|
|
"use strict";
|
|
|
var __defProp = Object.defineProperty;
|
|
|
var __defProps = Object.defineProperties;
|
|
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
|
var __spreadValues = (a, b) => {
|
|
|
for (var prop in b || (b = {}))
|
|
|
if (__hasOwnProp.call(b, prop))
|
|
|
__defNormalProp(a, prop, b[prop]);
|
|
|
if (__getOwnPropSymbols)
|
|
|
for (var prop of __getOwnPropSymbols(b)) {
|
|
|
if (__propIsEnum.call(b, prop))
|
|
|
__defNormalProp(a, prop, b[prop]);
|
|
|
}
|
|
|
return a;
|
|
|
};
|
|
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
|
var __publicField = (obj, key, value) => {
|
|
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
|
return value;
|
|
|
};
|
|
|
var require$$0 = require("obsidian");
|
|
|
function _interopDefaultLegacy(e) {
|
|
|
return e && typeof e === "object" && "default" in e ? e : { "default": e };
|
|
|
}
|
|
|
var require$$0__default = /* @__PURE__ */ _interopDefaultLegacy(require$$0);
|
|
|
const MEMOS_VIEW_TYPE = "memos_view";
|
|
|
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
|
|
|
function getAugmentedNamespace(n2) {
|
|
|
if (n2.__esModule)
|
|
|
return n2;
|
|
|
var a = Object.defineProperty({}, "__esModule", { value: true });
|
|
|
Object.keys(n2).forEach(function(k) {
|
|
|
var d = Object.getOwnPropertyDescriptor(n2, k);
|
|
|
Object.defineProperty(a, k, d.get ? d : {
|
|
|
enumerable: true,
|
|
|
get: function() {
|
|
|
return n2[k];
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
return a;
|
|
|
}
|
|
|
var _react_17_0_2_react = { exports: {} };
|
|
|
var react_production_min = {};
|
|
|
/*
|
|
|
object-assign
|
|
|
(c) Sindre Sorhus
|
|
|
@license MIT
|
|
|
*/
|
|
|
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
|
|
function toObject(val) {
|
|
|
if (val === null || val === void 0) {
|
|
|
throw new TypeError("Object.assign cannot be called with null or undefined");
|
|
|
}
|
|
|
return Object(val);
|
|
|
}
|
|
|
function shouldUseNative() {
|
|
|
try {
|
|
|
if (!Object.assign) {
|
|
|
return false;
|
|
|
}
|
|
|
var test1 = new String("abc");
|
|
|
test1[5] = "de";
|
|
|
if (Object.getOwnPropertyNames(test1)[0] === "5") {
|
|
|
return false;
|
|
|
}
|
|
|
var test2 = {};
|
|
|
for (var i = 0; i < 10; i++) {
|
|
|
test2["_" + String.fromCharCode(i)] = i;
|
|
|
}
|
|
|
var order2 = Object.getOwnPropertyNames(test2).map(function(n2) {
|
|
|
return test2[n2];
|
|
|
});
|
|
|
if (order2.join("") !== "0123456789") {
|
|
|
return false;
|
|
|
}
|
|
|
var test3 = {};
|
|
|
"abcdefghijklmnopqrst".split("").forEach(function(letter) {
|
|
|
test3[letter] = letter;
|
|
|
});
|
|
|
if (Object.keys(Object.assign({}, test3)).join("") !== "abcdefghijklmnopqrst") {
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
} catch (err) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
var _objectAssign_4_1_1_objectAssign = shouldUseNative() ? Object.assign : function(target, source) {
|
|
|
var from;
|
|
|
var to = toObject(target);
|
|
|
var symbols;
|
|
|
for (var s = 1; s < arguments.length; s++) {
|
|
|
from = Object(arguments[s]);
|
|
|
for (var key in from) {
|
|
|
if (hasOwnProperty.call(from, key)) {
|
|
|
to[key] = from[key];
|
|
|
}
|
|
|
}
|
|
|
if (getOwnPropertySymbols) {
|
|
|
symbols = getOwnPropertySymbols(from);
|
|
|
for (var i = 0; i < symbols.length; i++) {
|
|
|
if (propIsEnumerable.call(from, symbols[i])) {
|
|
|
to[symbols[i]] = from[symbols[i]];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return to;
|
|
|
};
|
|
|
/** @license React v17.0.2
|
|
|
* react.production.min.js
|
|
|
*
|
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
|
*
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
* LICENSE file in the root directory of this source tree.
|
|
|
*/
|
|
|
var l = _objectAssign_4_1_1_objectAssign, n$1 = 60103, p$1 = 60106;
|
|
|
react_production_min.Fragment = 60107;
|
|
|
react_production_min.StrictMode = 60108;
|
|
|
react_production_min.Profiler = 60114;
|
|
|
var q$1 = 60109, r$1 = 60110, t$1 = 60112;
|
|
|
react_production_min.Suspense = 60113;
|
|
|
var u = 60115, v = 60116;
|
|
|
if (typeof Symbol === "function" && Symbol.for) {
|
|
|
var w = Symbol.for;
|
|
|
n$1 = w("react.element");
|
|
|
p$1 = w("react.portal");
|
|
|
react_production_min.Fragment = w("react.fragment");
|
|
|
react_production_min.StrictMode = w("react.strict_mode");
|
|
|
react_production_min.Profiler = w("react.profiler");
|
|
|
q$1 = w("react.provider");
|
|
|
r$1 = w("react.context");
|
|
|
t$1 = w("react.forward_ref");
|
|
|
react_production_min.Suspense = w("react.suspense");
|
|
|
u = w("react.memo");
|
|
|
v = w("react.lazy");
|
|
|
}
|
|
|
var x = typeof Symbol === "function" && Symbol.iterator;
|
|
|
function y$1(a) {
|
|
|
if (a === null || typeof a !== "object")
|
|
|
return null;
|
|
|
a = x && a[x] || a["@@iterator"];
|
|
|
return typeof a === "function" ? a : null;
|
|
|
}
|
|
|
function z(a) {
|
|
|
for (var b = "https://reactjs.org/docs/error-decoder.html?invariant=" + a, c = 1; c < arguments.length; c++)
|
|
|
b += "&args[]=" + encodeURIComponent(arguments[c]);
|
|
|
return "Minified React error #" + a + "; visit " + b + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";
|
|
|
}
|
|
|
var A = { isMounted: function() {
|
|
|
return false;
|
|
|
}, enqueueForceUpdate: function() {
|
|
|
}, enqueueReplaceState: function() {
|
|
|
}, enqueueSetState: function() {
|
|
|
} }, B$1 = {};
|
|
|
function C(a, b, c) {
|
|
|
this.props = a;
|
|
|
this.context = b;
|
|
|
this.refs = B$1;
|
|
|
this.updater = c || A;
|
|
|
}
|
|
|
C.prototype.isReactComponent = {};
|
|
|
C.prototype.setState = function(a, b) {
|
|
|
if (typeof a !== "object" && typeof a !== "function" && a != null)
|
|
|
throw Error(z(85));
|
|
|
this.updater.enqueueSetState(this, a, b, "setState");
|
|
|
};
|
|
|
C.prototype.forceUpdate = function(a) {
|
|
|
this.updater.enqueueForceUpdate(this, a, "forceUpdate");
|
|
|
};
|
|
|
function D$1() {
|
|
|
}
|
|
|
D$1.prototype = C.prototype;
|
|
|
function E$1(a, b, c) {
|
|
|
this.props = a;
|
|
|
this.context = b;
|
|
|
this.refs = B$1;
|
|
|
this.updater = c || A;
|
|
|
}
|
|
|
var F$1 = E$1.prototype = new D$1();
|
|
|
F$1.constructor = E$1;
|
|
|
l(F$1, C.prototype);
|
|
|
F$1.isPureReactComponent = true;
|
|
|
var G$1 = { current: null }, H$1 = Object.prototype.hasOwnProperty, I$1 = { key: true, ref: true, __self: true, __source: true };
|
|
|
function J(a, b, c) {
|
|
|
var e, d = {}, k = null, h2 = null;
|
|
|
if (b != null)
|
|
|
for (e in b.ref !== void 0 && (h2 = b.ref), b.key !== void 0 && (k = "" + b.key), b)
|
|
|
H$1.call(b, e) && !I$1.hasOwnProperty(e) && (d[e] = b[e]);
|
|
|
var g2 = arguments.length - 2;
|
|
|
if (g2 === 1)
|
|
|
d.children = c;
|
|
|
else if (1 < g2) {
|
|
|
for (var f2 = Array(g2), m2 = 0; m2 < g2; m2++)
|
|
|
f2[m2] = arguments[m2 + 2];
|
|
|
d.children = f2;
|
|
|
}
|
|
|
if (a && a.defaultProps)
|
|
|
for (e in g2 = a.defaultProps, g2)
|
|
|
d[e] === void 0 && (d[e] = g2[e]);
|
|
|
return { $$typeof: n$1, type: a, key: k, ref: h2, props: d, _owner: G$1.current };
|
|
|
}
|
|
|
function K(a, b) {
|
|
|
return { $$typeof: n$1, type: a.type, key: b, ref: a.ref, props: a.props, _owner: a._owner };
|
|
|
}
|
|
|
function L(a) {
|
|
|
return typeof a === "object" && a !== null && a.$$typeof === n$1;
|
|
|
}
|
|
|
function escape(a) {
|
|
|
var b = { "=": "=0", ":": "=2" };
|
|
|
return "$" + a.replace(/[=:]/g, function(a2) {
|
|
|
return b[a2];
|
|
|
});
|
|
|
}
|
|
|
var M$1 = /\/+/g;
|
|
|
function N$1(a, b) {
|
|
|
return typeof a === "object" && a !== null && a.key != null ? escape("" + a.key) : b.toString(36);
|
|
|
}
|
|
|
function O$1(a, b, c, e, d) {
|
|
|
var k = typeof a;
|
|
|
if (k === "undefined" || k === "boolean")
|
|
|
a = null;
|
|
|
var h2 = false;
|
|
|
if (a === null)
|
|
|
h2 = true;
|
|
|
else
|
|
|
switch (k) {
|
|
|
case "string":
|
|
|
case "number":
|
|
|
h2 = true;
|
|
|
break;
|
|
|
case "object":
|
|
|
switch (a.$$typeof) {
|
|
|
case n$1:
|
|
|
case p$1:
|
|
|
h2 = true;
|
|
|
}
|
|
|
}
|
|
|
if (h2)
|
|
|
return h2 = a, d = d(h2), a = e === "" ? "." + N$1(h2, 0) : e, Array.isArray(d) ? (c = "", a != null && (c = a.replace(M$1, "$&/") + "/"), O$1(d, b, c, "", function(a2) {
|
|
|
return a2;
|
|
|
})) : d != null && (L(d) && (d = K(d, c + (!d.key || h2 && h2.key === d.key ? "" : ("" + d.key).replace(M$1, "$&/") + "/") + a)), b.push(d)), 1;
|
|
|
h2 = 0;
|
|
|
e = e === "" ? "." : e + ":";
|
|
|
if (Array.isArray(a))
|
|
|
for (var g2 = 0; g2 < a.length; g2++) {
|
|
|
k = a[g2];
|
|
|
var f2 = e + N$1(k, g2);
|
|
|
h2 += O$1(k, b, c, f2, d);
|
|
|
}
|
|
|
else if (f2 = y$1(a), typeof f2 === "function")
|
|
|
for (a = f2.call(a), g2 = 0; !(k = a.next()).done; )
|
|
|
k = k.value, f2 = e + N$1(k, g2++), h2 += O$1(k, b, c, f2, d);
|
|
|
else if (k === "object")
|
|
|
throw b = "" + a, Error(z(31, b === "[object Object]" ? "object with keys {" + Object.keys(a).join(", ") + "}" : b));
|
|
|
return h2;
|
|
|
}
|
|
|
function P$1(a, b, c) {
|
|
|
if (a == null)
|
|
|
return a;
|
|
|
var e = [], d = 0;
|
|
|
O$1(a, e, "", "", function(a2) {
|
|
|
return b.call(c, a2, d++);
|
|
|
});
|
|
|
return e;
|
|
|
}
|
|
|
function Q(a) {
|
|
|
if (a._status === -1) {
|
|
|
var b = a._result;
|
|
|
b = b();
|
|
|
a._status = 0;
|
|
|
a._result = b;
|
|
|
b.then(function(b2) {
|
|
|
a._status === 0 && (b2 = b2.default, a._status = 1, a._result = b2);
|
|
|
}, function(b2) {
|
|
|
a._status === 0 && (a._status = 2, a._result = b2);
|
|
|
});
|
|
|
}
|
|
|
if (a._status === 1)
|
|
|
return a._result;
|
|
|
throw a._result;
|
|
|
}
|
|
|
var R$1 = { current: null };
|
|
|
function S$1() {
|
|
|
var a = R$1.current;
|
|
|
if (a === null)
|
|
|
throw Error(z(321));
|
|
|
return a;
|
|
|
}
|
|
|
var T$1 = { ReactCurrentDispatcher: R$1, ReactCurrentBatchConfig: { transition: 0 }, ReactCurrentOwner: G$1, IsSomeRendererActing: { current: false }, assign: l };
|
|
|
react_production_min.Children = { map: P$1, forEach: function(a, b, c) {
|
|
|
P$1(a, function() {
|
|
|
b.apply(this, arguments);
|
|
|
}, c);
|
|
|
}, count: function(a) {
|
|
|
var b = 0;
|
|
|
P$1(a, function() {
|
|
|
b++;
|
|
|
});
|
|
|
return b;
|
|
|
}, toArray: function(a) {
|
|
|
return P$1(a, function(a2) {
|
|
|
return a2;
|
|
|
}) || [];
|
|
|
}, only: function(a) {
|
|
|
if (!L(a))
|
|
|
throw Error(z(143));
|
|
|
return a;
|
|
|
} };
|
|
|
react_production_min.Component = C;
|
|
|
react_production_min.PureComponent = E$1;
|
|
|
react_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = T$1;
|
|
|
react_production_min.cloneElement = function(a, b, c) {
|
|
|
if (a === null || a === void 0)
|
|
|
throw Error(z(267, a));
|
|
|
var e = l({}, a.props), d = a.key, k = a.ref, h2 = a._owner;
|
|
|
if (b != null) {
|
|
|
b.ref !== void 0 && (k = b.ref, h2 = G$1.current);
|
|
|
b.key !== void 0 && (d = "" + b.key);
|
|
|
if (a.type && a.type.defaultProps)
|
|
|
var g2 = a.type.defaultProps;
|
|
|
for (f2 in b)
|
|
|
H$1.call(b, f2) && !I$1.hasOwnProperty(f2) && (e[f2] = b[f2] === void 0 && g2 !== void 0 ? g2[f2] : b[f2]);
|
|
|
}
|
|
|
var f2 = arguments.length - 2;
|
|
|
if (f2 === 1)
|
|
|
e.children = c;
|
|
|
else if (1 < f2) {
|
|
|
g2 = Array(f2);
|
|
|
for (var m2 = 0; m2 < f2; m2++)
|
|
|
g2[m2] = arguments[m2 + 2];
|
|
|
e.children = g2;
|
|
|
}
|
|
|
return {
|
|
|
$$typeof: n$1,
|
|
|
type: a.type,
|
|
|
key: d,
|
|
|
ref: k,
|
|
|
props: e,
|
|
|
_owner: h2
|
|
|
};
|
|
|
};
|
|
|
react_production_min.createContext = function(a, b) {
|
|
|
b === void 0 && (b = null);
|
|
|
a = { $$typeof: r$1, _calculateChangedBits: b, _currentValue: a, _currentValue2: a, _threadCount: 0, Provider: null, Consumer: null };
|
|
|
a.Provider = { $$typeof: q$1, _context: a };
|
|
|
return a.Consumer = a;
|
|
|
};
|
|
|
react_production_min.createElement = J;
|
|
|
react_production_min.createFactory = function(a) {
|
|
|
var b = J.bind(null, a);
|
|
|
b.type = a;
|
|
|
return b;
|
|
|
};
|
|
|
react_production_min.createRef = function() {
|
|
|
return { current: null };
|
|
|
};
|
|
|
react_production_min.forwardRef = function(a) {
|
|
|
return { $$typeof: t$1, render: a };
|
|
|
};
|
|
|
react_production_min.isValidElement = L;
|
|
|
react_production_min.lazy = function(a) {
|
|
|
return { $$typeof: v, _payload: { _status: -1, _result: a }, _init: Q };
|
|
|
};
|
|
|
react_production_min.memo = function(a, b) {
|
|
|
return { $$typeof: u, type: a, compare: b === void 0 ? null : b };
|
|
|
};
|
|
|
react_production_min.useCallback = function(a, b) {
|
|
|
return S$1().useCallback(a, b);
|
|
|
};
|
|
|
react_production_min.useContext = function(a, b) {
|
|
|
return S$1().useContext(a, b);
|
|
|
};
|
|
|
react_production_min.useDebugValue = function() {
|
|
|
};
|
|
|
react_production_min.useEffect = function(a, b) {
|
|
|
return S$1().useEffect(a, b);
|
|
|
};
|
|
|
react_production_min.useImperativeHandle = function(a, b, c) {
|
|
|
return S$1().useImperativeHandle(a, b, c);
|
|
|
};
|
|
|
react_production_min.useLayoutEffect = function(a, b) {
|
|
|
return S$1().useLayoutEffect(a, b);
|
|
|
};
|
|
|
react_production_min.useMemo = function(a, b) {
|
|
|
return S$1().useMemo(a, b);
|
|
|
};
|
|
|
react_production_min.useReducer = function(a, b, c) {
|
|
|
return S$1().useReducer(a, b, c);
|
|
|
};
|
|
|
react_production_min.useRef = function(a) {
|
|
|
return S$1().useRef(a);
|
|
|
};
|
|
|
react_production_min.useState = function(a) {
|
|
|
return S$1().useState(a);
|
|
|
};
|
|
|
react_production_min.version = "17.0.2";
|
|
|
{
|
|
|
_react_17_0_2_react.exports = react_production_min;
|
|
|
}
|
|
|
var React$1 = _react_17_0_2_react.exports;
|
|
|
var _reactDom_17_0_2_reactDom = { exports: {} };
|
|
|
var reactDom_production_min = {};
|
|
|
var _scheduler_0_20_2_scheduler = { exports: {} };
|
|
|
var scheduler_production_min = {};
|
|
|
/** @license React v0.20.2
|
|
|
* scheduler.production.min.js
|
|
|
*
|
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
|
*
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
* LICENSE file in the root directory of this source tree.
|
|
|
*/
|
|
|
(function(exports) {
|
|
|
var f2, g2, h2, k;
|
|
|
if (typeof performance === "object" && typeof performance.now === "function") {
|
|
|
var l2 = performance;
|
|
|
exports.unstable_now = function() {
|
|
|
return l2.now();
|
|
|
};
|
|
|
} else {
|
|
|
var p2 = Date, q2 = p2.now();
|
|
|
exports.unstable_now = function() {
|
|
|
return p2.now() - q2;
|
|
|
};
|
|
|
}
|
|
|
if (typeof window === "undefined" || typeof MessageChannel !== "function") {
|
|
|
var t2 = null, u2 = null, w2 = function() {
|
|
|
if (t2 !== null)
|
|
|
try {
|
|
|
var a = exports.unstable_now();
|
|
|
t2(true, a);
|
|
|
t2 = null;
|
|
|
} catch (b) {
|
|
|
throw setTimeout(w2, 0), b;
|
|
|
}
|
|
|
};
|
|
|
f2 = function(a) {
|
|
|
t2 !== null ? setTimeout(f2, 0, a) : (t2 = a, setTimeout(w2, 0));
|
|
|
};
|
|
|
g2 = function(a, b) {
|
|
|
u2 = setTimeout(a, b);
|
|
|
};
|
|
|
h2 = function() {
|
|
|
clearTimeout(u2);
|
|
|
};
|
|
|
exports.unstable_shouldYield = function() {
|
|
|
return false;
|
|
|
};
|
|
|
k = exports.unstable_forceFrameRate = function() {
|
|
|
};
|
|
|
} else {
|
|
|
var x2 = window.setTimeout, y2 = window.clearTimeout;
|
|
|
if (typeof console !== "undefined") {
|
|
|
var z2 = window.cancelAnimationFrame;
|
|
|
typeof window.requestAnimationFrame !== "function" && console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills");
|
|
|
typeof z2 !== "function" && console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills");
|
|
|
}
|
|
|
var A2 = false, B2 = null, C2 = -1, D2 = 5, E2 = 0;
|
|
|
exports.unstable_shouldYield = function() {
|
|
|
return exports.unstable_now() >= E2;
|
|
|
};
|
|
|
k = function() {
|
|
|
};
|
|
|
exports.unstable_forceFrameRate = function(a) {
|
|
|
0 > a || 125 < a ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : D2 = 0 < a ? Math.floor(1e3 / a) : 5;
|
|
|
};
|
|
|
var F2 = new MessageChannel(), G2 = F2.port2;
|
|
|
F2.port1.onmessage = function() {
|
|
|
if (B2 !== null) {
|
|
|
var a = exports.unstable_now();
|
|
|
E2 = a + D2;
|
|
|
try {
|
|
|
B2(true, a) ? G2.postMessage(null) : (A2 = false, B2 = null);
|
|
|
} catch (b) {
|
|
|
throw G2.postMessage(null), b;
|
|
|
}
|
|
|
} else
|
|
|
A2 = false;
|
|
|
};
|
|
|
f2 = function(a) {
|
|
|
B2 = a;
|
|
|
A2 || (A2 = true, G2.postMessage(null));
|
|
|
};
|
|
|
g2 = function(a, b) {
|
|
|
C2 = x2(function() {
|
|
|
a(exports.unstable_now());
|
|
|
}, b);
|
|
|
};
|
|
|
h2 = function() {
|
|
|
y2(C2);
|
|
|
C2 = -1;
|
|
|
};
|
|
|
}
|
|
|
function H2(a, b) {
|
|
|
var c = a.length;
|
|
|
a.push(b);
|
|
|
a:
|
|
|
for (; ; ) {
|
|
|
var d = c - 1 >>> 1, e = a[d];
|
|
|
if (e !== void 0 && 0 < I2(e, b))
|
|
|
a[d] = b, a[c] = e, c = d;
|
|
|
else
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
function J2(a) {
|
|
|
a = a[0];
|
|
|
return a === void 0 ? null : a;
|
|
|
}
|
|
|
function K2(a) {
|
|
|
var b = a[0];
|
|
|
if (b !== void 0) {
|
|
|
var c = a.pop();
|
|
|
if (c !== b) {
|
|
|
a[0] = c;
|
|
|
a:
|
|
|
for (var d = 0, e = a.length; d < e; ) {
|
|
|
var m2 = 2 * (d + 1) - 1, n2 = a[m2], v2 = m2 + 1, r2 = a[v2];
|
|
|
if (n2 !== void 0 && 0 > I2(n2, c))
|
|
|
r2 !== void 0 && 0 > I2(r2, n2) ? (a[d] = r2, a[v2] = c, d = v2) : (a[d] = n2, a[m2] = c, d = m2);
|
|
|
else if (r2 !== void 0 && 0 > I2(r2, c))
|
|
|
a[d] = r2, a[v2] = c, d = v2;
|
|
|
else
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function I2(a, b) {
|
|
|
var c = a.sortIndex - b.sortIndex;
|
|
|
return c !== 0 ? c : a.id - b.id;
|
|
|
}
|
|
|
var L2 = [], M2 = [], N2 = 1, O2 = null, P2 = 3, Q2 = false, R2 = false, S2 = false;
|
|
|
function T2(a) {
|
|
|
for (var b = J2(M2); b !== null; ) {
|
|
|
if (b.callback === null)
|
|
|
K2(M2);
|
|
|
else if (b.startTime <= a)
|
|
|
K2(M2), b.sortIndex = b.expirationTime, H2(L2, b);
|
|
|
else
|
|
|
break;
|
|
|
b = J2(M2);
|
|
|
}
|
|
|
}
|
|
|
function U2(a) {
|
|
|
S2 = false;
|
|
|
T2(a);
|
|
|
if (!R2)
|
|
|
if (J2(L2) !== null)
|
|
|
R2 = true, f2(V2);
|
|
|
else {
|
|
|
var b = J2(M2);
|
|
|
b !== null && g2(U2, b.startTime - a);
|
|
|
}
|
|
|
}
|
|
|
function V2(a, b) {
|
|
|
R2 = false;
|
|
|
S2 && (S2 = false, h2());
|
|
|
Q2 = true;
|
|
|
var c = P2;
|
|
|
try {
|
|
|
T2(b);
|
|
|
for (O2 = J2(L2); O2 !== null && (!(O2.expirationTime > b) || a && !exports.unstable_shouldYield()); ) {
|
|
|
var d = O2.callback;
|
|
|
if (typeof d === "function") {
|
|
|
O2.callback = null;
|
|
|
P2 = O2.priorityLevel;
|
|
|
var e = d(O2.expirationTime <= b);
|
|
|
b = exports.unstable_now();
|
|
|
typeof e === "function" ? O2.callback = e : O2 === J2(L2) && K2(L2);
|
|
|
T2(b);
|
|
|
} else
|
|
|
K2(L2);
|
|
|
O2 = J2(L2);
|
|
|
}
|
|
|
if (O2 !== null)
|
|
|
var m2 = true;
|
|
|
else {
|
|
|
var n2 = J2(M2);
|
|
|
n2 !== null && g2(U2, n2.startTime - b);
|
|
|
m2 = false;
|
|
|
}
|
|
|
return m2;
|
|
|
} finally {
|
|
|
O2 = null, P2 = c, Q2 = false;
|
|
|
}
|
|
|
}
|
|
|
var W2 = k;
|
|
|
exports.unstable_IdlePriority = 5;
|
|
|
exports.unstable_ImmediatePriority = 1;
|
|
|
exports.unstable_LowPriority = 4;
|
|
|
exports.unstable_NormalPriority = 3;
|
|
|
exports.unstable_Profiling = null;
|
|
|
exports.unstable_UserBlockingPriority = 2;
|
|
|
exports.unstable_cancelCallback = function(a) {
|
|
|
a.callback = null;
|
|
|
};
|
|
|
exports.unstable_continueExecution = function() {
|
|
|
R2 || Q2 || (R2 = true, f2(V2));
|
|
|
};
|
|
|
exports.unstable_getCurrentPriorityLevel = function() {
|
|
|
return P2;
|
|
|
};
|
|
|
exports.unstable_getFirstCallbackNode = function() {
|
|
|
return J2(L2);
|
|
|
};
|
|
|
exports.unstable_next = function(a) {
|
|
|
switch (P2) {
|
|
|
case 1:
|
|
|
case 2:
|
|
|
case 3:
|
|
|
var b = 3;
|
|
|
break;
|
|
|
default:
|
|
|
b = P2;
|
|
|
}
|
|
|
var c = P2;
|
|
|
P2 = b;
|
|
|
try {
|
|
|
return a();
|
|
|
} finally {
|
|
|
P2 = c;
|
|
|
}
|
|
|
};
|
|
|
exports.unstable_pauseExecution = function() {
|
|
|
};
|
|
|
exports.unstable_requestPaint = W2;
|
|
|
exports.unstable_runWithPriority = function(a, b) {
|
|
|
switch (a) {
|
|
|
case 1:
|
|
|
case 2:
|
|
|
case 3:
|
|
|
case 4:
|
|
|
case 5:
|
|
|
break;
|
|
|
default:
|
|
|
a = 3;
|
|
|
}
|
|
|
var c = P2;
|
|
|
P2 = a;
|
|
|
try {
|
|
|
return b();
|
|
|
} finally {
|
|
|
P2 = c;
|
|
|
}
|
|
|
};
|
|
|
exports.unstable_scheduleCallback = function(a, b, c) {
|
|
|
var d = exports.unstable_now();
|
|
|
typeof c === "object" && c !== null ? (c = c.delay, c = typeof c === "number" && 0 < c ? d + c : d) : c = d;
|
|
|
switch (a) {
|
|
|
case 1:
|
|
|
var e = -1;
|
|
|
break;
|
|
|
case 2:
|
|
|
e = 250;
|
|
|
break;
|
|
|
case 5:
|
|
|
e = 1073741823;
|
|
|
break;
|
|
|
case 4:
|
|
|
e = 1e4;
|
|
|
break;
|
|
|
default:
|
|
|
e = 5e3;
|
|
|
}
|
|
|
e = c + e;
|
|
|
a = { id: N2++, callback: b, priorityLevel: a, startTime: c, expirationTime: e, sortIndex: -1 };
|
|
|
c > d ? (a.sortIndex = c, H2(M2, a), J2(L2) === null && a === J2(M2) && (S2 ? h2() : S2 = true, g2(U2, c - d))) : (a.sortIndex = e, H2(L2, a), R2 || Q2 || (R2 = true, f2(V2)));
|
|
|
return a;
|
|
|
};
|
|
|
exports.unstable_wrapCallback = function(a) {
|
|
|
var b = P2;
|
|
|
return function() {
|
|
|
var c = P2;
|
|
|
P2 = b;
|
|
|
try {
|
|
|
return a.apply(this, arguments);
|
|
|
} finally {
|
|
|
P2 = c;
|
|
|
}
|
|
|
};
|
|
|
};
|
|
|
})(scheduler_production_min);
|
|
|
{
|
|
|
_scheduler_0_20_2_scheduler.exports = scheduler_production_min;
|
|
|
}
|
|
|
/** @license React v17.0.2
|
|
|
* react-dom.production.min.js
|
|
|
*
|
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
|
*
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
* LICENSE file in the root directory of this source tree.
|
|
|
*/
|
|
|
var aa = _react_17_0_2_react.exports, m$1 = _objectAssign_4_1_1_objectAssign, r = _scheduler_0_20_2_scheduler.exports;
|
|
|
function y(a) {
|
|
|
for (var b = "https://reactjs.org/docs/error-decoder.html?invariant=" + a, c = 1; c < arguments.length; c++)
|
|
|
b += "&args[]=" + encodeURIComponent(arguments[c]);
|
|
|
return "Minified React error #" + a + "; visit " + b + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";
|
|
|
}
|
|
|
if (!aa)
|
|
|
throw Error(y(227));
|
|
|
var ba = new Set(), ca = {};
|
|
|
function da$1(a, b) {
|
|
|
ea(a, b);
|
|
|
ea(a + "Capture", b);
|
|
|
}
|
|
|
function ea(a, b) {
|
|
|
ca[a] = b;
|
|
|
for (a = 0; a < b.length; a++)
|
|
|
ba.add(b[a]);
|
|
|
}
|
|
|
var fa = !(typeof window === "undefined" || typeof window.document === "undefined" || typeof window.document.createElement === "undefined"), ha = /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/, ia = Object.prototype.hasOwnProperty, ja$1 = {}, ka = {};
|
|
|
function la(a) {
|
|
|
if (ia.call(ka, a))
|
|
|
return true;
|
|
|
if (ia.call(ja$1, a))
|
|
|
return false;
|
|
|
if (ha.test(a))
|
|
|
return ka[a] = true;
|
|
|
ja$1[a] = true;
|
|
|
return false;
|
|
|
}
|
|
|
function ma(a, b, c, d) {
|
|
|
if (c !== null && c.type === 0)
|
|
|
return false;
|
|
|
switch (typeof b) {
|
|
|
case "function":
|
|
|
case "symbol":
|
|
|
return true;
|
|
|
case "boolean":
|
|
|
if (d)
|
|
|
return false;
|
|
|
if (c !== null)
|
|
|
return !c.acceptsBooleans;
|
|
|
a = a.toLowerCase().slice(0, 5);
|
|
|
return a !== "data-" && a !== "aria-";
|
|
|
default:
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function na(a, b, c, d) {
|
|
|
if (b === null || typeof b === "undefined" || ma(a, b, c, d))
|
|
|
return true;
|
|
|
if (d)
|
|
|
return false;
|
|
|
if (c !== null)
|
|
|
switch (c.type) {
|
|
|
case 3:
|
|
|
return !b;
|
|
|
case 4:
|
|
|
return b === false;
|
|
|
case 5:
|
|
|
return isNaN(b);
|
|
|
case 6:
|
|
|
return isNaN(b) || 1 > b;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function B(a, b, c, d, e, f2, g2) {
|
|
|
this.acceptsBooleans = b === 2 || b === 3 || b === 4;
|
|
|
this.attributeName = d;
|
|
|
this.attributeNamespace = e;
|
|
|
this.mustUseProperty = c;
|
|
|
this.propertyName = a;
|
|
|
this.type = b;
|
|
|
this.sanitizeURL = f2;
|
|
|
this.removeEmptyString = g2;
|
|
|
}
|
|
|
var D = {};
|
|
|
"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a) {
|
|
|
D[a] = new B(a, 0, false, a, null, false, false);
|
|
|
});
|
|
|
[["acceptCharset", "accept-charset"], ["className", "class"], ["htmlFor", "for"], ["httpEquiv", "http-equiv"]].forEach(function(a) {
|
|
|
var b = a[0];
|
|
|
D[b] = new B(b, 1, false, a[1], null, false, false);
|
|
|
});
|
|
|
["contentEditable", "draggable", "spellCheck", "value"].forEach(function(a) {
|
|
|
D[a] = new B(a, 2, false, a.toLowerCase(), null, false, false);
|
|
|
});
|
|
|
["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(a) {
|
|
|
D[a] = new B(a, 2, false, a, null, false, false);
|
|
|
});
|
|
|
"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a) {
|
|
|
D[a] = new B(a, 3, false, a.toLowerCase(), null, false, false);
|
|
|
});
|
|
|
["checked", "multiple", "muted", "selected"].forEach(function(a) {
|
|
|
D[a] = new B(a, 3, true, a, null, false, false);
|
|
|
});
|
|
|
["capture", "download"].forEach(function(a) {
|
|
|
D[a] = new B(a, 4, false, a, null, false, false);
|
|
|
});
|
|
|
["cols", "rows", "size", "span"].forEach(function(a) {
|
|
|
D[a] = new B(a, 6, false, a, null, false, false);
|
|
|
});
|
|
|
["rowSpan", "start"].forEach(function(a) {
|
|
|
D[a] = new B(a, 5, false, a.toLowerCase(), null, false, false);
|
|
|
});
|
|
|
var oa = /[\-:]([a-z])/g;
|
|
|
function pa(a) {
|
|
|
return a[1].toUpperCase();
|
|
|
}
|
|
|
"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a) {
|
|
|
var b = a.replace(oa, pa);
|
|
|
D[b] = new B(b, 1, false, a, null, false, false);
|
|
|
});
|
|
|
"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a) {
|
|
|
var b = a.replace(oa, pa);
|
|
|
D[b] = new B(b, 1, false, a, "http://www.w3.org/1999/xlink", false, false);
|
|
|
});
|
|
|
["xml:base", "xml:lang", "xml:space"].forEach(function(a) {
|
|
|
var b = a.replace(oa, pa);
|
|
|
D[b] = new B(b, 1, false, a, "http://www.w3.org/XML/1998/namespace", false, false);
|
|
|
});
|
|
|
["tabIndex", "crossOrigin"].forEach(function(a) {
|
|
|
D[a] = new B(a, 1, false, a.toLowerCase(), null, false, false);
|
|
|
});
|
|
|
D.xlinkHref = new B("xlinkHref", 1, false, "xlink:href", "http://www.w3.org/1999/xlink", true, false);
|
|
|
["src", "href", "action", "formAction"].forEach(function(a) {
|
|
|
D[a] = new B(a, 1, false, a.toLowerCase(), null, true, true);
|
|
|
});
|
|
|
function qa(a, b, c, d) {
|
|
|
var e = D.hasOwnProperty(b) ? D[b] : null;
|
|
|
var f2 = e !== null ? e.type === 0 : d ? false : !(2 < b.length) || b[0] !== "o" && b[0] !== "O" || b[1] !== "n" && b[1] !== "N" ? false : true;
|
|
|
f2 || (na(b, c, e, d) && (c = null), d || e === null ? la(b) && (c === null ? a.removeAttribute(b) : a.setAttribute(b, "" + c)) : e.mustUseProperty ? a[e.propertyName] = c === null ? e.type === 3 ? false : "" : c : (b = e.attributeName, d = e.attributeNamespace, c === null ? a.removeAttribute(b) : (e = e.type, c = e === 3 || e === 4 && c === true ? "" : "" + c, d ? a.setAttributeNS(d, b, c) : a.setAttribute(b, c))));
|
|
|
}
|
|
|
var ra = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, sa = 60103, ta = 60106, ua = 60107, wa = 60108, xa = 60114, ya = 60109, za = 60110, Aa = 60112, Ba = 60113, Ca = 60120, Da = 60115, Ea = 60116, Fa = 60121, Ga = 60128, Ha = 60129, Ia = 60130, Ja = 60131;
|
|
|
if (typeof Symbol === "function" && Symbol.for) {
|
|
|
var E = Symbol.for;
|
|
|
sa = E("react.element");
|
|
|
ta = E("react.portal");
|
|
|
ua = E("react.fragment");
|
|
|
wa = E("react.strict_mode");
|
|
|
xa = E("react.profiler");
|
|
|
ya = E("react.provider");
|
|
|
za = E("react.context");
|
|
|
Aa = E("react.forward_ref");
|
|
|
Ba = E("react.suspense");
|
|
|
Ca = E("react.suspense_list");
|
|
|
Da = E("react.memo");
|
|
|
Ea = E("react.lazy");
|
|
|
Fa = E("react.block");
|
|
|
E("react.scope");
|
|
|
Ga = E("react.opaque.id");
|
|
|
Ha = E("react.debug_trace_mode");
|
|
|
Ia = E("react.offscreen");
|
|
|
Ja = E("react.legacy_hidden");
|
|
|
}
|
|
|
var Ka = typeof Symbol === "function" && Symbol.iterator;
|
|
|
function La(a) {
|
|
|
if (a === null || typeof a !== "object")
|
|
|
return null;
|
|
|
a = Ka && a[Ka] || a["@@iterator"];
|
|
|
return typeof a === "function" ? a : null;
|
|
|
}
|
|
|
var Ma;
|
|
|
function Na(a) {
|
|
|
if (Ma === void 0)
|
|
|
try {
|
|
|
throw Error();
|
|
|
} catch (c) {
|
|
|
var b = c.stack.trim().match(/\n( *(at )?)/);
|
|
|
Ma = b && b[1] || "";
|
|
|
}
|
|
|
return "\n" + Ma + a;
|
|
|
}
|
|
|
var Oa = false;
|
|
|
function Pa(a, b) {
|
|
|
if (!a || Oa)
|
|
|
return "";
|
|
|
Oa = true;
|
|
|
var c = Error.prepareStackTrace;
|
|
|
Error.prepareStackTrace = void 0;
|
|
|
try {
|
|
|
if (b)
|
|
|
if (b = function() {
|
|
|
throw Error();
|
|
|
}, Object.defineProperty(b.prototype, "props", { set: function() {
|
|
|
throw Error();
|
|
|
} }), typeof Reflect === "object" && Reflect.construct) {
|
|
|
try {
|
|
|
Reflect.construct(b, []);
|
|
|
} catch (k) {
|
|
|
var d = k;
|
|
|
}
|
|
|
Reflect.construct(a, [], b);
|
|
|
} else {
|
|
|
try {
|
|
|
b.call();
|
|
|
} catch (k) {
|
|
|
d = k;
|
|
|
}
|
|
|
a.call(b.prototype);
|
|
|
}
|
|
|
else {
|
|
|
try {
|
|
|
throw Error();
|
|
|
} catch (k) {
|
|
|
d = k;
|
|
|
}
|
|
|
a();
|
|
|
}
|
|
|
} catch (k) {
|
|
|
if (k && d && typeof k.stack === "string") {
|
|
|
for (var e = k.stack.split("\n"), f2 = d.stack.split("\n"), g2 = e.length - 1, h2 = f2.length - 1; 1 <= g2 && 0 <= h2 && e[g2] !== f2[h2]; )
|
|
|
h2--;
|
|
|
for (; 1 <= g2 && 0 <= h2; g2--, h2--)
|
|
|
if (e[g2] !== f2[h2]) {
|
|
|
if (g2 !== 1 || h2 !== 1) {
|
|
|
do
|
|
|
if (g2--, h2--, 0 > h2 || e[g2] !== f2[h2])
|
|
|
return "\n" + e[g2].replace(" at new ", " at ");
|
|
|
while (1 <= g2 && 0 <= h2);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
} finally {
|
|
|
Oa = false, Error.prepareStackTrace = c;
|
|
|
}
|
|
|
return (a = a ? a.displayName || a.name : "") ? Na(a) : "";
|
|
|
}
|
|
|
function Qa(a) {
|
|
|
switch (a.tag) {
|
|
|
case 5:
|
|
|
return Na(a.type);
|
|
|
case 16:
|
|
|
return Na("Lazy");
|
|
|
case 13:
|
|
|
return Na("Suspense");
|
|
|
case 19:
|
|
|
return Na("SuspenseList");
|
|
|
case 0:
|
|
|
case 2:
|
|
|
case 15:
|
|
|
return a = Pa(a.type, false), a;
|
|
|
case 11:
|
|
|
return a = Pa(a.type.render, false), a;
|
|
|
case 22:
|
|
|
return a = Pa(a.type._render, false), a;
|
|
|
case 1:
|
|
|
return a = Pa(a.type, true), a;
|
|
|
default:
|
|
|
return "";
|
|
|
}
|
|
|
}
|
|
|
function Ra(a) {
|
|
|
if (a == null)
|
|
|
return null;
|
|
|
if (typeof a === "function")
|
|
|
return a.displayName || a.name || null;
|
|
|
if (typeof a === "string")
|
|
|
return a;
|
|
|
switch (a) {
|
|
|
case ua:
|
|
|
return "Fragment";
|
|
|
case ta:
|
|
|
return "Portal";
|
|
|
case xa:
|
|
|
return "Profiler";
|
|
|
case wa:
|
|
|
return "StrictMode";
|
|
|
case Ba:
|
|
|
return "Suspense";
|
|
|
case Ca:
|
|
|
return "SuspenseList";
|
|
|
}
|
|
|
if (typeof a === "object")
|
|
|
switch (a.$$typeof) {
|
|
|
case za:
|
|
|
return (a.displayName || "Context") + ".Consumer";
|
|
|
case ya:
|
|
|
return (a._context.displayName || "Context") + ".Provider";
|
|
|
case Aa:
|
|
|
var b = a.render;
|
|
|
b = b.displayName || b.name || "";
|
|
|
return a.displayName || (b !== "" ? "ForwardRef(" + b + ")" : "ForwardRef");
|
|
|
case Da:
|
|
|
return Ra(a.type);
|
|
|
case Fa:
|
|
|
return Ra(a._render);
|
|
|
case Ea:
|
|
|
b = a._payload;
|
|
|
a = a._init;
|
|
|
try {
|
|
|
return Ra(a(b));
|
|
|
} catch (c) {
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function Sa(a) {
|
|
|
switch (typeof a) {
|
|
|
case "boolean":
|
|
|
case "number":
|
|
|
case "object":
|
|
|
case "string":
|
|
|
case "undefined":
|
|
|
return a;
|
|
|
default:
|
|
|
return "";
|
|
|
}
|
|
|
}
|
|
|
function Ta(a) {
|
|
|
var b = a.type;
|
|
|
return (a = a.nodeName) && a.toLowerCase() === "input" && (b === "checkbox" || b === "radio");
|
|
|
}
|
|
|
function Ua(a) {
|
|
|
var b = Ta(a) ? "checked" : "value", c = Object.getOwnPropertyDescriptor(a.constructor.prototype, b), d = "" + a[b];
|
|
|
if (!a.hasOwnProperty(b) && typeof c !== "undefined" && typeof c.get === "function" && typeof c.set === "function") {
|
|
|
var e = c.get, f2 = c.set;
|
|
|
Object.defineProperty(a, b, { configurable: true, get: function() {
|
|
|
return e.call(this);
|
|
|
}, set: function(a2) {
|
|
|
d = "" + a2;
|
|
|
f2.call(this, a2);
|
|
|
} });
|
|
|
Object.defineProperty(a, b, { enumerable: c.enumerable });
|
|
|
return { getValue: function() {
|
|
|
return d;
|
|
|
}, setValue: function(a2) {
|
|
|
d = "" + a2;
|
|
|
}, stopTracking: function() {
|
|
|
a._valueTracker = null;
|
|
|
delete a[b];
|
|
|
} };
|
|
|
}
|
|
|
}
|
|
|
function Va(a) {
|
|
|
a._valueTracker || (a._valueTracker = Ua(a));
|
|
|
}
|
|
|
function Wa(a) {
|
|
|
if (!a)
|
|
|
return false;
|
|
|
var b = a._valueTracker;
|
|
|
if (!b)
|
|
|
return true;
|
|
|
var c = b.getValue();
|
|
|
var d = "";
|
|
|
a && (d = Ta(a) ? a.checked ? "true" : "false" : a.value);
|
|
|
a = d;
|
|
|
return a !== c ? (b.setValue(a), true) : false;
|
|
|
}
|
|
|
function Xa(a) {
|
|
|
a = a || (typeof document !== "undefined" ? document : void 0);
|
|
|
if (typeof a === "undefined")
|
|
|
return null;
|
|
|
try {
|
|
|
return a.activeElement || a.body;
|
|
|
} catch (b) {
|
|
|
return a.body;
|
|
|
}
|
|
|
}
|
|
|
function Ya(a, b) {
|
|
|
var c = b.checked;
|
|
|
return m$1({}, b, { defaultChecked: void 0, defaultValue: void 0, value: void 0, checked: c != null ? c : a._wrapperState.initialChecked });
|
|
|
}
|
|
|
function Za(a, b) {
|
|
|
var c = b.defaultValue == null ? "" : b.defaultValue, d = b.checked != null ? b.checked : b.defaultChecked;
|
|
|
c = Sa(b.value != null ? b.value : c);
|
|
|
a._wrapperState = { initialChecked: d, initialValue: c, controlled: b.type === "checkbox" || b.type === "radio" ? b.checked != null : b.value != null };
|
|
|
}
|
|
|
function $a(a, b) {
|
|
|
b = b.checked;
|
|
|
b != null && qa(a, "checked", b, false);
|
|
|
}
|
|
|
function ab(a, b) {
|
|
|
$a(a, b);
|
|
|
var c = Sa(b.value), d = b.type;
|
|
|
if (c != null)
|
|
|
if (d === "number") {
|
|
|
if (c === 0 && a.value === "" || a.value != c)
|
|
|
a.value = "" + c;
|
|
|
} else
|
|
|
a.value !== "" + c && (a.value = "" + c);
|
|
|
else if (d === "submit" || d === "reset") {
|
|
|
a.removeAttribute("value");
|
|
|
return;
|
|
|
}
|
|
|
b.hasOwnProperty("value") ? bb(a, b.type, c) : b.hasOwnProperty("defaultValue") && bb(a, b.type, Sa(b.defaultValue));
|
|
|
b.checked == null && b.defaultChecked != null && (a.defaultChecked = !!b.defaultChecked);
|
|
|
}
|
|
|
function cb(a, b, c) {
|
|
|
if (b.hasOwnProperty("value") || b.hasOwnProperty("defaultValue")) {
|
|
|
var d = b.type;
|
|
|
if (!(d !== "submit" && d !== "reset" || b.value !== void 0 && b.value !== null))
|
|
|
return;
|
|
|
b = "" + a._wrapperState.initialValue;
|
|
|
c || b === a.value || (a.value = b);
|
|
|
a.defaultValue = b;
|
|
|
}
|
|
|
c = a.name;
|
|
|
c !== "" && (a.name = "");
|
|
|
a.defaultChecked = !!a._wrapperState.initialChecked;
|
|
|
c !== "" && (a.name = c);
|
|
|
}
|
|
|
function bb(a, b, c) {
|
|
|
if (b !== "number" || Xa(a.ownerDocument) !== a)
|
|
|
c == null ? a.defaultValue = "" + a._wrapperState.initialValue : a.defaultValue !== "" + c && (a.defaultValue = "" + c);
|
|
|
}
|
|
|
function db(a) {
|
|
|
var b = "";
|
|
|
aa.Children.forEach(a, function(a2) {
|
|
|
a2 != null && (b += a2);
|
|
|
});
|
|
|
return b;
|
|
|
}
|
|
|
function eb(a, b) {
|
|
|
a = m$1({ children: void 0 }, b);
|
|
|
if (b = db(b.children))
|
|
|
a.children = b;
|
|
|
return a;
|
|
|
}
|
|
|
function fb(a, b, c, d) {
|
|
|
a = a.options;
|
|
|
if (b) {
|
|
|
b = {};
|
|
|
for (var e = 0; e < c.length; e++)
|
|
|
b["$" + c[e]] = true;
|
|
|
for (c = 0; c < a.length; c++)
|
|
|
e = b.hasOwnProperty("$" + a[c].value), a[c].selected !== e && (a[c].selected = e), e && d && (a[c].defaultSelected = true);
|
|
|
} else {
|
|
|
c = "" + Sa(c);
|
|
|
b = null;
|
|
|
for (e = 0; e < a.length; e++) {
|
|
|
if (a[e].value === c) {
|
|
|
a[e].selected = true;
|
|
|
d && (a[e].defaultSelected = true);
|
|
|
return;
|
|
|
}
|
|
|
b !== null || a[e].disabled || (b = a[e]);
|
|
|
}
|
|
|
b !== null && (b.selected = true);
|
|
|
}
|
|
|
}
|
|
|
function gb(a, b) {
|
|
|
if (b.dangerouslySetInnerHTML != null)
|
|
|
throw Error(y(91));
|
|
|
return m$1({}, b, { value: void 0, defaultValue: void 0, children: "" + a._wrapperState.initialValue });
|
|
|
}
|
|
|
function hb(a, b) {
|
|
|
var c = b.value;
|
|
|
if (c == null) {
|
|
|
c = b.children;
|
|
|
b = b.defaultValue;
|
|
|
if (c != null) {
|
|
|
if (b != null)
|
|
|
throw Error(y(92));
|
|
|
if (Array.isArray(c)) {
|
|
|
if (!(1 >= c.length))
|
|
|
throw Error(y(93));
|
|
|
c = c[0];
|
|
|
}
|
|
|
b = c;
|
|
|
}
|
|
|
b == null && (b = "");
|
|
|
c = b;
|
|
|
}
|
|
|
a._wrapperState = { initialValue: Sa(c) };
|
|
|
}
|
|
|
function ib(a, b) {
|
|
|
var c = Sa(b.value), d = Sa(b.defaultValue);
|
|
|
c != null && (c = "" + c, c !== a.value && (a.value = c), b.defaultValue == null && a.defaultValue !== c && (a.defaultValue = c));
|
|
|
d != null && (a.defaultValue = "" + d);
|
|
|
}
|
|
|
function jb(a) {
|
|
|
var b = a.textContent;
|
|
|
b === a._wrapperState.initialValue && b !== "" && b !== null && (a.value = b);
|
|
|
}
|
|
|
var kb = { html: "http://www.w3.org/1999/xhtml", mathml: "http://www.w3.org/1998/Math/MathML", svg: "http://www.w3.org/2000/svg" };
|
|
|
function lb(a) {
|
|
|
switch (a) {
|
|
|
case "svg":
|
|
|
return "http://www.w3.org/2000/svg";
|
|
|
case "math":
|
|
|
return "http://www.w3.org/1998/Math/MathML";
|
|
|
default:
|
|
|
return "http://www.w3.org/1999/xhtml";
|
|
|
}
|
|
|
}
|
|
|
function mb(a, b) {
|
|
|
return a == null || a === "http://www.w3.org/1999/xhtml" ? lb(b) : a === "http://www.w3.org/2000/svg" && b === "foreignObject" ? "http://www.w3.org/1999/xhtml" : a;
|
|
|
}
|
|
|
var nb, ob = function(a) {
|
|
|
return typeof MSApp !== "undefined" && MSApp.execUnsafeLocalFunction ? function(b, c, d, e) {
|
|
|
MSApp.execUnsafeLocalFunction(function() {
|
|
|
return a(b, c, d, e);
|
|
|
});
|
|
|
} : a;
|
|
|
}(function(a, b) {
|
|
|
if (a.namespaceURI !== kb.svg || "innerHTML" in a)
|
|
|
a.innerHTML = b;
|
|
|
else {
|
|
|
nb = nb || document.createElement("div");
|
|
|
nb.innerHTML = "<svg>" + b.valueOf().toString() + "</svg>";
|
|
|
for (b = nb.firstChild; a.firstChild; )
|
|
|
a.removeChild(a.firstChild);
|
|
|
for (; b.firstChild; )
|
|
|
a.appendChild(b.firstChild);
|
|
|
}
|
|
|
});
|
|
|
function pb(a, b) {
|
|
|
if (b) {
|
|
|
var c = a.firstChild;
|
|
|
if (c && c === a.lastChild && c.nodeType === 3) {
|
|
|
c.nodeValue = b;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
a.textContent = b;
|
|
|
}
|
|
|
var qb = {
|
|
|
animationIterationCount: true,
|
|
|
borderImageOutset: true,
|
|
|
borderImageSlice: true,
|
|
|
borderImageWidth: true,
|
|
|
boxFlex: true,
|
|
|
boxFlexGroup: true,
|
|
|
boxOrdinalGroup: true,
|
|
|
columnCount: true,
|
|
|
columns: true,
|
|
|
flex: true,
|
|
|
flexGrow: true,
|
|
|
flexPositive: true,
|
|
|
flexShrink: true,
|
|
|
flexNegative: true,
|
|
|
flexOrder: true,
|
|
|
gridArea: true,
|
|
|
gridRow: true,
|
|
|
gridRowEnd: true,
|
|
|
gridRowSpan: true,
|
|
|
gridRowStart: true,
|
|
|
gridColumn: true,
|
|
|
gridColumnEnd: true,
|
|
|
gridColumnSpan: true,
|
|
|
gridColumnStart: true,
|
|
|
fontWeight: true,
|
|
|
lineClamp: true,
|
|
|
lineHeight: true,
|
|
|
opacity: true,
|
|
|
order: true,
|
|
|
orphans: true,
|
|
|
tabSize: true,
|
|
|
widows: true,
|
|
|
zIndex: true,
|
|
|
zoom: true,
|
|
|
fillOpacity: true,
|
|
|
floodOpacity: true,
|
|
|
stopOpacity: true,
|
|
|
strokeDasharray: true,
|
|
|
strokeDashoffset: true,
|
|
|
strokeMiterlimit: true,
|
|
|
strokeOpacity: true,
|
|
|
strokeWidth: true
|
|
|
}, rb = ["Webkit", "ms", "Moz", "O"];
|
|
|
Object.keys(qb).forEach(function(a) {
|
|
|
rb.forEach(function(b) {
|
|
|
b = b + a.charAt(0).toUpperCase() + a.substring(1);
|
|
|
qb[b] = qb[a];
|
|
|
});
|
|
|
});
|
|
|
function sb(a, b, c) {
|
|
|
return b == null || typeof b === "boolean" || b === "" ? "" : c || typeof b !== "number" || b === 0 || qb.hasOwnProperty(a) && qb[a] ? ("" + b).trim() : b + "px";
|
|
|
}
|
|
|
function tb(a, b) {
|
|
|
a = a.style;
|
|
|
for (var c in b)
|
|
|
if (b.hasOwnProperty(c)) {
|
|
|
var d = c.indexOf("--") === 0, e = sb(c, b[c], d);
|
|
|
c === "float" && (c = "cssFloat");
|
|
|
d ? a.setProperty(c, e) : a[c] = e;
|
|
|
}
|
|
|
}
|
|
|
var ub = m$1({ menuitem: true }, { area: true, base: true, br: true, col: true, embed: true, hr: true, img: true, input: true, keygen: true, link: true, meta: true, param: true, source: true, track: true, wbr: true });
|
|
|
function vb(a, b) {
|
|
|
if (b) {
|
|
|
if (ub[a] && (b.children != null || b.dangerouslySetInnerHTML != null))
|
|
|
throw Error(y(137, a));
|
|
|
if (b.dangerouslySetInnerHTML != null) {
|
|
|
if (b.children != null)
|
|
|
throw Error(y(60));
|
|
|
if (!(typeof b.dangerouslySetInnerHTML === "object" && "__html" in b.dangerouslySetInnerHTML))
|
|
|
throw Error(y(61));
|
|
|
}
|
|
|
if (b.style != null && typeof b.style !== "object")
|
|
|
throw Error(y(62));
|
|
|
}
|
|
|
}
|
|
|
function wb(a, b) {
|
|
|
if (a.indexOf("-") === -1)
|
|
|
return typeof b.is === "string";
|
|
|
switch (a) {
|
|
|
case "annotation-xml":
|
|
|
case "color-profile":
|
|
|
case "font-face":
|
|
|
case "font-face-src":
|
|
|
case "font-face-uri":
|
|
|
case "font-face-format":
|
|
|
case "font-face-name":
|
|
|
case "missing-glyph":
|
|
|
return false;
|
|
|
default:
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
function xb(a) {
|
|
|
a = a.target || a.srcElement || window;
|
|
|
a.correspondingUseElement && (a = a.correspondingUseElement);
|
|
|
return a.nodeType === 3 ? a.parentNode : a;
|
|
|
}
|
|
|
var yb = null, zb = null, Ab = null;
|
|
|
function Bb(a) {
|
|
|
if (a = Cb(a)) {
|
|
|
if (typeof yb !== "function")
|
|
|
throw Error(y(280));
|
|
|
var b = a.stateNode;
|
|
|
b && (b = Db(b), yb(a.stateNode, a.type, b));
|
|
|
}
|
|
|
}
|
|
|
function Eb(a) {
|
|
|
zb ? Ab ? Ab.push(a) : Ab = [a] : zb = a;
|
|
|
}
|
|
|
function Fb() {
|
|
|
if (zb) {
|
|
|
var a = zb, b = Ab;
|
|
|
Ab = zb = null;
|
|
|
Bb(a);
|
|
|
if (b)
|
|
|
for (a = 0; a < b.length; a++)
|
|
|
Bb(b[a]);
|
|
|
}
|
|
|
}
|
|
|
function Gb(a, b) {
|
|
|
return a(b);
|
|
|
}
|
|
|
function Hb(a, b, c, d, e) {
|
|
|
return a(b, c, d, e);
|
|
|
}
|
|
|
function Ib() {
|
|
|
}
|
|
|
var Jb = Gb, Kb = false, Lb = false;
|
|
|
function Mb() {
|
|
|
if (zb !== null || Ab !== null)
|
|
|
Ib(), Fb();
|
|
|
}
|
|
|
function Nb(a, b, c) {
|
|
|
if (Lb)
|
|
|
return a(b, c);
|
|
|
Lb = true;
|
|
|
try {
|
|
|
return Jb(a, b, c);
|
|
|
} finally {
|
|
|
Lb = false, Mb();
|
|
|
}
|
|
|
}
|
|
|
function Ob(a, b) {
|
|
|
var c = a.stateNode;
|
|
|
if (c === null)
|
|
|
return null;
|
|
|
var d = Db(c);
|
|
|
if (d === null)
|
|
|
return null;
|
|
|
c = d[b];
|
|
|
a:
|
|
|
switch (b) {
|
|
|
case "onClick":
|
|
|
case "onClickCapture":
|
|
|
case "onDoubleClick":
|
|
|
case "onDoubleClickCapture":
|
|
|
case "onMouseDown":
|
|
|
case "onMouseDownCapture":
|
|
|
case "onMouseMove":
|
|
|
case "onMouseMoveCapture":
|
|
|
case "onMouseUp":
|
|
|
case "onMouseUpCapture":
|
|
|
case "onMouseEnter":
|
|
|
(d = !d.disabled) || (a = a.type, d = !(a === "button" || a === "input" || a === "select" || a === "textarea"));
|
|
|
a = !d;
|
|
|
break a;
|
|
|
default:
|
|
|
a = false;
|
|
|
}
|
|
|
if (a)
|
|
|
return null;
|
|
|
if (c && typeof c !== "function")
|
|
|
throw Error(y(231, b, typeof c));
|
|
|
return c;
|
|
|
}
|
|
|
var Pb = false;
|
|
|
if (fa)
|
|
|
try {
|
|
|
var Qb = {};
|
|
|
Object.defineProperty(Qb, "passive", { get: function() {
|
|
|
Pb = true;
|
|
|
} });
|
|
|
window.addEventListener("test", Qb, Qb);
|
|
|
window.removeEventListener("test", Qb, Qb);
|
|
|
} catch (a) {
|
|
|
Pb = false;
|
|
|
}
|
|
|
function Rb(a, b, c, d, e, f2, g2, h2, k) {
|
|
|
var l2 = Array.prototype.slice.call(arguments, 3);
|
|
|
try {
|
|
|
b.apply(c, l2);
|
|
|
} catch (n2) {
|
|
|
this.onError(n2);
|
|
|
}
|
|
|
}
|
|
|
var Sb = false, Tb = null, Ub = false, Vb = null, Wb = { onError: function(a) {
|
|
|
Sb = true;
|
|
|
Tb = a;
|
|
|
} };
|
|
|
function Xb(a, b, c, d, e, f2, g2, h2, k) {
|
|
|
Sb = false;
|
|
|
Tb = null;
|
|
|
Rb.apply(Wb, arguments);
|
|
|
}
|
|
|
function Yb(a, b, c, d, e, f2, g2, h2, k) {
|
|
|
Xb.apply(this, arguments);
|
|
|
if (Sb) {
|
|
|
if (Sb) {
|
|
|
var l2 = Tb;
|
|
|
Sb = false;
|
|
|
Tb = null;
|
|
|
} else
|
|
|
throw Error(y(198));
|
|
|
Ub || (Ub = true, Vb = l2);
|
|
|
}
|
|
|
}
|
|
|
function Zb(a) {
|
|
|
var b = a, c = a;
|
|
|
if (a.alternate)
|
|
|
for (; b.return; )
|
|
|
b = b.return;
|
|
|
else {
|
|
|
a = b;
|
|
|
do
|
|
|
b = a, (b.flags & 1026) !== 0 && (c = b.return), a = b.return;
|
|
|
while (a);
|
|
|
}
|
|
|
return b.tag === 3 ? c : null;
|
|
|
}
|
|
|
function $b(a) {
|
|
|
if (a.tag === 13) {
|
|
|
var b = a.memoizedState;
|
|
|
b === null && (a = a.alternate, a !== null && (b = a.memoizedState));
|
|
|
if (b !== null)
|
|
|
return b.dehydrated;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function ac(a) {
|
|
|
if (Zb(a) !== a)
|
|
|
throw Error(y(188));
|
|
|
}
|
|
|
function bc(a) {
|
|
|
var b = a.alternate;
|
|
|
if (!b) {
|
|
|
b = Zb(a);
|
|
|
if (b === null)
|
|
|
throw Error(y(188));
|
|
|
return b !== a ? null : a;
|
|
|
}
|
|
|
for (var c = a, d = b; ; ) {
|
|
|
var e = c.return;
|
|
|
if (e === null)
|
|
|
break;
|
|
|
var f2 = e.alternate;
|
|
|
if (f2 === null) {
|
|
|
d = e.return;
|
|
|
if (d !== null) {
|
|
|
c = d;
|
|
|
continue;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
if (e.child === f2.child) {
|
|
|
for (f2 = e.child; f2; ) {
|
|
|
if (f2 === c)
|
|
|
return ac(e), a;
|
|
|
if (f2 === d)
|
|
|
return ac(e), b;
|
|
|
f2 = f2.sibling;
|
|
|
}
|
|
|
throw Error(y(188));
|
|
|
}
|
|
|
if (c.return !== d.return)
|
|
|
c = e, d = f2;
|
|
|
else {
|
|
|
for (var g2 = false, h2 = e.child; h2; ) {
|
|
|
if (h2 === c) {
|
|
|
g2 = true;
|
|
|
c = e;
|
|
|
d = f2;
|
|
|
break;
|
|
|
}
|
|
|
if (h2 === d) {
|
|
|
g2 = true;
|
|
|
d = e;
|
|
|
c = f2;
|
|
|
break;
|
|
|
}
|
|
|
h2 = h2.sibling;
|
|
|
}
|
|
|
if (!g2) {
|
|
|
for (h2 = f2.child; h2; ) {
|
|
|
if (h2 === c) {
|
|
|
g2 = true;
|
|
|
c = f2;
|
|
|
d = e;
|
|
|
break;
|
|
|
}
|
|
|
if (h2 === d) {
|
|
|
g2 = true;
|
|
|
d = f2;
|
|
|
c = e;
|
|
|
break;
|
|
|
}
|
|
|
h2 = h2.sibling;
|
|
|
}
|
|
|
if (!g2)
|
|
|
throw Error(y(189));
|
|
|
}
|
|
|
}
|
|
|
if (c.alternate !== d)
|
|
|
throw Error(y(190));
|
|
|
}
|
|
|
if (c.tag !== 3)
|
|
|
throw Error(y(188));
|
|
|
return c.stateNode.current === c ? a : b;
|
|
|
}
|
|
|
function cc(a) {
|
|
|
a = bc(a);
|
|
|
if (!a)
|
|
|
return null;
|
|
|
for (var b = a; ; ) {
|
|
|
if (b.tag === 5 || b.tag === 6)
|
|
|
return b;
|
|
|
if (b.child)
|
|
|
b.child.return = b, b = b.child;
|
|
|
else {
|
|
|
if (b === a)
|
|
|
break;
|
|
|
for (; !b.sibling; ) {
|
|
|
if (!b.return || b.return === a)
|
|
|
return null;
|
|
|
b = b.return;
|
|
|
}
|
|
|
b.sibling.return = b.return;
|
|
|
b = b.sibling;
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function dc(a, b) {
|
|
|
for (var c = a.alternate; b !== null; ) {
|
|
|
if (b === a || b === c)
|
|
|
return true;
|
|
|
b = b.return;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
var ec, fc, gc, hc, ic = false, jc = [], kc = null, lc = null, mc = null, nc = new Map(), oc = new Map(), pc = [], qc = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");
|
|
|
function rc(a, b, c, d, e) {
|
|
|
return { blockedOn: a, domEventName: b, eventSystemFlags: c | 16, nativeEvent: e, targetContainers: [d] };
|
|
|
}
|
|
|
function sc(a, b) {
|
|
|
switch (a) {
|
|
|
case "focusin":
|
|
|
case "focusout":
|
|
|
kc = null;
|
|
|
break;
|
|
|
case "dragenter":
|
|
|
case "dragleave":
|
|
|
lc = null;
|
|
|
break;
|
|
|
case "mouseover":
|
|
|
case "mouseout":
|
|
|
mc = null;
|
|
|
break;
|
|
|
case "pointerover":
|
|
|
case "pointerout":
|
|
|
nc.delete(b.pointerId);
|
|
|
break;
|
|
|
case "gotpointercapture":
|
|
|
case "lostpointercapture":
|
|
|
oc.delete(b.pointerId);
|
|
|
}
|
|
|
}
|
|
|
function tc(a, b, c, d, e, f2) {
|
|
|
if (a === null || a.nativeEvent !== f2)
|
|
|
return a = rc(b, c, d, e, f2), b !== null && (b = Cb(b), b !== null && fc(b)), a;
|
|
|
a.eventSystemFlags |= d;
|
|
|
b = a.targetContainers;
|
|
|
e !== null && b.indexOf(e) === -1 && b.push(e);
|
|
|
return a;
|
|
|
}
|
|
|
function uc(a, b, c, d, e) {
|
|
|
switch (b) {
|
|
|
case "focusin":
|
|
|
return kc = tc(kc, a, b, c, d, e), true;
|
|
|
case "dragenter":
|
|
|
return lc = tc(lc, a, b, c, d, e), true;
|
|
|
case "mouseover":
|
|
|
return mc = tc(mc, a, b, c, d, e), true;
|
|
|
case "pointerover":
|
|
|
var f2 = e.pointerId;
|
|
|
nc.set(f2, tc(nc.get(f2) || null, a, b, c, d, e));
|
|
|
return true;
|
|
|
case "gotpointercapture":
|
|
|
return f2 = e.pointerId, oc.set(f2, tc(oc.get(f2) || null, a, b, c, d, e)), true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function vc(a) {
|
|
|
var b = wc(a.target);
|
|
|
if (b !== null) {
|
|
|
var c = Zb(b);
|
|
|
if (c !== null) {
|
|
|
if (b = c.tag, b === 13) {
|
|
|
if (b = $b(c), b !== null) {
|
|
|
a.blockedOn = b;
|
|
|
hc(a.lanePriority, function() {
|
|
|
r.unstable_runWithPriority(a.priority, function() {
|
|
|
gc(c);
|
|
|
});
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
} else if (b === 3 && c.stateNode.hydrate) {
|
|
|
a.blockedOn = c.tag === 3 ? c.stateNode.containerInfo : null;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
a.blockedOn = null;
|
|
|
}
|
|
|
function xc(a) {
|
|
|
if (a.blockedOn !== null)
|
|
|
return false;
|
|
|
for (var b = a.targetContainers; 0 < b.length; ) {
|
|
|
var c = yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent);
|
|
|
if (c !== null)
|
|
|
return b = Cb(c), b !== null && fc(b), a.blockedOn = c, false;
|
|
|
b.shift();
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
function zc(a, b, c) {
|
|
|
xc(a) && c.delete(b);
|
|
|
}
|
|
|
function Ac() {
|
|
|
for (ic = false; 0 < jc.length; ) {
|
|
|
var a = jc[0];
|
|
|
if (a.blockedOn !== null) {
|
|
|
a = Cb(a.blockedOn);
|
|
|
a !== null && ec(a);
|
|
|
break;
|
|
|
}
|
|
|
for (var b = a.targetContainers; 0 < b.length; ) {
|
|
|
var c = yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent);
|
|
|
if (c !== null) {
|
|
|
a.blockedOn = c;
|
|
|
break;
|
|
|
}
|
|
|
b.shift();
|
|
|
}
|
|
|
a.blockedOn === null && jc.shift();
|
|
|
}
|
|
|
kc !== null && xc(kc) && (kc = null);
|
|
|
lc !== null && xc(lc) && (lc = null);
|
|
|
mc !== null && xc(mc) && (mc = null);
|
|
|
nc.forEach(zc);
|
|
|
oc.forEach(zc);
|
|
|
}
|
|
|
function Bc(a, b) {
|
|
|
a.blockedOn === b && (a.blockedOn = null, ic || (ic = true, r.unstable_scheduleCallback(r.unstable_NormalPriority, Ac)));
|
|
|
}
|
|
|
function Cc(a) {
|
|
|
function b(b2) {
|
|
|
return Bc(b2, a);
|
|
|
}
|
|
|
if (0 < jc.length) {
|
|
|
Bc(jc[0], a);
|
|
|
for (var c = 1; c < jc.length; c++) {
|
|
|
var d = jc[c];
|
|
|
d.blockedOn === a && (d.blockedOn = null);
|
|
|
}
|
|
|
}
|
|
|
kc !== null && Bc(kc, a);
|
|
|
lc !== null && Bc(lc, a);
|
|
|
mc !== null && Bc(mc, a);
|
|
|
nc.forEach(b);
|
|
|
oc.forEach(b);
|
|
|
for (c = 0; c < pc.length; c++)
|
|
|
d = pc[c], d.blockedOn === a && (d.blockedOn = null);
|
|
|
for (; 0 < pc.length && (c = pc[0], c.blockedOn === null); )
|
|
|
vc(c), c.blockedOn === null && pc.shift();
|
|
|
}
|
|
|
function Dc(a, b) {
|
|
|
var c = {};
|
|
|
c[a.toLowerCase()] = b.toLowerCase();
|
|
|
c["Webkit" + a] = "webkit" + b;
|
|
|
c["Moz" + a] = "moz" + b;
|
|
|
return c;
|
|
|
}
|
|
|
var Ec = { animationend: Dc("Animation", "AnimationEnd"), animationiteration: Dc("Animation", "AnimationIteration"), animationstart: Dc("Animation", "AnimationStart"), transitionend: Dc("Transition", "TransitionEnd") }, Fc = {}, Gc = {};
|
|
|
fa && (Gc = document.createElement("div").style, "AnimationEvent" in window || (delete Ec.animationend.animation, delete Ec.animationiteration.animation, delete Ec.animationstart.animation), "TransitionEvent" in window || delete Ec.transitionend.transition);
|
|
|
function Hc(a) {
|
|
|
if (Fc[a])
|
|
|
return Fc[a];
|
|
|
if (!Ec[a])
|
|
|
return a;
|
|
|
var b = Ec[a], c;
|
|
|
for (c in b)
|
|
|
if (b.hasOwnProperty(c) && c in Gc)
|
|
|
return Fc[a] = b[c];
|
|
|
return a;
|
|
|
}
|
|
|
var Ic = Hc("animationend"), Jc = Hc("animationiteration"), Kc = Hc("animationstart"), Lc = Hc("transitionend"), Mc = new Map(), Nc = new Map(), Oc = [
|
|
|
"abort",
|
|
|
"abort",
|
|
|
Ic,
|
|
|
"animationEnd",
|
|
|
Jc,
|
|
|
"animationIteration",
|
|
|
Kc,
|
|
|
"animationStart",
|
|
|
"canplay",
|
|
|
"canPlay",
|
|
|
"canplaythrough",
|
|
|
"canPlayThrough",
|
|
|
"durationchange",
|
|
|
"durationChange",
|
|
|
"emptied",
|
|
|
"emptied",
|
|
|
"encrypted",
|
|
|
"encrypted",
|
|
|
"ended",
|
|
|
"ended",
|
|
|
"error",
|
|
|
"error",
|
|
|
"gotpointercapture",
|
|
|
"gotPointerCapture",
|
|
|
"load",
|
|
|
"load",
|
|
|
"loadeddata",
|
|
|
"loadedData",
|
|
|
"loadedmetadata",
|
|
|
"loadedMetadata",
|
|
|
"loadstart",
|
|
|
"loadStart",
|
|
|
"lostpointercapture",
|
|
|
"lostPointerCapture",
|
|
|
"playing",
|
|
|
"playing",
|
|
|
"progress",
|
|
|
"progress",
|
|
|
"seeking",
|
|
|
"seeking",
|
|
|
"stalled",
|
|
|
"stalled",
|
|
|
"suspend",
|
|
|
"suspend",
|
|
|
"timeupdate",
|
|
|
"timeUpdate",
|
|
|
Lc,
|
|
|
"transitionEnd",
|
|
|
"waiting",
|
|
|
"waiting"
|
|
|
];
|
|
|
function Pc(a, b) {
|
|
|
for (var c = 0; c < a.length; c += 2) {
|
|
|
var d = a[c], e = a[c + 1];
|
|
|
e = "on" + (e[0].toUpperCase() + e.slice(1));
|
|
|
Nc.set(d, b);
|
|
|
Mc.set(d, e);
|
|
|
da$1(e, [d]);
|
|
|
}
|
|
|
}
|
|
|
var Qc = r.unstable_now;
|
|
|
Qc();
|
|
|
var F = 8;
|
|
|
function Rc(a) {
|
|
|
if ((1 & a) !== 0)
|
|
|
return F = 15, 1;
|
|
|
if ((2 & a) !== 0)
|
|
|
return F = 14, 2;
|
|
|
if ((4 & a) !== 0)
|
|
|
return F = 13, 4;
|
|
|
var b = 24 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 12, b;
|
|
|
if ((a & 32) !== 0)
|
|
|
return F = 11, 32;
|
|
|
b = 192 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 10, b;
|
|
|
if ((a & 256) !== 0)
|
|
|
return F = 9, 256;
|
|
|
b = 3584 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 8, b;
|
|
|
if ((a & 4096) !== 0)
|
|
|
return F = 7, 4096;
|
|
|
b = 4186112 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 6, b;
|
|
|
b = 62914560 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 5, b;
|
|
|
if (a & 67108864)
|
|
|
return F = 4, 67108864;
|
|
|
if ((a & 134217728) !== 0)
|
|
|
return F = 3, 134217728;
|
|
|
b = 805306368 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 2, b;
|
|
|
if ((1073741824 & a) !== 0)
|
|
|
return F = 1, 1073741824;
|
|
|
F = 8;
|
|
|
return a;
|
|
|
}
|
|
|
function Sc(a) {
|
|
|
switch (a) {
|
|
|
case 99:
|
|
|
return 15;
|
|
|
case 98:
|
|
|
return 10;
|
|
|
case 97:
|
|
|
case 96:
|
|
|
return 8;
|
|
|
case 95:
|
|
|
return 2;
|
|
|
default:
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
function Tc(a) {
|
|
|
switch (a) {
|
|
|
case 15:
|
|
|
case 14:
|
|
|
return 99;
|
|
|
case 13:
|
|
|
case 12:
|
|
|
case 11:
|
|
|
case 10:
|
|
|
return 98;
|
|
|
case 9:
|
|
|
case 8:
|
|
|
case 7:
|
|
|
case 6:
|
|
|
case 4:
|
|
|
case 5:
|
|
|
return 97;
|
|
|
case 3:
|
|
|
case 2:
|
|
|
case 1:
|
|
|
return 95;
|
|
|
case 0:
|
|
|
return 90;
|
|
|
default:
|
|
|
throw Error(y(358, a));
|
|
|
}
|
|
|
}
|
|
|
function Uc(a, b) {
|
|
|
var c = a.pendingLanes;
|
|
|
if (c === 0)
|
|
|
return F = 0;
|
|
|
var d = 0, e = 0, f2 = a.expiredLanes, g2 = a.suspendedLanes, h2 = a.pingedLanes;
|
|
|
if (f2 !== 0)
|
|
|
d = f2, e = F = 15;
|
|
|
else if (f2 = c & 134217727, f2 !== 0) {
|
|
|
var k = f2 & ~g2;
|
|
|
k !== 0 ? (d = Rc(k), e = F) : (h2 &= f2, h2 !== 0 && (d = Rc(h2), e = F));
|
|
|
} else
|
|
|
f2 = c & ~g2, f2 !== 0 ? (d = Rc(f2), e = F) : h2 !== 0 && (d = Rc(h2), e = F);
|
|
|
if (d === 0)
|
|
|
return 0;
|
|
|
d = 31 - Vc(d);
|
|
|
d = c & ((0 > d ? 0 : 1 << d) << 1) - 1;
|
|
|
if (b !== 0 && b !== d && (b & g2) === 0) {
|
|
|
Rc(b);
|
|
|
if (e <= F)
|
|
|
return b;
|
|
|
F = e;
|
|
|
}
|
|
|
b = a.entangledLanes;
|
|
|
if (b !== 0)
|
|
|
for (a = a.entanglements, b &= d; 0 < b; )
|
|
|
c = 31 - Vc(b), e = 1 << c, d |= a[c], b &= ~e;
|
|
|
return d;
|
|
|
}
|
|
|
function Wc(a) {
|
|
|
a = a.pendingLanes & -1073741825;
|
|
|
return a !== 0 ? a : a & 1073741824 ? 1073741824 : 0;
|
|
|
}
|
|
|
function Xc(a, b) {
|
|
|
switch (a) {
|
|
|
case 15:
|
|
|
return 1;
|
|
|
case 14:
|
|
|
return 2;
|
|
|
case 12:
|
|
|
return a = Yc(24 & ~b), a === 0 ? Xc(10, b) : a;
|
|
|
case 10:
|
|
|
return a = Yc(192 & ~b), a === 0 ? Xc(8, b) : a;
|
|
|
case 8:
|
|
|
return a = Yc(3584 & ~b), a === 0 && (a = Yc(4186112 & ~b), a === 0 && (a = 512)), a;
|
|
|
case 2:
|
|
|
return b = Yc(805306368 & ~b), b === 0 && (b = 268435456), b;
|
|
|
}
|
|
|
throw Error(y(358, a));
|
|
|
}
|
|
|
function Yc(a) {
|
|
|
return a & -a;
|
|
|
}
|
|
|
function Zc(a) {
|
|
|
for (var b = [], c = 0; 31 > c; c++)
|
|
|
b.push(a);
|
|
|
return b;
|
|
|
}
|
|
|
function $c(a, b, c) {
|
|
|
a.pendingLanes |= b;
|
|
|
var d = b - 1;
|
|
|
a.suspendedLanes &= d;
|
|
|
a.pingedLanes &= d;
|
|
|
a = a.eventTimes;
|
|
|
b = 31 - Vc(b);
|
|
|
a[b] = c;
|
|
|
}
|
|
|
var Vc = Math.clz32 ? Math.clz32 : ad, bd = Math.log, cd = Math.LN2;
|
|
|
function ad(a) {
|
|
|
return a === 0 ? 32 : 31 - (bd(a) / cd | 0) | 0;
|
|
|
}
|
|
|
var dd = r.unstable_UserBlockingPriority, ed = r.unstable_runWithPriority, fd = true;
|
|
|
function gd(a, b, c, d) {
|
|
|
Kb || Ib();
|
|
|
var e = hd, f2 = Kb;
|
|
|
Kb = true;
|
|
|
try {
|
|
|
Hb(e, a, b, c, d);
|
|
|
} finally {
|
|
|
(Kb = f2) || Mb();
|
|
|
}
|
|
|
}
|
|
|
function id$2(a, b, c, d) {
|
|
|
ed(dd, hd.bind(null, a, b, c, d));
|
|
|
}
|
|
|
function hd(a, b, c, d) {
|
|
|
if (fd) {
|
|
|
var e;
|
|
|
if ((e = (b & 4) === 0) && 0 < jc.length && -1 < qc.indexOf(a))
|
|
|
a = rc(null, a, b, c, d), jc.push(a);
|
|
|
else {
|
|
|
var f2 = yc(a, b, c, d);
|
|
|
if (f2 === null)
|
|
|
e && sc(a, d);
|
|
|
else {
|
|
|
if (e) {
|
|
|
if (-1 < qc.indexOf(a)) {
|
|
|
a = rc(f2, a, b, c, d);
|
|
|
jc.push(a);
|
|
|
return;
|
|
|
}
|
|
|
if (uc(f2, a, b, c, d))
|
|
|
return;
|
|
|
sc(a, d);
|
|
|
}
|
|
|
jd(a, b, d, null, c);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
function yc(a, b, c, d) {
|
|
|
var e = xb(d);
|
|
|
e = wc(e);
|
|
|
if (e !== null) {
|
|
|
var f2 = Zb(e);
|
|
|
if (f2 === null)
|
|
|
e = null;
|
|
|
else {
|
|
|
var g2 = f2.tag;
|
|
|
if (g2 === 13) {
|
|
|
e = $b(f2);
|
|
|
if (e !== null)
|
|
|
return e;
|
|
|
e = null;
|
|
|
} else if (g2 === 3) {
|
|
|
if (f2.stateNode.hydrate)
|
|
|
return f2.tag === 3 ? f2.stateNode.containerInfo : null;
|
|
|
e = null;
|
|
|
} else
|
|
|
f2 !== e && (e = null);
|
|
|
}
|
|
|
}
|
|
|
jd(a, b, d, e, c);
|
|
|
return null;
|
|
|
}
|
|
|
var kd = null, ld = null, md = null;
|
|
|
function nd() {
|
|
|
if (md)
|
|
|
return md;
|
|
|
var a, b = ld, c = b.length, d, e = "value" in kd ? kd.value : kd.textContent, f2 = e.length;
|
|
|
for (a = 0; a < c && b[a] === e[a]; a++)
|
|
|
;
|
|
|
var g2 = c - a;
|
|
|
for (d = 1; d <= g2 && b[c - d] === e[f2 - d]; d++)
|
|
|
;
|
|
|
return md = e.slice(a, 1 < d ? 1 - d : void 0);
|
|
|
}
|
|
|
function od(a) {
|
|
|
var b = a.keyCode;
|
|
|
"charCode" in a ? (a = a.charCode, a === 0 && b === 13 && (a = 13)) : a = b;
|
|
|
a === 10 && (a = 13);
|
|
|
return 32 <= a || a === 13 ? a : 0;
|
|
|
}
|
|
|
function pd() {
|
|
|
return true;
|
|
|
}
|
|
|
function qd() {
|
|
|
return false;
|
|
|
}
|
|
|
function rd(a) {
|
|
|
function b(b2, d, e, f2, g2) {
|
|
|
this._reactName = b2;
|
|
|
this._targetInst = e;
|
|
|
this.type = d;
|
|
|
this.nativeEvent = f2;
|
|
|
this.target = g2;
|
|
|
this.currentTarget = null;
|
|
|
for (var c in a)
|
|
|
a.hasOwnProperty(c) && (b2 = a[c], this[c] = b2 ? b2(f2) : f2[c]);
|
|
|
this.isDefaultPrevented = (f2.defaultPrevented != null ? f2.defaultPrevented : f2.returnValue === false) ? pd : qd;
|
|
|
this.isPropagationStopped = qd;
|
|
|
return this;
|
|
|
}
|
|
|
m$1(b.prototype, { preventDefault: function() {
|
|
|
this.defaultPrevented = true;
|
|
|
var a2 = this.nativeEvent;
|
|
|
a2 && (a2.preventDefault ? a2.preventDefault() : typeof a2.returnValue !== "unknown" && (a2.returnValue = false), this.isDefaultPrevented = pd);
|
|
|
}, stopPropagation: function() {
|
|
|
var a2 = this.nativeEvent;
|
|
|
a2 && (a2.stopPropagation ? a2.stopPropagation() : typeof a2.cancelBubble !== "unknown" && (a2.cancelBubble = true), this.isPropagationStopped = pd);
|
|
|
}, persist: function() {
|
|
|
}, isPersistent: pd });
|
|
|
return b;
|
|
|
}
|
|
|
var sd = { eventPhase: 0, bubbles: 0, cancelable: 0, timeStamp: function(a) {
|
|
|
return a.timeStamp || Date.now();
|
|
|
}, defaultPrevented: 0, isTrusted: 0 }, td = rd(sd), ud = m$1({}, sd, { view: 0, detail: 0 }), vd = rd(ud), wd, xd, yd, Ad = m$1({}, ud, { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, getModifierState: zd, button: 0, buttons: 0, relatedTarget: function(a) {
|
|
|
return a.relatedTarget === void 0 ? a.fromElement === a.srcElement ? a.toElement : a.fromElement : a.relatedTarget;
|
|
|
}, movementX: function(a) {
|
|
|
if ("movementX" in a)
|
|
|
return a.movementX;
|
|
|
a !== yd && (yd && a.type === "mousemove" ? (wd = a.screenX - yd.screenX, xd = a.screenY - yd.screenY) : xd = wd = 0, yd = a);
|
|
|
return wd;
|
|
|
}, movementY: function(a) {
|
|
|
return "movementY" in a ? a.movementY : xd;
|
|
|
} }), Bd = rd(Ad), Cd = m$1({}, Ad, { dataTransfer: 0 }), Dd = rd(Cd), Ed = m$1({}, ud, { relatedTarget: 0 }), Fd = rd(Ed), Gd = m$1({}, sd, { animationName: 0, elapsedTime: 0, pseudoElement: 0 }), Hd = rd(Gd), Id = m$1({}, sd, { clipboardData: function(a) {
|
|
|
return "clipboardData" in a ? a.clipboardData : window.clipboardData;
|
|
|
} }), Jd = rd(Id), Kd = m$1({}, sd, { data: 0 }), Ld = rd(Kd), Md = {
|
|
|
Esc: "Escape",
|
|
|
Spacebar: " ",
|
|
|
Left: "ArrowLeft",
|
|
|
Up: "ArrowUp",
|
|
|
Right: "ArrowRight",
|
|
|
Down: "ArrowDown",
|
|
|
Del: "Delete",
|
|
|
Win: "OS",
|
|
|
Menu: "ContextMenu",
|
|
|
Apps: "ContextMenu",
|
|
|
Scroll: "ScrollLock",
|
|
|
MozPrintableKey: "Unidentified"
|
|
|
}, Nd = {
|
|
|
8: "Backspace",
|
|
|
9: "Tab",
|
|
|
12: "Clear",
|
|
|
13: "Enter",
|
|
|
16: "Shift",
|
|
|
17: "Control",
|
|
|
18: "Alt",
|
|
|
19: "Pause",
|
|
|
20: "CapsLock",
|
|
|
27: "Escape",
|
|
|
32: " ",
|
|
|
33: "PageUp",
|
|
|
34: "PageDown",
|
|
|
35: "End",
|
|
|
36: "Home",
|
|
|
37: "ArrowLeft",
|
|
|
38: "ArrowUp",
|
|
|
39: "ArrowRight",
|
|
|
40: "ArrowDown",
|
|
|
45: "Insert",
|
|
|
46: "Delete",
|
|
|
112: "F1",
|
|
|
113: "F2",
|
|
|
114: "F3",
|
|
|
115: "F4",
|
|
|
116: "F5",
|
|
|
117: "F6",
|
|
|
118: "F7",
|
|
|
119: "F8",
|
|
|
120: "F9",
|
|
|
121: "F10",
|
|
|
122: "F11",
|
|
|
123: "F12",
|
|
|
144: "NumLock",
|
|
|
145: "ScrollLock",
|
|
|
224: "Meta"
|
|
|
}, Od = { Alt: "altKey", Control: "ctrlKey", Meta: "metaKey", Shift: "shiftKey" };
|
|
|
function Pd(a) {
|
|
|
var b = this.nativeEvent;
|
|
|
return b.getModifierState ? b.getModifierState(a) : (a = Od[a]) ? !!b[a] : false;
|
|
|
}
|
|
|
function zd() {
|
|
|
return Pd;
|
|
|
}
|
|
|
var Qd = m$1({}, ud, { key: function(a) {
|
|
|
if (a.key) {
|
|
|
var b = Md[a.key] || a.key;
|
|
|
if (b !== "Unidentified")
|
|
|
return b;
|
|
|
}
|
|
|
return a.type === "keypress" ? (a = od(a), a === 13 ? "Enter" : String.fromCharCode(a)) : a.type === "keydown" || a.type === "keyup" ? Nd[a.keyCode] || "Unidentified" : "";
|
|
|
}, code: 0, location: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, repeat: 0, locale: 0, getModifierState: zd, charCode: function(a) {
|
|
|
return a.type === "keypress" ? od(a) : 0;
|
|
|
}, keyCode: function(a) {
|
|
|
return a.type === "keydown" || a.type === "keyup" ? a.keyCode : 0;
|
|
|
}, which: function(a) {
|
|
|
return a.type === "keypress" ? od(a) : a.type === "keydown" || a.type === "keyup" ? a.keyCode : 0;
|
|
|
} }), Rd = rd(Qd), Sd = m$1({}, Ad, { pointerId: 0, width: 0, height: 0, pressure: 0, tangentialPressure: 0, tiltX: 0, tiltY: 0, twist: 0, pointerType: 0, isPrimary: 0 }), Td = rd(Sd), Ud = m$1({}, ud, { touches: 0, targetTouches: 0, changedTouches: 0, altKey: 0, metaKey: 0, ctrlKey: 0, shiftKey: 0, getModifierState: zd }), Vd = rd(Ud), Wd = m$1({}, sd, { propertyName: 0, elapsedTime: 0, pseudoElement: 0 }), Xd = rd(Wd), Yd = m$1({}, Ad, {
|
|
|
deltaX: function(a) {
|
|
|
return "deltaX" in a ? a.deltaX : "wheelDeltaX" in a ? -a.wheelDeltaX : 0;
|
|
|
},
|
|
|
deltaY: function(a) {
|
|
|
return "deltaY" in a ? a.deltaY : "wheelDeltaY" in a ? -a.wheelDeltaY : "wheelDelta" in a ? -a.wheelDelta : 0;
|
|
|
},
|
|
|
deltaZ: 0,
|
|
|
deltaMode: 0
|
|
|
}), Zd = rd(Yd), $d = [9, 13, 27, 32], ae = fa && "CompositionEvent" in window, be = null;
|
|
|
fa && "documentMode" in document && (be = document.documentMode);
|
|
|
var ce = fa && "TextEvent" in window && !be, de$1 = fa && (!ae || be && 8 < be && 11 >= be), ee = String.fromCharCode(32), fe = false;
|
|
|
function ge(a, b) {
|
|
|
switch (a) {
|
|
|
case "keyup":
|
|
|
return $d.indexOf(b.keyCode) !== -1;
|
|
|
case "keydown":
|
|
|
return b.keyCode !== 229;
|
|
|
case "keypress":
|
|
|
case "mousedown":
|
|
|
case "focusout":
|
|
|
return true;
|
|
|
default:
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function he(a) {
|
|
|
a = a.detail;
|
|
|
return typeof a === "object" && "data" in a ? a.data : null;
|
|
|
}
|
|
|
var ie = false;
|
|
|
function je(a, b) {
|
|
|
switch (a) {
|
|
|
case "compositionend":
|
|
|
return he(b);
|
|
|
case "keypress":
|
|
|
if (b.which !== 32)
|
|
|
return null;
|
|
|
fe = true;
|
|
|
return ee;
|
|
|
case "textInput":
|
|
|
return a = b.data, a === ee && fe ? null : a;
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
function ke(a, b) {
|
|
|
if (ie)
|
|
|
return a === "compositionend" || !ae && ge(a, b) ? (a = nd(), md = ld = kd = null, ie = false, a) : null;
|
|
|
switch (a) {
|
|
|
case "paste":
|
|
|
return null;
|
|
|
case "keypress":
|
|
|
if (!(b.ctrlKey || b.altKey || b.metaKey) || b.ctrlKey && b.altKey) {
|
|
|
if (b.char && 1 < b.char.length)
|
|
|
return b.char;
|
|
|
if (b.which)
|
|
|
return String.fromCharCode(b.which);
|
|
|
}
|
|
|
return null;
|
|
|
case "compositionend":
|
|
|
return de$1 && b.locale !== "ko" ? null : b.data;
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
var le = { color: true, date: true, datetime: true, "datetime-local": true, email: true, month: true, number: true, password: true, range: true, search: true, tel: true, text: true, time: true, url: true, week: true };
|
|
|
function me(a) {
|
|
|
var b = a && a.nodeName && a.nodeName.toLowerCase();
|
|
|
return b === "input" ? !!le[a.type] : b === "textarea" ? true : false;
|
|
|
}
|
|
|
function ne(a, b, c, d) {
|
|
|
Eb(d);
|
|
|
b = oe(b, "onChange");
|
|
|
0 < b.length && (c = new td("onChange", "change", null, c, d), a.push({ event: c, listeners: b }));
|
|
|
}
|
|
|
var pe = null, qe = null;
|
|
|
function re(a) {
|
|
|
se(a, 0);
|
|
|
}
|
|
|
function te(a) {
|
|
|
var b = ue(a);
|
|
|
if (Wa(b))
|
|
|
return a;
|
|
|
}
|
|
|
function ve(a, b) {
|
|
|
if (a === "change")
|
|
|
return b;
|
|
|
}
|
|
|
var we = false;
|
|
|
if (fa) {
|
|
|
var xe;
|
|
|
if (fa) {
|
|
|
var ye = "oninput" in document;
|
|
|
if (!ye) {
|
|
|
var ze = document.createElement("div");
|
|
|
ze.setAttribute("oninput", "return;");
|
|
|
ye = typeof ze.oninput === "function";
|
|
|
}
|
|
|
xe = ye;
|
|
|
} else
|
|
|
xe = false;
|
|
|
we = xe && (!document.documentMode || 9 < document.documentMode);
|
|
|
}
|
|
|
function Ae() {
|
|
|
pe && (pe.detachEvent("onpropertychange", Be), qe = pe = null);
|
|
|
}
|
|
|
function Be(a) {
|
|
|
if (a.propertyName === "value" && te(qe)) {
|
|
|
var b = [];
|
|
|
ne(b, qe, a, xb(a));
|
|
|
a = re;
|
|
|
if (Kb)
|
|
|
a(b);
|
|
|
else {
|
|
|
Kb = true;
|
|
|
try {
|
|
|
Gb(a, b);
|
|
|
} finally {
|
|
|
Kb = false, Mb();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
function Ce(a, b, c) {
|
|
|
a === "focusin" ? (Ae(), pe = b, qe = c, pe.attachEvent("onpropertychange", Be)) : a === "focusout" && Ae();
|
|
|
}
|
|
|
function De(a) {
|
|
|
if (a === "selectionchange" || a === "keyup" || a === "keydown")
|
|
|
return te(qe);
|
|
|
}
|
|
|
function Ee(a, b) {
|
|
|
if (a === "click")
|
|
|
return te(b);
|
|
|
}
|
|
|
function Fe(a, b) {
|
|
|
if (a === "input" || a === "change")
|
|
|
return te(b);
|
|
|
}
|
|
|
function Ge(a, b) {
|
|
|
return a === b && (a !== 0 || 1 / a === 1 / b) || a !== a && b !== b;
|
|
|
}
|
|
|
var He = typeof Object.is === "function" ? Object.is : Ge, Ie = Object.prototype.hasOwnProperty;
|
|
|
function Je(a, b) {
|
|
|
if (He(a, b))
|
|
|
return true;
|
|
|
if (typeof a !== "object" || a === null || typeof b !== "object" || b === null)
|
|
|
return false;
|
|
|
var c = Object.keys(a), d = Object.keys(b);
|
|
|
if (c.length !== d.length)
|
|
|
return false;
|
|
|
for (d = 0; d < c.length; d++)
|
|
|
if (!Ie.call(b, c[d]) || !He(a[c[d]], b[c[d]]))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
function Ke(a) {
|
|
|
for (; a && a.firstChild; )
|
|
|
a = a.firstChild;
|
|
|
return a;
|
|
|
}
|
|
|
function Le(a, b) {
|
|
|
var c = Ke(a);
|
|
|
a = 0;
|
|
|
for (var d; c; ) {
|
|
|
if (c.nodeType === 3) {
|
|
|
d = a + c.textContent.length;
|
|
|
if (a <= b && d >= b)
|
|
|
return { node: c, offset: b - a };
|
|
|
a = d;
|
|
|
}
|
|
|
a: {
|
|
|
for (; c; ) {
|
|
|
if (c.nextSibling) {
|
|
|
c = c.nextSibling;
|
|
|
break a;
|
|
|
}
|
|
|
c = c.parentNode;
|
|
|
}
|
|
|
c = void 0;
|
|
|
}
|
|
|
c = Ke(c);
|
|
|
}
|
|
|
}
|
|
|
function Me(a, b) {
|
|
|
return a && b ? a === b ? true : a && a.nodeType === 3 ? false : b && b.nodeType === 3 ? Me(a, b.parentNode) : "contains" in a ? a.contains(b) : a.compareDocumentPosition ? !!(a.compareDocumentPosition(b) & 16) : false : false;
|
|
|
}
|
|
|
function Ne() {
|
|
|
for (var a = window, b = Xa(); b instanceof a.HTMLIFrameElement; ) {
|
|
|
try {
|
|
|
var c = typeof b.contentWindow.location.href === "string";
|
|
|
} catch (d) {
|
|
|
c = false;
|
|
|
}
|
|
|
if (c)
|
|
|
a = b.contentWindow;
|
|
|
else
|
|
|
break;
|
|
|
b = Xa(a.document);
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
function Oe(a) {
|
|
|
var b = a && a.nodeName && a.nodeName.toLowerCase();
|
|
|
return b && (b === "input" && (a.type === "text" || a.type === "search" || a.type === "tel" || a.type === "url" || a.type === "password") || b === "textarea" || a.contentEditable === "true");
|
|
|
}
|
|
|
var Pe = fa && "documentMode" in document && 11 >= document.documentMode, Qe = null, Re = null, Se = null, Te = false;
|
|
|
function Ue(a, b, c) {
|
|
|
var d = c.window === c ? c.document : c.nodeType === 9 ? c : c.ownerDocument;
|
|
|
Te || Qe == null || Qe !== Xa(d) || (d = Qe, "selectionStart" in d && Oe(d) ? d = { start: d.selectionStart, end: d.selectionEnd } : (d = (d.ownerDocument && d.ownerDocument.defaultView || window).getSelection(), d = { anchorNode: d.anchorNode, anchorOffset: d.anchorOffset, focusNode: d.focusNode, focusOffset: d.focusOffset }), Se && Je(Se, d) || (Se = d, d = oe(Re, "onSelect"), 0 < d.length && (b = new td("onSelect", "select", null, b, c), a.push({ event: b, listeners: d }), b.target = Qe)));
|
|
|
}
|
|
|
Pc("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "), 0);
|
|
|
Pc("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "), 1);
|
|
|
Pc(Oc, 2);
|
|
|
for (var Ve = "change selectionchange textInput compositionstart compositionend compositionupdate".split(" "), We = 0; We < Ve.length; We++)
|
|
|
Nc.set(Ve[We], 0);
|
|
|
ea("onMouseEnter", ["mouseout", "mouseover"]);
|
|
|
ea("onMouseLeave", ["mouseout", "mouseover"]);
|
|
|
ea("onPointerEnter", ["pointerout", "pointerover"]);
|
|
|
ea("onPointerLeave", ["pointerout", "pointerover"]);
|
|
|
da$1("onChange", "change click focusin focusout input keydown keyup selectionchange".split(" "));
|
|
|
da$1("onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));
|
|
|
da$1("onBeforeInput", ["compositionend", "keypress", "textInput", "paste"]);
|
|
|
da$1("onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" "));
|
|
|
da$1("onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" "));
|
|
|
da$1("onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" "));
|
|
|
var Xe = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "), Ye = new Set("cancel close invalid load scroll toggle".split(" ").concat(Xe));
|
|
|
function Ze(a, b, c) {
|
|
|
var d = a.type || "unknown-event";
|
|
|
a.currentTarget = c;
|
|
|
Yb(d, b, void 0, a);
|
|
|
a.currentTarget = null;
|
|
|
}
|
|
|
function se(a, b) {
|
|
|
b = (b & 4) !== 0;
|
|
|
for (var c = 0; c < a.length; c++) {
|
|
|
var d = a[c], e = d.event;
|
|
|
d = d.listeners;
|
|
|
a: {
|
|
|
var f2 = void 0;
|
|
|
if (b)
|
|
|
for (var g2 = d.length - 1; 0 <= g2; g2--) {
|
|
|
var h2 = d[g2], k = h2.instance, l2 = h2.currentTarget;
|
|
|
h2 = h2.listener;
|
|
|
if (k !== f2 && e.isPropagationStopped())
|
|
|
break a;
|
|
|
Ze(e, h2, l2);
|
|
|
f2 = k;
|
|
|
}
|
|
|
else
|
|
|
for (g2 = 0; g2 < d.length; g2++) {
|
|
|
h2 = d[g2];
|
|
|
k = h2.instance;
|
|
|
l2 = h2.currentTarget;
|
|
|
h2 = h2.listener;
|
|
|
if (k !== f2 && e.isPropagationStopped())
|
|
|
break a;
|
|
|
Ze(e, h2, l2);
|
|
|
f2 = k;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (Ub)
|
|
|
throw a = Vb, Ub = false, Vb = null, a;
|
|
|
}
|
|
|
function G(a, b) {
|
|
|
var c = $e(b), d = a + "__bubble";
|
|
|
c.has(d) || (af(b, a, 2, false), c.add(d));
|
|
|
}
|
|
|
var bf = "_reactListening" + Math.random().toString(36).slice(2);
|
|
|
function cf(a) {
|
|
|
a[bf] || (a[bf] = true, ba.forEach(function(b) {
|
|
|
Ye.has(b) || df(b, false, a, null);
|
|
|
df(b, true, a, null);
|
|
|
}));
|
|
|
}
|
|
|
function df(a, b, c, d) {
|
|
|
var e = 4 < arguments.length && arguments[4] !== void 0 ? arguments[4] : 0, f2 = c;
|
|
|
a === "selectionchange" && c.nodeType !== 9 && (f2 = c.ownerDocument);
|
|
|
if (d !== null && !b && Ye.has(a)) {
|
|
|
if (a !== "scroll")
|
|
|
return;
|
|
|
e |= 2;
|
|
|
f2 = d;
|
|
|
}
|
|
|
var g2 = $e(f2), h2 = a + "__" + (b ? "capture" : "bubble");
|
|
|
g2.has(h2) || (b && (e |= 4), af(f2, a, e, b), g2.add(h2));
|
|
|
}
|
|
|
function af(a, b, c, d) {
|
|
|
var e = Nc.get(b);
|
|
|
switch (e === void 0 ? 2 : e) {
|
|
|
case 0:
|
|
|
e = gd;
|
|
|
break;
|
|
|
case 1:
|
|
|
e = id$2;
|
|
|
break;
|
|
|
default:
|
|
|
e = hd;
|
|
|
}
|
|
|
c = e.bind(null, b, c, a);
|
|
|
e = void 0;
|
|
|
!Pb || b !== "touchstart" && b !== "touchmove" && b !== "wheel" || (e = true);
|
|
|
d ? e !== void 0 ? a.addEventListener(b, c, { capture: true, passive: e }) : a.addEventListener(b, c, true) : e !== void 0 ? a.addEventListener(b, c, { passive: e }) : a.addEventListener(b, c, false);
|
|
|
}
|
|
|
function jd(a, b, c, d, e) {
|
|
|
var f2 = d;
|
|
|
if ((b & 1) === 0 && (b & 2) === 0 && d !== null)
|
|
|
a:
|
|
|
for (; ; ) {
|
|
|
if (d === null)
|
|
|
return;
|
|
|
var g2 = d.tag;
|
|
|
if (g2 === 3 || g2 === 4) {
|
|
|
var h2 = d.stateNode.containerInfo;
|
|
|
if (h2 === e || h2.nodeType === 8 && h2.parentNode === e)
|
|
|
break;
|
|
|
if (g2 === 4)
|
|
|
for (g2 = d.return; g2 !== null; ) {
|
|
|
var k = g2.tag;
|
|
|
if (k === 3 || k === 4) {
|
|
|
if (k = g2.stateNode.containerInfo, k === e || k.nodeType === 8 && k.parentNode === e)
|
|
|
return;
|
|
|
}
|
|
|
g2 = g2.return;
|
|
|
}
|
|
|
for (; h2 !== null; ) {
|
|
|
g2 = wc(h2);
|
|
|
if (g2 === null)
|
|
|
return;
|
|
|
k = g2.tag;
|
|
|
if (k === 5 || k === 6) {
|
|
|
d = f2 = g2;
|
|
|
continue a;
|
|
|
}
|
|
|
h2 = h2.parentNode;
|
|
|
}
|
|
|
}
|
|
|
d = d.return;
|
|
|
}
|
|
|
Nb(function() {
|
|
|
var d2 = f2, e2 = xb(c), g3 = [];
|
|
|
a: {
|
|
|
var h3 = Mc.get(a);
|
|
|
if (h3 !== void 0) {
|
|
|
var k2 = td, x2 = a;
|
|
|
switch (a) {
|
|
|
case "keypress":
|
|
|
if (od(c) === 0)
|
|
|
break a;
|
|
|
case "keydown":
|
|
|
case "keyup":
|
|
|
k2 = Rd;
|
|
|
break;
|
|
|
case "focusin":
|
|
|
x2 = "focus";
|
|
|
k2 = Fd;
|
|
|
break;
|
|
|
case "focusout":
|
|
|
x2 = "blur";
|
|
|
k2 = Fd;
|
|
|
break;
|
|
|
case "beforeblur":
|
|
|
case "afterblur":
|
|
|
k2 = Fd;
|
|
|
break;
|
|
|
case "click":
|
|
|
if (c.button === 2)
|
|
|
break a;
|
|
|
case "auxclick":
|
|
|
case "dblclick":
|
|
|
case "mousedown":
|
|
|
case "mousemove":
|
|
|
case "mouseup":
|
|
|
case "mouseout":
|
|
|
case "mouseover":
|
|
|
case "contextmenu":
|
|
|
k2 = Bd;
|
|
|
break;
|
|
|
case "drag":
|
|
|
case "dragend":
|
|
|
case "dragenter":
|
|
|
case "dragexit":
|
|
|
case "dragleave":
|
|
|
case "dragover":
|
|
|
case "dragstart":
|
|
|
case "drop":
|
|
|
k2 = Dd;
|
|
|
break;
|
|
|
case "touchcancel":
|
|
|
case "touchend":
|
|
|
case "touchmove":
|
|
|
case "touchstart":
|
|
|
k2 = Vd;
|
|
|
break;
|
|
|
case Ic:
|
|
|
case Jc:
|
|
|
case Kc:
|
|
|
k2 = Hd;
|
|
|
break;
|
|
|
case Lc:
|
|
|
k2 = Xd;
|
|
|
break;
|
|
|
case "scroll":
|
|
|
k2 = vd;
|
|
|
break;
|
|
|
case "wheel":
|
|
|
k2 = Zd;
|
|
|
break;
|
|
|
case "copy":
|
|
|
case "cut":
|
|
|
case "paste":
|
|
|
k2 = Jd;
|
|
|
break;
|
|
|
case "gotpointercapture":
|
|
|
case "lostpointercapture":
|
|
|
case "pointercancel":
|
|
|
case "pointerdown":
|
|
|
case "pointermove":
|
|
|
case "pointerout":
|
|
|
case "pointerover":
|
|
|
case "pointerup":
|
|
|
k2 = Td;
|
|
|
}
|
|
|
var w2 = (b & 4) !== 0, z2 = !w2 && a === "scroll", u2 = w2 ? h3 !== null ? h3 + "Capture" : null : h3;
|
|
|
w2 = [];
|
|
|
for (var t2 = d2, q2; t2 !== null; ) {
|
|
|
q2 = t2;
|
|
|
var v2 = q2.stateNode;
|
|
|
q2.tag === 5 && v2 !== null && (q2 = v2, u2 !== null && (v2 = Ob(t2, u2), v2 != null && w2.push(ef(t2, v2, q2))));
|
|
|
if (z2)
|
|
|
break;
|
|
|
t2 = t2.return;
|
|
|
}
|
|
|
0 < w2.length && (h3 = new k2(h3, x2, null, c, e2), g3.push({ event: h3, listeners: w2 }));
|
|
|
}
|
|
|
}
|
|
|
if ((b & 7) === 0) {
|
|
|
a: {
|
|
|
h3 = a === "mouseover" || a === "pointerover";
|
|
|
k2 = a === "mouseout" || a === "pointerout";
|
|
|
if (h3 && (b & 16) === 0 && (x2 = c.relatedTarget || c.fromElement) && (wc(x2) || x2[ff]))
|
|
|
break a;
|
|
|
if (k2 || h3) {
|
|
|
h3 = e2.window === e2 ? e2 : (h3 = e2.ownerDocument) ? h3.defaultView || h3.parentWindow : window;
|
|
|
if (k2) {
|
|
|
if (x2 = c.relatedTarget || c.toElement, k2 = d2, x2 = x2 ? wc(x2) : null, x2 !== null && (z2 = Zb(x2), x2 !== z2 || x2.tag !== 5 && x2.tag !== 6))
|
|
|
x2 = null;
|
|
|
} else
|
|
|
k2 = null, x2 = d2;
|
|
|
if (k2 !== x2) {
|
|
|
w2 = Bd;
|
|
|
v2 = "onMouseLeave";
|
|
|
u2 = "onMouseEnter";
|
|
|
t2 = "mouse";
|
|
|
if (a === "pointerout" || a === "pointerover")
|
|
|
w2 = Td, v2 = "onPointerLeave", u2 = "onPointerEnter", t2 = "pointer";
|
|
|
z2 = k2 == null ? h3 : ue(k2);
|
|
|
q2 = x2 == null ? h3 : ue(x2);
|
|
|
h3 = new w2(v2, t2 + "leave", k2, c, e2);
|
|
|
h3.target = z2;
|
|
|
h3.relatedTarget = q2;
|
|
|
v2 = null;
|
|
|
wc(e2) === d2 && (w2 = new w2(u2, t2 + "enter", x2, c, e2), w2.target = q2, w2.relatedTarget = z2, v2 = w2);
|
|
|
z2 = v2;
|
|
|
if (k2 && x2)
|
|
|
b: {
|
|
|
w2 = k2;
|
|
|
u2 = x2;
|
|
|
t2 = 0;
|
|
|
for (q2 = w2; q2; q2 = gf(q2))
|
|
|
t2++;
|
|
|
q2 = 0;
|
|
|
for (v2 = u2; v2; v2 = gf(v2))
|
|
|
q2++;
|
|
|
for (; 0 < t2 - q2; )
|
|
|
w2 = gf(w2), t2--;
|
|
|
for (; 0 < q2 - t2; )
|
|
|
u2 = gf(u2), q2--;
|
|
|
for (; t2--; ) {
|
|
|
if (w2 === u2 || u2 !== null && w2 === u2.alternate)
|
|
|
break b;
|
|
|
w2 = gf(w2);
|
|
|
u2 = gf(u2);
|
|
|
}
|
|
|
w2 = null;
|
|
|
}
|
|
|
else
|
|
|
w2 = null;
|
|
|
k2 !== null && hf(g3, h3, k2, w2, false);
|
|
|
x2 !== null && z2 !== null && hf(g3, z2, x2, w2, true);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
a: {
|
|
|
h3 = d2 ? ue(d2) : window;
|
|
|
k2 = h3.nodeName && h3.nodeName.toLowerCase();
|
|
|
if (k2 === "select" || k2 === "input" && h3.type === "file")
|
|
|
var J2 = ve;
|
|
|
else if (me(h3))
|
|
|
if (we)
|
|
|
J2 = Fe;
|
|
|
else {
|
|
|
J2 = De;
|
|
|
var K2 = Ce;
|
|
|
}
|
|
|
else
|
|
|
(k2 = h3.nodeName) && k2.toLowerCase() === "input" && (h3.type === "checkbox" || h3.type === "radio") && (J2 = Ee);
|
|
|
if (J2 && (J2 = J2(a, d2))) {
|
|
|
ne(g3, J2, c, e2);
|
|
|
break a;
|
|
|
}
|
|
|
K2 && K2(a, h3, d2);
|
|
|
a === "focusout" && (K2 = h3._wrapperState) && K2.controlled && h3.type === "number" && bb(h3, "number", h3.value);
|
|
|
}
|
|
|
K2 = d2 ? ue(d2) : window;
|
|
|
switch (a) {
|
|
|
case "focusin":
|
|
|
if (me(K2) || K2.contentEditable === "true")
|
|
|
Qe = K2, Re = d2, Se = null;
|
|
|
break;
|
|
|
case "focusout":
|
|
|
Se = Re = Qe = null;
|
|
|
break;
|
|
|
case "mousedown":
|
|
|
Te = true;
|
|
|
break;
|
|
|
case "contextmenu":
|
|
|
case "mouseup":
|
|
|
case "dragend":
|
|
|
Te = false;
|
|
|
Ue(g3, c, e2);
|
|
|
break;
|
|
|
case "selectionchange":
|
|
|
if (Pe)
|
|
|
break;
|
|
|
case "keydown":
|
|
|
case "keyup":
|
|
|
Ue(g3, c, e2);
|
|
|
}
|
|
|
var Q2;
|
|
|
if (ae)
|
|
|
b: {
|
|
|
switch (a) {
|
|
|
case "compositionstart":
|
|
|
var L2 = "onCompositionStart";
|
|
|
break b;
|
|
|
case "compositionend":
|
|
|
L2 = "onCompositionEnd";
|
|
|
break b;
|
|
|
case "compositionupdate":
|
|
|
L2 = "onCompositionUpdate";
|
|
|
break b;
|
|
|
}
|
|
|
L2 = void 0;
|
|
|
}
|
|
|
else
|
|
|
ie ? ge(a, c) && (L2 = "onCompositionEnd") : a === "keydown" && c.keyCode === 229 && (L2 = "onCompositionStart");
|
|
|
L2 && (de$1 && c.locale !== "ko" && (ie || L2 !== "onCompositionStart" ? L2 === "onCompositionEnd" && ie && (Q2 = nd()) : (kd = e2, ld = "value" in kd ? kd.value : kd.textContent, ie = true)), K2 = oe(d2, L2), 0 < K2.length && (L2 = new Ld(L2, a, null, c, e2), g3.push({ event: L2, listeners: K2 }), Q2 ? L2.data = Q2 : (Q2 = he(c), Q2 !== null && (L2.data = Q2))));
|
|
|
if (Q2 = ce ? je(a, c) : ke(a, c))
|
|
|
d2 = oe(d2, "onBeforeInput"), 0 < d2.length && (e2 = new Ld("onBeforeInput", "beforeinput", null, c, e2), g3.push({ event: e2, listeners: d2 }), e2.data = Q2);
|
|
|
}
|
|
|
se(g3, b);
|
|
|
});
|
|
|
}
|
|
|
function ef(a, b, c) {
|
|
|
return { instance: a, listener: b, currentTarget: c };
|
|
|
}
|
|
|
function oe(a, b) {
|
|
|
for (var c = b + "Capture", d = []; a !== null; ) {
|
|
|
var e = a, f2 = e.stateNode;
|
|
|
e.tag === 5 && f2 !== null && (e = f2, f2 = Ob(a, c), f2 != null && d.unshift(ef(a, f2, e)), f2 = Ob(a, b), f2 != null && d.push(ef(a, f2, e)));
|
|
|
a = a.return;
|
|
|
}
|
|
|
return d;
|
|
|
}
|
|
|
function gf(a) {
|
|
|
if (a === null)
|
|
|
return null;
|
|
|
do
|
|
|
a = a.return;
|
|
|
while (a && a.tag !== 5);
|
|
|
return a ? a : null;
|
|
|
}
|
|
|
function hf(a, b, c, d, e) {
|
|
|
for (var f2 = b._reactName, g2 = []; c !== null && c !== d; ) {
|
|
|
var h2 = c, k = h2.alternate, l2 = h2.stateNode;
|
|
|
if (k !== null && k === d)
|
|
|
break;
|
|
|
h2.tag === 5 && l2 !== null && (h2 = l2, e ? (k = Ob(c, f2), k != null && g2.unshift(ef(c, k, h2))) : e || (k = Ob(c, f2), k != null && g2.push(ef(c, k, h2))));
|
|
|
c = c.return;
|
|
|
}
|
|
|
g2.length !== 0 && a.push({ event: b, listeners: g2 });
|
|
|
}
|
|
|
function jf() {
|
|
|
}
|
|
|
var kf = null, lf = null;
|
|
|
function mf(a, b) {
|
|
|
switch (a) {
|
|
|
case "button":
|
|
|
case "input":
|
|
|
case "select":
|
|
|
case "textarea":
|
|
|
return !!b.autoFocus;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function nf(a, b) {
|
|
|
return a === "textarea" || a === "option" || a === "noscript" || typeof b.children === "string" || typeof b.children === "number" || typeof b.dangerouslySetInnerHTML === "object" && b.dangerouslySetInnerHTML !== null && b.dangerouslySetInnerHTML.__html != null;
|
|
|
}
|
|
|
var of = typeof setTimeout === "function" ? setTimeout : void 0, pf = typeof clearTimeout === "function" ? clearTimeout : void 0;
|
|
|
function qf(a) {
|
|
|
a.nodeType === 1 ? a.textContent = "" : a.nodeType === 9 && (a = a.body, a != null && (a.textContent = ""));
|
|
|
}
|
|
|
function rf(a) {
|
|
|
for (; a != null; a = a.nextSibling) {
|
|
|
var b = a.nodeType;
|
|
|
if (b === 1 || b === 3)
|
|
|
break;
|
|
|
}
|
|
|
return a;
|
|
|
}
|
|
|
function sf(a) {
|
|
|
a = a.previousSibling;
|
|
|
for (var b = 0; a; ) {
|
|
|
if (a.nodeType === 8) {
|
|
|
var c = a.data;
|
|
|
if (c === "$" || c === "$!" || c === "$?") {
|
|
|
if (b === 0)
|
|
|
return a;
|
|
|
b--;
|
|
|
} else
|
|
|
c === "/$" && b++;
|
|
|
}
|
|
|
a = a.previousSibling;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
var tf = 0;
|
|
|
function uf(a) {
|
|
|
return { $$typeof: Ga, toString: a, valueOf: a };
|
|
|
}
|
|
|
var vf = Math.random().toString(36).slice(2), wf = "__reactFiber$" + vf, xf = "__reactProps$" + vf, ff = "__reactContainer$" + vf, yf = "__reactEvents$" + vf;
|
|
|
function wc(a) {
|
|
|
var b = a[wf];
|
|
|
if (b)
|
|
|
return b;
|
|
|
for (var c = a.parentNode; c; ) {
|
|
|
if (b = c[ff] || c[wf]) {
|
|
|
c = b.alternate;
|
|
|
if (b.child !== null || c !== null && c.child !== null)
|
|
|
for (a = sf(a); a !== null; ) {
|
|
|
if (c = a[wf])
|
|
|
return c;
|
|
|
a = sf(a);
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
a = c;
|
|
|
c = a.parentNode;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function Cb(a) {
|
|
|
a = a[wf] || a[ff];
|
|
|
return !a || a.tag !== 5 && a.tag !== 6 && a.tag !== 13 && a.tag !== 3 ? null : a;
|
|
|
}
|
|
|
function ue(a) {
|
|
|
if (a.tag === 5 || a.tag === 6)
|
|
|
return a.stateNode;
|
|
|
throw Error(y(33));
|
|
|
}
|
|
|
function Db(a) {
|
|
|
return a[xf] || null;
|
|
|
}
|
|
|
function $e(a) {
|
|
|
var b = a[yf];
|
|
|
b === void 0 && (b = a[yf] = new Set());
|
|
|
return b;
|
|
|
}
|
|
|
var zf = [], Af = -1;
|
|
|
function Bf(a) {
|
|
|
return { current: a };
|
|
|
}
|
|
|
function H(a) {
|
|
|
0 > Af || (a.current = zf[Af], zf[Af] = null, Af--);
|
|
|
}
|
|
|
function I(a, b) {
|
|
|
Af++;
|
|
|
zf[Af] = a.current;
|
|
|
a.current = b;
|
|
|
}
|
|
|
var Cf = {}, M = Bf(Cf), N = Bf(false), Df = Cf;
|
|
|
function Ef(a, b) {
|
|
|
var c = a.type.contextTypes;
|
|
|
if (!c)
|
|
|
return Cf;
|
|
|
var d = a.stateNode;
|
|
|
if (d && d.__reactInternalMemoizedUnmaskedChildContext === b)
|
|
|
return d.__reactInternalMemoizedMaskedChildContext;
|
|
|
var e = {}, f2;
|
|
|
for (f2 in c)
|
|
|
e[f2] = b[f2];
|
|
|
d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = b, a.__reactInternalMemoizedMaskedChildContext = e);
|
|
|
return e;
|
|
|
}
|
|
|
function Ff(a) {
|
|
|
a = a.childContextTypes;
|
|
|
return a !== null && a !== void 0;
|
|
|
}
|
|
|
function Gf() {
|
|
|
H(N);
|
|
|
H(M);
|
|
|
}
|
|
|
function Hf(a, b, c) {
|
|
|
if (M.current !== Cf)
|
|
|
throw Error(y(168));
|
|
|
I(M, b);
|
|
|
I(N, c);
|
|
|
}
|
|
|
function If(a, b, c) {
|
|
|
var d = a.stateNode;
|
|
|
a = b.childContextTypes;
|
|
|
if (typeof d.getChildContext !== "function")
|
|
|
return c;
|
|
|
d = d.getChildContext();
|
|
|
for (var e in d)
|
|
|
if (!(e in a))
|
|
|
throw Error(y(108, Ra(b) || "Unknown", e));
|
|
|
return m$1({}, c, d);
|
|
|
}
|
|
|
function Jf(a) {
|
|
|
a = (a = a.stateNode) && a.__reactInternalMemoizedMergedChildContext || Cf;
|
|
|
Df = M.current;
|
|
|
I(M, a);
|
|
|
I(N, N.current);
|
|
|
return true;
|
|
|
}
|
|
|
function Kf(a, b, c) {
|
|
|
var d = a.stateNode;
|
|
|
if (!d)
|
|
|
throw Error(y(169));
|
|
|
c ? (a = If(a, b, Df), d.__reactInternalMemoizedMergedChildContext = a, H(N), H(M), I(M, a)) : H(N);
|
|
|
I(N, c);
|
|
|
}
|
|
|
var Lf = null, Mf = null, Nf = r.unstable_runWithPriority, Of = r.unstable_scheduleCallback, Pf = r.unstable_cancelCallback, Qf = r.unstable_shouldYield, Rf = r.unstable_requestPaint, Sf = r.unstable_now, Tf = r.unstable_getCurrentPriorityLevel, Uf = r.unstable_ImmediatePriority, Vf = r.unstable_UserBlockingPriority, Wf = r.unstable_NormalPriority, Xf = r.unstable_LowPriority, Yf = r.unstable_IdlePriority, Zf = {}, $f = Rf !== void 0 ? Rf : function() {
|
|
|
}, ag = null, bg = null, cg = false, dg = Sf(), O = 1e4 > dg ? Sf : function() {
|
|
|
return Sf() - dg;
|
|
|
};
|
|
|
function eg() {
|
|
|
switch (Tf()) {
|
|
|
case Uf:
|
|
|
return 99;
|
|
|
case Vf:
|
|
|
return 98;
|
|
|
case Wf:
|
|
|
return 97;
|
|
|
case Xf:
|
|
|
return 96;
|
|
|
case Yf:
|
|
|
return 95;
|
|
|
default:
|
|
|
throw Error(y(332));
|
|
|
}
|
|
|
}
|
|
|
function fg(a) {
|
|
|
switch (a) {
|
|
|
case 99:
|
|
|
return Uf;
|
|
|
case 98:
|
|
|
return Vf;
|
|
|
case 97:
|
|
|
return Wf;
|
|
|
case 96:
|
|
|
return Xf;
|
|
|
case 95:
|
|
|
return Yf;
|
|
|
default:
|
|
|
throw Error(y(332));
|
|
|
}
|
|
|
}
|
|
|
function gg(a, b) {
|
|
|
a = fg(a);
|
|
|
return Nf(a, b);
|
|
|
}
|
|
|
function hg(a, b, c) {
|
|
|
a = fg(a);
|
|
|
return Of(a, b, c);
|
|
|
}
|
|
|
function ig() {
|
|
|
if (bg !== null) {
|
|
|
var a = bg;
|
|
|
bg = null;
|
|
|
Pf(a);
|
|
|
}
|
|
|
jg();
|
|
|
}
|
|
|
function jg() {
|
|
|
if (!cg && ag !== null) {
|
|
|
cg = true;
|
|
|
var a = 0;
|
|
|
try {
|
|
|
var b = ag;
|
|
|
gg(99, function() {
|
|
|
for (; a < b.length; a++) {
|
|
|
var c = b[a];
|
|
|
do
|
|
|
c = c(true);
|
|
|
while (c !== null);
|
|
|
}
|
|
|
});
|
|
|
ag = null;
|
|
|
} catch (c) {
|
|
|
throw ag !== null && (ag = ag.slice(a + 1)), Of(Uf, ig), c;
|
|
|
} finally {
|
|
|
cg = false;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
var kg = ra.ReactCurrentBatchConfig;
|
|
|
function lg(a, b) {
|
|
|
if (a && a.defaultProps) {
|
|
|
b = m$1({}, b);
|
|
|
a = a.defaultProps;
|
|
|
for (var c in a)
|
|
|
b[c] === void 0 && (b[c] = a[c]);
|
|
|
return b;
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
var mg = Bf(null), ng = null, og = null, pg = null;
|
|
|
function qg() {
|
|
|
pg = og = ng = null;
|
|
|
}
|
|
|
function rg(a) {
|
|
|
var b = mg.current;
|
|
|
H(mg);
|
|
|
a.type._context._currentValue = b;
|
|
|
}
|
|
|
function sg(a, b) {
|
|
|
for (; a !== null; ) {
|
|
|
var c = a.alternate;
|
|
|
if ((a.childLanes & b) === b)
|
|
|
if (c === null || (c.childLanes & b) === b)
|
|
|
break;
|
|
|
else
|
|
|
c.childLanes |= b;
|
|
|
else
|
|
|
a.childLanes |= b, c !== null && (c.childLanes |= b);
|
|
|
a = a.return;
|
|
|
}
|
|
|
}
|
|
|
function tg(a, b) {
|
|
|
ng = a;
|
|
|
pg = og = null;
|
|
|
a = a.dependencies;
|
|
|
a !== null && a.firstContext !== null && ((a.lanes & b) !== 0 && (ug = true), a.firstContext = null);
|
|
|
}
|
|
|
function vg(a, b) {
|
|
|
if (pg !== a && b !== false && b !== 0) {
|
|
|
if (typeof b !== "number" || b === 1073741823)
|
|
|
pg = a, b = 1073741823;
|
|
|
b = { context: a, observedBits: b, next: null };
|
|
|
if (og === null) {
|
|
|
if (ng === null)
|
|
|
throw Error(y(308));
|
|
|
og = b;
|
|
|
ng.dependencies = { lanes: 0, firstContext: b, responders: null };
|
|
|
} else
|
|
|
og = og.next = b;
|
|
|
}
|
|
|
return a._currentValue;
|
|
|
}
|
|
|
var wg = false;
|
|
|
function xg(a) {
|
|
|
a.updateQueue = { baseState: a.memoizedState, firstBaseUpdate: null, lastBaseUpdate: null, shared: { pending: null }, effects: null };
|
|
|
}
|
|
|
function yg(a, b) {
|
|
|
a = a.updateQueue;
|
|
|
b.updateQueue === a && (b.updateQueue = { baseState: a.baseState, firstBaseUpdate: a.firstBaseUpdate, lastBaseUpdate: a.lastBaseUpdate, shared: a.shared, effects: a.effects });
|
|
|
}
|
|
|
function zg(a, b) {
|
|
|
return { eventTime: a, lane: b, tag: 0, payload: null, callback: null, next: null };
|
|
|
}
|
|
|
function Ag(a, b) {
|
|
|
a = a.updateQueue;
|
|
|
if (a !== null) {
|
|
|
a = a.shared;
|
|
|
var c = a.pending;
|
|
|
c === null ? b.next = b : (b.next = c.next, c.next = b);
|
|
|
a.pending = b;
|
|
|
}
|
|
|
}
|
|
|
function Bg(a, b) {
|
|
|
var c = a.updateQueue, d = a.alternate;
|
|
|
if (d !== null && (d = d.updateQueue, c === d)) {
|
|
|
var e = null, f2 = null;
|
|
|
c = c.firstBaseUpdate;
|
|
|
if (c !== null) {
|
|
|
do {
|
|
|
var g2 = { eventTime: c.eventTime, lane: c.lane, tag: c.tag, payload: c.payload, callback: c.callback, next: null };
|
|
|
f2 === null ? e = f2 = g2 : f2 = f2.next = g2;
|
|
|
c = c.next;
|
|
|
} while (c !== null);
|
|
|
f2 === null ? e = f2 = b : f2 = f2.next = b;
|
|
|
} else
|
|
|
e = f2 = b;
|
|
|
c = { baseState: d.baseState, firstBaseUpdate: e, lastBaseUpdate: f2, shared: d.shared, effects: d.effects };
|
|
|
a.updateQueue = c;
|
|
|
return;
|
|
|
}
|
|
|
a = c.lastBaseUpdate;
|
|
|
a === null ? c.firstBaseUpdate = b : a.next = b;
|
|
|
c.lastBaseUpdate = b;
|
|
|
}
|
|
|
function Cg(a, b, c, d) {
|
|
|
var e = a.updateQueue;
|
|
|
wg = false;
|
|
|
var f2 = e.firstBaseUpdate, g2 = e.lastBaseUpdate, h2 = e.shared.pending;
|
|
|
if (h2 !== null) {
|
|
|
e.shared.pending = null;
|
|
|
var k = h2, l2 = k.next;
|
|
|
k.next = null;
|
|
|
g2 === null ? f2 = l2 : g2.next = l2;
|
|
|
g2 = k;
|
|
|
var n2 = a.alternate;
|
|
|
if (n2 !== null) {
|
|
|
n2 = n2.updateQueue;
|
|
|
var A2 = n2.lastBaseUpdate;
|
|
|
A2 !== g2 && (A2 === null ? n2.firstBaseUpdate = l2 : A2.next = l2, n2.lastBaseUpdate = k);
|
|
|
}
|
|
|
}
|
|
|
if (f2 !== null) {
|
|
|
A2 = e.baseState;
|
|
|
g2 = 0;
|
|
|
n2 = l2 = k = null;
|
|
|
do {
|
|
|
h2 = f2.lane;
|
|
|
var p2 = f2.eventTime;
|
|
|
if ((d & h2) === h2) {
|
|
|
n2 !== null && (n2 = n2.next = {
|
|
|
eventTime: p2,
|
|
|
lane: 0,
|
|
|
tag: f2.tag,
|
|
|
payload: f2.payload,
|
|
|
callback: f2.callback,
|
|
|
next: null
|
|
|
});
|
|
|
a: {
|
|
|
var C2 = a, x2 = f2;
|
|
|
h2 = b;
|
|
|
p2 = c;
|
|
|
switch (x2.tag) {
|
|
|
case 1:
|
|
|
C2 = x2.payload;
|
|
|
if (typeof C2 === "function") {
|
|
|
A2 = C2.call(p2, A2, h2);
|
|
|
break a;
|
|
|
}
|
|
|
A2 = C2;
|
|
|
break a;
|
|
|
case 3:
|
|
|
C2.flags = C2.flags & -4097 | 64;
|
|
|
case 0:
|
|
|
C2 = x2.payload;
|
|
|
h2 = typeof C2 === "function" ? C2.call(p2, A2, h2) : C2;
|
|
|
if (h2 === null || h2 === void 0)
|
|
|
break a;
|
|
|
A2 = m$1({}, A2, h2);
|
|
|
break a;
|
|
|
case 2:
|
|
|
wg = true;
|
|
|
}
|
|
|
}
|
|
|
f2.callback !== null && (a.flags |= 32, h2 = e.effects, h2 === null ? e.effects = [f2] : h2.push(f2));
|
|
|
} else
|
|
|
p2 = { eventTime: p2, lane: h2, tag: f2.tag, payload: f2.payload, callback: f2.callback, next: null }, n2 === null ? (l2 = n2 = p2, k = A2) : n2 = n2.next = p2, g2 |= h2;
|
|
|
f2 = f2.next;
|
|
|
if (f2 === null)
|
|
|
if (h2 = e.shared.pending, h2 === null)
|
|
|
break;
|
|
|
else
|
|
|
f2 = h2.next, h2.next = null, e.lastBaseUpdate = h2, e.shared.pending = null;
|
|
|
} while (1);
|
|
|
n2 === null && (k = A2);
|
|
|
e.baseState = k;
|
|
|
e.firstBaseUpdate = l2;
|
|
|
e.lastBaseUpdate = n2;
|
|
|
Dg |= g2;
|
|
|
a.lanes = g2;
|
|
|
a.memoizedState = A2;
|
|
|
}
|
|
|
}
|
|
|
function Eg(a, b, c) {
|
|
|
a = b.effects;
|
|
|
b.effects = null;
|
|
|
if (a !== null)
|
|
|
for (b = 0; b < a.length; b++) {
|
|
|
var d = a[b], e = d.callback;
|
|
|
if (e !== null) {
|
|
|
d.callback = null;
|
|
|
d = c;
|
|
|
if (typeof e !== "function")
|
|
|
throw Error(y(191, e));
|
|
|
e.call(d);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
var Fg = new aa.Component().refs;
|
|
|
function Gg(a, b, c, d) {
|
|
|
b = a.memoizedState;
|
|
|
c = c(d, b);
|
|
|
c = c === null || c === void 0 ? b : m$1({}, b, c);
|
|
|
a.memoizedState = c;
|
|
|
a.lanes === 0 && (a.updateQueue.baseState = c);
|
|
|
}
|
|
|
var Kg = { isMounted: function(a) {
|
|
|
return (a = a._reactInternals) ? Zb(a) === a : false;
|
|
|
}, enqueueSetState: function(a, b, c) {
|
|
|
a = a._reactInternals;
|
|
|
var d = Hg(), e = Ig(a), f2 = zg(d, e);
|
|
|
f2.payload = b;
|
|
|
c !== void 0 && c !== null && (f2.callback = c);
|
|
|
Ag(a, f2);
|
|
|
Jg(a, e, d);
|
|
|
}, enqueueReplaceState: function(a, b, c) {
|
|
|
a = a._reactInternals;
|
|
|
var d = Hg(), e = Ig(a), f2 = zg(d, e);
|
|
|
f2.tag = 1;
|
|
|
f2.payload = b;
|
|
|
c !== void 0 && c !== null && (f2.callback = c);
|
|
|
Ag(a, f2);
|
|
|
Jg(a, e, d);
|
|
|
}, enqueueForceUpdate: function(a, b) {
|
|
|
a = a._reactInternals;
|
|
|
var c = Hg(), d = Ig(a), e = zg(c, d);
|
|
|
e.tag = 2;
|
|
|
b !== void 0 && b !== null && (e.callback = b);
|
|
|
Ag(a, e);
|
|
|
Jg(a, d, c);
|
|
|
} };
|
|
|
function Lg(a, b, c, d, e, f2, g2) {
|
|
|
a = a.stateNode;
|
|
|
return typeof a.shouldComponentUpdate === "function" ? a.shouldComponentUpdate(d, f2, g2) : b.prototype && b.prototype.isPureReactComponent ? !Je(c, d) || !Je(e, f2) : true;
|
|
|
}
|
|
|
function Mg(a, b, c) {
|
|
|
var d = false, e = Cf;
|
|
|
var f2 = b.contextType;
|
|
|
typeof f2 === "object" && f2 !== null ? f2 = vg(f2) : (e = Ff(b) ? Df : M.current, d = b.contextTypes, f2 = (d = d !== null && d !== void 0) ? Ef(a, e) : Cf);
|
|
|
b = new b(c, f2);
|
|
|
a.memoizedState = b.state !== null && b.state !== void 0 ? b.state : null;
|
|
|
b.updater = Kg;
|
|
|
a.stateNode = b;
|
|
|
b._reactInternals = a;
|
|
|
d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = e, a.__reactInternalMemoizedMaskedChildContext = f2);
|
|
|
return b;
|
|
|
}
|
|
|
function Ng(a, b, c, d) {
|
|
|
a = b.state;
|
|
|
typeof b.componentWillReceiveProps === "function" && b.componentWillReceiveProps(c, d);
|
|
|
typeof b.UNSAFE_componentWillReceiveProps === "function" && b.UNSAFE_componentWillReceiveProps(c, d);
|
|
|
b.state !== a && Kg.enqueueReplaceState(b, b.state, null);
|
|
|
}
|
|
|
function Og(a, b, c, d) {
|
|
|
var e = a.stateNode;
|
|
|
e.props = c;
|
|
|
e.state = a.memoizedState;
|
|
|
e.refs = Fg;
|
|
|
xg(a);
|
|
|
var f2 = b.contextType;
|
|
|
typeof f2 === "object" && f2 !== null ? e.context = vg(f2) : (f2 = Ff(b) ? Df : M.current, e.context = Ef(a, f2));
|
|
|
Cg(a, c, e, d);
|
|
|
e.state = a.memoizedState;
|
|
|
f2 = b.getDerivedStateFromProps;
|
|
|
typeof f2 === "function" && (Gg(a, b, f2, c), e.state = a.memoizedState);
|
|
|
typeof b.getDerivedStateFromProps === "function" || typeof e.getSnapshotBeforeUpdate === "function" || typeof e.UNSAFE_componentWillMount !== "function" && typeof e.componentWillMount !== "function" || (b = e.state, typeof e.componentWillMount === "function" && e.componentWillMount(), typeof e.UNSAFE_componentWillMount === "function" && e.UNSAFE_componentWillMount(), b !== e.state && Kg.enqueueReplaceState(e, e.state, null), Cg(a, c, e, d), e.state = a.memoizedState);
|
|
|
typeof e.componentDidMount === "function" && (a.flags |= 4);
|
|
|
}
|
|
|
var Pg = Array.isArray;
|
|
|
function Qg(a, b, c) {
|
|
|
a = c.ref;
|
|
|
if (a !== null && typeof a !== "function" && typeof a !== "object") {
|
|
|
if (c._owner) {
|
|
|
c = c._owner;
|
|
|
if (c) {
|
|
|
if (c.tag !== 1)
|
|
|
throw Error(y(309));
|
|
|
var d = c.stateNode;
|
|
|
}
|
|
|
if (!d)
|
|
|
throw Error(y(147, a));
|
|
|
var e = "" + a;
|
|
|
if (b !== null && b.ref !== null && typeof b.ref === "function" && b.ref._stringRef === e)
|
|
|
return b.ref;
|
|
|
b = function(a2) {
|
|
|
var b2 = d.refs;
|
|
|
b2 === Fg && (b2 = d.refs = {});
|
|
|
a2 === null ? delete b2[e] : b2[e] = a2;
|
|
|
};
|
|
|
b._stringRef = e;
|
|
|
return b;
|
|
|
}
|
|
|
if (typeof a !== "string")
|
|
|
throw Error(y(284));
|
|
|
if (!c._owner)
|
|
|
throw Error(y(290, a));
|
|
|
}
|
|
|
return a;
|
|
|
}
|
|
|
function Rg(a, b) {
|
|
|
if (a.type !== "textarea")
|
|
|
throw Error(y(31, Object.prototype.toString.call(b) === "[object Object]" ? "object with keys {" + Object.keys(b).join(", ") + "}" : b));
|
|
|
}
|
|
|
function Sg(a) {
|
|
|
function b(b2, c2) {
|
|
|
if (a) {
|
|
|
var d2 = b2.lastEffect;
|
|
|
d2 !== null ? (d2.nextEffect = c2, b2.lastEffect = c2) : b2.firstEffect = b2.lastEffect = c2;
|
|
|
c2.nextEffect = null;
|
|
|
c2.flags = 8;
|
|
|
}
|
|
|
}
|
|
|
function c(c2, d2) {
|
|
|
if (!a)
|
|
|
return null;
|
|
|
for (; d2 !== null; )
|
|
|
b(c2, d2), d2 = d2.sibling;
|
|
|
return null;
|
|
|
}
|
|
|
function d(a2, b2) {
|
|
|
for (a2 = new Map(); b2 !== null; )
|
|
|
b2.key !== null ? a2.set(b2.key, b2) : a2.set(b2.index, b2), b2 = b2.sibling;
|
|
|
return a2;
|
|
|
}
|
|
|
function e(a2, b2) {
|
|
|
a2 = Tg(a2, b2);
|
|
|
a2.index = 0;
|
|
|
a2.sibling = null;
|
|
|
return a2;
|
|
|
}
|
|
|
function f2(b2, c2, d2) {
|
|
|
b2.index = d2;
|
|
|
if (!a)
|
|
|
return c2;
|
|
|
d2 = b2.alternate;
|
|
|
if (d2 !== null)
|
|
|
return d2 = d2.index, d2 < c2 ? (b2.flags = 2, c2) : d2;
|
|
|
b2.flags = 2;
|
|
|
return c2;
|
|
|
}
|
|
|
function g2(b2) {
|
|
|
a && b2.alternate === null && (b2.flags = 2);
|
|
|
return b2;
|
|
|
}
|
|
|
function h2(a2, b2, c2, d2) {
|
|
|
if (b2 === null || b2.tag !== 6)
|
|
|
return b2 = Ug(c2, a2.mode, d2), b2.return = a2, b2;
|
|
|
b2 = e(b2, c2);
|
|
|
b2.return = a2;
|
|
|
return b2;
|
|
|
}
|
|
|
function k(a2, b2, c2, d2) {
|
|
|
if (b2 !== null && b2.elementType === c2.type)
|
|
|
return d2 = e(b2, c2.props), d2.ref = Qg(a2, b2, c2), d2.return = a2, d2;
|
|
|
d2 = Vg(c2.type, c2.key, c2.props, null, a2.mode, d2);
|
|
|
d2.ref = Qg(a2, b2, c2);
|
|
|
d2.return = a2;
|
|
|
return d2;
|
|
|
}
|
|
|
function l2(a2, b2, c2, d2) {
|
|
|
if (b2 === null || b2.tag !== 4 || b2.stateNode.containerInfo !== c2.containerInfo || b2.stateNode.implementation !== c2.implementation)
|
|
|
return b2 = Wg(c2, a2.mode, d2), b2.return = a2, b2;
|
|
|
b2 = e(b2, c2.children || []);
|
|
|
b2.return = a2;
|
|
|
return b2;
|
|
|
}
|
|
|
function n2(a2, b2, c2, d2, f3) {
|
|
|
if (b2 === null || b2.tag !== 7)
|
|
|
return b2 = Xg(c2, a2.mode, d2, f3), b2.return = a2, b2;
|
|
|
b2 = e(b2, c2);
|
|
|
b2.return = a2;
|
|
|
return b2;
|
|
|
}
|
|
|
function A2(a2, b2, c2) {
|
|
|
if (typeof b2 === "string" || typeof b2 === "number")
|
|
|
return b2 = Ug("" + b2, a2.mode, c2), b2.return = a2, b2;
|
|
|
if (typeof b2 === "object" && b2 !== null) {
|
|
|
switch (b2.$$typeof) {
|
|
|
case sa:
|
|
|
return c2 = Vg(b2.type, b2.key, b2.props, null, a2.mode, c2), c2.ref = Qg(a2, null, b2), c2.return = a2, c2;
|
|
|
case ta:
|
|
|
return b2 = Wg(b2, a2.mode, c2), b2.return = a2, b2;
|
|
|
}
|
|
|
if (Pg(b2) || La(b2))
|
|
|
return b2 = Xg(b2, a2.mode, c2, null), b2.return = a2, b2;
|
|
|
Rg(a2, b2);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function p2(a2, b2, c2, d2) {
|
|
|
var e2 = b2 !== null ? b2.key : null;
|
|
|
if (typeof c2 === "string" || typeof c2 === "number")
|
|
|
return e2 !== null ? null : h2(a2, b2, "" + c2, d2);
|
|
|
if (typeof c2 === "object" && c2 !== null) {
|
|
|
switch (c2.$$typeof) {
|
|
|
case sa:
|
|
|
return c2.key === e2 ? c2.type === ua ? n2(a2, b2, c2.props.children, d2, e2) : k(a2, b2, c2, d2) : null;
|
|
|
case ta:
|
|
|
return c2.key === e2 ? l2(a2, b2, c2, d2) : null;
|
|
|
}
|
|
|
if (Pg(c2) || La(c2))
|
|
|
return e2 !== null ? null : n2(a2, b2, c2, d2, null);
|
|
|
Rg(a2, c2);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function C2(a2, b2, c2, d2, e2) {
|
|
|
if (typeof d2 === "string" || typeof d2 === "number")
|
|
|
return a2 = a2.get(c2) || null, h2(b2, a2, "" + d2, e2);
|
|
|
if (typeof d2 === "object" && d2 !== null) {
|
|
|
switch (d2.$$typeof) {
|
|
|
case sa:
|
|
|
return a2 = a2.get(d2.key === null ? c2 : d2.key) || null, d2.type === ua ? n2(b2, a2, d2.props.children, e2, d2.key) : k(b2, a2, d2, e2);
|
|
|
case ta:
|
|
|
return a2 = a2.get(d2.key === null ? c2 : d2.key) || null, l2(b2, a2, d2, e2);
|
|
|
}
|
|
|
if (Pg(d2) || La(d2))
|
|
|
return a2 = a2.get(c2) || null, n2(b2, a2, d2, e2, null);
|
|
|
Rg(b2, d2);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function x2(e2, g3, h3, k2) {
|
|
|
for (var l3 = null, t2 = null, u2 = g3, z2 = g3 = 0, q2 = null; u2 !== null && z2 < h3.length; z2++) {
|
|
|
u2.index > z2 ? (q2 = u2, u2 = null) : q2 = u2.sibling;
|
|
|
var n3 = p2(e2, u2, h3[z2], k2);
|
|
|
if (n3 === null) {
|
|
|
u2 === null && (u2 = q2);
|
|
|
break;
|
|
|
}
|
|
|
a && u2 && n3.alternate === null && b(e2, u2);
|
|
|
g3 = f2(n3, g3, z2);
|
|
|
t2 === null ? l3 = n3 : t2.sibling = n3;
|
|
|
t2 = n3;
|
|
|
u2 = q2;
|
|
|
}
|
|
|
if (z2 === h3.length)
|
|
|
return c(e2, u2), l3;
|
|
|
if (u2 === null) {
|
|
|
for (; z2 < h3.length; z2++)
|
|
|
u2 = A2(e2, h3[z2], k2), u2 !== null && (g3 = f2(u2, g3, z2), t2 === null ? l3 = u2 : t2.sibling = u2, t2 = u2);
|
|
|
return l3;
|
|
|
}
|
|
|
for (u2 = d(e2, u2); z2 < h3.length; z2++)
|
|
|
q2 = C2(u2, e2, z2, h3[z2], k2), q2 !== null && (a && q2.alternate !== null && u2.delete(q2.key === null ? z2 : q2.key), g3 = f2(q2, g3, z2), t2 === null ? l3 = q2 : t2.sibling = q2, t2 = q2);
|
|
|
a && u2.forEach(function(a2) {
|
|
|
return b(e2, a2);
|
|
|
});
|
|
|
return l3;
|
|
|
}
|
|
|
function w2(e2, g3, h3, k2) {
|
|
|
var l3 = La(h3);
|
|
|
if (typeof l3 !== "function")
|
|
|
throw Error(y(150));
|
|
|
h3 = l3.call(h3);
|
|
|
if (h3 == null)
|
|
|
throw Error(y(151));
|
|
|
for (var t2 = l3 = null, u2 = g3, z2 = g3 = 0, q2 = null, n3 = h3.next(); u2 !== null && !n3.done; z2++, n3 = h3.next()) {
|
|
|
u2.index > z2 ? (q2 = u2, u2 = null) : q2 = u2.sibling;
|
|
|
var w3 = p2(e2, u2, n3.value, k2);
|
|
|
if (w3 === null) {
|
|
|
u2 === null && (u2 = q2);
|
|
|
break;
|
|
|
}
|
|
|
a && u2 && w3.alternate === null && b(e2, u2);
|
|
|
g3 = f2(w3, g3, z2);
|
|
|
t2 === null ? l3 = w3 : t2.sibling = w3;
|
|
|
t2 = w3;
|
|
|
u2 = q2;
|
|
|
}
|
|
|
if (n3.done)
|
|
|
return c(e2, u2), l3;
|
|
|
if (u2 === null) {
|
|
|
for (; !n3.done; z2++, n3 = h3.next())
|
|
|
n3 = A2(e2, n3.value, k2), n3 !== null && (g3 = f2(n3, g3, z2), t2 === null ? l3 = n3 : t2.sibling = n3, t2 = n3);
|
|
|
return l3;
|
|
|
}
|
|
|
for (u2 = d(e2, u2); !n3.done; z2++, n3 = h3.next())
|
|
|
n3 = C2(u2, e2, z2, n3.value, k2), n3 !== null && (a && n3.alternate !== null && u2.delete(n3.key === null ? z2 : n3.key), g3 = f2(n3, g3, z2), t2 === null ? l3 = n3 : t2.sibling = n3, t2 = n3);
|
|
|
a && u2.forEach(function(a2) {
|
|
|
return b(e2, a2);
|
|
|
});
|
|
|
return l3;
|
|
|
}
|
|
|
return function(a2, d2, f3, h3) {
|
|
|
var k2 = typeof f3 === "object" && f3 !== null && f3.type === ua && f3.key === null;
|
|
|
k2 && (f3 = f3.props.children);
|
|
|
var l3 = typeof f3 === "object" && f3 !== null;
|
|
|
if (l3)
|
|
|
switch (f3.$$typeof) {
|
|
|
case sa:
|
|
|
a: {
|
|
|
l3 = f3.key;
|
|
|
for (k2 = d2; k2 !== null; ) {
|
|
|
if (k2.key === l3) {
|
|
|
switch (k2.tag) {
|
|
|
case 7:
|
|
|
if (f3.type === ua) {
|
|
|
c(a2, k2.sibling);
|
|
|
d2 = e(k2, f3.props.children);
|
|
|
d2.return = a2;
|
|
|
a2 = d2;
|
|
|
break a;
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
|
if (k2.elementType === f3.type) {
|
|
|
c(a2, k2.sibling);
|
|
|
d2 = e(k2, f3.props);
|
|
|
d2.ref = Qg(a2, k2, f3);
|
|
|
d2.return = a2;
|
|
|
a2 = d2;
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
c(a2, k2);
|
|
|
break;
|
|
|
} else
|
|
|
b(a2, k2);
|
|
|
k2 = k2.sibling;
|
|
|
}
|
|
|
f3.type === ua ? (d2 = Xg(f3.props.children, a2.mode, h3, f3.key), d2.return = a2, a2 = d2) : (h3 = Vg(f3.type, f3.key, f3.props, null, a2.mode, h3), h3.ref = Qg(a2, d2, f3), h3.return = a2, a2 = h3);
|
|
|
}
|
|
|
return g2(a2);
|
|
|
case ta:
|
|
|
a: {
|
|
|
for (k2 = f3.key; d2 !== null; ) {
|
|
|
if (d2.key === k2)
|
|
|
if (d2.tag === 4 && d2.stateNode.containerInfo === f3.containerInfo && d2.stateNode.implementation === f3.implementation) {
|
|
|
c(a2, d2.sibling);
|
|
|
d2 = e(d2, f3.children || []);
|
|
|
d2.return = a2;
|
|
|
a2 = d2;
|
|
|
break a;
|
|
|
} else {
|
|
|
c(a2, d2);
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
b(a2, d2);
|
|
|
d2 = d2.sibling;
|
|
|
}
|
|
|
d2 = Wg(f3, a2.mode, h3);
|
|
|
d2.return = a2;
|
|
|
a2 = d2;
|
|
|
}
|
|
|
return g2(a2);
|
|
|
}
|
|
|
if (typeof f3 === "string" || typeof f3 === "number")
|
|
|
return f3 = "" + f3, d2 !== null && d2.tag === 6 ? (c(a2, d2.sibling), d2 = e(d2, f3), d2.return = a2, a2 = d2) : (c(a2, d2), d2 = Ug(f3, a2.mode, h3), d2.return = a2, a2 = d2), g2(a2);
|
|
|
if (Pg(f3))
|
|
|
return x2(a2, d2, f3, h3);
|
|
|
if (La(f3))
|
|
|
return w2(a2, d2, f3, h3);
|
|
|
l3 && Rg(a2, f3);
|
|
|
if (typeof f3 === "undefined" && !k2)
|
|
|
switch (a2.tag) {
|
|
|
case 1:
|
|
|
case 22:
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 15:
|
|
|
throw Error(y(152, Ra(a2.type) || "Component"));
|
|
|
}
|
|
|
return c(a2, d2);
|
|
|
};
|
|
|
}
|
|
|
var Yg = Sg(true), Zg = Sg(false), $g = {}, ah = Bf($g), bh = Bf($g), ch = Bf($g);
|
|
|
function dh(a) {
|
|
|
if (a === $g)
|
|
|
throw Error(y(174));
|
|
|
return a;
|
|
|
}
|
|
|
function eh(a, b) {
|
|
|
I(ch, b);
|
|
|
I(bh, a);
|
|
|
I(ah, $g);
|
|
|
a = b.nodeType;
|
|
|
switch (a) {
|
|
|
case 9:
|
|
|
case 11:
|
|
|
b = (b = b.documentElement) ? b.namespaceURI : mb(null, "");
|
|
|
break;
|
|
|
default:
|
|
|
a = a === 8 ? b.parentNode : b, b = a.namespaceURI || null, a = a.tagName, b = mb(b, a);
|
|
|
}
|
|
|
H(ah);
|
|
|
I(ah, b);
|
|
|
}
|
|
|
function fh() {
|
|
|
H(ah);
|
|
|
H(bh);
|
|
|
H(ch);
|
|
|
}
|
|
|
function gh(a) {
|
|
|
dh(ch.current);
|
|
|
var b = dh(ah.current);
|
|
|
var c = mb(b, a.type);
|
|
|
b !== c && (I(bh, a), I(ah, c));
|
|
|
}
|
|
|
function hh(a) {
|
|
|
bh.current === a && (H(ah), H(bh));
|
|
|
}
|
|
|
var P = Bf(0);
|
|
|
function ih(a) {
|
|
|
for (var b = a; b !== null; ) {
|
|
|
if (b.tag === 13) {
|
|
|
var c = b.memoizedState;
|
|
|
if (c !== null && (c = c.dehydrated, c === null || c.data === "$?" || c.data === "$!"))
|
|
|
return b;
|
|
|
} else if (b.tag === 19 && b.memoizedProps.revealOrder !== void 0) {
|
|
|
if ((b.flags & 64) !== 0)
|
|
|
return b;
|
|
|
} else if (b.child !== null) {
|
|
|
b.child.return = b;
|
|
|
b = b.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (b === a)
|
|
|
break;
|
|
|
for (; b.sibling === null; ) {
|
|
|
if (b.return === null || b.return === a)
|
|
|
return null;
|
|
|
b = b.return;
|
|
|
}
|
|
|
b.sibling.return = b.return;
|
|
|
b = b.sibling;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
var jh = null, kh = null, lh = false;
|
|
|
function mh(a, b) {
|
|
|
var c = nh(5, null, null, 0);
|
|
|
c.elementType = "DELETED";
|
|
|
c.type = "DELETED";
|
|
|
c.stateNode = b;
|
|
|
c.return = a;
|
|
|
c.flags = 8;
|
|
|
a.lastEffect !== null ? (a.lastEffect.nextEffect = c, a.lastEffect = c) : a.firstEffect = a.lastEffect = c;
|
|
|
}
|
|
|
function oh(a, b) {
|
|
|
switch (a.tag) {
|
|
|
case 5:
|
|
|
var c = a.type;
|
|
|
b = b.nodeType !== 1 || c.toLowerCase() !== b.nodeName.toLowerCase() ? null : b;
|
|
|
return b !== null ? (a.stateNode = b, true) : false;
|
|
|
case 6:
|
|
|
return b = a.pendingProps === "" || b.nodeType !== 3 ? null : b, b !== null ? (a.stateNode = b, true) : false;
|
|
|
case 13:
|
|
|
return false;
|
|
|
default:
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function ph(a) {
|
|
|
if (lh) {
|
|
|
var b = kh;
|
|
|
if (b) {
|
|
|
var c = b;
|
|
|
if (!oh(a, b)) {
|
|
|
b = rf(c.nextSibling);
|
|
|
if (!b || !oh(a, b)) {
|
|
|
a.flags = a.flags & -1025 | 2;
|
|
|
lh = false;
|
|
|
jh = a;
|
|
|
return;
|
|
|
}
|
|
|
mh(jh, c);
|
|
|
}
|
|
|
jh = a;
|
|
|
kh = rf(b.firstChild);
|
|
|
} else
|
|
|
a.flags = a.flags & -1025 | 2, lh = false, jh = a;
|
|
|
}
|
|
|
}
|
|
|
function qh(a) {
|
|
|
for (a = a.return; a !== null && a.tag !== 5 && a.tag !== 3 && a.tag !== 13; )
|
|
|
a = a.return;
|
|
|
jh = a;
|
|
|
}
|
|
|
function rh(a) {
|
|
|
if (a !== jh)
|
|
|
return false;
|
|
|
if (!lh)
|
|
|
return qh(a), lh = true, false;
|
|
|
var b = a.type;
|
|
|
if (a.tag !== 5 || b !== "head" && b !== "body" && !nf(b, a.memoizedProps))
|
|
|
for (b = kh; b; )
|
|
|
mh(a, b), b = rf(b.nextSibling);
|
|
|
qh(a);
|
|
|
if (a.tag === 13) {
|
|
|
a = a.memoizedState;
|
|
|
a = a !== null ? a.dehydrated : null;
|
|
|
if (!a)
|
|
|
throw Error(y(317));
|
|
|
a: {
|
|
|
a = a.nextSibling;
|
|
|
for (b = 0; a; ) {
|
|
|
if (a.nodeType === 8) {
|
|
|
var c = a.data;
|
|
|
if (c === "/$") {
|
|
|
if (b === 0) {
|
|
|
kh = rf(a.nextSibling);
|
|
|
break a;
|
|
|
}
|
|
|
b--;
|
|
|
} else
|
|
|
c !== "$" && c !== "$!" && c !== "$?" || b++;
|
|
|
}
|
|
|
a = a.nextSibling;
|
|
|
}
|
|
|
kh = null;
|
|
|
}
|
|
|
} else
|
|
|
kh = jh ? rf(a.stateNode.nextSibling) : null;
|
|
|
return true;
|
|
|
}
|
|
|
function sh() {
|
|
|
kh = jh = null;
|
|
|
lh = false;
|
|
|
}
|
|
|
var th = [];
|
|
|
function uh() {
|
|
|
for (var a = 0; a < th.length; a++)
|
|
|
th[a]._workInProgressVersionPrimary = null;
|
|
|
th.length = 0;
|
|
|
}
|
|
|
var vh = ra.ReactCurrentDispatcher, wh = ra.ReactCurrentBatchConfig, xh = 0, R = null, S = null, T = null, yh = false, zh = false;
|
|
|
function Ah() {
|
|
|
throw Error(y(321));
|
|
|
}
|
|
|
function Bh(a, b) {
|
|
|
if (b === null)
|
|
|
return false;
|
|
|
for (var c = 0; c < b.length && c < a.length; c++)
|
|
|
if (!He(a[c], b[c]))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
function Ch(a, b, c, d, e, f2) {
|
|
|
xh = f2;
|
|
|
R = b;
|
|
|
b.memoizedState = null;
|
|
|
b.updateQueue = null;
|
|
|
b.lanes = 0;
|
|
|
vh.current = a === null || a.memoizedState === null ? Dh : Eh;
|
|
|
a = c(d, e);
|
|
|
if (zh) {
|
|
|
f2 = 0;
|
|
|
do {
|
|
|
zh = false;
|
|
|
if (!(25 > f2))
|
|
|
throw Error(y(301));
|
|
|
f2 += 1;
|
|
|
T = S = null;
|
|
|
b.updateQueue = null;
|
|
|
vh.current = Fh;
|
|
|
a = c(d, e);
|
|
|
} while (zh);
|
|
|
}
|
|
|
vh.current = Gh;
|
|
|
b = S !== null && S.next !== null;
|
|
|
xh = 0;
|
|
|
T = S = R = null;
|
|
|
yh = false;
|
|
|
if (b)
|
|
|
throw Error(y(300));
|
|
|
return a;
|
|
|
}
|
|
|
function Hh() {
|
|
|
var a = { memoizedState: null, baseState: null, baseQueue: null, queue: null, next: null };
|
|
|
T === null ? R.memoizedState = T = a : T = T.next = a;
|
|
|
return T;
|
|
|
}
|
|
|
function Ih() {
|
|
|
if (S === null) {
|
|
|
var a = R.alternate;
|
|
|
a = a !== null ? a.memoizedState : null;
|
|
|
} else
|
|
|
a = S.next;
|
|
|
var b = T === null ? R.memoizedState : T.next;
|
|
|
if (b !== null)
|
|
|
T = b, S = a;
|
|
|
else {
|
|
|
if (a === null)
|
|
|
throw Error(y(310));
|
|
|
S = a;
|
|
|
a = { memoizedState: S.memoizedState, baseState: S.baseState, baseQueue: S.baseQueue, queue: S.queue, next: null };
|
|
|
T === null ? R.memoizedState = T = a : T = T.next = a;
|
|
|
}
|
|
|
return T;
|
|
|
}
|
|
|
function Jh(a, b) {
|
|
|
return typeof b === "function" ? b(a) : b;
|
|
|
}
|
|
|
function Kh(a) {
|
|
|
var b = Ih(), c = b.queue;
|
|
|
if (c === null)
|
|
|
throw Error(y(311));
|
|
|
c.lastRenderedReducer = a;
|
|
|
var d = S, e = d.baseQueue, f2 = c.pending;
|
|
|
if (f2 !== null) {
|
|
|
if (e !== null) {
|
|
|
var g2 = e.next;
|
|
|
e.next = f2.next;
|
|
|
f2.next = g2;
|
|
|
}
|
|
|
d.baseQueue = e = f2;
|
|
|
c.pending = null;
|
|
|
}
|
|
|
if (e !== null) {
|
|
|
e = e.next;
|
|
|
d = d.baseState;
|
|
|
var h2 = g2 = f2 = null, k = e;
|
|
|
do {
|
|
|
var l2 = k.lane;
|
|
|
if ((xh & l2) === l2)
|
|
|
h2 !== null && (h2 = h2.next = { lane: 0, action: k.action, eagerReducer: k.eagerReducer, eagerState: k.eagerState, next: null }), d = k.eagerReducer === a ? k.eagerState : a(d, k.action);
|
|
|
else {
|
|
|
var n2 = {
|
|
|
lane: l2,
|
|
|
action: k.action,
|
|
|
eagerReducer: k.eagerReducer,
|
|
|
eagerState: k.eagerState,
|
|
|
next: null
|
|
|
};
|
|
|
h2 === null ? (g2 = h2 = n2, f2 = d) : h2 = h2.next = n2;
|
|
|
R.lanes |= l2;
|
|
|
Dg |= l2;
|
|
|
}
|
|
|
k = k.next;
|
|
|
} while (k !== null && k !== e);
|
|
|
h2 === null ? f2 = d : h2.next = g2;
|
|
|
He(d, b.memoizedState) || (ug = true);
|
|
|
b.memoizedState = d;
|
|
|
b.baseState = f2;
|
|
|
b.baseQueue = h2;
|
|
|
c.lastRenderedState = d;
|
|
|
}
|
|
|
return [b.memoizedState, c.dispatch];
|
|
|
}
|
|
|
function Lh(a) {
|
|
|
var b = Ih(), c = b.queue;
|
|
|
if (c === null)
|
|
|
throw Error(y(311));
|
|
|
c.lastRenderedReducer = a;
|
|
|
var d = c.dispatch, e = c.pending, f2 = b.memoizedState;
|
|
|
if (e !== null) {
|
|
|
c.pending = null;
|
|
|
var g2 = e = e.next;
|
|
|
do
|
|
|
f2 = a(f2, g2.action), g2 = g2.next;
|
|
|
while (g2 !== e);
|
|
|
He(f2, b.memoizedState) || (ug = true);
|
|
|
b.memoizedState = f2;
|
|
|
b.baseQueue === null && (b.baseState = f2);
|
|
|
c.lastRenderedState = f2;
|
|
|
}
|
|
|
return [f2, d];
|
|
|
}
|
|
|
function Mh(a, b, c) {
|
|
|
var d = b._getVersion;
|
|
|
d = d(b._source);
|
|
|
var e = b._workInProgressVersionPrimary;
|
|
|
if (e !== null)
|
|
|
a = e === d;
|
|
|
else if (a = a.mutableReadLanes, a = (xh & a) === a)
|
|
|
b._workInProgressVersionPrimary = d, th.push(b);
|
|
|
if (a)
|
|
|
return c(b._source);
|
|
|
th.push(b);
|
|
|
throw Error(y(350));
|
|
|
}
|
|
|
function Nh(a, b, c, d) {
|
|
|
var e = U;
|
|
|
if (e === null)
|
|
|
throw Error(y(349));
|
|
|
var f2 = b._getVersion, g2 = f2(b._source), h2 = vh.current, k = h2.useState(function() {
|
|
|
return Mh(e, b, c);
|
|
|
}), l2 = k[1], n2 = k[0];
|
|
|
k = T;
|
|
|
var A2 = a.memoizedState, p2 = A2.refs, C2 = p2.getSnapshot, x2 = A2.source;
|
|
|
A2 = A2.subscribe;
|
|
|
var w2 = R;
|
|
|
a.memoizedState = { refs: p2, source: b, subscribe: d };
|
|
|
h2.useEffect(function() {
|
|
|
p2.getSnapshot = c;
|
|
|
p2.setSnapshot = l2;
|
|
|
var a2 = f2(b._source);
|
|
|
if (!He(g2, a2)) {
|
|
|
a2 = c(b._source);
|
|
|
He(n2, a2) || (l2(a2), a2 = Ig(w2), e.mutableReadLanes |= a2 & e.pendingLanes);
|
|
|
a2 = e.mutableReadLanes;
|
|
|
e.entangledLanes |= a2;
|
|
|
for (var d2 = e.entanglements, h3 = a2; 0 < h3; ) {
|
|
|
var k2 = 31 - Vc(h3), v2 = 1 << k2;
|
|
|
d2[k2] |= a2;
|
|
|
h3 &= ~v2;
|
|
|
}
|
|
|
}
|
|
|
}, [c, b, d]);
|
|
|
h2.useEffect(function() {
|
|
|
return d(b._source, function() {
|
|
|
var a2 = p2.getSnapshot, c2 = p2.setSnapshot;
|
|
|
try {
|
|
|
c2(a2(b._source));
|
|
|
var d2 = Ig(w2);
|
|
|
e.mutableReadLanes |= d2 & e.pendingLanes;
|
|
|
} catch (q2) {
|
|
|
c2(function() {
|
|
|
throw q2;
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}, [b, d]);
|
|
|
He(C2, c) && He(x2, b) && He(A2, d) || (a = { pending: null, dispatch: null, lastRenderedReducer: Jh, lastRenderedState: n2 }, a.dispatch = l2 = Oh.bind(null, R, a), k.queue = a, k.baseQueue = null, n2 = Mh(e, b, c), k.memoizedState = k.baseState = n2);
|
|
|
return n2;
|
|
|
}
|
|
|
function Ph(a, b, c) {
|
|
|
var d = Ih();
|
|
|
return Nh(d, a, b, c);
|
|
|
}
|
|
|
function Qh(a) {
|
|
|
var b = Hh();
|
|
|
typeof a === "function" && (a = a());
|
|
|
b.memoizedState = b.baseState = a;
|
|
|
a = b.queue = { pending: null, dispatch: null, lastRenderedReducer: Jh, lastRenderedState: a };
|
|
|
a = a.dispatch = Oh.bind(null, R, a);
|
|
|
return [b.memoizedState, a];
|
|
|
}
|
|
|
function Rh(a, b, c, d) {
|
|
|
a = { tag: a, create: b, destroy: c, deps: d, next: null };
|
|
|
b = R.updateQueue;
|
|
|
b === null ? (b = { lastEffect: null }, R.updateQueue = b, b.lastEffect = a.next = a) : (c = b.lastEffect, c === null ? b.lastEffect = a.next = a : (d = c.next, c.next = a, a.next = d, b.lastEffect = a));
|
|
|
return a;
|
|
|
}
|
|
|
function Sh(a) {
|
|
|
var b = Hh();
|
|
|
a = { current: a };
|
|
|
return b.memoizedState = a;
|
|
|
}
|
|
|
function Th() {
|
|
|
return Ih().memoizedState;
|
|
|
}
|
|
|
function Uh(a, b, c, d) {
|
|
|
var e = Hh();
|
|
|
R.flags |= a;
|
|
|
e.memoizedState = Rh(1 | b, c, void 0, d === void 0 ? null : d);
|
|
|
}
|
|
|
function Vh(a, b, c, d) {
|
|
|
var e = Ih();
|
|
|
d = d === void 0 ? null : d;
|
|
|
var f2 = void 0;
|
|
|
if (S !== null) {
|
|
|
var g2 = S.memoizedState;
|
|
|
f2 = g2.destroy;
|
|
|
if (d !== null && Bh(d, g2.deps)) {
|
|
|
Rh(b, c, f2, d);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
R.flags |= a;
|
|
|
e.memoizedState = Rh(1 | b, c, f2, d);
|
|
|
}
|
|
|
function Wh(a, b) {
|
|
|
return Uh(516, 4, a, b);
|
|
|
}
|
|
|
function Xh(a, b) {
|
|
|
return Vh(516, 4, a, b);
|
|
|
}
|
|
|
function Yh(a, b) {
|
|
|
return Vh(4, 2, a, b);
|
|
|
}
|
|
|
function Zh(a, b) {
|
|
|
if (typeof b === "function")
|
|
|
return a = a(), b(a), function() {
|
|
|
b(null);
|
|
|
};
|
|
|
if (b !== null && b !== void 0)
|
|
|
return a = a(), b.current = a, function() {
|
|
|
b.current = null;
|
|
|
};
|
|
|
}
|
|
|
function $h(a, b, c) {
|
|
|
c = c !== null && c !== void 0 ? c.concat([a]) : null;
|
|
|
return Vh(4, 2, Zh.bind(null, b, a), c);
|
|
|
}
|
|
|
function ai() {
|
|
|
}
|
|
|
function bi(a, b) {
|
|
|
var c = Ih();
|
|
|
b = b === void 0 ? null : b;
|
|
|
var d = c.memoizedState;
|
|
|
if (d !== null && b !== null && Bh(b, d[1]))
|
|
|
return d[0];
|
|
|
c.memoizedState = [a, b];
|
|
|
return a;
|
|
|
}
|
|
|
function ci(a, b) {
|
|
|
var c = Ih();
|
|
|
b = b === void 0 ? null : b;
|
|
|
var d = c.memoizedState;
|
|
|
if (d !== null && b !== null && Bh(b, d[1]))
|
|
|
return d[0];
|
|
|
a = a();
|
|
|
c.memoizedState = [a, b];
|
|
|
return a;
|
|
|
}
|
|
|
function di(a, b) {
|
|
|
var c = eg();
|
|
|
gg(98 > c ? 98 : c, function() {
|
|
|
a(true);
|
|
|
});
|
|
|
gg(97 < c ? 97 : c, function() {
|
|
|
var c2 = wh.transition;
|
|
|
wh.transition = 1;
|
|
|
try {
|
|
|
a(false), b();
|
|
|
} finally {
|
|
|
wh.transition = c2;
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
function Oh(a, b, c) {
|
|
|
var d = Hg(), e = Ig(a), f2 = { lane: e, action: c, eagerReducer: null, eagerState: null, next: null }, g2 = b.pending;
|
|
|
g2 === null ? f2.next = f2 : (f2.next = g2.next, g2.next = f2);
|
|
|
b.pending = f2;
|
|
|
g2 = a.alternate;
|
|
|
if (a === R || g2 !== null && g2 === R)
|
|
|
zh = yh = true;
|
|
|
else {
|
|
|
if (a.lanes === 0 && (g2 === null || g2.lanes === 0) && (g2 = b.lastRenderedReducer, g2 !== null))
|
|
|
try {
|
|
|
var h2 = b.lastRenderedState, k = g2(h2, c);
|
|
|
f2.eagerReducer = g2;
|
|
|
f2.eagerState = k;
|
|
|
if (He(k, h2))
|
|
|
return;
|
|
|
} catch (l2) {
|
|
|
} finally {
|
|
|
}
|
|
|
Jg(a, e, d);
|
|
|
}
|
|
|
}
|
|
|
var Gh = { readContext: vg, useCallback: Ah, useContext: Ah, useEffect: Ah, useImperativeHandle: Ah, useLayoutEffect: Ah, useMemo: Ah, useReducer: Ah, useRef: Ah, useState: Ah, useDebugValue: Ah, useDeferredValue: Ah, useTransition: Ah, useMutableSource: Ah, useOpaqueIdentifier: Ah, unstable_isNewReconciler: false }, Dh = { readContext: vg, useCallback: function(a, b) {
|
|
|
Hh().memoizedState = [a, b === void 0 ? null : b];
|
|
|
return a;
|
|
|
}, useContext: vg, useEffect: Wh, useImperativeHandle: function(a, b, c) {
|
|
|
c = c !== null && c !== void 0 ? c.concat([a]) : null;
|
|
|
return Uh(4, 2, Zh.bind(null, b, a), c);
|
|
|
}, useLayoutEffect: function(a, b) {
|
|
|
return Uh(4, 2, a, b);
|
|
|
}, useMemo: function(a, b) {
|
|
|
var c = Hh();
|
|
|
b = b === void 0 ? null : b;
|
|
|
a = a();
|
|
|
c.memoizedState = [a, b];
|
|
|
return a;
|
|
|
}, useReducer: function(a, b, c) {
|
|
|
var d = Hh();
|
|
|
b = c !== void 0 ? c(b) : b;
|
|
|
d.memoizedState = d.baseState = b;
|
|
|
a = d.queue = { pending: null, dispatch: null, lastRenderedReducer: a, lastRenderedState: b };
|
|
|
a = a.dispatch = Oh.bind(null, R, a);
|
|
|
return [d.memoizedState, a];
|
|
|
}, useRef: Sh, useState: Qh, useDebugValue: ai, useDeferredValue: function(a) {
|
|
|
var b = Qh(a), c = b[0], d = b[1];
|
|
|
Wh(function() {
|
|
|
var b2 = wh.transition;
|
|
|
wh.transition = 1;
|
|
|
try {
|
|
|
d(a);
|
|
|
} finally {
|
|
|
wh.transition = b2;
|
|
|
}
|
|
|
}, [a]);
|
|
|
return c;
|
|
|
}, useTransition: function() {
|
|
|
var a = Qh(false), b = a[0];
|
|
|
a = di.bind(null, a[1]);
|
|
|
Sh(a);
|
|
|
return [a, b];
|
|
|
}, useMutableSource: function(a, b, c) {
|
|
|
var d = Hh();
|
|
|
d.memoizedState = { refs: { getSnapshot: b, setSnapshot: null }, source: a, subscribe: c };
|
|
|
return Nh(d, a, b, c);
|
|
|
}, useOpaqueIdentifier: function() {
|
|
|
if (lh) {
|
|
|
var a = false, b = uf(function() {
|
|
|
a || (a = true, c("r:" + (tf++).toString(36)));
|
|
|
throw Error(y(355));
|
|
|
}), c = Qh(b)[1];
|
|
|
(R.mode & 2) === 0 && (R.flags |= 516, Rh(5, function() {
|
|
|
c("r:" + (tf++).toString(36));
|
|
|
}, void 0, null));
|
|
|
return b;
|
|
|
}
|
|
|
b = "r:" + (tf++).toString(36);
|
|
|
Qh(b);
|
|
|
return b;
|
|
|
}, unstable_isNewReconciler: false }, Eh = { readContext: vg, useCallback: bi, useContext: vg, useEffect: Xh, useImperativeHandle: $h, useLayoutEffect: Yh, useMemo: ci, useReducer: Kh, useRef: Th, useState: function() {
|
|
|
return Kh(Jh);
|
|
|
}, useDebugValue: ai, useDeferredValue: function(a) {
|
|
|
var b = Kh(Jh), c = b[0], d = b[1];
|
|
|
Xh(function() {
|
|
|
var b2 = wh.transition;
|
|
|
wh.transition = 1;
|
|
|
try {
|
|
|
d(a);
|
|
|
} finally {
|
|
|
wh.transition = b2;
|
|
|
}
|
|
|
}, [a]);
|
|
|
return c;
|
|
|
}, useTransition: function() {
|
|
|
var a = Kh(Jh)[0];
|
|
|
return [
|
|
|
Th().current,
|
|
|
a
|
|
|
];
|
|
|
}, useMutableSource: Ph, useOpaqueIdentifier: function() {
|
|
|
return Kh(Jh)[0];
|
|
|
}, unstable_isNewReconciler: false }, Fh = { readContext: vg, useCallback: bi, useContext: vg, useEffect: Xh, useImperativeHandle: $h, useLayoutEffect: Yh, useMemo: ci, useReducer: Lh, useRef: Th, useState: function() {
|
|
|
return Lh(Jh);
|
|
|
}, useDebugValue: ai, useDeferredValue: function(a) {
|
|
|
var b = Lh(Jh), c = b[0], d = b[1];
|
|
|
Xh(function() {
|
|
|
var b2 = wh.transition;
|
|
|
wh.transition = 1;
|
|
|
try {
|
|
|
d(a);
|
|
|
} finally {
|
|
|
wh.transition = b2;
|
|
|
}
|
|
|
}, [a]);
|
|
|
return c;
|
|
|
}, useTransition: function() {
|
|
|
var a = Lh(Jh)[0];
|
|
|
return [
|
|
|
Th().current,
|
|
|
a
|
|
|
];
|
|
|
}, useMutableSource: Ph, useOpaqueIdentifier: function() {
|
|
|
return Lh(Jh)[0];
|
|
|
}, unstable_isNewReconciler: false }, ei = ra.ReactCurrentOwner, ug = false;
|
|
|
function fi(a, b, c, d) {
|
|
|
b.child = a === null ? Zg(b, null, c, d) : Yg(b, a.child, c, d);
|
|
|
}
|
|
|
function gi(a, b, c, d, e) {
|
|
|
c = c.render;
|
|
|
var f2 = b.ref;
|
|
|
tg(b, e);
|
|
|
d = Ch(a, b, c, d, f2, e);
|
|
|
if (a !== null && !ug)
|
|
|
return b.updateQueue = a.updateQueue, b.flags &= -517, a.lanes &= ~e, hi$1(a, b, e);
|
|
|
b.flags |= 1;
|
|
|
fi(a, b, d, e);
|
|
|
return b.child;
|
|
|
}
|
|
|
function ii(a, b, c, d, e, f2) {
|
|
|
if (a === null) {
|
|
|
var g2 = c.type;
|
|
|
if (typeof g2 === "function" && !ji(g2) && g2.defaultProps === void 0 && c.compare === null && c.defaultProps === void 0)
|
|
|
return b.tag = 15, b.type = g2, ki(a, b, g2, d, e, f2);
|
|
|
a = Vg(c.type, null, d, b, b.mode, f2);
|
|
|
a.ref = b.ref;
|
|
|
a.return = b;
|
|
|
return b.child = a;
|
|
|
}
|
|
|
g2 = a.child;
|
|
|
if ((e & f2) === 0 && (e = g2.memoizedProps, c = c.compare, c = c !== null ? c : Je, c(e, d) && a.ref === b.ref))
|
|
|
return hi$1(a, b, f2);
|
|
|
b.flags |= 1;
|
|
|
a = Tg(g2, d);
|
|
|
a.ref = b.ref;
|
|
|
a.return = b;
|
|
|
return b.child = a;
|
|
|
}
|
|
|
function ki(a, b, c, d, e, f2) {
|
|
|
if (a !== null && Je(a.memoizedProps, d) && a.ref === b.ref)
|
|
|
if (ug = false, (f2 & e) !== 0)
|
|
|
(a.flags & 16384) !== 0 && (ug = true);
|
|
|
else
|
|
|
return b.lanes = a.lanes, hi$1(a, b, f2);
|
|
|
return li(a, b, c, d, f2);
|
|
|
}
|
|
|
function mi(a, b, c) {
|
|
|
var d = b.pendingProps, e = d.children, f2 = a !== null ? a.memoizedState : null;
|
|
|
if (d.mode === "hidden" || d.mode === "unstable-defer-without-hiding")
|
|
|
if ((b.mode & 4) === 0)
|
|
|
b.memoizedState = { baseLanes: 0 }, ni(b, c);
|
|
|
else if ((c & 1073741824) !== 0)
|
|
|
b.memoizedState = { baseLanes: 0 }, ni(b, f2 !== null ? f2.baseLanes : c);
|
|
|
else
|
|
|
return a = f2 !== null ? f2.baseLanes | c : c, b.lanes = b.childLanes = 1073741824, b.memoizedState = { baseLanes: a }, ni(b, a), null;
|
|
|
else
|
|
|
f2 !== null ? (d = f2.baseLanes | c, b.memoizedState = null) : d = c, ni(b, d);
|
|
|
fi(a, b, e, c);
|
|
|
return b.child;
|
|
|
}
|
|
|
function oi(a, b) {
|
|
|
var c = b.ref;
|
|
|
if (a === null && c !== null || a !== null && a.ref !== c)
|
|
|
b.flags |= 128;
|
|
|
}
|
|
|
function li(a, b, c, d, e) {
|
|
|
var f2 = Ff(c) ? Df : M.current;
|
|
|
f2 = Ef(b, f2);
|
|
|
tg(b, e);
|
|
|
c = Ch(a, b, c, d, f2, e);
|
|
|
if (a !== null && !ug)
|
|
|
return b.updateQueue = a.updateQueue, b.flags &= -517, a.lanes &= ~e, hi$1(a, b, e);
|
|
|
b.flags |= 1;
|
|
|
fi(a, b, c, e);
|
|
|
return b.child;
|
|
|
}
|
|
|
function pi(a, b, c, d, e) {
|
|
|
if (Ff(c)) {
|
|
|
var f2 = true;
|
|
|
Jf(b);
|
|
|
} else
|
|
|
f2 = false;
|
|
|
tg(b, e);
|
|
|
if (b.stateNode === null)
|
|
|
a !== null && (a.alternate = null, b.alternate = null, b.flags |= 2), Mg(b, c, d), Og(b, c, d, e), d = true;
|
|
|
else if (a === null) {
|
|
|
var g2 = b.stateNode, h2 = b.memoizedProps;
|
|
|
g2.props = h2;
|
|
|
var k = g2.context, l2 = c.contextType;
|
|
|
typeof l2 === "object" && l2 !== null ? l2 = vg(l2) : (l2 = Ff(c) ? Df : M.current, l2 = Ef(b, l2));
|
|
|
var n2 = c.getDerivedStateFromProps, A2 = typeof n2 === "function" || typeof g2.getSnapshotBeforeUpdate === "function";
|
|
|
A2 || typeof g2.UNSAFE_componentWillReceiveProps !== "function" && typeof g2.componentWillReceiveProps !== "function" || (h2 !== d || k !== l2) && Ng(b, g2, d, l2);
|
|
|
wg = false;
|
|
|
var p2 = b.memoizedState;
|
|
|
g2.state = p2;
|
|
|
Cg(b, d, g2, e);
|
|
|
k = b.memoizedState;
|
|
|
h2 !== d || p2 !== k || N.current || wg ? (typeof n2 === "function" && (Gg(b, c, n2, d), k = b.memoizedState), (h2 = wg || Lg(b, c, h2, d, p2, k, l2)) ? (A2 || typeof g2.UNSAFE_componentWillMount !== "function" && typeof g2.componentWillMount !== "function" || (typeof g2.componentWillMount === "function" && g2.componentWillMount(), typeof g2.UNSAFE_componentWillMount === "function" && g2.UNSAFE_componentWillMount()), typeof g2.componentDidMount === "function" && (b.flags |= 4)) : (typeof g2.componentDidMount === "function" && (b.flags |= 4), b.memoizedProps = d, b.memoizedState = k), g2.props = d, g2.state = k, g2.context = l2, d = h2) : (typeof g2.componentDidMount === "function" && (b.flags |= 4), d = false);
|
|
|
} else {
|
|
|
g2 = b.stateNode;
|
|
|
yg(a, b);
|
|
|
h2 = b.memoizedProps;
|
|
|
l2 = b.type === b.elementType ? h2 : lg(b.type, h2);
|
|
|
g2.props = l2;
|
|
|
A2 = b.pendingProps;
|
|
|
p2 = g2.context;
|
|
|
k = c.contextType;
|
|
|
typeof k === "object" && k !== null ? k = vg(k) : (k = Ff(c) ? Df : M.current, k = Ef(b, k));
|
|
|
var C2 = c.getDerivedStateFromProps;
|
|
|
(n2 = typeof C2 === "function" || typeof g2.getSnapshotBeforeUpdate === "function") || typeof g2.UNSAFE_componentWillReceiveProps !== "function" && typeof g2.componentWillReceiveProps !== "function" || (h2 !== A2 || p2 !== k) && Ng(b, g2, d, k);
|
|
|
wg = false;
|
|
|
p2 = b.memoizedState;
|
|
|
g2.state = p2;
|
|
|
Cg(b, d, g2, e);
|
|
|
var x2 = b.memoizedState;
|
|
|
h2 !== A2 || p2 !== x2 || N.current || wg ? (typeof C2 === "function" && (Gg(b, c, C2, d), x2 = b.memoizedState), (l2 = wg || Lg(b, c, l2, d, p2, x2, k)) ? (n2 || typeof g2.UNSAFE_componentWillUpdate !== "function" && typeof g2.componentWillUpdate !== "function" || (typeof g2.componentWillUpdate === "function" && g2.componentWillUpdate(d, x2, k), typeof g2.UNSAFE_componentWillUpdate === "function" && g2.UNSAFE_componentWillUpdate(d, x2, k)), typeof g2.componentDidUpdate === "function" && (b.flags |= 4), typeof g2.getSnapshotBeforeUpdate === "function" && (b.flags |= 256)) : (typeof g2.componentDidUpdate !== "function" || h2 === a.memoizedProps && p2 === a.memoizedState || (b.flags |= 4), typeof g2.getSnapshotBeforeUpdate !== "function" || h2 === a.memoizedProps && p2 === a.memoizedState || (b.flags |= 256), b.memoizedProps = d, b.memoizedState = x2), g2.props = d, g2.state = x2, g2.context = k, d = l2) : (typeof g2.componentDidUpdate !== "function" || h2 === a.memoizedProps && p2 === a.memoizedState || (b.flags |= 4), typeof g2.getSnapshotBeforeUpdate !== "function" || h2 === a.memoizedProps && p2 === a.memoizedState || (b.flags |= 256), d = false);
|
|
|
}
|
|
|
return qi(a, b, c, d, f2, e);
|
|
|
}
|
|
|
function qi(a, b, c, d, e, f2) {
|
|
|
oi(a, b);
|
|
|
var g2 = (b.flags & 64) !== 0;
|
|
|
if (!d && !g2)
|
|
|
return e && Kf(b, c, false), hi$1(a, b, f2);
|
|
|
d = b.stateNode;
|
|
|
ei.current = b;
|
|
|
var h2 = g2 && typeof c.getDerivedStateFromError !== "function" ? null : d.render();
|
|
|
b.flags |= 1;
|
|
|
a !== null && g2 ? (b.child = Yg(b, a.child, null, f2), b.child = Yg(b, null, h2, f2)) : fi(a, b, h2, f2);
|
|
|
b.memoizedState = d.state;
|
|
|
e && Kf(b, c, true);
|
|
|
return b.child;
|
|
|
}
|
|
|
function ri(a) {
|
|
|
var b = a.stateNode;
|
|
|
b.pendingContext ? Hf(a, b.pendingContext, b.pendingContext !== b.context) : b.context && Hf(a, b.context, false);
|
|
|
eh(a, b.containerInfo);
|
|
|
}
|
|
|
var si = { dehydrated: null, retryLane: 0 };
|
|
|
function ti(a, b, c) {
|
|
|
var d = b.pendingProps, e = P.current, f2 = false, g2;
|
|
|
(g2 = (b.flags & 64) !== 0) || (g2 = a !== null && a.memoizedState === null ? false : (e & 2) !== 0);
|
|
|
g2 ? (f2 = true, b.flags &= -65) : a !== null && a.memoizedState === null || d.fallback === void 0 || d.unstable_avoidThisFallback === true || (e |= 1);
|
|
|
I(P, e & 1);
|
|
|
if (a === null) {
|
|
|
d.fallback !== void 0 && ph(b);
|
|
|
a = d.children;
|
|
|
e = d.fallback;
|
|
|
if (f2)
|
|
|
return a = ui(b, a, e, c), b.child.memoizedState = { baseLanes: c }, b.memoizedState = si, a;
|
|
|
if (typeof d.unstable_expectedLoadTime === "number")
|
|
|
return a = ui(b, a, e, c), b.child.memoizedState = { baseLanes: c }, b.memoizedState = si, b.lanes = 33554432, a;
|
|
|
c = vi({ mode: "visible", children: a }, b.mode, c, null);
|
|
|
c.return = b;
|
|
|
return b.child = c;
|
|
|
}
|
|
|
if (a.memoizedState !== null) {
|
|
|
if (f2)
|
|
|
return d = wi(a, b, d.children, d.fallback, c), f2 = b.child, e = a.child.memoizedState, f2.memoizedState = e === null ? { baseLanes: c } : { baseLanes: e.baseLanes | c }, f2.childLanes = a.childLanes & ~c, b.memoizedState = si, d;
|
|
|
c = xi(a, b, d.children, c);
|
|
|
b.memoizedState = null;
|
|
|
return c;
|
|
|
}
|
|
|
if (f2)
|
|
|
return d = wi(a, b, d.children, d.fallback, c), f2 = b.child, e = a.child.memoizedState, f2.memoizedState = e === null ? { baseLanes: c } : { baseLanes: e.baseLanes | c }, f2.childLanes = a.childLanes & ~c, b.memoizedState = si, d;
|
|
|
c = xi(a, b, d.children, c);
|
|
|
b.memoizedState = null;
|
|
|
return c;
|
|
|
}
|
|
|
function ui(a, b, c, d) {
|
|
|
var e = a.mode, f2 = a.child;
|
|
|
b = { mode: "hidden", children: b };
|
|
|
(e & 2) === 0 && f2 !== null ? (f2.childLanes = 0, f2.pendingProps = b) : f2 = vi(b, e, 0, null);
|
|
|
c = Xg(c, e, d, null);
|
|
|
f2.return = a;
|
|
|
c.return = a;
|
|
|
f2.sibling = c;
|
|
|
a.child = f2;
|
|
|
return c;
|
|
|
}
|
|
|
function xi(a, b, c, d) {
|
|
|
var e = a.child;
|
|
|
a = e.sibling;
|
|
|
c = Tg(e, { mode: "visible", children: c });
|
|
|
(b.mode & 2) === 0 && (c.lanes = d);
|
|
|
c.return = b;
|
|
|
c.sibling = null;
|
|
|
a !== null && (a.nextEffect = null, a.flags = 8, b.firstEffect = b.lastEffect = a);
|
|
|
return b.child = c;
|
|
|
}
|
|
|
function wi(a, b, c, d, e) {
|
|
|
var f2 = b.mode, g2 = a.child;
|
|
|
a = g2.sibling;
|
|
|
var h2 = { mode: "hidden", children: c };
|
|
|
(f2 & 2) === 0 && b.child !== g2 ? (c = b.child, c.childLanes = 0, c.pendingProps = h2, g2 = c.lastEffect, g2 !== null ? (b.firstEffect = c.firstEffect, b.lastEffect = g2, g2.nextEffect = null) : b.firstEffect = b.lastEffect = null) : c = Tg(g2, h2);
|
|
|
a !== null ? d = Tg(a, d) : (d = Xg(d, f2, e, null), d.flags |= 2);
|
|
|
d.return = b;
|
|
|
c.return = b;
|
|
|
c.sibling = d;
|
|
|
b.child = c;
|
|
|
return d;
|
|
|
}
|
|
|
function yi(a, b) {
|
|
|
a.lanes |= b;
|
|
|
var c = a.alternate;
|
|
|
c !== null && (c.lanes |= b);
|
|
|
sg(a.return, b);
|
|
|
}
|
|
|
function zi(a, b, c, d, e, f2) {
|
|
|
var g2 = a.memoizedState;
|
|
|
g2 === null ? a.memoizedState = { isBackwards: b, rendering: null, renderingStartTime: 0, last: d, tail: c, tailMode: e, lastEffect: f2 } : (g2.isBackwards = b, g2.rendering = null, g2.renderingStartTime = 0, g2.last = d, g2.tail = c, g2.tailMode = e, g2.lastEffect = f2);
|
|
|
}
|
|
|
function Ai(a, b, c) {
|
|
|
var d = b.pendingProps, e = d.revealOrder, f2 = d.tail;
|
|
|
fi(a, b, d.children, c);
|
|
|
d = P.current;
|
|
|
if ((d & 2) !== 0)
|
|
|
d = d & 1 | 2, b.flags |= 64;
|
|
|
else {
|
|
|
if (a !== null && (a.flags & 64) !== 0)
|
|
|
a:
|
|
|
for (a = b.child; a !== null; ) {
|
|
|
if (a.tag === 13)
|
|
|
a.memoizedState !== null && yi(a, c);
|
|
|
else if (a.tag === 19)
|
|
|
yi(a, c);
|
|
|
else if (a.child !== null) {
|
|
|
a.child.return = a;
|
|
|
a = a.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (a === b)
|
|
|
break a;
|
|
|
for (; a.sibling === null; ) {
|
|
|
if (a.return === null || a.return === b)
|
|
|
break a;
|
|
|
a = a.return;
|
|
|
}
|
|
|
a.sibling.return = a.return;
|
|
|
a = a.sibling;
|
|
|
}
|
|
|
d &= 1;
|
|
|
}
|
|
|
I(P, d);
|
|
|
if ((b.mode & 2) === 0)
|
|
|
b.memoizedState = null;
|
|
|
else
|
|
|
switch (e) {
|
|
|
case "forwards":
|
|
|
c = b.child;
|
|
|
for (e = null; c !== null; )
|
|
|
a = c.alternate, a !== null && ih(a) === null && (e = c), c = c.sibling;
|
|
|
c = e;
|
|
|
c === null ? (e = b.child, b.child = null) : (e = c.sibling, c.sibling = null);
|
|
|
zi(b, false, e, c, f2, b.lastEffect);
|
|
|
break;
|
|
|
case "backwards":
|
|
|
c = null;
|
|
|
e = b.child;
|
|
|
for (b.child = null; e !== null; ) {
|
|
|
a = e.alternate;
|
|
|
if (a !== null && ih(a) === null) {
|
|
|
b.child = e;
|
|
|
break;
|
|
|
}
|
|
|
a = e.sibling;
|
|
|
e.sibling = c;
|
|
|
c = e;
|
|
|
e = a;
|
|
|
}
|
|
|
zi(b, true, c, null, f2, b.lastEffect);
|
|
|
break;
|
|
|
case "together":
|
|
|
zi(b, false, null, null, void 0, b.lastEffect);
|
|
|
break;
|
|
|
default:
|
|
|
b.memoizedState = null;
|
|
|
}
|
|
|
return b.child;
|
|
|
}
|
|
|
function hi$1(a, b, c) {
|
|
|
a !== null && (b.dependencies = a.dependencies);
|
|
|
Dg |= b.lanes;
|
|
|
if ((c & b.childLanes) !== 0) {
|
|
|
if (a !== null && b.child !== a.child)
|
|
|
throw Error(y(153));
|
|
|
if (b.child !== null) {
|
|
|
a = b.child;
|
|
|
c = Tg(a, a.pendingProps);
|
|
|
b.child = c;
|
|
|
for (c.return = b; a.sibling !== null; )
|
|
|
a = a.sibling, c = c.sibling = Tg(a, a.pendingProps), c.return = b;
|
|
|
c.sibling = null;
|
|
|
}
|
|
|
return b.child;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
var Bi, Ci, Di, Ei;
|
|
|
Bi = function(a, b) {
|
|
|
for (var c = b.child; c !== null; ) {
|
|
|
if (c.tag === 5 || c.tag === 6)
|
|
|
a.appendChild(c.stateNode);
|
|
|
else if (c.tag !== 4 && c.child !== null) {
|
|
|
c.child.return = c;
|
|
|
c = c.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (c === b)
|
|
|
break;
|
|
|
for (; c.sibling === null; ) {
|
|
|
if (c.return === null || c.return === b)
|
|
|
return;
|
|
|
c = c.return;
|
|
|
}
|
|
|
c.sibling.return = c.return;
|
|
|
c = c.sibling;
|
|
|
}
|
|
|
};
|
|
|
Ci = function() {
|
|
|
};
|
|
|
Di = function(a, b, c, d) {
|
|
|
var e = a.memoizedProps;
|
|
|
if (e !== d) {
|
|
|
a = b.stateNode;
|
|
|
dh(ah.current);
|
|
|
var f2 = null;
|
|
|
switch (c) {
|
|
|
case "input":
|
|
|
e = Ya(a, e);
|
|
|
d = Ya(a, d);
|
|
|
f2 = [];
|
|
|
break;
|
|
|
case "option":
|
|
|
e = eb(a, e);
|
|
|
d = eb(a, d);
|
|
|
f2 = [];
|
|
|
break;
|
|
|
case "select":
|
|
|
e = m$1({}, e, { value: void 0 });
|
|
|
d = m$1({}, d, { value: void 0 });
|
|
|
f2 = [];
|
|
|
break;
|
|
|
case "textarea":
|
|
|
e = gb(a, e);
|
|
|
d = gb(a, d);
|
|
|
f2 = [];
|
|
|
break;
|
|
|
default:
|
|
|
typeof e.onClick !== "function" && typeof d.onClick === "function" && (a.onclick = jf);
|
|
|
}
|
|
|
vb(c, d);
|
|
|
var g2;
|
|
|
c = null;
|
|
|
for (l2 in e)
|
|
|
if (!d.hasOwnProperty(l2) && e.hasOwnProperty(l2) && e[l2] != null)
|
|
|
if (l2 === "style") {
|
|
|
var h2 = e[l2];
|
|
|
for (g2 in h2)
|
|
|
h2.hasOwnProperty(g2) && (c || (c = {}), c[g2] = "");
|
|
|
} else
|
|
|
l2 !== "dangerouslySetInnerHTML" && l2 !== "children" && l2 !== "suppressContentEditableWarning" && l2 !== "suppressHydrationWarning" && l2 !== "autoFocus" && (ca.hasOwnProperty(l2) ? f2 || (f2 = []) : (f2 = f2 || []).push(l2, null));
|
|
|
for (l2 in d) {
|
|
|
var k = d[l2];
|
|
|
h2 = e != null ? e[l2] : void 0;
|
|
|
if (d.hasOwnProperty(l2) && k !== h2 && (k != null || h2 != null))
|
|
|
if (l2 === "style")
|
|
|
if (h2) {
|
|
|
for (g2 in h2)
|
|
|
!h2.hasOwnProperty(g2) || k && k.hasOwnProperty(g2) || (c || (c = {}), c[g2] = "");
|
|
|
for (g2 in k)
|
|
|
k.hasOwnProperty(g2) && h2[g2] !== k[g2] && (c || (c = {}), c[g2] = k[g2]);
|
|
|
} else
|
|
|
c || (f2 || (f2 = []), f2.push(l2, c)), c = k;
|
|
|
else
|
|
|
l2 === "dangerouslySetInnerHTML" ? (k = k ? k.__html : void 0, h2 = h2 ? h2.__html : void 0, k != null && h2 !== k && (f2 = f2 || []).push(l2, k)) : l2 === "children" ? typeof k !== "string" && typeof k !== "number" || (f2 = f2 || []).push(l2, "" + k) : l2 !== "suppressContentEditableWarning" && l2 !== "suppressHydrationWarning" && (ca.hasOwnProperty(l2) ? (k != null && l2 === "onScroll" && G("scroll", a), f2 || h2 === k || (f2 = [])) : typeof k === "object" && k !== null && k.$$typeof === Ga ? k.toString() : (f2 = f2 || []).push(l2, k));
|
|
|
}
|
|
|
c && (f2 = f2 || []).push("style", c);
|
|
|
var l2 = f2;
|
|
|
if (b.updateQueue = l2)
|
|
|
b.flags |= 4;
|
|
|
}
|
|
|
};
|
|
|
Ei = function(a, b, c, d) {
|
|
|
c !== d && (b.flags |= 4);
|
|
|
};
|
|
|
function Fi(a, b) {
|
|
|
if (!lh)
|
|
|
switch (a.tailMode) {
|
|
|
case "hidden":
|
|
|
b = a.tail;
|
|
|
for (var c = null; b !== null; )
|
|
|
b.alternate !== null && (c = b), b = b.sibling;
|
|
|
c === null ? a.tail = null : c.sibling = null;
|
|
|
break;
|
|
|
case "collapsed":
|
|
|
c = a.tail;
|
|
|
for (var d = null; c !== null; )
|
|
|
c.alternate !== null && (d = c), c = c.sibling;
|
|
|
d === null ? b || a.tail === null ? a.tail = null : a.tail.sibling = null : d.sibling = null;
|
|
|
}
|
|
|
}
|
|
|
function Gi(a, b, c) {
|
|
|
var d = b.pendingProps;
|
|
|
switch (b.tag) {
|
|
|
case 2:
|
|
|
case 16:
|
|
|
case 15:
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 7:
|
|
|
case 8:
|
|
|
case 12:
|
|
|
case 9:
|
|
|
case 14:
|
|
|
return null;
|
|
|
case 1:
|
|
|
return Ff(b.type) && Gf(), null;
|
|
|
case 3:
|
|
|
fh();
|
|
|
H(N);
|
|
|
H(M);
|
|
|
uh();
|
|
|
d = b.stateNode;
|
|
|
d.pendingContext && (d.context = d.pendingContext, d.pendingContext = null);
|
|
|
if (a === null || a.child === null)
|
|
|
rh(b) ? b.flags |= 4 : d.hydrate || (b.flags |= 256);
|
|
|
Ci(b);
|
|
|
return null;
|
|
|
case 5:
|
|
|
hh(b);
|
|
|
var e = dh(ch.current);
|
|
|
c = b.type;
|
|
|
if (a !== null && b.stateNode != null)
|
|
|
Di(a, b, c, d, e), a.ref !== b.ref && (b.flags |= 128);
|
|
|
else {
|
|
|
if (!d) {
|
|
|
if (b.stateNode === null)
|
|
|
throw Error(y(166));
|
|
|
return null;
|
|
|
}
|
|
|
a = dh(ah.current);
|
|
|
if (rh(b)) {
|
|
|
d = b.stateNode;
|
|
|
c = b.type;
|
|
|
var f2 = b.memoizedProps;
|
|
|
d[wf] = b;
|
|
|
d[xf] = f2;
|
|
|
switch (c) {
|
|
|
case "dialog":
|
|
|
G("cancel", d);
|
|
|
G("close", d);
|
|
|
break;
|
|
|
case "iframe":
|
|
|
case "object":
|
|
|
case "embed":
|
|
|
G("load", d);
|
|
|
break;
|
|
|
case "video":
|
|
|
case "audio":
|
|
|
for (a = 0; a < Xe.length; a++)
|
|
|
G(Xe[a], d);
|
|
|
break;
|
|
|
case "source":
|
|
|
G("error", d);
|
|
|
break;
|
|
|
case "img":
|
|
|
case "image":
|
|
|
case "link":
|
|
|
G("error", d);
|
|
|
G("load", d);
|
|
|
break;
|
|
|
case "details":
|
|
|
G("toggle", d);
|
|
|
break;
|
|
|
case "input":
|
|
|
Za(d, f2);
|
|
|
G("invalid", d);
|
|
|
break;
|
|
|
case "select":
|
|
|
d._wrapperState = { wasMultiple: !!f2.multiple };
|
|
|
G("invalid", d);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
hb(d, f2), G("invalid", d);
|
|
|
}
|
|
|
vb(c, f2);
|
|
|
a = null;
|
|
|
for (var g2 in f2)
|
|
|
f2.hasOwnProperty(g2) && (e = f2[g2], g2 === "children" ? typeof e === "string" ? d.textContent !== e && (a = ["children", e]) : typeof e === "number" && d.textContent !== "" + e && (a = ["children", "" + e]) : ca.hasOwnProperty(g2) && e != null && g2 === "onScroll" && G("scroll", d));
|
|
|
switch (c) {
|
|
|
case "input":
|
|
|
Va(d);
|
|
|
cb(d, f2, true);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
Va(d);
|
|
|
jb(d);
|
|
|
break;
|
|
|
case "select":
|
|
|
case "option":
|
|
|
break;
|
|
|
default:
|
|
|
typeof f2.onClick === "function" && (d.onclick = jf);
|
|
|
}
|
|
|
d = a;
|
|
|
b.updateQueue = d;
|
|
|
d !== null && (b.flags |= 4);
|
|
|
} else {
|
|
|
g2 = e.nodeType === 9 ? e : e.ownerDocument;
|
|
|
a === kb.html && (a = lb(c));
|
|
|
a === kb.html ? c === "script" ? (a = g2.createElement("div"), a.innerHTML = "<script><\/script>", a = a.removeChild(a.firstChild)) : typeof d.is === "string" ? a = g2.createElement(c, { is: d.is }) : (a = g2.createElement(c), c === "select" && (g2 = a, d.multiple ? g2.multiple = true : d.size && (g2.size = d.size))) : a = g2.createElementNS(a, c);
|
|
|
a[wf] = b;
|
|
|
a[xf] = d;
|
|
|
Bi(a, b, false, false);
|
|
|
b.stateNode = a;
|
|
|
g2 = wb(c, d);
|
|
|
switch (c) {
|
|
|
case "dialog":
|
|
|
G("cancel", a);
|
|
|
G("close", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "iframe":
|
|
|
case "object":
|
|
|
case "embed":
|
|
|
G("load", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "video":
|
|
|
case "audio":
|
|
|
for (e = 0; e < Xe.length; e++)
|
|
|
G(Xe[e], a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "source":
|
|
|
G("error", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "img":
|
|
|
case "image":
|
|
|
case "link":
|
|
|
G("error", a);
|
|
|
G("load", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "details":
|
|
|
G("toggle", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "input":
|
|
|
Za(a, d);
|
|
|
e = Ya(a, d);
|
|
|
G("invalid", a);
|
|
|
break;
|
|
|
case "option":
|
|
|
e = eb(a, d);
|
|
|
break;
|
|
|
case "select":
|
|
|
a._wrapperState = { wasMultiple: !!d.multiple };
|
|
|
e = m$1({}, d, { value: void 0 });
|
|
|
G("invalid", a);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
hb(a, d);
|
|
|
e = gb(a, d);
|
|
|
G("invalid", a);
|
|
|
break;
|
|
|
default:
|
|
|
e = d;
|
|
|
}
|
|
|
vb(c, e);
|
|
|
var h2 = e;
|
|
|
for (f2 in h2)
|
|
|
if (h2.hasOwnProperty(f2)) {
|
|
|
var k = h2[f2];
|
|
|
f2 === "style" ? tb(a, k) : f2 === "dangerouslySetInnerHTML" ? (k = k ? k.__html : void 0, k != null && ob(a, k)) : f2 === "children" ? typeof k === "string" ? (c !== "textarea" || k !== "") && pb(a, k) : typeof k === "number" && pb(a, "" + k) : f2 !== "suppressContentEditableWarning" && f2 !== "suppressHydrationWarning" && f2 !== "autoFocus" && (ca.hasOwnProperty(f2) ? k != null && f2 === "onScroll" && G("scroll", a) : k != null && qa(a, f2, k, g2));
|
|
|
}
|
|
|
switch (c) {
|
|
|
case "input":
|
|
|
Va(a);
|
|
|
cb(a, d, false);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
Va(a);
|
|
|
jb(a);
|
|
|
break;
|
|
|
case "option":
|
|
|
d.value != null && a.setAttribute("value", "" + Sa(d.value));
|
|
|
break;
|
|
|
case "select":
|
|
|
a.multiple = !!d.multiple;
|
|
|
f2 = d.value;
|
|
|
f2 != null ? fb(a, !!d.multiple, f2, false) : d.defaultValue != null && fb(a, !!d.multiple, d.defaultValue, true);
|
|
|
break;
|
|
|
default:
|
|
|
typeof e.onClick === "function" && (a.onclick = jf);
|
|
|
}
|
|
|
mf(c, d) && (b.flags |= 4);
|
|
|
}
|
|
|
b.ref !== null && (b.flags |= 128);
|
|
|
}
|
|
|
return null;
|
|
|
case 6:
|
|
|
if (a && b.stateNode != null)
|
|
|
Ei(a, b, a.memoizedProps, d);
|
|
|
else {
|
|
|
if (typeof d !== "string" && b.stateNode === null)
|
|
|
throw Error(y(166));
|
|
|
c = dh(ch.current);
|
|
|
dh(ah.current);
|
|
|
rh(b) ? (d = b.stateNode, c = b.memoizedProps, d[wf] = b, d.nodeValue !== c && (b.flags |= 4)) : (d = (c.nodeType === 9 ? c : c.ownerDocument).createTextNode(d), d[wf] = b, b.stateNode = d);
|
|
|
}
|
|
|
return null;
|
|
|
case 13:
|
|
|
H(P);
|
|
|
d = b.memoizedState;
|
|
|
if ((b.flags & 64) !== 0)
|
|
|
return b.lanes = c, b;
|
|
|
d = d !== null;
|
|
|
c = false;
|
|
|
a === null ? b.memoizedProps.fallback !== void 0 && rh(b) : c = a.memoizedState !== null;
|
|
|
if (d && !c && (b.mode & 2) !== 0)
|
|
|
if (a === null && b.memoizedProps.unstable_avoidThisFallback !== true || (P.current & 1) !== 0)
|
|
|
V === 0 && (V = 3);
|
|
|
else {
|
|
|
if (V === 0 || V === 3)
|
|
|
V = 4;
|
|
|
U === null || (Dg & 134217727) === 0 && (Hi & 134217727) === 0 || Ii(U, W);
|
|
|
}
|
|
|
if (d || c)
|
|
|
b.flags |= 4;
|
|
|
return null;
|
|
|
case 4:
|
|
|
return fh(), Ci(b), a === null && cf(b.stateNode.containerInfo), null;
|
|
|
case 10:
|
|
|
return rg(b), null;
|
|
|
case 17:
|
|
|
return Ff(b.type) && Gf(), null;
|
|
|
case 19:
|
|
|
H(P);
|
|
|
d = b.memoizedState;
|
|
|
if (d === null)
|
|
|
return null;
|
|
|
f2 = (b.flags & 64) !== 0;
|
|
|
g2 = d.rendering;
|
|
|
if (g2 === null)
|
|
|
if (f2)
|
|
|
Fi(d, false);
|
|
|
else {
|
|
|
if (V !== 0 || a !== null && (a.flags & 64) !== 0)
|
|
|
for (a = b.child; a !== null; ) {
|
|
|
g2 = ih(a);
|
|
|
if (g2 !== null) {
|
|
|
b.flags |= 64;
|
|
|
Fi(d, false);
|
|
|
f2 = g2.updateQueue;
|
|
|
f2 !== null && (b.updateQueue = f2, b.flags |= 4);
|
|
|
d.lastEffect === null && (b.firstEffect = null);
|
|
|
b.lastEffect = d.lastEffect;
|
|
|
d = c;
|
|
|
for (c = b.child; c !== null; )
|
|
|
f2 = c, a = d, f2.flags &= 2, f2.nextEffect = null, f2.firstEffect = null, f2.lastEffect = null, g2 = f2.alternate, g2 === null ? (f2.childLanes = 0, f2.lanes = a, f2.child = null, f2.memoizedProps = null, f2.memoizedState = null, f2.updateQueue = null, f2.dependencies = null, f2.stateNode = null) : (f2.childLanes = g2.childLanes, f2.lanes = g2.lanes, f2.child = g2.child, f2.memoizedProps = g2.memoizedProps, f2.memoizedState = g2.memoizedState, f2.updateQueue = g2.updateQueue, f2.type = g2.type, a = g2.dependencies, f2.dependencies = a === null ? null : { lanes: a.lanes, firstContext: a.firstContext }), c = c.sibling;
|
|
|
I(P, P.current & 1 | 2);
|
|
|
return b.child;
|
|
|
}
|
|
|
a = a.sibling;
|
|
|
}
|
|
|
d.tail !== null && O() > Ji && (b.flags |= 64, f2 = true, Fi(d, false), b.lanes = 33554432);
|
|
|
}
|
|
|
else {
|
|
|
if (!f2)
|
|
|
if (a = ih(g2), a !== null) {
|
|
|
if (b.flags |= 64, f2 = true, c = a.updateQueue, c !== null && (b.updateQueue = c, b.flags |= 4), Fi(d, true), d.tail === null && d.tailMode === "hidden" && !g2.alternate && !lh)
|
|
|
return b = b.lastEffect = d.lastEffect, b !== null && (b.nextEffect = null), null;
|
|
|
} else
|
|
|
2 * O() - d.renderingStartTime > Ji && c !== 1073741824 && (b.flags |= 64, f2 = true, Fi(d, false), b.lanes = 33554432);
|
|
|
d.isBackwards ? (g2.sibling = b.child, b.child = g2) : (c = d.last, c !== null ? c.sibling = g2 : b.child = g2, d.last = g2);
|
|
|
}
|
|
|
return d.tail !== null ? (c = d.tail, d.rendering = c, d.tail = c.sibling, d.lastEffect = b.lastEffect, d.renderingStartTime = O(), c.sibling = null, b = P.current, I(P, f2 ? b & 1 | 2 : b & 1), c) : null;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
return Ki(), a !== null && a.memoizedState !== null !== (b.memoizedState !== null) && d.mode !== "unstable-defer-without-hiding" && (b.flags |= 4), null;
|
|
|
}
|
|
|
throw Error(y(156, b.tag));
|
|
|
}
|
|
|
function Li(a) {
|
|
|
switch (a.tag) {
|
|
|
case 1:
|
|
|
Ff(a.type) && Gf();
|
|
|
var b = a.flags;
|
|
|
return b & 4096 ? (a.flags = b & -4097 | 64, a) : null;
|
|
|
case 3:
|
|
|
fh();
|
|
|
H(N);
|
|
|
H(M);
|
|
|
uh();
|
|
|
b = a.flags;
|
|
|
if ((b & 64) !== 0)
|
|
|
throw Error(y(285));
|
|
|
a.flags = b & -4097 | 64;
|
|
|
return a;
|
|
|
case 5:
|
|
|
return hh(a), null;
|
|
|
case 13:
|
|
|
return H(P), b = a.flags, b & 4096 ? (a.flags = b & -4097 | 64, a) : null;
|
|
|
case 19:
|
|
|
return H(P), null;
|
|
|
case 4:
|
|
|
return fh(), null;
|
|
|
case 10:
|
|
|
return rg(a), null;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
return Ki(), null;
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
function Mi(a, b) {
|
|
|
try {
|
|
|
var c = "", d = b;
|
|
|
do
|
|
|
c += Qa(d), d = d.return;
|
|
|
while (d);
|
|
|
var e = c;
|
|
|
} catch (f2) {
|
|
|
e = "\nError generating stack: " + f2.message + "\n" + f2.stack;
|
|
|
}
|
|
|
return { value: a, source: b, stack: e };
|
|
|
}
|
|
|
function Ni(a, b) {
|
|
|
try {
|
|
|
console.error(b.value);
|
|
|
} catch (c) {
|
|
|
setTimeout(function() {
|
|
|
throw c;
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
var Oi = typeof WeakMap === "function" ? WeakMap : Map;
|
|
|
function Pi(a, b, c) {
|
|
|
c = zg(-1, c);
|
|
|
c.tag = 3;
|
|
|
c.payload = { element: null };
|
|
|
var d = b.value;
|
|
|
c.callback = function() {
|
|
|
Qi || (Qi = true, Ri = d);
|
|
|
Ni(a, b);
|
|
|
};
|
|
|
return c;
|
|
|
}
|
|
|
function Si(a, b, c) {
|
|
|
c = zg(-1, c);
|
|
|
c.tag = 3;
|
|
|
var d = a.type.getDerivedStateFromError;
|
|
|
if (typeof d === "function") {
|
|
|
var e = b.value;
|
|
|
c.payload = function() {
|
|
|
Ni(a, b);
|
|
|
return d(e);
|
|
|
};
|
|
|
}
|
|
|
var f2 = a.stateNode;
|
|
|
f2 !== null && typeof f2.componentDidCatch === "function" && (c.callback = function() {
|
|
|
typeof d !== "function" && (Ti === null ? Ti = new Set([this]) : Ti.add(this), Ni(a, b));
|
|
|
var c2 = b.stack;
|
|
|
this.componentDidCatch(b.value, { componentStack: c2 !== null ? c2 : "" });
|
|
|
});
|
|
|
return c;
|
|
|
}
|
|
|
var Ui = typeof WeakSet === "function" ? WeakSet : Set;
|
|
|
function Vi(a) {
|
|
|
var b = a.ref;
|
|
|
if (b !== null)
|
|
|
if (typeof b === "function")
|
|
|
try {
|
|
|
b(null);
|
|
|
} catch (c) {
|
|
|
Wi(a, c);
|
|
|
}
|
|
|
else
|
|
|
b.current = null;
|
|
|
}
|
|
|
function Xi(a, b) {
|
|
|
switch (b.tag) {
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 15:
|
|
|
case 22:
|
|
|
return;
|
|
|
case 1:
|
|
|
if (b.flags & 256 && a !== null) {
|
|
|
var c = a.memoizedProps, d = a.memoizedState;
|
|
|
a = b.stateNode;
|
|
|
b = a.getSnapshotBeforeUpdate(b.elementType === b.type ? c : lg(b.type, c), d);
|
|
|
a.__reactInternalSnapshotBeforeUpdate = b;
|
|
|
}
|
|
|
return;
|
|
|
case 3:
|
|
|
b.flags & 256 && qf(b.stateNode.containerInfo);
|
|
|
return;
|
|
|
case 5:
|
|
|
case 6:
|
|
|
case 4:
|
|
|
case 17:
|
|
|
return;
|
|
|
}
|
|
|
throw Error(y(163));
|
|
|
}
|
|
|
function Yi(a, b, c) {
|
|
|
switch (c.tag) {
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 15:
|
|
|
case 22:
|
|
|
b = c.updateQueue;
|
|
|
b = b !== null ? b.lastEffect : null;
|
|
|
if (b !== null) {
|
|
|
a = b = b.next;
|
|
|
do {
|
|
|
if ((a.tag & 3) === 3) {
|
|
|
var d = a.create;
|
|
|
a.destroy = d();
|
|
|
}
|
|
|
a = a.next;
|
|
|
} while (a !== b);
|
|
|
}
|
|
|
b = c.updateQueue;
|
|
|
b = b !== null ? b.lastEffect : null;
|
|
|
if (b !== null) {
|
|
|
a = b = b.next;
|
|
|
do {
|
|
|
var e = a;
|
|
|
d = e.next;
|
|
|
e = e.tag;
|
|
|
(e & 4) !== 0 && (e & 1) !== 0 && (Zi(c, a), $i(c, a));
|
|
|
a = d;
|
|
|
} while (a !== b);
|
|
|
}
|
|
|
return;
|
|
|
case 1:
|
|
|
a = c.stateNode;
|
|
|
c.flags & 4 && (b === null ? a.componentDidMount() : (d = c.elementType === c.type ? b.memoizedProps : lg(c.type, b.memoizedProps), a.componentDidUpdate(d, b.memoizedState, a.__reactInternalSnapshotBeforeUpdate)));
|
|
|
b = c.updateQueue;
|
|
|
b !== null && Eg(c, b, a);
|
|
|
return;
|
|
|
case 3:
|
|
|
b = c.updateQueue;
|
|
|
if (b !== null) {
|
|
|
a = null;
|
|
|
if (c.child !== null)
|
|
|
switch (c.child.tag) {
|
|
|
case 5:
|
|
|
a = c.child.stateNode;
|
|
|
break;
|
|
|
case 1:
|
|
|
a = c.child.stateNode;
|
|
|
}
|
|
|
Eg(c, b, a);
|
|
|
}
|
|
|
return;
|
|
|
case 5:
|
|
|
a = c.stateNode;
|
|
|
b === null && c.flags & 4 && mf(c.type, c.memoizedProps) && a.focus();
|
|
|
return;
|
|
|
case 6:
|
|
|
return;
|
|
|
case 4:
|
|
|
return;
|
|
|
case 12:
|
|
|
return;
|
|
|
case 13:
|
|
|
c.memoizedState === null && (c = c.alternate, c !== null && (c = c.memoizedState, c !== null && (c = c.dehydrated, c !== null && Cc(c))));
|
|
|
return;
|
|
|
case 19:
|
|
|
case 17:
|
|
|
case 20:
|
|
|
case 21:
|
|
|
case 23:
|
|
|
case 24:
|
|
|
return;
|
|
|
}
|
|
|
throw Error(y(163));
|
|
|
}
|
|
|
function aj(a, b) {
|
|
|
for (var c = a; ; ) {
|
|
|
if (c.tag === 5) {
|
|
|
var d = c.stateNode;
|
|
|
if (b)
|
|
|
d = d.style, typeof d.setProperty === "function" ? d.setProperty("display", "none", "important") : d.display = "none";
|
|
|
else {
|
|
|
d = c.stateNode;
|
|
|
var e = c.memoizedProps.style;
|
|
|
e = e !== void 0 && e !== null && e.hasOwnProperty("display") ? e.display : null;
|
|
|
d.style.display = sb("display", e);
|
|
|
}
|
|
|
} else if (c.tag === 6)
|
|
|
c.stateNode.nodeValue = b ? "" : c.memoizedProps;
|
|
|
else if ((c.tag !== 23 && c.tag !== 24 || c.memoizedState === null || c === a) && c.child !== null) {
|
|
|
c.child.return = c;
|
|
|
c = c.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (c === a)
|
|
|
break;
|
|
|
for (; c.sibling === null; ) {
|
|
|
if (c.return === null || c.return === a)
|
|
|
return;
|
|
|
c = c.return;
|
|
|
}
|
|
|
c.sibling.return = c.return;
|
|
|
c = c.sibling;
|
|
|
}
|
|
|
}
|
|
|
function bj(a, b) {
|
|
|
if (Mf && typeof Mf.onCommitFiberUnmount === "function")
|
|
|
try {
|
|
|
Mf.onCommitFiberUnmount(Lf, b);
|
|
|
} catch (f2) {
|
|
|
}
|
|
|
switch (b.tag) {
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 14:
|
|
|
case 15:
|
|
|
case 22:
|
|
|
a = b.updateQueue;
|
|
|
if (a !== null && (a = a.lastEffect, a !== null)) {
|
|
|
var c = a = a.next;
|
|
|
do {
|
|
|
var d = c, e = d.destroy;
|
|
|
d = d.tag;
|
|
|
if (e !== void 0)
|
|
|
if ((d & 4) !== 0)
|
|
|
Zi(b, c);
|
|
|
else {
|
|
|
d = b;
|
|
|
try {
|
|
|
e();
|
|
|
} catch (f2) {
|
|
|
Wi(d, f2);
|
|
|
}
|
|
|
}
|
|
|
c = c.next;
|
|
|
} while (c !== a);
|
|
|
}
|
|
|
break;
|
|
|
case 1:
|
|
|
Vi(b);
|
|
|
a = b.stateNode;
|
|
|
if (typeof a.componentWillUnmount === "function")
|
|
|
try {
|
|
|
a.props = b.memoizedProps, a.state = b.memoizedState, a.componentWillUnmount();
|
|
|
} catch (f2) {
|
|
|
Wi(b, f2);
|
|
|
}
|
|
|
break;
|
|
|
case 5:
|
|
|
Vi(b);
|
|
|
break;
|
|
|
case 4:
|
|
|
cj(a, b);
|
|
|
}
|
|
|
}
|
|
|
function dj(a) {
|
|
|
a.alternate = null;
|
|
|
a.child = null;
|
|
|
a.dependencies = null;
|
|
|
a.firstEffect = null;
|
|
|
a.lastEffect = null;
|
|
|
a.memoizedProps = null;
|
|
|
a.memoizedState = null;
|
|
|
a.pendingProps = null;
|
|
|
a.return = null;
|
|
|
a.updateQueue = null;
|
|
|
}
|
|
|
function ej(a) {
|
|
|
return a.tag === 5 || a.tag === 3 || a.tag === 4;
|
|
|
}
|
|
|
function fj(a) {
|
|
|
a: {
|
|
|
for (var b = a.return; b !== null; ) {
|
|
|
if (ej(b))
|
|
|
break a;
|
|
|
b = b.return;
|
|
|
}
|
|
|
throw Error(y(160));
|
|
|
}
|
|
|
var c = b;
|
|
|
b = c.stateNode;
|
|
|
switch (c.tag) {
|
|
|
case 5:
|
|
|
var d = false;
|
|
|
break;
|
|
|
case 3:
|
|
|
b = b.containerInfo;
|
|
|
d = true;
|
|
|
break;
|
|
|
case 4:
|
|
|
b = b.containerInfo;
|
|
|
d = true;
|
|
|
break;
|
|
|
default:
|
|
|
throw Error(y(161));
|
|
|
}
|
|
|
c.flags & 16 && (pb(b, ""), c.flags &= -17);
|
|
|
a:
|
|
|
b:
|
|
|
for (c = a; ; ) {
|
|
|
for (; c.sibling === null; ) {
|
|
|
if (c.return === null || ej(c.return)) {
|
|
|
c = null;
|
|
|
break a;
|
|
|
}
|
|
|
c = c.return;
|
|
|
}
|
|
|
c.sibling.return = c.return;
|
|
|
for (c = c.sibling; c.tag !== 5 && c.tag !== 6 && c.tag !== 18; ) {
|
|
|
if (c.flags & 2)
|
|
|
continue b;
|
|
|
if (c.child === null || c.tag === 4)
|
|
|
continue b;
|
|
|
else
|
|
|
c.child.return = c, c = c.child;
|
|
|
}
|
|
|
if (!(c.flags & 2)) {
|
|
|
c = c.stateNode;
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
d ? gj(a, c, b) : hj(a, c, b);
|
|
|
}
|
|
|
function gj(a, b, c) {
|
|
|
var d = a.tag, e = d === 5 || d === 6;
|
|
|
if (e)
|
|
|
a = e ? a.stateNode : a.stateNode.instance, b ? c.nodeType === 8 ? c.parentNode.insertBefore(a, b) : c.insertBefore(a, b) : (c.nodeType === 8 ? (b = c.parentNode, b.insertBefore(a, c)) : (b = c, b.appendChild(a)), c = c._reactRootContainer, c !== null && c !== void 0 || b.onclick !== null || (b.onclick = jf));
|
|
|
else if (d !== 4 && (a = a.child, a !== null))
|
|
|
for (gj(a, b, c), a = a.sibling; a !== null; )
|
|
|
gj(a, b, c), a = a.sibling;
|
|
|
}
|
|
|
function hj(a, b, c) {
|
|
|
var d = a.tag, e = d === 5 || d === 6;
|
|
|
if (e)
|
|
|
a = e ? a.stateNode : a.stateNode.instance, b ? c.insertBefore(a, b) : c.appendChild(a);
|
|
|
else if (d !== 4 && (a = a.child, a !== null))
|
|
|
for (hj(a, b, c), a = a.sibling; a !== null; )
|
|
|
hj(a, b, c), a = a.sibling;
|
|
|
}
|
|
|
function cj(a, b) {
|
|
|
for (var c = b, d = false, e, f2; ; ) {
|
|
|
if (!d) {
|
|
|
d = c.return;
|
|
|
a:
|
|
|
for (; ; ) {
|
|
|
if (d === null)
|
|
|
throw Error(y(160));
|
|
|
e = d.stateNode;
|
|
|
switch (d.tag) {
|
|
|
case 5:
|
|
|
f2 = false;
|
|
|
break a;
|
|
|
case 3:
|
|
|
e = e.containerInfo;
|
|
|
f2 = true;
|
|
|
break a;
|
|
|
case 4:
|
|
|
e = e.containerInfo;
|
|
|
f2 = true;
|
|
|
break a;
|
|
|
}
|
|
|
d = d.return;
|
|
|
}
|
|
|
d = true;
|
|
|
}
|
|
|
if (c.tag === 5 || c.tag === 6) {
|
|
|
a:
|
|
|
for (var g2 = a, h2 = c, k = h2; ; )
|
|
|
if (bj(g2, k), k.child !== null && k.tag !== 4)
|
|
|
k.child.return = k, k = k.child;
|
|
|
else {
|
|
|
if (k === h2)
|
|
|
break a;
|
|
|
for (; k.sibling === null; ) {
|
|
|
if (k.return === null || k.return === h2)
|
|
|
break a;
|
|
|
k = k.return;
|
|
|
}
|
|
|
k.sibling.return = k.return;
|
|
|
k = k.sibling;
|
|
|
}
|
|
|
f2 ? (g2 = e, h2 = c.stateNode, g2.nodeType === 8 ? g2.parentNode.removeChild(h2) : g2.removeChild(h2)) : e.removeChild(c.stateNode);
|
|
|
} else if (c.tag === 4) {
|
|
|
if (c.child !== null) {
|
|
|
e = c.stateNode.containerInfo;
|
|
|
f2 = true;
|
|
|
c.child.return = c;
|
|
|
c = c.child;
|
|
|
continue;
|
|
|
}
|
|
|
} else if (bj(a, c), c.child !== null) {
|
|
|
c.child.return = c;
|
|
|
c = c.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (c === b)
|
|
|
break;
|
|
|
for (; c.sibling === null; ) {
|
|
|
if (c.return === null || c.return === b)
|
|
|
return;
|
|
|
c = c.return;
|
|
|
c.tag === 4 && (d = false);
|
|
|
}
|
|
|
c.sibling.return = c.return;
|
|
|
c = c.sibling;
|
|
|
}
|
|
|
}
|
|
|
function ij(a, b) {
|
|
|
switch (b.tag) {
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 14:
|
|
|
case 15:
|
|
|
case 22:
|
|
|
var c = b.updateQueue;
|
|
|
c = c !== null ? c.lastEffect : null;
|
|
|
if (c !== null) {
|
|
|
var d = c = c.next;
|
|
|
do
|
|
|
(d.tag & 3) === 3 && (a = d.destroy, d.destroy = void 0, a !== void 0 && a()), d = d.next;
|
|
|
while (d !== c);
|
|
|
}
|
|
|
return;
|
|
|
case 1:
|
|
|
return;
|
|
|
case 5:
|
|
|
c = b.stateNode;
|
|
|
if (c != null) {
|
|
|
d = b.memoizedProps;
|
|
|
var e = a !== null ? a.memoizedProps : d;
|
|
|
a = b.type;
|
|
|
var f2 = b.updateQueue;
|
|
|
b.updateQueue = null;
|
|
|
if (f2 !== null) {
|
|
|
c[xf] = d;
|
|
|
a === "input" && d.type === "radio" && d.name != null && $a(c, d);
|
|
|
wb(a, e);
|
|
|
b = wb(a, d);
|
|
|
for (e = 0; e < f2.length; e += 2) {
|
|
|
var g2 = f2[e], h2 = f2[e + 1];
|
|
|
g2 === "style" ? tb(c, h2) : g2 === "dangerouslySetInnerHTML" ? ob(c, h2) : g2 === "children" ? pb(c, h2) : qa(c, g2, h2, b);
|
|
|
}
|
|
|
switch (a) {
|
|
|
case "input":
|
|
|
ab(c, d);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
ib(c, d);
|
|
|
break;
|
|
|
case "select":
|
|
|
a = c._wrapperState.wasMultiple, c._wrapperState.wasMultiple = !!d.multiple, f2 = d.value, f2 != null ? fb(c, !!d.multiple, f2, false) : a !== !!d.multiple && (d.defaultValue != null ? fb(c, !!d.multiple, d.defaultValue, true) : fb(c, !!d.multiple, d.multiple ? [] : "", false));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return;
|
|
|
case 6:
|
|
|
if (b.stateNode === null)
|
|
|
throw Error(y(162));
|
|
|
b.stateNode.nodeValue = b.memoizedProps;
|
|
|
return;
|
|
|
case 3:
|
|
|
c = b.stateNode;
|
|
|
c.hydrate && (c.hydrate = false, Cc(c.containerInfo));
|
|
|
return;
|
|
|
case 12:
|
|
|
return;
|
|
|
case 13:
|
|
|
b.memoizedState !== null && (jj = O(), aj(b.child, true));
|
|
|
kj(b);
|
|
|
return;
|
|
|
case 19:
|
|
|
kj(b);
|
|
|
return;
|
|
|
case 17:
|
|
|
return;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
aj(b, b.memoizedState !== null);
|
|
|
return;
|
|
|
}
|
|
|
throw Error(y(163));
|
|
|
}
|
|
|
function kj(a) {
|
|
|
var b = a.updateQueue;
|
|
|
if (b !== null) {
|
|
|
a.updateQueue = null;
|
|
|
var c = a.stateNode;
|
|
|
c === null && (c = a.stateNode = new Ui());
|
|
|
b.forEach(function(b2) {
|
|
|
var d = lj.bind(null, a, b2);
|
|
|
c.has(b2) || (c.add(b2), b2.then(d, d));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
function mj(a, b) {
|
|
|
return a !== null && (a = a.memoizedState, a === null || a.dehydrated !== null) ? (b = b.memoizedState, b !== null && b.dehydrated === null) : false;
|
|
|
}
|
|
|
var nj = Math.ceil, oj = ra.ReactCurrentDispatcher, pj = ra.ReactCurrentOwner, X = 0, U = null, Y = null, W = 0, qj = 0, rj = Bf(0), V = 0, sj = null, tj = 0, Dg = 0, Hi = 0, uj = 0, vj = null, jj = 0, Ji = Infinity;
|
|
|
function wj() {
|
|
|
Ji = O() + 500;
|
|
|
}
|
|
|
var Z = null, Qi = false, Ri = null, Ti = null, xj = false, yj = null, zj = 90, Aj = [], Bj = [], Cj = null, Dj = 0, Ej = null, Fj = -1, Gj = 0, Hj = 0, Ij = null, Jj = false;
|
|
|
function Hg() {
|
|
|
return (X & 48) !== 0 ? O() : Fj !== -1 ? Fj : Fj = O();
|
|
|
}
|
|
|
function Ig(a) {
|
|
|
a = a.mode;
|
|
|
if ((a & 2) === 0)
|
|
|
return 1;
|
|
|
if ((a & 4) === 0)
|
|
|
return eg() === 99 ? 1 : 2;
|
|
|
Gj === 0 && (Gj = tj);
|
|
|
if (kg.transition !== 0) {
|
|
|
Hj !== 0 && (Hj = vj !== null ? vj.pendingLanes : 0);
|
|
|
a = Gj;
|
|
|
var b = 4186112 & ~Hj;
|
|
|
b &= -b;
|
|
|
b === 0 && (a = 4186112 & ~a, b = a & -a, b === 0 && (b = 8192));
|
|
|
return b;
|
|
|
}
|
|
|
a = eg();
|
|
|
(X & 4) !== 0 && a === 98 ? a = Xc(12, Gj) : (a = Sc(a), a = Xc(a, Gj));
|
|
|
return a;
|
|
|
}
|
|
|
function Jg(a, b, c) {
|
|
|
if (50 < Dj)
|
|
|
throw Dj = 0, Ej = null, Error(y(185));
|
|
|
a = Kj(a, b);
|
|
|
if (a === null)
|
|
|
return null;
|
|
|
$c(a, b, c);
|
|
|
a === U && (Hi |= b, V === 4 && Ii(a, W));
|
|
|
var d = eg();
|
|
|
b === 1 ? (X & 8) !== 0 && (X & 48) === 0 ? Lj(a) : (Mj(a, c), X === 0 && (wj(), ig())) : ((X & 4) === 0 || d !== 98 && d !== 99 || (Cj === null ? Cj = new Set([a]) : Cj.add(a)), Mj(a, c));
|
|
|
vj = a;
|
|
|
}
|
|
|
function Kj(a, b) {
|
|
|
a.lanes |= b;
|
|
|
var c = a.alternate;
|
|
|
c !== null && (c.lanes |= b);
|
|
|
c = a;
|
|
|
for (a = a.return; a !== null; )
|
|
|
a.childLanes |= b, c = a.alternate, c !== null && (c.childLanes |= b), c = a, a = a.return;
|
|
|
return c.tag === 3 ? c.stateNode : null;
|
|
|
}
|
|
|
function Mj(a, b) {
|
|
|
for (var c = a.callbackNode, d = a.suspendedLanes, e = a.pingedLanes, f2 = a.expirationTimes, g2 = a.pendingLanes; 0 < g2; ) {
|
|
|
var h2 = 31 - Vc(g2), k = 1 << h2, l2 = f2[h2];
|
|
|
if (l2 === -1) {
|
|
|
if ((k & d) === 0 || (k & e) !== 0) {
|
|
|
l2 = b;
|
|
|
Rc(k);
|
|
|
var n2 = F;
|
|
|
f2[h2] = 10 <= n2 ? l2 + 250 : 6 <= n2 ? l2 + 5e3 : -1;
|
|
|
}
|
|
|
} else
|
|
|
l2 <= b && (a.expiredLanes |= k);
|
|
|
g2 &= ~k;
|
|
|
}
|
|
|
d = Uc(a, a === U ? W : 0);
|
|
|
b = F;
|
|
|
if (d === 0)
|
|
|
c !== null && (c !== Zf && Pf(c), a.callbackNode = null, a.callbackPriority = 0);
|
|
|
else {
|
|
|
if (c !== null) {
|
|
|
if (a.callbackPriority === b)
|
|
|
return;
|
|
|
c !== Zf && Pf(c);
|
|
|
}
|
|
|
b === 15 ? (c = Lj.bind(null, a), ag === null ? (ag = [c], bg = Of(Uf, jg)) : ag.push(c), c = Zf) : b === 14 ? c = hg(99, Lj.bind(null, a)) : (c = Tc(b), c = hg(c, Nj.bind(null, a)));
|
|
|
a.callbackPriority = b;
|
|
|
a.callbackNode = c;
|
|
|
}
|
|
|
}
|
|
|
function Nj(a) {
|
|
|
Fj = -1;
|
|
|
Hj = Gj = 0;
|
|
|
if ((X & 48) !== 0)
|
|
|
throw Error(y(327));
|
|
|
var b = a.callbackNode;
|
|
|
if (Oj() && a.callbackNode !== b)
|
|
|
return null;
|
|
|
var c = Uc(a, a === U ? W : 0);
|
|
|
if (c === 0)
|
|
|
return null;
|
|
|
var d = c;
|
|
|
var e = X;
|
|
|
X |= 16;
|
|
|
var f2 = Pj();
|
|
|
if (U !== a || W !== d)
|
|
|
wj(), Qj(a, d);
|
|
|
do
|
|
|
try {
|
|
|
Rj();
|
|
|
break;
|
|
|
} catch (h2) {
|
|
|
Sj(a, h2);
|
|
|
}
|
|
|
while (1);
|
|
|
qg();
|
|
|
oj.current = f2;
|
|
|
X = e;
|
|
|
Y !== null ? d = 0 : (U = null, W = 0, d = V);
|
|
|
if ((tj & Hi) !== 0)
|
|
|
Qj(a, 0);
|
|
|
else if (d !== 0) {
|
|
|
d === 2 && (X |= 64, a.hydrate && (a.hydrate = false, qf(a.containerInfo)), c = Wc(a), c !== 0 && (d = Tj(a, c)));
|
|
|
if (d === 1)
|
|
|
throw b = sj, Qj(a, 0), Ii(a, c), Mj(a, O()), b;
|
|
|
a.finishedWork = a.current.alternate;
|
|
|
a.finishedLanes = c;
|
|
|
switch (d) {
|
|
|
case 0:
|
|
|
case 1:
|
|
|
throw Error(y(345));
|
|
|
case 2:
|
|
|
Uj(a);
|
|
|
break;
|
|
|
case 3:
|
|
|
Ii(a, c);
|
|
|
if ((c & 62914560) === c && (d = jj + 500 - O(), 10 < d)) {
|
|
|
if (Uc(a, 0) !== 0)
|
|
|
break;
|
|
|
e = a.suspendedLanes;
|
|
|
if ((e & c) !== c) {
|
|
|
Hg();
|
|
|
a.pingedLanes |= a.suspendedLanes & e;
|
|
|
break;
|
|
|
}
|
|
|
a.timeoutHandle = of(Uj.bind(null, a), d);
|
|
|
break;
|
|
|
}
|
|
|
Uj(a);
|
|
|
break;
|
|
|
case 4:
|
|
|
Ii(a, c);
|
|
|
if ((c & 4186112) === c)
|
|
|
break;
|
|
|
d = a.eventTimes;
|
|
|
for (e = -1; 0 < c; ) {
|
|
|
var g2 = 31 - Vc(c);
|
|
|
f2 = 1 << g2;
|
|
|
g2 = d[g2];
|
|
|
g2 > e && (e = g2);
|
|
|
c &= ~f2;
|
|
|
}
|
|
|
c = e;
|
|
|
c = O() - c;
|
|
|
c = (120 > c ? 120 : 480 > c ? 480 : 1080 > c ? 1080 : 1920 > c ? 1920 : 3e3 > c ? 3e3 : 4320 > c ? 4320 : 1960 * nj(c / 1960)) - c;
|
|
|
if (10 < c) {
|
|
|
a.timeoutHandle = of(Uj.bind(null, a), c);
|
|
|
break;
|
|
|
}
|
|
|
Uj(a);
|
|
|
break;
|
|
|
case 5:
|
|
|
Uj(a);
|
|
|
break;
|
|
|
default:
|
|
|
throw Error(y(329));
|
|
|
}
|
|
|
}
|
|
|
Mj(a, O());
|
|
|
return a.callbackNode === b ? Nj.bind(null, a) : null;
|
|
|
}
|
|
|
function Ii(a, b) {
|
|
|
b &= ~uj;
|
|
|
b &= ~Hi;
|
|
|
a.suspendedLanes |= b;
|
|
|
a.pingedLanes &= ~b;
|
|
|
for (a = a.expirationTimes; 0 < b; ) {
|
|
|
var c = 31 - Vc(b), d = 1 << c;
|
|
|
a[c] = -1;
|
|
|
b &= ~d;
|
|
|
}
|
|
|
}
|
|
|
function Lj(a) {
|
|
|
if ((X & 48) !== 0)
|
|
|
throw Error(y(327));
|
|
|
Oj();
|
|
|
if (a === U && (a.expiredLanes & W) !== 0) {
|
|
|
var b = W;
|
|
|
var c = Tj(a, b);
|
|
|
(tj & Hi) !== 0 && (b = Uc(a, b), c = Tj(a, b));
|
|
|
} else
|
|
|
b = Uc(a, 0), c = Tj(a, b);
|
|
|
a.tag !== 0 && c === 2 && (X |= 64, a.hydrate && (a.hydrate = false, qf(a.containerInfo)), b = Wc(a), b !== 0 && (c = Tj(a, b)));
|
|
|
if (c === 1)
|
|
|
throw c = sj, Qj(a, 0), Ii(a, b), Mj(a, O()), c;
|
|
|
a.finishedWork = a.current.alternate;
|
|
|
a.finishedLanes = b;
|
|
|
Uj(a);
|
|
|
Mj(a, O());
|
|
|
return null;
|
|
|
}
|
|
|
function Vj() {
|
|
|
if (Cj !== null) {
|
|
|
var a = Cj;
|
|
|
Cj = null;
|
|
|
a.forEach(function(a2) {
|
|
|
a2.expiredLanes |= 24 & a2.pendingLanes;
|
|
|
Mj(a2, O());
|
|
|
});
|
|
|
}
|
|
|
ig();
|
|
|
}
|
|
|
function Wj(a, b) {
|
|
|
var c = X;
|
|
|
X |= 1;
|
|
|
try {
|
|
|
return a(b);
|
|
|
} finally {
|
|
|
X = c, X === 0 && (wj(), ig());
|
|
|
}
|
|
|
}
|
|
|
function Xj(a, b) {
|
|
|
var c = X;
|
|
|
X &= -2;
|
|
|
X |= 8;
|
|
|
try {
|
|
|
return a(b);
|
|
|
} finally {
|
|
|
X = c, X === 0 && (wj(), ig());
|
|
|
}
|
|
|
}
|
|
|
function ni(a, b) {
|
|
|
I(rj, qj);
|
|
|
qj |= b;
|
|
|
tj |= b;
|
|
|
}
|
|
|
function Ki() {
|
|
|
qj = rj.current;
|
|
|
H(rj);
|
|
|
}
|
|
|
function Qj(a, b) {
|
|
|
a.finishedWork = null;
|
|
|
a.finishedLanes = 0;
|
|
|
var c = a.timeoutHandle;
|
|
|
c !== -1 && (a.timeoutHandle = -1, pf(c));
|
|
|
if (Y !== null)
|
|
|
for (c = Y.return; c !== null; ) {
|
|
|
var d = c;
|
|
|
switch (d.tag) {
|
|
|
case 1:
|
|
|
d = d.type.childContextTypes;
|
|
|
d !== null && d !== void 0 && Gf();
|
|
|
break;
|
|
|
case 3:
|
|
|
fh();
|
|
|
H(N);
|
|
|
H(M);
|
|
|
uh();
|
|
|
break;
|
|
|
case 5:
|
|
|
hh(d);
|
|
|
break;
|
|
|
case 4:
|
|
|
fh();
|
|
|
break;
|
|
|
case 13:
|
|
|
H(P);
|
|
|
break;
|
|
|
case 19:
|
|
|
H(P);
|
|
|
break;
|
|
|
case 10:
|
|
|
rg(d);
|
|
|
break;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
Ki();
|
|
|
}
|
|
|
c = c.return;
|
|
|
}
|
|
|
U = a;
|
|
|
Y = Tg(a.current, null);
|
|
|
W = qj = tj = b;
|
|
|
V = 0;
|
|
|
sj = null;
|
|
|
uj = Hi = Dg = 0;
|
|
|
}
|
|
|
function Sj(a, b) {
|
|
|
do {
|
|
|
var c = Y;
|
|
|
try {
|
|
|
qg();
|
|
|
vh.current = Gh;
|
|
|
if (yh) {
|
|
|
for (var d = R.memoizedState; d !== null; ) {
|
|
|
var e = d.queue;
|
|
|
e !== null && (e.pending = null);
|
|
|
d = d.next;
|
|
|
}
|
|
|
yh = false;
|
|
|
}
|
|
|
xh = 0;
|
|
|
T = S = R = null;
|
|
|
zh = false;
|
|
|
pj.current = null;
|
|
|
if (c === null || c.return === null) {
|
|
|
V = 1;
|
|
|
sj = b;
|
|
|
Y = null;
|
|
|
break;
|
|
|
}
|
|
|
a: {
|
|
|
var f2 = a, g2 = c.return, h2 = c, k = b;
|
|
|
b = W;
|
|
|
h2.flags |= 2048;
|
|
|
h2.firstEffect = h2.lastEffect = null;
|
|
|
if (k !== null && typeof k === "object" && typeof k.then === "function") {
|
|
|
var l2 = k;
|
|
|
if ((h2.mode & 2) === 0) {
|
|
|
var n2 = h2.alternate;
|
|
|
n2 ? (h2.updateQueue = n2.updateQueue, h2.memoizedState = n2.memoizedState, h2.lanes = n2.lanes) : (h2.updateQueue = null, h2.memoizedState = null);
|
|
|
}
|
|
|
var A2 = (P.current & 1) !== 0, p2 = g2;
|
|
|
do {
|
|
|
var C2;
|
|
|
if (C2 = p2.tag === 13) {
|
|
|
var x2 = p2.memoizedState;
|
|
|
if (x2 !== null)
|
|
|
C2 = x2.dehydrated !== null ? true : false;
|
|
|
else {
|
|
|
var w2 = p2.memoizedProps;
|
|
|
C2 = w2.fallback === void 0 ? false : w2.unstable_avoidThisFallback !== true ? true : A2 ? false : true;
|
|
|
}
|
|
|
}
|
|
|
if (C2) {
|
|
|
var z2 = p2.updateQueue;
|
|
|
if (z2 === null) {
|
|
|
var u2 = new Set();
|
|
|
u2.add(l2);
|
|
|
p2.updateQueue = u2;
|
|
|
} else
|
|
|
z2.add(l2);
|
|
|
if ((p2.mode & 2) === 0) {
|
|
|
p2.flags |= 64;
|
|
|
h2.flags |= 16384;
|
|
|
h2.flags &= -2981;
|
|
|
if (h2.tag === 1)
|
|
|
if (h2.alternate === null)
|
|
|
h2.tag = 17;
|
|
|
else {
|
|
|
var t2 = zg(-1, 1);
|
|
|
t2.tag = 2;
|
|
|
Ag(h2, t2);
|
|
|
}
|
|
|
h2.lanes |= 1;
|
|
|
break a;
|
|
|
}
|
|
|
k = void 0;
|
|
|
h2 = b;
|
|
|
var q2 = f2.pingCache;
|
|
|
q2 === null ? (q2 = f2.pingCache = new Oi(), k = new Set(), q2.set(l2, k)) : (k = q2.get(l2), k === void 0 && (k = new Set(), q2.set(l2, k)));
|
|
|
if (!k.has(h2)) {
|
|
|
k.add(h2);
|
|
|
var v2 = Yj.bind(null, f2, l2, h2);
|
|
|
l2.then(v2, v2);
|
|
|
}
|
|
|
p2.flags |= 4096;
|
|
|
p2.lanes = b;
|
|
|
break a;
|
|
|
}
|
|
|
p2 = p2.return;
|
|
|
} while (p2 !== null);
|
|
|
k = Error((Ra(h2.type) || "A React component") + " suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.");
|
|
|
}
|
|
|
V !== 5 && (V = 2);
|
|
|
k = Mi(k, h2);
|
|
|
p2 = g2;
|
|
|
do {
|
|
|
switch (p2.tag) {
|
|
|
case 3:
|
|
|
f2 = k;
|
|
|
p2.flags |= 4096;
|
|
|
b &= -b;
|
|
|
p2.lanes |= b;
|
|
|
var J2 = Pi(p2, f2, b);
|
|
|
Bg(p2, J2);
|
|
|
break a;
|
|
|
case 1:
|
|
|
f2 = k;
|
|
|
var K2 = p2.type, Q2 = p2.stateNode;
|
|
|
if ((p2.flags & 64) === 0 && (typeof K2.getDerivedStateFromError === "function" || Q2 !== null && typeof Q2.componentDidCatch === "function" && (Ti === null || !Ti.has(Q2)))) {
|
|
|
p2.flags |= 4096;
|
|
|
b &= -b;
|
|
|
p2.lanes |= b;
|
|
|
var L2 = Si(p2, f2, b);
|
|
|
Bg(p2, L2);
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
p2 = p2.return;
|
|
|
} while (p2 !== null);
|
|
|
}
|
|
|
Zj(c);
|
|
|
} catch (va) {
|
|
|
b = va;
|
|
|
Y === c && c !== null && (Y = c = c.return);
|
|
|
continue;
|
|
|
}
|
|
|
break;
|
|
|
} while (1);
|
|
|
}
|
|
|
function Pj() {
|
|
|
var a = oj.current;
|
|
|
oj.current = Gh;
|
|
|
return a === null ? Gh : a;
|
|
|
}
|
|
|
function Tj(a, b) {
|
|
|
var c = X;
|
|
|
X |= 16;
|
|
|
var d = Pj();
|
|
|
U === a && W === b || Qj(a, b);
|
|
|
do
|
|
|
try {
|
|
|
ak();
|
|
|
break;
|
|
|
} catch (e) {
|
|
|
Sj(a, e);
|
|
|
}
|
|
|
while (1);
|
|
|
qg();
|
|
|
X = c;
|
|
|
oj.current = d;
|
|
|
if (Y !== null)
|
|
|
throw Error(y(261));
|
|
|
U = null;
|
|
|
W = 0;
|
|
|
return V;
|
|
|
}
|
|
|
function ak() {
|
|
|
for (; Y !== null; )
|
|
|
bk(Y);
|
|
|
}
|
|
|
function Rj() {
|
|
|
for (; Y !== null && !Qf(); )
|
|
|
bk(Y);
|
|
|
}
|
|
|
function bk(a) {
|
|
|
var b = ck(a.alternate, a, qj);
|
|
|
a.memoizedProps = a.pendingProps;
|
|
|
b === null ? Zj(a) : Y = b;
|
|
|
pj.current = null;
|
|
|
}
|
|
|
function Zj(a) {
|
|
|
var b = a;
|
|
|
do {
|
|
|
var c = b.alternate;
|
|
|
a = b.return;
|
|
|
if ((b.flags & 2048) === 0) {
|
|
|
c = Gi(c, b, qj);
|
|
|
if (c !== null) {
|
|
|
Y = c;
|
|
|
return;
|
|
|
}
|
|
|
c = b;
|
|
|
if (c.tag !== 24 && c.tag !== 23 || c.memoizedState === null || (qj & 1073741824) !== 0 || (c.mode & 4) === 0) {
|
|
|
for (var d = 0, e = c.child; e !== null; )
|
|
|
d |= e.lanes | e.childLanes, e = e.sibling;
|
|
|
c.childLanes = d;
|
|
|
}
|
|
|
a !== null && (a.flags & 2048) === 0 && (a.firstEffect === null && (a.firstEffect = b.firstEffect), b.lastEffect !== null && (a.lastEffect !== null && (a.lastEffect.nextEffect = b.firstEffect), a.lastEffect = b.lastEffect), 1 < b.flags && (a.lastEffect !== null ? a.lastEffect.nextEffect = b : a.firstEffect = b, a.lastEffect = b));
|
|
|
} else {
|
|
|
c = Li(b);
|
|
|
if (c !== null) {
|
|
|
c.flags &= 2047;
|
|
|
Y = c;
|
|
|
return;
|
|
|
}
|
|
|
a !== null && (a.firstEffect = a.lastEffect = null, a.flags |= 2048);
|
|
|
}
|
|
|
b = b.sibling;
|
|
|
if (b !== null) {
|
|
|
Y = b;
|
|
|
return;
|
|
|
}
|
|
|
Y = b = a;
|
|
|
} while (b !== null);
|
|
|
V === 0 && (V = 5);
|
|
|
}
|
|
|
function Uj(a) {
|
|
|
var b = eg();
|
|
|
gg(99, dk.bind(null, a, b));
|
|
|
return null;
|
|
|
}
|
|
|
function dk(a, b) {
|
|
|
do
|
|
|
Oj();
|
|
|
while (yj !== null);
|
|
|
if ((X & 48) !== 0)
|
|
|
throw Error(y(327));
|
|
|
var c = a.finishedWork;
|
|
|
if (c === null)
|
|
|
return null;
|
|
|
a.finishedWork = null;
|
|
|
a.finishedLanes = 0;
|
|
|
if (c === a.current)
|
|
|
throw Error(y(177));
|
|
|
a.callbackNode = null;
|
|
|
var d = c.lanes | c.childLanes, e = d, f2 = a.pendingLanes & ~e;
|
|
|
a.pendingLanes = e;
|
|
|
a.suspendedLanes = 0;
|
|
|
a.pingedLanes = 0;
|
|
|
a.expiredLanes &= e;
|
|
|
a.mutableReadLanes &= e;
|
|
|
a.entangledLanes &= e;
|
|
|
e = a.entanglements;
|
|
|
for (var g2 = a.eventTimes, h2 = a.expirationTimes; 0 < f2; ) {
|
|
|
var k = 31 - Vc(f2), l2 = 1 << k;
|
|
|
e[k] = 0;
|
|
|
g2[k] = -1;
|
|
|
h2[k] = -1;
|
|
|
f2 &= ~l2;
|
|
|
}
|
|
|
Cj !== null && (d & 24) === 0 && Cj.has(a) && Cj.delete(a);
|
|
|
a === U && (Y = U = null, W = 0);
|
|
|
1 < c.flags ? c.lastEffect !== null ? (c.lastEffect.nextEffect = c, d = c.firstEffect) : d = c : d = c.firstEffect;
|
|
|
if (d !== null) {
|
|
|
e = X;
|
|
|
X |= 32;
|
|
|
pj.current = null;
|
|
|
kf = fd;
|
|
|
g2 = Ne();
|
|
|
if (Oe(g2)) {
|
|
|
if ("selectionStart" in g2)
|
|
|
h2 = { start: g2.selectionStart, end: g2.selectionEnd };
|
|
|
else
|
|
|
a:
|
|
|
if (h2 = (h2 = g2.ownerDocument) && h2.defaultView || window, (l2 = h2.getSelection && h2.getSelection()) && l2.rangeCount !== 0) {
|
|
|
h2 = l2.anchorNode;
|
|
|
f2 = l2.anchorOffset;
|
|
|
k = l2.focusNode;
|
|
|
l2 = l2.focusOffset;
|
|
|
try {
|
|
|
h2.nodeType, k.nodeType;
|
|
|
} catch (va) {
|
|
|
h2 = null;
|
|
|
break a;
|
|
|
}
|
|
|
var n2 = 0, A2 = -1, p2 = -1, C2 = 0, x2 = 0, w2 = g2, z2 = null;
|
|
|
b:
|
|
|
for (; ; ) {
|
|
|
for (var u2; ; ) {
|
|
|
w2 !== h2 || f2 !== 0 && w2.nodeType !== 3 || (A2 = n2 + f2);
|
|
|
w2 !== k || l2 !== 0 && w2.nodeType !== 3 || (p2 = n2 + l2);
|
|
|
w2.nodeType === 3 && (n2 += w2.nodeValue.length);
|
|
|
if ((u2 = w2.firstChild) === null)
|
|
|
break;
|
|
|
z2 = w2;
|
|
|
w2 = u2;
|
|
|
}
|
|
|
for (; ; ) {
|
|
|
if (w2 === g2)
|
|
|
break b;
|
|
|
z2 === h2 && ++C2 === f2 && (A2 = n2);
|
|
|
z2 === k && ++x2 === l2 && (p2 = n2);
|
|
|
if ((u2 = w2.nextSibling) !== null)
|
|
|
break;
|
|
|
w2 = z2;
|
|
|
z2 = w2.parentNode;
|
|
|
}
|
|
|
w2 = u2;
|
|
|
}
|
|
|
h2 = A2 === -1 || p2 === -1 ? null : { start: A2, end: p2 };
|
|
|
} else
|
|
|
h2 = null;
|
|
|
h2 = h2 || { start: 0, end: 0 };
|
|
|
} else
|
|
|
h2 = null;
|
|
|
lf = { focusedElem: g2, selectionRange: h2 };
|
|
|
fd = false;
|
|
|
Ij = null;
|
|
|
Jj = false;
|
|
|
Z = d;
|
|
|
do
|
|
|
try {
|
|
|
ek();
|
|
|
} catch (va) {
|
|
|
if (Z === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(Z, va);
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
while (Z !== null);
|
|
|
Ij = null;
|
|
|
Z = d;
|
|
|
do
|
|
|
try {
|
|
|
for (g2 = a; Z !== null; ) {
|
|
|
var t2 = Z.flags;
|
|
|
t2 & 16 && pb(Z.stateNode, "");
|
|
|
if (t2 & 128) {
|
|
|
var q2 = Z.alternate;
|
|
|
if (q2 !== null) {
|
|
|
var v2 = q2.ref;
|
|
|
v2 !== null && (typeof v2 === "function" ? v2(null) : v2.current = null);
|
|
|
}
|
|
|
}
|
|
|
switch (t2 & 1038) {
|
|
|
case 2:
|
|
|
fj(Z);
|
|
|
Z.flags &= -3;
|
|
|
break;
|
|
|
case 6:
|
|
|
fj(Z);
|
|
|
Z.flags &= -3;
|
|
|
ij(Z.alternate, Z);
|
|
|
break;
|
|
|
case 1024:
|
|
|
Z.flags &= -1025;
|
|
|
break;
|
|
|
case 1028:
|
|
|
Z.flags &= -1025;
|
|
|
ij(Z.alternate, Z);
|
|
|
break;
|
|
|
case 4:
|
|
|
ij(Z.alternate, Z);
|
|
|
break;
|
|
|
case 8:
|
|
|
h2 = Z;
|
|
|
cj(g2, h2);
|
|
|
var J2 = h2.alternate;
|
|
|
dj(h2);
|
|
|
J2 !== null && dj(J2);
|
|
|
}
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
} catch (va) {
|
|
|
if (Z === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(Z, va);
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
while (Z !== null);
|
|
|
v2 = lf;
|
|
|
q2 = Ne();
|
|
|
t2 = v2.focusedElem;
|
|
|
g2 = v2.selectionRange;
|
|
|
if (q2 !== t2 && t2 && t2.ownerDocument && Me(t2.ownerDocument.documentElement, t2)) {
|
|
|
g2 !== null && Oe(t2) && (q2 = g2.start, v2 = g2.end, v2 === void 0 && (v2 = q2), "selectionStart" in t2 ? (t2.selectionStart = q2, t2.selectionEnd = Math.min(v2, t2.value.length)) : (v2 = (q2 = t2.ownerDocument || document) && q2.defaultView || window, v2.getSelection && (v2 = v2.getSelection(), h2 = t2.textContent.length, J2 = Math.min(g2.start, h2), g2 = g2.end === void 0 ? J2 : Math.min(g2.end, h2), !v2.extend && J2 > g2 && (h2 = g2, g2 = J2, J2 = h2), h2 = Le(t2, J2), f2 = Le(t2, g2), h2 && f2 && (v2.rangeCount !== 1 || v2.anchorNode !== h2.node || v2.anchorOffset !== h2.offset || v2.focusNode !== f2.node || v2.focusOffset !== f2.offset) && (q2 = q2.createRange(), q2.setStart(h2.node, h2.offset), v2.removeAllRanges(), J2 > g2 ? (v2.addRange(q2), v2.extend(f2.node, f2.offset)) : (q2.setEnd(f2.node, f2.offset), v2.addRange(q2))))));
|
|
|
q2 = [];
|
|
|
for (v2 = t2; v2 = v2.parentNode; )
|
|
|
v2.nodeType === 1 && q2.push({ element: v2, left: v2.scrollLeft, top: v2.scrollTop });
|
|
|
typeof t2.focus === "function" && t2.focus();
|
|
|
for (t2 = 0; t2 < q2.length; t2++)
|
|
|
v2 = q2[t2], v2.element.scrollLeft = v2.left, v2.element.scrollTop = v2.top;
|
|
|
}
|
|
|
fd = !!kf;
|
|
|
lf = kf = null;
|
|
|
a.current = c;
|
|
|
Z = d;
|
|
|
do
|
|
|
try {
|
|
|
for (t2 = a; Z !== null; ) {
|
|
|
var K2 = Z.flags;
|
|
|
K2 & 36 && Yi(t2, Z.alternate, Z);
|
|
|
if (K2 & 128) {
|
|
|
q2 = void 0;
|
|
|
var Q2 = Z.ref;
|
|
|
if (Q2 !== null) {
|
|
|
var L2 = Z.stateNode;
|
|
|
switch (Z.tag) {
|
|
|
case 5:
|
|
|
q2 = L2;
|
|
|
break;
|
|
|
default:
|
|
|
q2 = L2;
|
|
|
}
|
|
|
typeof Q2 === "function" ? Q2(q2) : Q2.current = q2;
|
|
|
}
|
|
|
}
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
} catch (va) {
|
|
|
if (Z === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(Z, va);
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
while (Z !== null);
|
|
|
Z = null;
|
|
|
$f();
|
|
|
X = e;
|
|
|
} else
|
|
|
a.current = c;
|
|
|
if (xj)
|
|
|
xj = false, yj = a, zj = b;
|
|
|
else
|
|
|
for (Z = d; Z !== null; )
|
|
|
b = Z.nextEffect, Z.nextEffect = null, Z.flags & 8 && (K2 = Z, K2.sibling = null, K2.stateNode = null), Z = b;
|
|
|
d = a.pendingLanes;
|
|
|
d === 0 && (Ti = null);
|
|
|
d === 1 ? a === Ej ? Dj++ : (Dj = 0, Ej = a) : Dj = 0;
|
|
|
c = c.stateNode;
|
|
|
if (Mf && typeof Mf.onCommitFiberRoot === "function")
|
|
|
try {
|
|
|
Mf.onCommitFiberRoot(Lf, c, void 0, (c.current.flags & 64) === 64);
|
|
|
} catch (va) {
|
|
|
}
|
|
|
Mj(a, O());
|
|
|
if (Qi)
|
|
|
throw Qi = false, a = Ri, Ri = null, a;
|
|
|
if ((X & 8) !== 0)
|
|
|
return null;
|
|
|
ig();
|
|
|
return null;
|
|
|
}
|
|
|
function ek() {
|
|
|
for (; Z !== null; ) {
|
|
|
var a = Z.alternate;
|
|
|
Jj || Ij === null || ((Z.flags & 8) !== 0 ? dc(Z, Ij) && (Jj = true) : Z.tag === 13 && mj(a, Z) && dc(Z, Ij) && (Jj = true));
|
|
|
var b = Z.flags;
|
|
|
(b & 256) !== 0 && Xi(a, Z);
|
|
|
(b & 512) === 0 || xj || (xj = true, hg(97, function() {
|
|
|
Oj();
|
|
|
return null;
|
|
|
}));
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
}
|
|
|
function Oj() {
|
|
|
if (zj !== 90) {
|
|
|
var a = 97 < zj ? 97 : zj;
|
|
|
zj = 90;
|
|
|
return gg(a, fk);
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function $i(a, b) {
|
|
|
Aj.push(b, a);
|
|
|
xj || (xj = true, hg(97, function() {
|
|
|
Oj();
|
|
|
return null;
|
|
|
}));
|
|
|
}
|
|
|
function Zi(a, b) {
|
|
|
Bj.push(b, a);
|
|
|
xj || (xj = true, hg(97, function() {
|
|
|
Oj();
|
|
|
return null;
|
|
|
}));
|
|
|
}
|
|
|
function fk() {
|
|
|
if (yj === null)
|
|
|
return false;
|
|
|
var a = yj;
|
|
|
yj = null;
|
|
|
if ((X & 48) !== 0)
|
|
|
throw Error(y(331));
|
|
|
var b = X;
|
|
|
X |= 32;
|
|
|
var c = Bj;
|
|
|
Bj = [];
|
|
|
for (var d = 0; d < c.length; d += 2) {
|
|
|
var e = c[d], f2 = c[d + 1], g2 = e.destroy;
|
|
|
e.destroy = void 0;
|
|
|
if (typeof g2 === "function")
|
|
|
try {
|
|
|
g2();
|
|
|
} catch (k) {
|
|
|
if (f2 === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(f2, k);
|
|
|
}
|
|
|
}
|
|
|
c = Aj;
|
|
|
Aj = [];
|
|
|
for (d = 0; d < c.length; d += 2) {
|
|
|
e = c[d];
|
|
|
f2 = c[d + 1];
|
|
|
try {
|
|
|
var h2 = e.create;
|
|
|
e.destroy = h2();
|
|
|
} catch (k) {
|
|
|
if (f2 === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(f2, k);
|
|
|
}
|
|
|
}
|
|
|
for (h2 = a.current.firstEffect; h2 !== null; )
|
|
|
a = h2.nextEffect, h2.nextEffect = null, h2.flags & 8 && (h2.sibling = null, h2.stateNode = null), h2 = a;
|
|
|
X = b;
|
|
|
ig();
|
|
|
return true;
|
|
|
}
|
|
|
function gk(a, b, c) {
|
|
|
b = Mi(c, b);
|
|
|
b = Pi(a, b, 1);
|
|
|
Ag(a, b);
|
|
|
b = Hg();
|
|
|
a = Kj(a, 1);
|
|
|
a !== null && ($c(a, 1, b), Mj(a, b));
|
|
|
}
|
|
|
function Wi(a, b) {
|
|
|
if (a.tag === 3)
|
|
|
gk(a, a, b);
|
|
|
else
|
|
|
for (var c = a.return; c !== null; ) {
|
|
|
if (c.tag === 3) {
|
|
|
gk(c, a, b);
|
|
|
break;
|
|
|
} else if (c.tag === 1) {
|
|
|
var d = c.stateNode;
|
|
|
if (typeof c.type.getDerivedStateFromError === "function" || typeof d.componentDidCatch === "function" && (Ti === null || !Ti.has(d))) {
|
|
|
a = Mi(b, a);
|
|
|
var e = Si(c, a, 1);
|
|
|
Ag(c, e);
|
|
|
e = Hg();
|
|
|
c = Kj(c, 1);
|
|
|
if (c !== null)
|
|
|
$c(c, 1, e), Mj(c, e);
|
|
|
else if (typeof d.componentDidCatch === "function" && (Ti === null || !Ti.has(d)))
|
|
|
try {
|
|
|
d.componentDidCatch(b, a);
|
|
|
} catch (f2) {
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
c = c.return;
|
|
|
}
|
|
|
}
|
|
|
function Yj(a, b, c) {
|
|
|
var d = a.pingCache;
|
|
|
d !== null && d.delete(b);
|
|
|
b = Hg();
|
|
|
a.pingedLanes |= a.suspendedLanes & c;
|
|
|
U === a && (W & c) === c && (V === 4 || V === 3 && (W & 62914560) === W && 500 > O() - jj ? Qj(a, 0) : uj |= c);
|
|
|
Mj(a, b);
|
|
|
}
|
|
|
function lj(a, b) {
|
|
|
var c = a.stateNode;
|
|
|
c !== null && c.delete(b);
|
|
|
b = 0;
|
|
|
b === 0 && (b = a.mode, (b & 2) === 0 ? b = 1 : (b & 4) === 0 ? b = eg() === 99 ? 1 : 2 : (Gj === 0 && (Gj = tj), b = Yc(62914560 & ~Gj), b === 0 && (b = 4194304)));
|
|
|
c = Hg();
|
|
|
a = Kj(a, b);
|
|
|
a !== null && ($c(a, b, c), Mj(a, c));
|
|
|
}
|
|
|
var ck;
|
|
|
ck = function(a, b, c) {
|
|
|
var d = b.lanes;
|
|
|
if (a !== null)
|
|
|
if (a.memoizedProps !== b.pendingProps || N.current)
|
|
|
ug = true;
|
|
|
else if ((c & d) !== 0)
|
|
|
ug = (a.flags & 16384) !== 0 ? true : false;
|
|
|
else {
|
|
|
ug = false;
|
|
|
switch (b.tag) {
|
|
|
case 3:
|
|
|
ri(b);
|
|
|
sh();
|
|
|
break;
|
|
|
case 5:
|
|
|
gh(b);
|
|
|
break;
|
|
|
case 1:
|
|
|
Ff(b.type) && Jf(b);
|
|
|
break;
|
|
|
case 4:
|
|
|
eh(b, b.stateNode.containerInfo);
|
|
|
break;
|
|
|
case 10:
|
|
|
d = b.memoizedProps.value;
|
|
|
var e = b.type._context;
|
|
|
I(mg, e._currentValue);
|
|
|
e._currentValue = d;
|
|
|
break;
|
|
|
case 13:
|
|
|
if (b.memoizedState !== null) {
|
|
|
if ((c & b.child.childLanes) !== 0)
|
|
|
return ti(a, b, c);
|
|
|
I(P, P.current & 1);
|
|
|
b = hi$1(a, b, c);
|
|
|
return b !== null ? b.sibling : null;
|
|
|
}
|
|
|
I(P, P.current & 1);
|
|
|
break;
|
|
|
case 19:
|
|
|
d = (c & b.childLanes) !== 0;
|
|
|
if ((a.flags & 64) !== 0) {
|
|
|
if (d)
|
|
|
return Ai(a, b, c);
|
|
|
b.flags |= 64;
|
|
|
}
|
|
|
e = b.memoizedState;
|
|
|
e !== null && (e.rendering = null, e.tail = null, e.lastEffect = null);
|
|
|
I(P, P.current);
|
|
|
if (d)
|
|
|
break;
|
|
|
else
|
|
|
return null;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
return b.lanes = 0, mi(a, b, c);
|
|
|
}
|
|
|
return hi$1(a, b, c);
|
|
|
}
|
|
|
else
|
|
|
ug = false;
|
|
|
b.lanes = 0;
|
|
|
switch (b.tag) {
|
|
|
case 2:
|
|
|
d = b.type;
|
|
|
a !== null && (a.alternate = null, b.alternate = null, b.flags |= 2);
|
|
|
a = b.pendingProps;
|
|
|
e = Ef(b, M.current);
|
|
|
tg(b, c);
|
|
|
e = Ch(null, b, d, a, e, c);
|
|
|
b.flags |= 1;
|
|
|
if (typeof e === "object" && e !== null && typeof e.render === "function" && e.$$typeof === void 0) {
|
|
|
b.tag = 1;
|
|
|
b.memoizedState = null;
|
|
|
b.updateQueue = null;
|
|
|
if (Ff(d)) {
|
|
|
var f2 = true;
|
|
|
Jf(b);
|
|
|
} else
|
|
|
f2 = false;
|
|
|
b.memoizedState = e.state !== null && e.state !== void 0 ? e.state : null;
|
|
|
xg(b);
|
|
|
var g2 = d.getDerivedStateFromProps;
|
|
|
typeof g2 === "function" && Gg(b, d, g2, a);
|
|
|
e.updater = Kg;
|
|
|
b.stateNode = e;
|
|
|
e._reactInternals = b;
|
|
|
Og(b, d, a, c);
|
|
|
b = qi(null, b, d, true, f2, c);
|
|
|
} else
|
|
|
b.tag = 0, fi(null, b, e, c), b = b.child;
|
|
|
return b;
|
|
|
case 16:
|
|
|
e = b.elementType;
|
|
|
a: {
|
|
|
a !== null && (a.alternate = null, b.alternate = null, b.flags |= 2);
|
|
|
a = b.pendingProps;
|
|
|
f2 = e._init;
|
|
|
e = f2(e._payload);
|
|
|
b.type = e;
|
|
|
f2 = b.tag = hk(e);
|
|
|
a = lg(e, a);
|
|
|
switch (f2) {
|
|
|
case 0:
|
|
|
b = li(null, b, e, a, c);
|
|
|
break a;
|
|
|
case 1:
|
|
|
b = pi(null, b, e, a, c);
|
|
|
break a;
|
|
|
case 11:
|
|
|
b = gi(null, b, e, a, c);
|
|
|
break a;
|
|
|
case 14:
|
|
|
b = ii(null, b, e, lg(e.type, a), d, c);
|
|
|
break a;
|
|
|
}
|
|
|
throw Error(y(306, e, ""));
|
|
|
}
|
|
|
return b;
|
|
|
case 0:
|
|
|
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), li(a, b, d, e, c);
|
|
|
case 1:
|
|
|
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), pi(a, b, d, e, c);
|
|
|
case 3:
|
|
|
ri(b);
|
|
|
d = b.updateQueue;
|
|
|
if (a === null || d === null)
|
|
|
throw Error(y(282));
|
|
|
d = b.pendingProps;
|
|
|
e = b.memoizedState;
|
|
|
e = e !== null ? e.element : null;
|
|
|
yg(a, b);
|
|
|
Cg(b, d, null, c);
|
|
|
d = b.memoizedState.element;
|
|
|
if (d === e)
|
|
|
sh(), b = hi$1(a, b, c);
|
|
|
else {
|
|
|
e = b.stateNode;
|
|
|
if (f2 = e.hydrate)
|
|
|
kh = rf(b.stateNode.containerInfo.firstChild), jh = b, f2 = lh = true;
|
|
|
if (f2) {
|
|
|
a = e.mutableSourceEagerHydrationData;
|
|
|
if (a != null)
|
|
|
for (e = 0; e < a.length; e += 2)
|
|
|
f2 = a[e], f2._workInProgressVersionPrimary = a[e + 1], th.push(f2);
|
|
|
c = Zg(b, null, d, c);
|
|
|
for (b.child = c; c; )
|
|
|
c.flags = c.flags & -3 | 1024, c = c.sibling;
|
|
|
} else
|
|
|
fi(a, b, d, c), sh();
|
|
|
b = b.child;
|
|
|
}
|
|
|
return b;
|
|
|
case 5:
|
|
|
return gh(b), a === null && ph(b), d = b.type, e = b.pendingProps, f2 = a !== null ? a.memoizedProps : null, g2 = e.children, nf(d, e) ? g2 = null : f2 !== null && nf(d, f2) && (b.flags |= 16), oi(a, b), fi(a, b, g2, c), b.child;
|
|
|
case 6:
|
|
|
return a === null && ph(b), null;
|
|
|
case 13:
|
|
|
return ti(a, b, c);
|
|
|
case 4:
|
|
|
return eh(b, b.stateNode.containerInfo), d = b.pendingProps, a === null ? b.child = Yg(b, null, d, c) : fi(a, b, d, c), b.child;
|
|
|
case 11:
|
|
|
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), gi(a, b, d, e, c);
|
|
|
case 7:
|
|
|
return fi(a, b, b.pendingProps, c), b.child;
|
|
|
case 8:
|
|
|
return fi(a, b, b.pendingProps.children, c), b.child;
|
|
|
case 12:
|
|
|
return fi(a, b, b.pendingProps.children, c), b.child;
|
|
|
case 10:
|
|
|
a: {
|
|
|
d = b.type._context;
|
|
|
e = b.pendingProps;
|
|
|
g2 = b.memoizedProps;
|
|
|
f2 = e.value;
|
|
|
var h2 = b.type._context;
|
|
|
I(mg, h2._currentValue);
|
|
|
h2._currentValue = f2;
|
|
|
if (g2 !== null)
|
|
|
if (h2 = g2.value, f2 = He(h2, f2) ? 0 : (typeof d._calculateChangedBits === "function" ? d._calculateChangedBits(h2, f2) : 1073741823) | 0, f2 === 0) {
|
|
|
if (g2.children === e.children && !N.current) {
|
|
|
b = hi$1(a, b, c);
|
|
|
break a;
|
|
|
}
|
|
|
} else
|
|
|
for (h2 = b.child, h2 !== null && (h2.return = b); h2 !== null; ) {
|
|
|
var k = h2.dependencies;
|
|
|
if (k !== null) {
|
|
|
g2 = h2.child;
|
|
|
for (var l2 = k.firstContext; l2 !== null; ) {
|
|
|
if (l2.context === d && (l2.observedBits & f2) !== 0) {
|
|
|
h2.tag === 1 && (l2 = zg(-1, c & -c), l2.tag = 2, Ag(h2, l2));
|
|
|
h2.lanes |= c;
|
|
|
l2 = h2.alternate;
|
|
|
l2 !== null && (l2.lanes |= c);
|
|
|
sg(h2.return, c);
|
|
|
k.lanes |= c;
|
|
|
break;
|
|
|
}
|
|
|
l2 = l2.next;
|
|
|
}
|
|
|
} else
|
|
|
g2 = h2.tag === 10 ? h2.type === b.type ? null : h2.child : h2.child;
|
|
|
if (g2 !== null)
|
|
|
g2.return = h2;
|
|
|
else
|
|
|
for (g2 = h2; g2 !== null; ) {
|
|
|
if (g2 === b) {
|
|
|
g2 = null;
|
|
|
break;
|
|
|
}
|
|
|
h2 = g2.sibling;
|
|
|
if (h2 !== null) {
|
|
|
h2.return = g2.return;
|
|
|
g2 = h2;
|
|
|
break;
|
|
|
}
|
|
|
g2 = g2.return;
|
|
|
}
|
|
|
h2 = g2;
|
|
|
}
|
|
|
fi(a, b, e.children, c);
|
|
|
b = b.child;
|
|
|
}
|
|
|
return b;
|
|
|
case 9:
|
|
|
return e = b.type, f2 = b.pendingProps, d = f2.children, tg(b, c), e = vg(e, f2.unstable_observedBits), d = d(e), b.flags |= 1, fi(a, b, d, c), b.child;
|
|
|
case 14:
|
|
|
return e = b.type, f2 = lg(e, b.pendingProps), f2 = lg(e.type, f2), ii(a, b, e, f2, d, c);
|
|
|
case 15:
|
|
|
return ki(a, b, b.type, b.pendingProps, d, c);
|
|
|
case 17:
|
|
|
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), a !== null && (a.alternate = null, b.alternate = null, b.flags |= 2), b.tag = 1, Ff(d) ? (a = true, Jf(b)) : a = false, tg(b, c), Mg(b, d, e), Og(b, d, e, c), qi(null, b, d, true, a, c);
|
|
|
case 19:
|
|
|
return Ai(a, b, c);
|
|
|
case 23:
|
|
|
return mi(a, b, c);
|
|
|
case 24:
|
|
|
return mi(a, b, c);
|
|
|
}
|
|
|
throw Error(y(156, b.tag));
|
|
|
};
|
|
|
function ik(a, b, c, d) {
|
|
|
this.tag = a;
|
|
|
this.key = c;
|
|
|
this.sibling = this.child = this.return = this.stateNode = this.type = this.elementType = null;
|
|
|
this.index = 0;
|
|
|
this.ref = null;
|
|
|
this.pendingProps = b;
|
|
|
this.dependencies = this.memoizedState = this.updateQueue = this.memoizedProps = null;
|
|
|
this.mode = d;
|
|
|
this.flags = 0;
|
|
|
this.lastEffect = this.firstEffect = this.nextEffect = null;
|
|
|
this.childLanes = this.lanes = 0;
|
|
|
this.alternate = null;
|
|
|
}
|
|
|
function nh(a, b, c, d) {
|
|
|
return new ik(a, b, c, d);
|
|
|
}
|
|
|
function ji(a) {
|
|
|
a = a.prototype;
|
|
|
return !(!a || !a.isReactComponent);
|
|
|
}
|
|
|
function hk(a) {
|
|
|
if (typeof a === "function")
|
|
|
return ji(a) ? 1 : 0;
|
|
|
if (a !== void 0 && a !== null) {
|
|
|
a = a.$$typeof;
|
|
|
if (a === Aa)
|
|
|
return 11;
|
|
|
if (a === Da)
|
|
|
return 14;
|
|
|
}
|
|
|
return 2;
|
|
|
}
|
|
|
function Tg(a, b) {
|
|
|
var c = a.alternate;
|
|
|
c === null ? (c = nh(a.tag, b, a.key, a.mode), c.elementType = a.elementType, c.type = a.type, c.stateNode = a.stateNode, c.alternate = a, a.alternate = c) : (c.pendingProps = b, c.type = a.type, c.flags = 0, c.nextEffect = null, c.firstEffect = null, c.lastEffect = null);
|
|
|
c.childLanes = a.childLanes;
|
|
|
c.lanes = a.lanes;
|
|
|
c.child = a.child;
|
|
|
c.memoizedProps = a.memoizedProps;
|
|
|
c.memoizedState = a.memoizedState;
|
|
|
c.updateQueue = a.updateQueue;
|
|
|
b = a.dependencies;
|
|
|
c.dependencies = b === null ? null : { lanes: b.lanes, firstContext: b.firstContext };
|
|
|
c.sibling = a.sibling;
|
|
|
c.index = a.index;
|
|
|
c.ref = a.ref;
|
|
|
return c;
|
|
|
}
|
|
|
function Vg(a, b, c, d, e, f2) {
|
|
|
var g2 = 2;
|
|
|
d = a;
|
|
|
if (typeof a === "function")
|
|
|
ji(a) && (g2 = 1);
|
|
|
else if (typeof a === "string")
|
|
|
g2 = 5;
|
|
|
else
|
|
|
a:
|
|
|
switch (a) {
|
|
|
case ua:
|
|
|
return Xg(c.children, e, f2, b);
|
|
|
case Ha:
|
|
|
g2 = 8;
|
|
|
e |= 16;
|
|
|
break;
|
|
|
case wa:
|
|
|
g2 = 8;
|
|
|
e |= 1;
|
|
|
break;
|
|
|
case xa:
|
|
|
return a = nh(12, c, b, e | 8), a.elementType = xa, a.type = xa, a.lanes = f2, a;
|
|
|
case Ba:
|
|
|
return a = nh(13, c, b, e), a.type = Ba, a.elementType = Ba, a.lanes = f2, a;
|
|
|
case Ca:
|
|
|
return a = nh(19, c, b, e), a.elementType = Ca, a.lanes = f2, a;
|
|
|
case Ia:
|
|
|
return vi(c, e, f2, b);
|
|
|
case Ja:
|
|
|
return a = nh(24, c, b, e), a.elementType = Ja, a.lanes = f2, a;
|
|
|
default:
|
|
|
if (typeof a === "object" && a !== null)
|
|
|
switch (a.$$typeof) {
|
|
|
case ya:
|
|
|
g2 = 10;
|
|
|
break a;
|
|
|
case za:
|
|
|
g2 = 9;
|
|
|
break a;
|
|
|
case Aa:
|
|
|
g2 = 11;
|
|
|
break a;
|
|
|
case Da:
|
|
|
g2 = 14;
|
|
|
break a;
|
|
|
case Ea:
|
|
|
g2 = 16;
|
|
|
d = null;
|
|
|
break a;
|
|
|
case Fa:
|
|
|
g2 = 22;
|
|
|
break a;
|
|
|
}
|
|
|
throw Error(y(130, a == null ? a : typeof a, ""));
|
|
|
}
|
|
|
b = nh(g2, c, b, e);
|
|
|
b.elementType = a;
|
|
|
b.type = d;
|
|
|
b.lanes = f2;
|
|
|
return b;
|
|
|
}
|
|
|
function Xg(a, b, c, d) {
|
|
|
a = nh(7, a, d, b);
|
|
|
a.lanes = c;
|
|
|
return a;
|
|
|
}
|
|
|
function vi(a, b, c, d) {
|
|
|
a = nh(23, a, d, b);
|
|
|
a.elementType = Ia;
|
|
|
a.lanes = c;
|
|
|
return a;
|
|
|
}
|
|
|
function Ug(a, b, c) {
|
|
|
a = nh(6, a, null, b);
|
|
|
a.lanes = c;
|
|
|
return a;
|
|
|
}
|
|
|
function Wg(a, b, c) {
|
|
|
b = nh(4, a.children !== null ? a.children : [], a.key, b);
|
|
|
b.lanes = c;
|
|
|
b.stateNode = { containerInfo: a.containerInfo, pendingChildren: null, implementation: a.implementation };
|
|
|
return b;
|
|
|
}
|
|
|
function jk(a, b, c) {
|
|
|
this.tag = b;
|
|
|
this.containerInfo = a;
|
|
|
this.finishedWork = this.pingCache = this.current = this.pendingChildren = null;
|
|
|
this.timeoutHandle = -1;
|
|
|
this.pendingContext = this.context = null;
|
|
|
this.hydrate = c;
|
|
|
this.callbackNode = null;
|
|
|
this.callbackPriority = 0;
|
|
|
this.eventTimes = Zc(0);
|
|
|
this.expirationTimes = Zc(-1);
|
|
|
this.entangledLanes = this.finishedLanes = this.mutableReadLanes = this.expiredLanes = this.pingedLanes = this.suspendedLanes = this.pendingLanes = 0;
|
|
|
this.entanglements = Zc(0);
|
|
|
this.mutableSourceEagerHydrationData = null;
|
|
|
}
|
|
|
function kk(a, b, c) {
|
|
|
var d = 3 < arguments.length && arguments[3] !== void 0 ? arguments[3] : null;
|
|
|
return { $$typeof: ta, key: d == null ? null : "" + d, children: a, containerInfo: b, implementation: c };
|
|
|
}
|
|
|
function lk(a, b, c, d) {
|
|
|
var e = b.current, f2 = Hg(), g2 = Ig(e);
|
|
|
a:
|
|
|
if (c) {
|
|
|
c = c._reactInternals;
|
|
|
b: {
|
|
|
if (Zb(c) !== c || c.tag !== 1)
|
|
|
throw Error(y(170));
|
|
|
var h2 = c;
|
|
|
do {
|
|
|
switch (h2.tag) {
|
|
|
case 3:
|
|
|
h2 = h2.stateNode.context;
|
|
|
break b;
|
|
|
case 1:
|
|
|
if (Ff(h2.type)) {
|
|
|
h2 = h2.stateNode.__reactInternalMemoizedMergedChildContext;
|
|
|
break b;
|
|
|
}
|
|
|
}
|
|
|
h2 = h2.return;
|
|
|
} while (h2 !== null);
|
|
|
throw Error(y(171));
|
|
|
}
|
|
|
if (c.tag === 1) {
|
|
|
var k = c.type;
|
|
|
if (Ff(k)) {
|
|
|
c = If(c, k, h2);
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
c = h2;
|
|
|
} else
|
|
|
c = Cf;
|
|
|
b.context === null ? b.context = c : b.pendingContext = c;
|
|
|
b = zg(f2, g2);
|
|
|
b.payload = { element: a };
|
|
|
d = d === void 0 ? null : d;
|
|
|
d !== null && (b.callback = d);
|
|
|
Ag(e, b);
|
|
|
Jg(e, g2, f2);
|
|
|
return g2;
|
|
|
}
|
|
|
function mk(a) {
|
|
|
a = a.current;
|
|
|
if (!a.child)
|
|
|
return null;
|
|
|
switch (a.child.tag) {
|
|
|
case 5:
|
|
|
return a.child.stateNode;
|
|
|
default:
|
|
|
return a.child.stateNode;
|
|
|
}
|
|
|
}
|
|
|
function nk(a, b) {
|
|
|
a = a.memoizedState;
|
|
|
if (a !== null && a.dehydrated !== null) {
|
|
|
var c = a.retryLane;
|
|
|
a.retryLane = c !== 0 && c < b ? c : b;
|
|
|
}
|
|
|
}
|
|
|
function ok(a, b) {
|
|
|
nk(a, b);
|
|
|
(a = a.alternate) && nk(a, b);
|
|
|
}
|
|
|
function pk() {
|
|
|
return null;
|
|
|
}
|
|
|
function qk(a, b, c) {
|
|
|
var d = c != null && c.hydrationOptions != null && c.hydrationOptions.mutableSources || null;
|
|
|
c = new jk(a, b, c != null && c.hydrate === true);
|
|
|
b = nh(3, null, null, b === 2 ? 7 : b === 1 ? 3 : 0);
|
|
|
c.current = b;
|
|
|
b.stateNode = c;
|
|
|
xg(b);
|
|
|
a[ff] = c.current;
|
|
|
cf(a.nodeType === 8 ? a.parentNode : a);
|
|
|
if (d)
|
|
|
for (a = 0; a < d.length; a++) {
|
|
|
b = d[a];
|
|
|
var e = b._getVersion;
|
|
|
e = e(b._source);
|
|
|
c.mutableSourceEagerHydrationData == null ? c.mutableSourceEagerHydrationData = [b, e] : c.mutableSourceEagerHydrationData.push(b, e);
|
|
|
}
|
|
|
this._internalRoot = c;
|
|
|
}
|
|
|
qk.prototype.render = function(a) {
|
|
|
lk(a, this._internalRoot, null, null);
|
|
|
};
|
|
|
qk.prototype.unmount = function() {
|
|
|
var a = this._internalRoot, b = a.containerInfo;
|
|
|
lk(null, a, null, function() {
|
|
|
b[ff] = null;
|
|
|
});
|
|
|
};
|
|
|
function rk(a) {
|
|
|
return !(!a || a.nodeType !== 1 && a.nodeType !== 9 && a.nodeType !== 11 && (a.nodeType !== 8 || a.nodeValue !== " react-mount-point-unstable "));
|
|
|
}
|
|
|
function sk(a, b) {
|
|
|
b || (b = a ? a.nodeType === 9 ? a.documentElement : a.firstChild : null, b = !(!b || b.nodeType !== 1 || !b.hasAttribute("data-reactroot")));
|
|
|
if (!b)
|
|
|
for (var c; c = a.lastChild; )
|
|
|
a.removeChild(c);
|
|
|
return new qk(a, 0, b ? { hydrate: true } : void 0);
|
|
|
}
|
|
|
function tk(a, b, c, d, e) {
|
|
|
var f2 = c._reactRootContainer;
|
|
|
if (f2) {
|
|
|
var g2 = f2._internalRoot;
|
|
|
if (typeof e === "function") {
|
|
|
var h2 = e;
|
|
|
e = function() {
|
|
|
var a2 = mk(g2);
|
|
|
h2.call(a2);
|
|
|
};
|
|
|
}
|
|
|
lk(b, g2, a, e);
|
|
|
} else {
|
|
|
f2 = c._reactRootContainer = sk(c, d);
|
|
|
g2 = f2._internalRoot;
|
|
|
if (typeof e === "function") {
|
|
|
var k = e;
|
|
|
e = function() {
|
|
|
var a2 = mk(g2);
|
|
|
k.call(a2);
|
|
|
};
|
|
|
}
|
|
|
Xj(function() {
|
|
|
lk(b, g2, a, e);
|
|
|
});
|
|
|
}
|
|
|
return mk(g2);
|
|
|
}
|
|
|
ec = function(a) {
|
|
|
if (a.tag === 13) {
|
|
|
var b = Hg();
|
|
|
Jg(a, 4, b);
|
|
|
ok(a, 4);
|
|
|
}
|
|
|
};
|
|
|
fc = function(a) {
|
|
|
if (a.tag === 13) {
|
|
|
var b = Hg();
|
|
|
Jg(a, 67108864, b);
|
|
|
ok(a, 67108864);
|
|
|
}
|
|
|
};
|
|
|
gc = function(a) {
|
|
|
if (a.tag === 13) {
|
|
|
var b = Hg(), c = Ig(a);
|
|
|
Jg(a, c, b);
|
|
|
ok(a, c);
|
|
|
}
|
|
|
};
|
|
|
hc = function(a, b) {
|
|
|
return b();
|
|
|
};
|
|
|
yb = function(a, b, c) {
|
|
|
switch (b) {
|
|
|
case "input":
|
|
|
ab(a, c);
|
|
|
b = c.name;
|
|
|
if (c.type === "radio" && b != null) {
|
|
|
for (c = a; c.parentNode; )
|
|
|
c = c.parentNode;
|
|
|
c = c.querySelectorAll("input[name=" + JSON.stringify("" + b) + '][type="radio"]');
|
|
|
for (b = 0; b < c.length; b++) {
|
|
|
var d = c[b];
|
|
|
if (d !== a && d.form === a.form) {
|
|
|
var e = Db(d);
|
|
|
if (!e)
|
|
|
throw Error(y(90));
|
|
|
Wa(d);
|
|
|
ab(d, e);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case "textarea":
|
|
|
ib(a, c);
|
|
|
break;
|
|
|
case "select":
|
|
|
b = c.value, b != null && fb(a, !!c.multiple, b, false);
|
|
|
}
|
|
|
};
|
|
|
Gb = Wj;
|
|
|
Hb = function(a, b, c, d, e) {
|
|
|
var f2 = X;
|
|
|
X |= 4;
|
|
|
try {
|
|
|
return gg(98, a.bind(null, b, c, d, e));
|
|
|
} finally {
|
|
|
X = f2, X === 0 && (wj(), ig());
|
|
|
}
|
|
|
};
|
|
|
Ib = function() {
|
|
|
(X & 49) === 0 && (Vj(), Oj());
|
|
|
};
|
|
|
Jb = function(a, b) {
|
|
|
var c = X;
|
|
|
X |= 2;
|
|
|
try {
|
|
|
return a(b);
|
|
|
} finally {
|
|
|
X = c, X === 0 && (wj(), ig());
|
|
|
}
|
|
|
};
|
|
|
function uk(a, b) {
|
|
|
var c = 2 < arguments.length && arguments[2] !== void 0 ? arguments[2] : null;
|
|
|
if (!rk(b))
|
|
|
throw Error(y(200));
|
|
|
return kk(a, b, null, c);
|
|
|
}
|
|
|
var vk = { Events: [Cb, ue, Db, Eb, Fb, Oj, { current: false }] }, wk = { findFiberByHostInstance: wc, bundleType: 0, version: "17.0.2", rendererPackageName: "react-dom" };
|
|
|
var xk = { bundleType: wk.bundleType, version: wk.version, rendererPackageName: wk.rendererPackageName, rendererConfig: wk.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, overrideProps: null, overridePropsDeletePath: null, overridePropsRenamePath: null, setSuspenseHandler: null, scheduleUpdate: null, currentDispatcherRef: ra.ReactCurrentDispatcher, findHostInstanceByFiber: function(a) {
|
|
|
a = cc(a);
|
|
|
return a === null ? null : a.stateNode;
|
|
|
}, findFiberByHostInstance: wk.findFiberByHostInstance || pk, findHostInstancesForRefresh: null, scheduleRefresh: null, scheduleRoot: null, setRefreshHandler: null, getCurrentFiber: null };
|
|
|
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined") {
|
|
|
var yk = __REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
|
if (!yk.isDisabled && yk.supportsFiber)
|
|
|
try {
|
|
|
Lf = yk.inject(xk), Mf = yk;
|
|
|
} catch (a) {
|
|
|
}
|
|
|
}
|
|
|
reactDom_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = vk;
|
|
|
reactDom_production_min.createPortal = uk;
|
|
|
reactDom_production_min.findDOMNode = function(a) {
|
|
|
if (a == null)
|
|
|
return null;
|
|
|
if (a.nodeType === 1)
|
|
|
return a;
|
|
|
var b = a._reactInternals;
|
|
|
if (b === void 0) {
|
|
|
if (typeof a.render === "function")
|
|
|
throw Error(y(188));
|
|
|
throw Error(y(268, Object.keys(a)));
|
|
|
}
|
|
|
a = cc(b);
|
|
|
a = a === null ? null : a.stateNode;
|
|
|
return a;
|
|
|
};
|
|
|
reactDom_production_min.flushSync = function(a, b) {
|
|
|
var c = X;
|
|
|
if ((c & 48) !== 0)
|
|
|
return a(b);
|
|
|
X |= 1;
|
|
|
try {
|
|
|
if (a)
|
|
|
return gg(99, a.bind(null, b));
|
|
|
} finally {
|
|
|
X = c, ig();
|
|
|
}
|
|
|
};
|
|
|
reactDom_production_min.hydrate = function(a, b, c) {
|
|
|
if (!rk(b))
|
|
|
throw Error(y(200));
|
|
|
return tk(null, a, b, true, c);
|
|
|
};
|
|
|
reactDom_production_min.render = function(a, b, c) {
|
|
|
if (!rk(b))
|
|
|
throw Error(y(200));
|
|
|
return tk(null, a, b, false, c);
|
|
|
};
|
|
|
reactDom_production_min.unmountComponentAtNode = function(a) {
|
|
|
if (!rk(a))
|
|
|
throw Error(y(40));
|
|
|
return a._reactRootContainer ? (Xj(function() {
|
|
|
tk(null, null, a, false, function() {
|
|
|
a._reactRootContainer = null;
|
|
|
a[ff] = null;
|
|
|
});
|
|
|
}), true) : false;
|
|
|
};
|
|
|
reactDom_production_min.unstable_batchedUpdates = Wj;
|
|
|
reactDom_production_min.unstable_createPortal = function(a, b) {
|
|
|
return uk(a, b, 2 < arguments.length && arguments[2] !== void 0 ? arguments[2] : null);
|
|
|
};
|
|
|
reactDom_production_min.unstable_renderSubtreeIntoContainer = function(a, b, c, d) {
|
|
|
if (!rk(c))
|
|
|
throw Error(y(200));
|
|
|
if (a == null || a._reactInternals === void 0)
|
|
|
throw Error(y(38));
|
|
|
return tk(a, b, c, false, d);
|
|
|
};
|
|
|
reactDom_production_min.version = "17.0.2";
|
|
|
function checkDCE() {
|
|
|
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function") {
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);
|
|
|
} catch (err) {
|
|
|
console.error(err);
|
|
|
}
|
|
|
}
|
|
|
{
|
|
|
checkDCE();
|
|
|
_reactDom_17_0_2_reactDom.exports = reactDom_production_min;
|
|
|
}
|
|
|
var ReactDOM$1 = _reactDom_17_0_2_reactDom.exports;
|
|
|
function combineReducers(reducers) {
|
|
|
const reducerKeys = Object.keys(reducers);
|
|
|
const finalReducersObj = {};
|
|
|
for (const key of reducerKeys) {
|
|
|
if (typeof reducers[key] === "function") {
|
|
|
finalReducersObj[key] = reducers[key];
|
|
|
}
|
|
|
}
|
|
|
return (state = {}, action) => {
|
|
|
let hasChanged = false;
|
|
|
const nextState = {};
|
|
|
for (const key of reducerKeys) {
|
|
|
const prevStateForKey = state[key];
|
|
|
const nextStateForKey = finalReducersObj[key](prevStateForKey, action);
|
|
|
nextState[key] = nextStateForKey;
|
|
|
hasChanged = hasChanged || nextStateForKey !== prevStateForKey;
|
|
|
}
|
|
|
return hasChanged ? nextState : state;
|
|
|
};
|
|
|
}
|
|
|
function createStore(preloadedState, reducer2) {
|
|
|
const listeners = [];
|
|
|
let currentState = preloadedState;
|
|
|
const dispatch = (action) => {
|
|
|
const nextState = reducer2(currentState, action);
|
|
|
const prevState = currentState;
|
|
|
currentState = nextState;
|
|
|
for (const cb2 of listeners) {
|
|
|
cb2(currentState, prevState);
|
|
|
}
|
|
|
};
|
|
|
const subscribe = (listener) => {
|
|
|
let isSubscribed = true;
|
|
|
listeners.push(listener);
|
|
|
return () => {
|
|
|
if (!isSubscribed) {
|
|
|
return;
|
|
|
}
|
|
|
const index = listeners.indexOf(listener);
|
|
|
listeners.splice(index, 1);
|
|
|
isSubscribed = false;
|
|
|
};
|
|
|
};
|
|
|
const getState = () => {
|
|
|
return currentState;
|
|
|
};
|
|
|
return {
|
|
|
dispatch,
|
|
|
getState,
|
|
|
subscribe
|
|
|
};
|
|
|
}
|
|
|
function reducer$5(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_MARK_MEMO_ID": {
|
|
|
if (action.payload.markMemoId === state.markMemoId) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
markMemoId: action.payload.markMemoId
|
|
|
});
|
|
|
}
|
|
|
case "SET_EDIT_MEMO_ID": {
|
|
|
if (action.payload.editMemoId === state.editMemoId) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
editMemoId: action.payload.editMemoId
|
|
|
});
|
|
|
}
|
|
|
case "SET_MOBILE_VIEW": {
|
|
|
if (action.payload.isMobileView === state.isMobileView) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
isMobileView: action.payload.isMobileView
|
|
|
});
|
|
|
}
|
|
|
case "SET_SHOW_SIDEBAR_IN_MOBILE_VIEW": {
|
|
|
if (action.payload.showSiderbarInMobileView === state.showSiderbarInMobileView) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
showSiderbarInMobileView: action.payload.showSiderbarInMobileView
|
|
|
});
|
|
|
}
|
|
|
case "SET_APP_SETTING": {
|
|
|
return __spreadValues(__spreadValues({}, state), action.payload);
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$5 = {
|
|
|
markMemoId: "",
|
|
|
editMemoId: "",
|
|
|
shouldSplitMemoWord: true,
|
|
|
shouldHideImageUrl: true,
|
|
|
shouldUseMarkdownParser: true,
|
|
|
useTinyUndoHistoryCache: false,
|
|
|
isMobileView: false,
|
|
|
showSiderbarInMobileView: false
|
|
|
};
|
|
|
function reducer$4(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_LOCATION": {
|
|
|
return action.payload;
|
|
|
}
|
|
|
case "SET_PATHNAME": {
|
|
|
if (action.payload.pathname === state.pathname) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
pathname: action.payload.pathname
|
|
|
});
|
|
|
}
|
|
|
case "SET_HASH": {
|
|
|
if (action.payload.hash === state.hash) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
hash: action.payload.hash
|
|
|
});
|
|
|
}
|
|
|
case "SET_QUERY": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadValues({}, action.payload)
|
|
|
});
|
|
|
}
|
|
|
case "SET_TAG_QUERY": {
|
|
|
if (action.payload.tag === state.query.tag) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
tag: action.payload.tag
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
case "SET_DURATION_QUERY": {
|
|
|
if (action.payload.duration === state.query.duration) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
duration: __spreadValues(__spreadValues({}, state.query.duration), action.payload.duration)
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
case "SET_TYPE": {
|
|
|
if (action.payload.type === state.query.type) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
type: action.payload.type
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
case "SET_TEXT": {
|
|
|
if (action.payload.text === state.query.text) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
text: action.payload.text
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
case "SET_QUERY_FILTER": {
|
|
|
if (action.payload === state.query.filter) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
filter: action.payload
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$4 = {
|
|
|
pathname: "/",
|
|
|
hash: "",
|
|
|
query: {
|
|
|
tag: "",
|
|
|
duration: null,
|
|
|
type: "",
|
|
|
text: "",
|
|
|
filter: ""
|
|
|
}
|
|
|
};
|
|
|
var utils;
|
|
|
(function(utils2) {
|
|
|
function getNowTimeStamp() {
|
|
|
return parseInt(require$$0.moment().format("x"));
|
|
|
}
|
|
|
utils2.getNowTimeStamp = getNowTimeStamp;
|
|
|
function getOSVersion() {
|
|
|
const appVersion = navigator.userAgent;
|
|
|
let detectedOS = "Unknown";
|
|
|
if (appVersion.indexOf("Win") != -1) {
|
|
|
detectedOS = "Windows";
|
|
|
} else if (appVersion.indexOf("Mac") != -1) {
|
|
|
detectedOS = "MacOS";
|
|
|
} else if (appVersion.indexOf("Linux") != -1) {
|
|
|
detectedOS = "Linux";
|
|
|
}
|
|
|
return detectedOS;
|
|
|
}
|
|
|
utils2.getOSVersion = getOSVersion;
|
|
|
function getTimeStampByDate(t2) {
|
|
|
if (typeof t2 === "string") {
|
|
|
t2 = t2.replaceAll("-", "/");
|
|
|
}
|
|
|
return new Date(t2).getTime();
|
|
|
}
|
|
|
utils2.getTimeStampByDate = getTimeStampByDate;
|
|
|
function getDateStampByDate(t2) {
|
|
|
const d = new Date(getTimeStampByDate(t2));
|
|
|
return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
|
|
|
}
|
|
|
utils2.getDateStampByDate = getDateStampByDate;
|
|
|
function getDateString(t2) {
|
|
|
const d = new Date(getTimeStampByDate(t2));
|
|
|
const year = d.getFullYear();
|
|
|
const month = d.getMonth() + 1;
|
|
|
const date = d.getDate();
|
|
|
return `${year}/${month}/${date}`;
|
|
|
}
|
|
|
utils2.getDateString = getDateString;
|
|
|
function getTimeString(t2) {
|
|
|
const d = new Date(getTimeStampByDate(t2));
|
|
|
const hours = d.getHours();
|
|
|
const mins = d.getMinutes();
|
|
|
const hoursStr = hours < 10 ? "0" + hours : hours;
|
|
|
const minsStr = mins < 10 ? "0" + mins : mins;
|
|
|
return `${hoursStr}:${minsStr}`;
|
|
|
}
|
|
|
utils2.getTimeString = getTimeString;
|
|
|
function getDateTimeString(t2) {
|
|
|
const d = new Date(getTimeStampByDate(t2));
|
|
|
const year = d.getFullYear();
|
|
|
const month = d.getMonth() + 1;
|
|
|
const date = d.getDate();
|
|
|
const hours = d.getHours();
|
|
|
const mins = d.getMinutes();
|
|
|
const monthStr = month < 10 ? "0" + month : month;
|
|
|
const dateStr = date < 10 ? "0" + date : date;
|
|
|
const hoursStr = hours < 10 ? "0" + hours : hours;
|
|
|
const minsStr = mins < 10 ? "0" + mins : mins;
|
|
|
const secsStr = "00";
|
|
|
return `${year}/${monthStr}/${dateStr} ${hoursStr}:${minsStr}:${secsStr}`;
|
|
|
}
|
|
|
utils2.getDateTimeString = getDateTimeString;
|
|
|
function dedupe(data) {
|
|
|
return Array.from(new Set(data));
|
|
|
}
|
|
|
utils2.dedupe = dedupe;
|
|
|
function dedupeObjectWithId(data) {
|
|
|
const idSet = new Set();
|
|
|
const result = [];
|
|
|
for (const d of data) {
|
|
|
if (!idSet.has(d.id)) {
|
|
|
idSet.add(d.id);
|
|
|
result.push(d);
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
utils2.dedupeObjectWithId = dedupeObjectWithId;
|
|
|
function debounce2(fn2, delay3) {
|
|
|
let timer = null;
|
|
|
return () => {
|
|
|
if (timer) {
|
|
|
clearTimeout(timer);
|
|
|
timer = setTimeout(fn2, delay3);
|
|
|
} else {
|
|
|
timer = setTimeout(fn2, delay3);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
utils2.debounce = debounce2;
|
|
|
function throttle(fn2, delay3) {
|
|
|
let valid = true;
|
|
|
return () => {
|
|
|
if (!valid) {
|
|
|
return false;
|
|
|
}
|
|
|
valid = false;
|
|
|
setTimeout(() => {
|
|
|
fn2();
|
|
|
valid = true;
|
|
|
}, delay3);
|
|
|
};
|
|
|
}
|
|
|
utils2.throttle = throttle;
|
|
|
function transformObjectToParamsString(object) {
|
|
|
const params = [];
|
|
|
const keys = Object.keys(object).sort();
|
|
|
for (const key of keys) {
|
|
|
const val = object[key];
|
|
|
if (val) {
|
|
|
if (typeof val === "object") {
|
|
|
params.push(...transformObjectToParamsString(val).split("&"));
|
|
|
} else {
|
|
|
params.push(`${key}=${val}`);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return params.join("&");
|
|
|
}
|
|
|
utils2.transformObjectToParamsString = transformObjectToParamsString;
|
|
|
function transformParamsStringToObject(paramsString) {
|
|
|
const object = {};
|
|
|
const params = paramsString.split("&");
|
|
|
for (const p2 of params) {
|
|
|
const [key, val] = p2.split("=");
|
|
|
if (key && val) {
|
|
|
object[key] = val;
|
|
|
}
|
|
|
}
|
|
|
return object;
|
|
|
}
|
|
|
utils2.transformParamsStringToObject = transformParamsStringToObject;
|
|
|
function filterObjectNullKeys(object) {
|
|
|
if (!object) {
|
|
|
return {};
|
|
|
}
|
|
|
const finalObject = {};
|
|
|
const keys = Object.keys(object).sort();
|
|
|
for (const key of keys) {
|
|
|
const val = object[key];
|
|
|
if (typeof val === "object") {
|
|
|
const temp = filterObjectNullKeys(JSON.parse(JSON.stringify(val)));
|
|
|
if (temp && Object.keys(temp).length > 0) {
|
|
|
finalObject[key] = temp;
|
|
|
}
|
|
|
} else {
|
|
|
if (val) {
|
|
|
finalObject[key] = val;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return finalObject;
|
|
|
}
|
|
|
utils2.filterObjectNullKeys = filterObjectNullKeys;
|
|
|
async function copyTextToClipboard(text) {
|
|
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
|
try {
|
|
|
await navigator.clipboard.writeText(text);
|
|
|
} catch (error) {
|
|
|
console.warn("Copy to clipboard failed.", error);
|
|
|
}
|
|
|
} else {
|
|
|
console.warn("Copy to clipboard failed, methods not supports.");
|
|
|
}
|
|
|
}
|
|
|
utils2.copyTextToClipboard = copyTextToClipboard;
|
|
|
function getImageSize(src) {
|
|
|
return new Promise((resolve) => {
|
|
|
const imgEl = new Image();
|
|
|
imgEl.onload = () => {
|
|
|
const { width, height } = imgEl;
|
|
|
if (width > 0 && height > 0) {
|
|
|
resolve({ width, height });
|
|
|
} else {
|
|
|
resolve({ width: 0, height: 0 });
|
|
|
}
|
|
|
};
|
|
|
imgEl.onerror = () => {
|
|
|
resolve({ width: 0, height: 0 });
|
|
|
};
|
|
|
imgEl.className = "hidden";
|
|
|
imgEl.src = src;
|
|
|
document.body.appendChild(imgEl);
|
|
|
imgEl.remove();
|
|
|
});
|
|
|
}
|
|
|
utils2.getImageSize = getImageSize;
|
|
|
})(utils || (utils = {}));
|
|
|
var utils$1 = utils;
|
|
|
function reducer$3(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_MEMOS": {
|
|
|
const memos = utils$1.dedupeObjectWithId(action.payload.memos.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)));
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
memos: [...memos]
|
|
|
});
|
|
|
}
|
|
|
case "SET_TAGS": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
tags: action.payload.tags
|
|
|
});
|
|
|
}
|
|
|
case "INSERT_MEMO": {
|
|
|
const memos = utils$1.dedupeObjectWithId([action.payload.memo, ...state.memos].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)));
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
memos
|
|
|
});
|
|
|
}
|
|
|
case "DELETE_MEMO_BY_ID": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
memos: [...state.memos].filter((memo2) => memo2.id !== action.payload.id)
|
|
|
});
|
|
|
}
|
|
|
case "EDIT_MEMO": {
|
|
|
const memos = state.memos.map((m2) => {
|
|
|
if (m2.id === action.payload.id) {
|
|
|
return __spreadValues(__spreadValues({}, m2), action.payload);
|
|
|
} else {
|
|
|
return m2;
|
|
|
}
|
|
|
});
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
memos
|
|
|
});
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$3 = {
|
|
|
memos: [],
|
|
|
tags: []
|
|
|
};
|
|
|
function reducer$2(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SIGN_IN": {
|
|
|
return {
|
|
|
user: action.payload.user
|
|
|
};
|
|
|
}
|
|
|
case "SIGN_OUT": {
|
|
|
return {
|
|
|
user: null
|
|
|
};
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$2 = { user: null };
|
|
|
function reducer$1(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_QUERIES": {
|
|
|
const queries = utils$1.dedupeObjectWithId(action.payload.queries.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).sort((a, b) => {
|
|
|
var _a, _b;
|
|
|
return utils$1.getTimeStampByDate((_a = b.pinnedAt) != null ? _a : 0) - utils$1.getTimeStampByDate((_b = a.pinnedAt) != null ? _b : 0);
|
|
|
}));
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
queries
|
|
|
});
|
|
|
}
|
|
|
case "INSERT_QUERY": {
|
|
|
const queries = utils$1.dedupeObjectWithId([action.payload.query, ...state.queries].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)));
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
queries
|
|
|
});
|
|
|
}
|
|
|
case "DELETE_QUERY_BY_ID": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
queries: [...state.queries].filter((query) => query.id !== action.payload.id)
|
|
|
});
|
|
|
}
|
|
|
case "UPDATE_QUERY": {
|
|
|
const queries = state.queries.map((m2) => {
|
|
|
if (m2.id === action.payload.id) {
|
|
|
return __spreadValues(__spreadValues({}, m2), action.payload);
|
|
|
} else {
|
|
|
return m2;
|
|
|
}
|
|
|
});
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
queries
|
|
|
});
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$1 = {
|
|
|
queries: []
|
|
|
};
|
|
|
var main$1 = {};
|
|
|
Object.defineProperty(main$1, "__esModule", { value: true });
|
|
|
var obsidian = require$$0__default["default"];
|
|
|
const DEFAULT_DAILY_NOTE_FORMAT = "YYYY-MM-DD";
|
|
|
const DEFAULT_WEEKLY_NOTE_FORMAT = "gggg-[W]ww";
|
|
|
const DEFAULT_MONTHLY_NOTE_FORMAT = "YYYY-MM";
|
|
|
const DEFAULT_QUARTERLY_NOTE_FORMAT = "YYYY-[Q]Q";
|
|
|
const DEFAULT_YEARLY_NOTE_FORMAT = "YYYY";
|
|
|
function shouldUsePeriodicNotesSettings(periodicity) {
|
|
|
var _a, _b;
|
|
|
const periodicNotes = window.app.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a[periodicity]) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function getDailyNoteSettings() {
|
|
|
var _a, _b, _c, _d;
|
|
|
try {
|
|
|
const { internalPlugins, plugins } = window.app;
|
|
|
if (shouldUsePeriodicNotesSettings("daily")) {
|
|
|
const { format: format3, folder: folder2, template: template2 } = ((_b = (_a = plugins.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.daily) || {};
|
|
|
return {
|
|
|
format: format3 || DEFAULT_DAILY_NOTE_FORMAT,
|
|
|
folder: (folder2 == null ? void 0 : folder2.trim()) || "",
|
|
|
template: (template2 == null ? void 0 : template2.trim()) || ""
|
|
|
};
|
|
|
}
|
|
|
const { folder, format: format2, template } = ((_d = (_c = internalPlugins.getPluginById("daily-notes")) == null ? void 0 : _c.instance) == null ? void 0 : _d.options) || {};
|
|
|
return {
|
|
|
format: format2 || DEFAULT_DAILY_NOTE_FORMAT,
|
|
|
folder: (folder == null ? void 0 : folder.trim()) || "",
|
|
|
template: (template == null ? void 0 : template.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom daily note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function getWeeklyNoteSettings() {
|
|
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
|
try {
|
|
|
const pluginManager = window.app.plugins;
|
|
|
const calendarSettings = (_a = pluginManager.getPlugin("calendar")) == null ? void 0 : _a.options;
|
|
|
const periodicNotesSettings = (_c = (_b = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _b.settings) == null ? void 0 : _c.weekly;
|
|
|
if (shouldUsePeriodicNotesSettings("weekly")) {
|
|
|
return {
|
|
|
format: periodicNotesSettings.format || DEFAULT_WEEKLY_NOTE_FORMAT,
|
|
|
folder: ((_d = periodicNotesSettings.folder) == null ? void 0 : _d.trim()) || "",
|
|
|
template: ((_e = periodicNotesSettings.template) == null ? void 0 : _e.trim()) || ""
|
|
|
};
|
|
|
}
|
|
|
const settings = calendarSettings || {};
|
|
|
return {
|
|
|
format: settings.weeklyNoteFormat || DEFAULT_WEEKLY_NOTE_FORMAT,
|
|
|
folder: ((_f = settings.weeklyNoteFolder) == null ? void 0 : _f.trim()) || "",
|
|
|
template: ((_g = settings.weeklyNoteTemplate) == null ? void 0 : _g.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom weekly note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function getMonthlyNoteSettings() {
|
|
|
var _a, _b, _c, _d;
|
|
|
const pluginManager = window.app.plugins;
|
|
|
try {
|
|
|
const settings = shouldUsePeriodicNotesSettings("monthly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.monthly) || {};
|
|
|
return {
|
|
|
format: settings.format || DEFAULT_MONTHLY_NOTE_FORMAT,
|
|
|
folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "",
|
|
|
template: ((_d = settings.template) == null ? void 0 : _d.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom monthly note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function getQuarterlyNoteSettings() {
|
|
|
var _a, _b, _c, _d;
|
|
|
const pluginManager = window.app.plugins;
|
|
|
try {
|
|
|
const settings = shouldUsePeriodicNotesSettings("quarterly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.quarterly) || {};
|
|
|
return {
|
|
|
format: settings.format || DEFAULT_QUARTERLY_NOTE_FORMAT,
|
|
|
folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "",
|
|
|
template: ((_d = settings.template) == null ? void 0 : _d.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom quarterly note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function getYearlyNoteSettings() {
|
|
|
var _a, _b, _c, _d;
|
|
|
const pluginManager = window.app.plugins;
|
|
|
try {
|
|
|
const settings = shouldUsePeriodicNotesSettings("yearly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.yearly) || {};
|
|
|
return {
|
|
|
format: settings.format || DEFAULT_YEARLY_NOTE_FORMAT,
|
|
|
folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "",
|
|
|
template: ((_d = settings.template) == null ? void 0 : _d.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom yearly note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function join(...partSegments) {
|
|
|
let parts = [];
|
|
|
for (let i = 0, l2 = partSegments.length; i < l2; i++) {
|
|
|
parts = parts.concat(partSegments[i].split("/"));
|
|
|
}
|
|
|
const newParts = [];
|
|
|
for (let i = 0, l2 = parts.length; i < l2; i++) {
|
|
|
const part = parts[i];
|
|
|
if (!part || part === ".")
|
|
|
continue;
|
|
|
else
|
|
|
newParts.push(part);
|
|
|
}
|
|
|
if (parts[0] === "")
|
|
|
newParts.unshift("");
|
|
|
return newParts.join("/");
|
|
|
}
|
|
|
function basename(fullPath) {
|
|
|
let base = fullPath.substring(fullPath.lastIndexOf("/") + 1);
|
|
|
if (base.lastIndexOf(".") != -1)
|
|
|
base = base.substring(0, base.lastIndexOf("."));
|
|
|
return base;
|
|
|
}
|
|
|
async function ensureFolderExists(path) {
|
|
|
const dirs = path.replace(/\\/g, "/").split("/");
|
|
|
dirs.pop();
|
|
|
if (dirs.length) {
|
|
|
const dir = join(...dirs);
|
|
|
if (!window.app.vault.getAbstractFileByPath(dir)) {
|
|
|
await window.app.vault.createFolder(dir);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async function getNotePath(directory, filename) {
|
|
|
if (!filename.endsWith(".md")) {
|
|
|
filename += ".md";
|
|
|
}
|
|
|
const path = obsidian.normalizePath(join(directory, filename));
|
|
|
await ensureFolderExists(path);
|
|
|
return path;
|
|
|
}
|
|
|
async function getTemplateInfo(template) {
|
|
|
const { metadataCache, vault } = window.app;
|
|
|
const templatePath = obsidian.normalizePath(template);
|
|
|
if (templatePath === "/") {
|
|
|
return Promise.resolve(["", null]);
|
|
|
}
|
|
|
try {
|
|
|
const templateFile = metadataCache.getFirstLinkpathDest(templatePath, "");
|
|
|
const contents = await vault.cachedRead(templateFile);
|
|
|
const IFoldInfo = window.app.foldManager.load(templateFile);
|
|
|
return [contents, IFoldInfo];
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to read the daily note template '${templatePath}'`, err);
|
|
|
new obsidian.Notice("Failed to read the daily note template");
|
|
|
return ["", null];
|
|
|
}
|
|
|
}
|
|
|
function getDateUID(date, granularity = "day") {
|
|
|
const ts = date.clone().startOf(granularity).format();
|
|
|
return `${granularity}-${ts}`;
|
|
|
}
|
|
|
function removeEscapedCharacters(format2) {
|
|
|
return format2.replace(/\[[^\]]*\]/g, "");
|
|
|
}
|
|
|
function isFormatAmbiguous(format2, granularity) {
|
|
|
if (granularity === "week") {
|
|
|
const cleanFormat = removeEscapedCharacters(format2);
|
|
|
return /w{1,2}/i.test(cleanFormat) && (/M{1,4}/.test(cleanFormat) || /D{1,4}/.test(cleanFormat));
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function getDateFromFile(file, granularity) {
|
|
|
return getDateFromFilename(file.basename, granularity);
|
|
|
}
|
|
|
function getDateFromPath(path, granularity) {
|
|
|
return getDateFromFilename(basename(path), granularity);
|
|
|
}
|
|
|
function getDateFromFilename(filename, granularity) {
|
|
|
const getSettings = {
|
|
|
day: getDailyNoteSettings,
|
|
|
week: getWeeklyNoteSettings,
|
|
|
month: getMonthlyNoteSettings,
|
|
|
quarter: getQuarterlyNoteSettings,
|
|
|
year: getYearlyNoteSettings
|
|
|
};
|
|
|
const format2 = getSettings[granularity]().format.split("/").pop();
|
|
|
const noteDate = window.moment(filename, format2, true);
|
|
|
if (!noteDate.isValid()) {
|
|
|
return null;
|
|
|
}
|
|
|
if (isFormatAmbiguous(format2, granularity)) {
|
|
|
if (granularity === "week") {
|
|
|
const cleanFormat = removeEscapedCharacters(format2);
|
|
|
if (/w{1,2}/i.test(cleanFormat)) {
|
|
|
return window.moment(filename, format2.replace(/M{1,4}/g, "").replace(/D{1,4}/g, ""), false);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return noteDate;
|
|
|
}
|
|
|
class DailyNotesFolderMissingError$1 extends Error {
|
|
|
}
|
|
|
async function createDailyNote(date) {
|
|
|
const app2 = window.app;
|
|
|
const { vault } = app2;
|
|
|
const moment = window.moment;
|
|
|
const { template, format: format2, folder } = getDailyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*yesterday\s*}}/gi, date.clone().subtract(1, "day").format(format2)).replace(/{{\s*tomorrow\s*}}/gi, date.clone().add(1, "d").format(format2)));
|
|
|
app2.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getDailyNote(date, dailyNotes) {
|
|
|
var _a;
|
|
|
return (_a = dailyNotes[getDateUID(date, "day")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllDailyNotes() {
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getDailyNoteSettings();
|
|
|
const dailyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!dailyNotesFolder) {
|
|
|
throw new DailyNotesFolderMissingError$1("Failed to find daily notes folder");
|
|
|
}
|
|
|
const dailyNotes = {};
|
|
|
obsidian.Vault.recurseChildren(dailyNotesFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "day");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "day");
|
|
|
dailyNotes[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return dailyNotes;
|
|
|
}
|
|
|
class WeeklyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
function getDaysOfWeek() {
|
|
|
const { moment } = window;
|
|
|
let weekStart = moment.localeData()._week.dow;
|
|
|
const daysOfWeek = [
|
|
|
"sunday",
|
|
|
"monday",
|
|
|
"tuesday",
|
|
|
"wednesday",
|
|
|
"thursday",
|
|
|
"friday",
|
|
|
"saturday"
|
|
|
];
|
|
|
while (weekStart) {
|
|
|
daysOfWeek.push(daysOfWeek.shift());
|
|
|
weekStart--;
|
|
|
}
|
|
|
return daysOfWeek;
|
|
|
}
|
|
|
function getDayOfWeekNumericalValue(dayOfWeekName) {
|
|
|
return getDaysOfWeek().indexOf(dayOfWeekName.toLowerCase());
|
|
|
}
|
|
|
async function createWeeklyNote(date) {
|
|
|
const { vault } = window.app;
|
|
|
const { template, format: format2, folder } = getWeeklyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = window.moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi, (_, dayOfWeek, momentFormat) => {
|
|
|
const day = getDayOfWeekNumericalValue(dayOfWeek);
|
|
|
return date.weekday(day).format(momentFormat.trim());
|
|
|
}));
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getWeeklyNote(date, weeklyNotes) {
|
|
|
var _a;
|
|
|
return (_a = weeklyNotes[getDateUID(date, "week")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllWeeklyNotes() {
|
|
|
const weeklyNotes = {};
|
|
|
if (!appHasWeeklyNotesPluginLoaded()) {
|
|
|
return weeklyNotes;
|
|
|
}
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getWeeklyNoteSettings();
|
|
|
const weeklyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!weeklyNotesFolder) {
|
|
|
throw new WeeklyNotesFolderMissingError("Failed to find weekly notes folder");
|
|
|
}
|
|
|
obsidian.Vault.recurseChildren(weeklyNotesFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "week");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "week");
|
|
|
weeklyNotes[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return weeklyNotes;
|
|
|
}
|
|
|
class MonthlyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
async function createMonthlyNote(date) {
|
|
|
const { vault } = window.app;
|
|
|
const { template, format: format2, folder } = getMonthlyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = window.moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename));
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getMonthlyNote(date, monthlyNotes) {
|
|
|
var _a;
|
|
|
return (_a = monthlyNotes[getDateUID(date, "month")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllMonthlyNotes() {
|
|
|
const monthlyNotes = {};
|
|
|
if (!appHasMonthlyNotesPluginLoaded()) {
|
|
|
return monthlyNotes;
|
|
|
}
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getMonthlyNoteSettings();
|
|
|
const monthlyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!monthlyNotesFolder) {
|
|
|
throw new MonthlyNotesFolderMissingError("Failed to find monthly notes folder");
|
|
|
}
|
|
|
obsidian.Vault.recurseChildren(monthlyNotesFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "month");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "month");
|
|
|
monthlyNotes[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return monthlyNotes;
|
|
|
}
|
|
|
class QuarterlyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
async function createQuarterlyNote(date) {
|
|
|
const { vault } = window.app;
|
|
|
const { template, format: format2, folder } = getQuarterlyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = window.moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename));
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getQuarterlyNote(date, quarterly) {
|
|
|
var _a;
|
|
|
return (_a = quarterly[getDateUID(date, "quarter")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllQuarterlyNotes() {
|
|
|
const quarterly = {};
|
|
|
if (!appHasQuarterlyNotesPluginLoaded()) {
|
|
|
return quarterly;
|
|
|
}
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getQuarterlyNoteSettings();
|
|
|
const quarterlyFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!quarterlyFolder) {
|
|
|
throw new QuarterlyNotesFolderMissingError("Failed to find quarterly notes folder");
|
|
|
}
|
|
|
obsidian.Vault.recurseChildren(quarterlyFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "quarter");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "quarter");
|
|
|
quarterly[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return quarterly;
|
|
|
}
|
|
|
class YearlyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
async function createYearlyNote(date) {
|
|
|
const { vault } = window.app;
|
|
|
const { template, format: format2, folder } = getYearlyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = window.moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename));
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getYearlyNote(date, yearlyNotes) {
|
|
|
var _a;
|
|
|
return (_a = yearlyNotes[getDateUID(date, "year")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllYearlyNotes() {
|
|
|
const yearlyNotes = {};
|
|
|
if (!appHasYearlyNotesPluginLoaded()) {
|
|
|
return yearlyNotes;
|
|
|
}
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getYearlyNoteSettings();
|
|
|
const yearlyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!yearlyNotesFolder) {
|
|
|
throw new YearlyNotesFolderMissingError("Failed to find yearly notes folder");
|
|
|
}
|
|
|
obsidian.Vault.recurseChildren(yearlyNotesFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "year");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "year");
|
|
|
yearlyNotes[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return yearlyNotes;
|
|
|
}
|
|
|
function appHasDailyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
const dailyNotesPlugin = app2.internalPlugins.plugins["daily-notes"];
|
|
|
if (dailyNotesPlugin && dailyNotesPlugin.enabled) {
|
|
|
return true;
|
|
|
}
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.daily) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function appHasWeeklyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
if (app2.plugins.getPlugin("calendar")) {
|
|
|
return true;
|
|
|
}
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.weekly) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function appHasMonthlyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.monthly) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function appHasQuarterlyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.quarterly) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function appHasYearlyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.yearly) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function getPeriodicNoteSettings(granularity) {
|
|
|
const getSettings = {
|
|
|
day: getDailyNoteSettings,
|
|
|
week: getWeeklyNoteSettings,
|
|
|
month: getMonthlyNoteSettings,
|
|
|
quarter: getQuarterlyNoteSettings,
|
|
|
year: getYearlyNoteSettings
|
|
|
}[granularity];
|
|
|
return getSettings();
|
|
|
}
|
|
|
function createPeriodicNote(granularity, date) {
|
|
|
const createFn = {
|
|
|
day: createDailyNote,
|
|
|
month: createMonthlyNote,
|
|
|
week: createWeeklyNote
|
|
|
};
|
|
|
return createFn[granularity](date);
|
|
|
}
|
|
|
main$1.DEFAULT_DAILY_NOTE_FORMAT = DEFAULT_DAILY_NOTE_FORMAT;
|
|
|
main$1.DEFAULT_MONTHLY_NOTE_FORMAT = DEFAULT_MONTHLY_NOTE_FORMAT;
|
|
|
main$1.DEFAULT_QUARTERLY_NOTE_FORMAT = DEFAULT_QUARTERLY_NOTE_FORMAT;
|
|
|
main$1.DEFAULT_WEEKLY_NOTE_FORMAT = DEFAULT_WEEKLY_NOTE_FORMAT;
|
|
|
main$1.DEFAULT_YEARLY_NOTE_FORMAT = DEFAULT_YEARLY_NOTE_FORMAT;
|
|
|
var appHasDailyNotesPluginLoaded_1 = main$1.appHasDailyNotesPluginLoaded = appHasDailyNotesPluginLoaded;
|
|
|
main$1.appHasMonthlyNotesPluginLoaded = appHasMonthlyNotesPluginLoaded;
|
|
|
main$1.appHasQuarterlyNotesPluginLoaded = appHasQuarterlyNotesPluginLoaded;
|
|
|
main$1.appHasWeeklyNotesPluginLoaded = appHasWeeklyNotesPluginLoaded;
|
|
|
main$1.appHasYearlyNotesPluginLoaded = appHasYearlyNotesPluginLoaded;
|
|
|
var createDailyNote_1 = main$1.createDailyNote = createDailyNote;
|
|
|
main$1.createMonthlyNote = createMonthlyNote;
|
|
|
main$1.createPeriodicNote = createPeriodicNote;
|
|
|
main$1.createQuarterlyNote = createQuarterlyNote;
|
|
|
main$1.createWeeklyNote = createWeeklyNote;
|
|
|
main$1.createYearlyNote = createYearlyNote;
|
|
|
var getAllDailyNotes_1 = main$1.getAllDailyNotes = getAllDailyNotes;
|
|
|
main$1.getAllMonthlyNotes = getAllMonthlyNotes;
|
|
|
main$1.getAllQuarterlyNotes = getAllQuarterlyNotes;
|
|
|
main$1.getAllWeeklyNotes = getAllWeeklyNotes;
|
|
|
main$1.getAllYearlyNotes = getAllYearlyNotes;
|
|
|
var getDailyNote_1 = main$1.getDailyNote = getDailyNote;
|
|
|
var getDailyNoteSettings_1 = main$1.getDailyNoteSettings = getDailyNoteSettings;
|
|
|
var getDateFromFile_1 = main$1.getDateFromFile = getDateFromFile;
|
|
|
main$1.getDateFromPath = getDateFromPath;
|
|
|
main$1.getDateUID = getDateUID;
|
|
|
main$1.getMonthlyNote = getMonthlyNote;
|
|
|
main$1.getMonthlyNoteSettings = getMonthlyNoteSettings;
|
|
|
main$1.getPeriodicNoteSettings = getPeriodicNoteSettings;
|
|
|
main$1.getQuarterlyNote = getQuarterlyNote;
|
|
|
main$1.getQuarterlyNoteSettings = getQuarterlyNoteSettings;
|
|
|
main$1.getTemplateInfo = getTemplateInfo;
|
|
|
main$1.getWeeklyNote = getWeeklyNote;
|
|
|
main$1.getWeeklyNoteSettings = getWeeklyNoteSettings;
|
|
|
main$1.getYearlyNote = getYearlyNote;
|
|
|
main$1.getYearlyNoteSettings = getYearlyNoteSettings;
|
|
|
function reducer(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_DAILYNOTES": {
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
dailyNotes
|
|
|
});
|
|
|
}
|
|
|
case "SET_APP": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
app: action.payload.app
|
|
|
});
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState = {
|
|
|
dailyNotes: null,
|
|
|
app: null
|
|
|
};
|
|
|
const appStore = createStore({
|
|
|
globalState: defaultState$5,
|
|
|
locationState: defaultState$4,
|
|
|
memoState: defaultState$3,
|
|
|
userState: defaultState$2,
|
|
|
queryState: defaultState$1,
|
|
|
dailyNotesState: defaultState
|
|
|
}, combineReducers({
|
|
|
globalState: reducer$5,
|
|
|
locationState: reducer$4,
|
|
|
memoState: reducer$3,
|
|
|
userState: reducer$2,
|
|
|
queryState: reducer$1,
|
|
|
dailyNotesState: reducer
|
|
|
}));
|
|
|
const appContext = _react_17_0_2_react.exports.createContext(appStore.getState());
|
|
|
class DailyNotesService {
|
|
|
getState() {
|
|
|
return appStore.getState().dailyNotesState;
|
|
|
}
|
|
|
getApp(app2) {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_APP",
|
|
|
payload: {
|
|
|
app: app2
|
|
|
}
|
|
|
});
|
|
|
return app2;
|
|
|
}
|
|
|
async getMyAllDailyNotes() {
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
appStore.dispatch({
|
|
|
type: "SET_DAILYNOTES",
|
|
|
payload: {
|
|
|
dailyNotes
|
|
|
}
|
|
|
});
|
|
|
return dailyNotes;
|
|
|
}
|
|
|
async getDailyNoteByMemo(date) {
|
|
|
const { dailyNotes } = this.getState();
|
|
|
const dailyNote = getDailyNote_1(date, dailyNotes);
|
|
|
return dailyNote;
|
|
|
}
|
|
|
}
|
|
|
const dailyNotesService = new DailyNotesService();
|
|
|
var storage;
|
|
|
(function(storage2) {
|
|
|
function get(keys) {
|
|
|
const data = {};
|
|
|
for (const key of keys) {
|
|
|
try {
|
|
|
const stringifyValue = localStorage.getItem(key);
|
|
|
if (stringifyValue !== null) {
|
|
|
const val = JSON.parse(stringifyValue);
|
|
|
data[key] = val;
|
|
|
}
|
|
|
} catch (error) {
|
|
|
console.error("Get storage failed in ", key, error);
|
|
|
}
|
|
|
}
|
|
|
return data;
|
|
|
}
|
|
|
storage2.get = get;
|
|
|
function set(data) {
|
|
|
for (const key in data) {
|
|
|
try {
|
|
|
const stringifyValue = JSON.stringify(data[key]);
|
|
|
localStorage.setItem(key, stringifyValue);
|
|
|
} catch (error) {
|
|
|
console.error("Save storage failed in ", key, error);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
storage2.set = set;
|
|
|
function remove(keys) {
|
|
|
for (const key of keys) {
|
|
|
try {
|
|
|
localStorage.removeItem(key);
|
|
|
} catch (error) {
|
|
|
console.error("Remove storage failed in ", key, error);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
storage2.remove = remove;
|
|
|
function emitStorageChangedEvent() {
|
|
|
var _a;
|
|
|
const iframeEl = document.createElement("iframe");
|
|
|
iframeEl.style.display = "none";
|
|
|
document.body.appendChild(iframeEl);
|
|
|
(_a = iframeEl.contentWindow) == null ? void 0 : _a.localStorage.setItem("t", Date.now().toString());
|
|
|
iframeEl.remove();
|
|
|
}
|
|
|
storage2.emitStorageChangedEvent = emitStorageChangedEvent;
|
|
|
})(storage || (storage = {}));
|
|
|
class GlobalStateService {
|
|
|
constructor() {
|
|
|
__publicField(this, "getState", () => {
|
|
|
return appStore.getState().globalState;
|
|
|
});
|
|
|
__publicField(this, "setEditMemoId", (editMemoId) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_EDIT_MEMO_ID",
|
|
|
payload: {
|
|
|
editMemoId
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setMarkMemoId", (markMemoId) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_MARK_MEMO_ID",
|
|
|
payload: {
|
|
|
markMemoId
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setIsMobileView", (isMobileView) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_MOBILE_VIEW",
|
|
|
payload: {
|
|
|
isMobileView
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setShowSiderbarInMobileView", (showSiderbarInMobileView) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_SHOW_SIDEBAR_IN_MOBILE_VIEW",
|
|
|
payload: {
|
|
|
showSiderbarInMobileView
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setAppSetting", (appSetting) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_APP_SETTING",
|
|
|
payload: appSetting
|
|
|
});
|
|
|
storage.set(appSetting);
|
|
|
});
|
|
|
var _a, _b, _c, _d;
|
|
|
const cachedSetting = storage.get([
|
|
|
"shouldSplitMemoWord",
|
|
|
"shouldHideImageUrl",
|
|
|
"shouldUseMarkdownParser",
|
|
|
"useTinyUndoHistoryCache"
|
|
|
]);
|
|
|
const defaultAppSetting = {
|
|
|
shouldSplitMemoWord: (_a = cachedSetting.shouldSplitMemoWord) != null ? _a : true,
|
|
|
shouldHideImageUrl: (_b = cachedSetting.shouldHideImageUrl) != null ? _b : true,
|
|
|
shouldUseMarkdownParser: (_c = cachedSetting.shouldUseMarkdownParser) != null ? _c : true,
|
|
|
useTinyUndoHistoryCache: (_d = cachedSetting.useTinyUndoHistoryCache) != null ? _d : false
|
|
|
};
|
|
|
this.setAppSetting(defaultAppSetting);
|
|
|
}
|
|
|
}
|
|
|
const globalStateService = new GlobalStateService();
|
|
|
class LocationService {
|
|
|
constructor() {
|
|
|
__publicField(this, "updateStateWithLocation", () => {
|
|
|
var _a, _b, _c, _d, _e, _f;
|
|
|
const { pathname, search: search2, hash: hash2 } = window.location;
|
|
|
const urlParams = new URLSearchParams(search2);
|
|
|
const state = {
|
|
|
pathname: "/",
|
|
|
hash: "",
|
|
|
query: {
|
|
|
tag: "",
|
|
|
duration: null,
|
|
|
text: "",
|
|
|
type: "",
|
|
|
filter: ""
|
|
|
}
|
|
|
};
|
|
|
state.query.tag = (_a = urlParams.get("tag")) != null ? _a : "";
|
|
|
state.query.type = (_b = urlParams.get("type")) != null ? _b : "";
|
|
|
state.query.text = (_c = urlParams.get("text")) != null ? _c : "";
|
|
|
state.query.filter = (_d = urlParams.get("filter")) != null ? _d : "";
|
|
|
const from = parseInt((_e = urlParams.get("from")) != null ? _e : "0");
|
|
|
const to = parseInt((_f = urlParams.get("to")) != null ? _f : "0");
|
|
|
if (to > from && to !== 0) {
|
|
|
state.query.duration = {
|
|
|
from,
|
|
|
to
|
|
|
};
|
|
|
}
|
|
|
state.hash = hash2;
|
|
|
state.pathname = this.getValidPathname(pathname);
|
|
|
appStore.dispatch({
|
|
|
type: "SET_LOCATION",
|
|
|
payload: state
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "getState", () => {
|
|
|
return appStore.getState().locationState;
|
|
|
});
|
|
|
__publicField(this, "clearQuery", () => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_QUERY",
|
|
|
payload: {
|
|
|
tag: "",
|
|
|
duration: null,
|
|
|
text: "",
|
|
|
type: "",
|
|
|
filter: ""
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setQuery", (query) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_QUERY",
|
|
|
payload: query
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setHash", (hash2) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_HASH",
|
|
|
payload: {
|
|
|
hash: hash2
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setPathname", (pathname) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_PATHNAME",
|
|
|
payload: {
|
|
|
pathname
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "pushHistory", (pathname) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_PATHNAME",
|
|
|
payload: {
|
|
|
pathname
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "replaceHistory", (pathname) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_PATHNAME",
|
|
|
payload: {
|
|
|
pathname
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setMemoTypeQuery", (type = "") => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_TYPE",
|
|
|
payload: {
|
|
|
type
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setMemoFilter", (filterId) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_QUERY_FILTER",
|
|
|
payload: filterId
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setTextQuery", (text) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_TEXT",
|
|
|
payload: {
|
|
|
text
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setTagQuery", (tag2) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_TAG_QUERY",
|
|
|
payload: {
|
|
|
tag: tag2
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setFromAndToQuery", (from, to) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_DURATION_QUERY",
|
|
|
payload: {
|
|
|
duration: { from, to }
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "getValidPathname", (pathname) => {
|
|
|
if (["/", "/recycle", "/setting"].includes(pathname)) {
|
|
|
return pathname;
|
|
|
} else {
|
|
|
return "/";
|
|
|
}
|
|
|
});
|
|
|
this.updateStateWithLocation();
|
|
|
window.onpopstate = () => {
|
|
|
this.updateStateWithLocation();
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
const locationService = new LocationService();
|
|
|
async function changeMemo(memoid, originalContent, content, memoType) {
|
|
|
const { dailyNotes } = dailyNotesService.getState();
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const timeString = memoid.slice(0, 11) + "00";
|
|
|
const idString = parseInt(memoid.slice(14));
|
|
|
const changeDate = require$$0.moment(timeString, "YYYYMMDDHHmmSS");
|
|
|
const dailyNote = getDailyNote_1(changeDate, dailyNotes);
|
|
|
const fileContent = await vault.read(dailyNote);
|
|
|
const fileLines = getAllLinesFromFile$9(fileContent);
|
|
|
const removeEnter = content.replace(/\n/g, "<br>");
|
|
|
const originalLine = fileLines[idString];
|
|
|
const newLine = fileLines[idString].replace(originalContent, removeEnter);
|
|
|
const newFileContent = fileContent.replace(originalLine, newLine);
|
|
|
await vault.modify(dailyNote, newFileContent);
|
|
|
return {
|
|
|
id: memoid,
|
|
|
content: removeEnter,
|
|
|
deletedAt: "",
|
|
|
createdAt: changeDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
updatedAt: changeDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
memoType
|
|
|
};
|
|
|
}
|
|
|
function getDailyNotePath() {
|
|
|
const dailyNotesSetting = getDailyNoteSettings_1();
|
|
|
const dailyNotePath = dailyNotesSetting.folder;
|
|
|
return dailyNotePath;
|
|
|
}
|
|
|
const getAllLinesFromFile$9 = (cache) => cache.split(/\r?\n/);
|
|
|
const findQuery = async () => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const queryList2 = [];
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile$8(fileContents);
|
|
|
if (fileLines && fileLines.length != 0) {
|
|
|
for (let i = 0; i < fileLines.length; i++) {
|
|
|
if (fileLines[i] === "")
|
|
|
continue;
|
|
|
const createdDateString = getCreatedDateFromLine(fileLines[i]);
|
|
|
const createdDate = require$$0.moment(createdDateString, "YYYYMMDDHHmmss").format("YYYY/MM/DD HH:mm:ss");
|
|
|
const updatedDate = createdDate;
|
|
|
const id2 = createdDateString + getIDFromLine$1(fileLines[i]);
|
|
|
const querystring = getStringFromLine(fileLines[i]);
|
|
|
const title = getTitleFromLine(fileLines[i]);
|
|
|
let pinnedDate;
|
|
|
if (/^(.+)pinnedAt(.+)$/.test(fileLines[i])) {
|
|
|
pinnedDate = require$$0.moment(getPinnedDateFromLine$1(fileLines[i]), "YYYYMMDDHHmmss");
|
|
|
queryList2.push({
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: pinnedDate.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
querystring,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
});
|
|
|
} else if (/^(.+)\[\](.+)?$/.test(fileLines[i])) {
|
|
|
queryList2.push({
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring: "",
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
});
|
|
|
} else {
|
|
|
queryList2.push({
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return queryList2;
|
|
|
};
|
|
|
const getAllLinesFromFile$8 = (cache) => cache.split(/\r?\n/);
|
|
|
const getCreatedDateFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})/.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const getIDFromLine$1 = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s/.exec(line)) == null ? void 0 : _a[2];
|
|
|
};
|
|
|
const getStringFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)?\])/.exec(line)) == null ? void 0 : _a[4];
|
|
|
};
|
|
|
const getTitleFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])/.exec(line)) == null ? void 0 : _a[3];
|
|
|
};
|
|
|
const getPinnedDateFromLine$1 = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt\: (\d{14}))/.exec(line)) == null ? void 0 : _a[7];
|
|
|
};
|
|
|
const createObsidianQuery = async (title, querystring) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile$7(fileContents);
|
|
|
const date = require$$0.moment();
|
|
|
const createdDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
const updatedDate = createdDate;
|
|
|
let lineNum;
|
|
|
if (fileLines.length === 1 && fileLines[0] === "") {
|
|
|
lineNum = 1;
|
|
|
} else {
|
|
|
lineNum = fileLines.length + 1;
|
|
|
}
|
|
|
const id2 = date.format("YYYYMMDDHHmmss") + lineNum;
|
|
|
await createQueryInFile(queryFile, fileContents, id2, title, querystring);
|
|
|
return [
|
|
|
{
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
}
|
|
|
];
|
|
|
} else {
|
|
|
const queryFilePath = require$$0.normalizePath(absolutePath);
|
|
|
const file = await createQueryFile(queryFilePath);
|
|
|
const fileContents = await vault.read(file);
|
|
|
const date = require$$0.moment();
|
|
|
const createdDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
const updatedDate = createdDate;
|
|
|
const id2 = date.format("YYYYMMDDHHmmss") + 1;
|
|
|
await createQueryInFile(file, fileContents, id2, title, querystring);
|
|
|
return [
|
|
|
{
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
};
|
|
|
const createQueryInFile = async (file, fileContent, id2, title, queryString) => {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
let newContent;
|
|
|
if (fileContent === "") {
|
|
|
newContent = id2 + " " + title + " " + queryString;
|
|
|
} else {
|
|
|
newContent = fileContent + "\n" + id2 + " " + title + " " + queryString;
|
|
|
}
|
|
|
await vault.modify(file, newContent);
|
|
|
return true;
|
|
|
};
|
|
|
const createQueryFile = async (path) => {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
try {
|
|
|
const createdFile = await vault.create(path, "");
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${path}'`, err);
|
|
|
new require$$0.Notice("Unable to create new file.");
|
|
|
}
|
|
|
};
|
|
|
const getAllLinesFromFile$7 = (cache) => cache.split(/\r?\n/);
|
|
|
class DailyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
async function getRemainingMemos(note) {
|
|
|
if (!note) {
|
|
|
return 0;
|
|
|
}
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
let fileContents = await vault.read(note);
|
|
|
let regexMatch;
|
|
|
if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) {
|
|
|
regexMatch = "(-|\\*) (\\[(.{1})\\]\\s)?" + DefaultMemoComposition.replace(/{TIME}/g, "((\\<time\\>)?\\d{1,2}:\\d{2})?").replace(/ {CONTENT}/g, "");
|
|
|
} else {
|
|
|
regexMatch = "(-|\\*) (\\[(.{1})\\]\\s)?((\\<time\\>)?\\d{1,2}\\:\\d{2})?";
|
|
|
}
|
|
|
const regexMatchRe = new RegExp(regexMatch, "g");
|
|
|
const matchLength = (fileContents.match(regexMatchRe) || []).length;
|
|
|
const re2 = new RegExp(ProcessEntriesBelow.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"), "g");
|
|
|
const processEntriesHeader = (fileContents.match(re2) || []).length;
|
|
|
fileContents = null;
|
|
|
if (processEntriesHeader) {
|
|
|
return matchLength;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
async function getMemosFromDailyNote(dailyNote, dailyEvents) {
|
|
|
if (!dailyNote) {
|
|
|
return [];
|
|
|
}
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const Memos2 = await getRemainingMemos(dailyNote);
|
|
|
if (Memos2) {
|
|
|
let fileContents = await vault.read(dailyNote);
|
|
|
let fileLines = getAllLinesFromFile$6(fileContents);
|
|
|
const startDate = getDateFromFile_1(dailyNote, "day");
|
|
|
const endDate = getDateFromFile_1(dailyNote, "day");
|
|
|
let processHeaderFound = false;
|
|
|
let memoType;
|
|
|
for (let i = 0; i < fileLines.length; i++) {
|
|
|
const line = fileLines[i];
|
|
|
if (line.length === 0)
|
|
|
continue;
|
|
|
if (processHeaderFound == false && lineContainsParseBelowToken(line)) {
|
|
|
processHeaderFound = true;
|
|
|
}
|
|
|
if (processHeaderFound == true && !lineContainsParseBelowToken(line) && /^#{1,} /g.test(line)) {
|
|
|
processHeaderFound = false;
|
|
|
}
|
|
|
if (lineContainsTime(line) && processHeaderFound) {
|
|
|
const hourText = extractHourFromBulletLine(line);
|
|
|
const minText = extractMinFromBulletLine(line);
|
|
|
startDate.hours(parseInt(hourText));
|
|
|
startDate.minutes(parseInt(minText));
|
|
|
endDate.hours(parseInt(hourText));
|
|
|
if (parseInt(hourText) > 22) {
|
|
|
endDate.minutes(parseInt(minText));
|
|
|
} else {
|
|
|
endDate.minutes(parseInt(minText));
|
|
|
}
|
|
|
if (/^\s*[-*]\s(\[(.{1})\])\s/g.test(line)) {
|
|
|
const memoTaskType = extractMemoTaskTypeFromLine(line);
|
|
|
if (memoTaskType === " ") {
|
|
|
memoType = "TASK-TODO";
|
|
|
} else if (memoTaskType === "x" || memoTaskType === "X") {
|
|
|
memoType = "TASK-DONE";
|
|
|
} else {
|
|
|
memoType = "TASK-" + memoTaskType;
|
|
|
}
|
|
|
} else {
|
|
|
memoType = "JOURNAL";
|
|
|
}
|
|
|
const rawText = extractTextFromTodoLine(line);
|
|
|
if (rawText !== "") {
|
|
|
dailyEvents.push({
|
|
|
id: startDate.format("YYYYMMDDHHmmSS") + i,
|
|
|
content: rawText,
|
|
|
user_id: 1,
|
|
|
createdAt: startDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
updatedAt: endDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
memoType
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
}
|
|
|
async function getMemos() {
|
|
|
const events = [];
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const { folder } = getDailyNoteSettings_1();
|
|
|
const dailyNotesFolder = vault.getAbstractFileByPath(require$$0.normalizePath(folder));
|
|
|
if (!dailyNotesFolder) {
|
|
|
throw new DailyNotesFolderMissingError("Failed to find daily notes folder");
|
|
|
}
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
for (const string in dailyNotes) {
|
|
|
if (dailyNotes[string] instanceof require$$0.TFile) {
|
|
|
await getMemosFromDailyNote(dailyNotes[string], events);
|
|
|
}
|
|
|
}
|
|
|
return events;
|
|
|
}
|
|
|
const getAllLinesFromFile$6 = (cache) => cache.split(/\r?\n/);
|
|
|
const lineContainsTime = (line) => {
|
|
|
let regexMatch;
|
|
|
if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) {
|
|
|
regexMatch = "^\\s*(-|\\*)\\s(\\[(.{1})\\]\\s)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\<time\\>)?\\d{1,2}:\\d{2}(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$");
|
|
|
} else {
|
|
|
regexMatch = "^\\s*(-|\\*)\\s(\\[(.{1})\\]\\s)?(\\<time\\>)?\\d{1,2}\\:\\d{2}(.*)$";
|
|
|
}
|
|
|
const regexMatchRe = new RegExp(regexMatch, "");
|
|
|
return regexMatchRe.test(line);
|
|
|
};
|
|
|
const lineContainsParseBelowToken = (line) => {
|
|
|
if (ProcessEntriesBelow === "") {
|
|
|
return true;
|
|
|
}
|
|
|
const re2 = new RegExp(ProcessEntriesBelow.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"), "");
|
|
|
return re2.test(line);
|
|
|
};
|
|
|
const extractTextFromTodoLine = (line) => {
|
|
|
var _a;
|
|
|
let regexMatch;
|
|
|
if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) {
|
|
|
regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\<time\\>)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$");
|
|
|
} else {
|
|
|
regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\<time\\>)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?\\s?(.*)$";
|
|
|
}
|
|
|
const regexMatchRe = new RegExp(regexMatch, "");
|
|
|
return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[8];
|
|
|
};
|
|
|
const extractHourFromBulletLine = (line) => {
|
|
|
var _a;
|
|
|
let regexHourMatch;
|
|
|
if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) {
|
|
|
regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\<time\\>)?(\\d{1,2})\\:(\\d{2})(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$");
|
|
|
} else {
|
|
|
regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\<time\\>)?(\\d{1,2})\\:(\\d{2})(.*)$";
|
|
|
}
|
|
|
const regexMatchRe = new RegExp(regexHourMatch, "");
|
|
|
return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[4];
|
|
|
};
|
|
|
const extractMinFromBulletLine = (line) => {
|
|
|
var _a;
|
|
|
let regexHourMatch;
|
|
|
if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) {
|
|
|
regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\<time\\>)?(\\d{1,2})\\:(\\d{2})(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$");
|
|
|
} else {
|
|
|
regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\<time\\>)?(\\d{1,2})\\:(\\d{2})(.*)$";
|
|
|
}
|
|
|
const regexMatchRe = new RegExp(regexHourMatch, "");
|
|
|
return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[5];
|
|
|
};
|
|
|
const extractMemoTaskTypeFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^\s*[\-\*]\s(\[(.{1})\])\s(.*)$/.exec(line)) == null ? void 0 : _a[2];
|
|
|
};
|
|
|
const updateObsidianQuery = async (queryId, title, queryString) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile$5(fileContents);
|
|
|
let lineID;
|
|
|
if (/^\d{1,3}$/.test(queryId)) {
|
|
|
lineID = queryId;
|
|
|
} else {
|
|
|
lineID = getIDFromLine(queryId);
|
|
|
}
|
|
|
const lineNum = parseInt(lineID) - 1;
|
|
|
if (fileLines && fileLines.length != 0) {
|
|
|
const oldContent = fileLines[lineNum];
|
|
|
const date = require$$0.moment();
|
|
|
const updatedDateString = date.format("YYYYMMDDHHmmss");
|
|
|
const updatedDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
const newLineNum = lineNum + 1;
|
|
|
const id2 = updatedDateString + newLineNum;
|
|
|
if (/^(.+)pinnedAt(.+)$/.test(oldContent)) {
|
|
|
const pinnedString = getPinnedStringFromLine(oldContent);
|
|
|
const pinnedDateString = getPinnedDateFromLine(oldContent);
|
|
|
const newContent = id2 + " " + title + " " + queryString + " " + pinnedString;
|
|
|
const pinnedAtDate = require$$0.moment(pinnedDateString, "YYYYMMDDHHmmss").format("YYYY/MM/DD HH:mm:ss");
|
|
|
const newFileContents = fileContents.replace(oldContent, newContent);
|
|
|
await vault.modify(queryFile, newFileContents);
|
|
|
return [
|
|
|
{
|
|
|
createdAt: updatedDate,
|
|
|
id: id2,
|
|
|
pinnedAt: pinnedAtDate,
|
|
|
querystring: queryString,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
}
|
|
|
];
|
|
|
} else {
|
|
|
const newContent = id2 + " " + title + " " + queryString;
|
|
|
const newFileContents = fileContents.replace(oldContent, newContent);
|
|
|
await vault.modify(queryFile, newFileContents);
|
|
|
return [
|
|
|
{
|
|
|
createdAt: updatedDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring: queryString,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const getAllLinesFromFile$5 = (cache) => cache.split(/\r?\n/);
|
|
|
const getIDFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})/.exec(line)) == null ? void 0 : _a[2];
|
|
|
};
|
|
|
const getPinnedStringFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt\: (\d{14})\d+)/.exec(line)) == null ? void 0 : _a[6];
|
|
|
};
|
|
|
const getPinnedDateFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt\: (\d{14})\d+)/.exec(line)) == null ? void 0 : _a[7];
|
|
|
};
|
|
|
async function escapeRegExp(text) {
|
|
|
return await text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
|
}
|
|
|
function getLinesInString(input) {
|
|
|
const lines = [];
|
|
|
let tempString = input;
|
|
|
while (tempString.contains("\n")) {
|
|
|
const lineEndIndex = tempString.indexOf("\n");
|
|
|
lines.push(tempString.slice(0, lineEndIndex));
|
|
|
tempString = tempString.slice(lineEndIndex + 1);
|
|
|
}
|
|
|
lines.push(tempString);
|
|
|
return lines;
|
|
|
}
|
|
|
async function waitForInsert(MemoContent, isList2) {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const removeEnter = MemoContent.replace(/\n/g, "<br>");
|
|
|
const date = require$$0.moment();
|
|
|
const timeHour = date.format("HH");
|
|
|
const timeMinute = date.format("mm");
|
|
|
let newEvent;
|
|
|
let lineNum;
|
|
|
const timeText = String(timeHour) + `:` + String(timeMinute);
|
|
|
if (isList2 && DefaultMemoComposition === "") {
|
|
|
newEvent = `- [ ] ` + String(timeHour) + `:` + String(timeMinute) + ` ` + removeEnter;
|
|
|
} else if (!isList2 && DefaultMemoComposition === "") {
|
|
|
newEvent = `- ` + String(timeHour) + `:` + String(timeMinute) + ` ` + removeEnter;
|
|
|
}
|
|
|
if (isList2 && DefaultMemoComposition != "") {
|
|
|
newEvent = `- [ ] ` + DefaultMemoComposition.replace(/{TIME}/g, timeText).replace(/{CONTENT}/g, removeEnter);
|
|
|
} else if (!isList2 && DefaultMemoComposition != "") {
|
|
|
newEvent = `- ` + DefaultMemoComposition.replace(/{TIME}/g, timeText).replace(/{CONTENT}/g, removeEnter);
|
|
|
}
|
|
|
const dailyNotes = await getAllDailyNotes_1();
|
|
|
const existingFile = getDailyNote_1(date, dailyNotes);
|
|
|
if (!existingFile) {
|
|
|
const file = await createDailyNote_1(date);
|
|
|
await dailyNotesService.getMyAllDailyNotes();
|
|
|
const fileContents = await vault.read(file);
|
|
|
const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents);
|
|
|
await vault.modify(file, newFileContent.content);
|
|
|
if (newFileContent.posNum === -1) {
|
|
|
const allLines = getAllLinesFromFile$4(newFileContent.content);
|
|
|
lineNum = allLines.length + 1;
|
|
|
} else {
|
|
|
lineNum = newFileContent.posNum + 1;
|
|
|
}
|
|
|
if (isList2) {
|
|
|
return {
|
|
|
id: date.format("YYYYMMDDHHmm") + "00" + lineNum,
|
|
|
content: MemoContent,
|
|
|
deletedAt: "",
|
|
|
createdAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
updatedAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
memoType: "TASK-TODO"
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
id: date.format("YYYYMMDDHHmm") + "00" + lineNum,
|
|
|
content: MemoContent,
|
|
|
deletedAt: "",
|
|
|
createdAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
updatedAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
memoType: "JOURNAL"
|
|
|
};
|
|
|
}
|
|
|
} else {
|
|
|
const fileContents = await vault.read(existingFile);
|
|
|
const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents);
|
|
|
await vault.modify(existingFile, newFileContent.content);
|
|
|
if (newFileContent.posNum === -1) {
|
|
|
const allLines = getAllLinesFromFile$4(newFileContent.content);
|
|
|
lineNum = allLines.length + 1;
|
|
|
} else {
|
|
|
lineNum = newFileContent.posNum + 1;
|
|
|
}
|
|
|
if (isList2) {
|
|
|
return {
|
|
|
id: date.format("YYYYMMDDHHmm") + "00" + lineNum,
|
|
|
content: MemoContent,
|
|
|
deletedAt: "",
|
|
|
createdAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
updatedAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
memoType: "TODO-Blank"
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
id: date.format("YYYYMMDDHHmm") + "00" + lineNum,
|
|
|
content: MemoContent,
|
|
|
deletedAt: "",
|
|
|
createdAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
updatedAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
memoType: "JOURNAL"
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async function insertAfterHandler(targetString, formatted, fileContent) {
|
|
|
const targetRegex = new RegExp(`s*${await escapeRegExp(targetString)}s*`);
|
|
|
const fileContentLines = getLinesInString(fileContent);
|
|
|
const targetPosition = fileContentLines.findIndex((line) => targetRegex.test(line));
|
|
|
const targetNotFound = targetPosition === -1;
|
|
|
if (targetNotFound) {
|
|
|
console.log("unable to find insert after line in file.");
|
|
|
}
|
|
|
const nextHeaderPositionAfterTargetPosition = fileContentLines.slice(targetPosition + 1).findIndex((line) => /^#+ |---/.test(line));
|
|
|
const foundNextHeader = nextHeaderPositionAfterTargetPosition !== -1;
|
|
|
if (foundNextHeader) {
|
|
|
let endOfSectionIndex;
|
|
|
for (let i = nextHeaderPositionAfterTargetPosition + targetPosition; i > targetPosition; i--) {
|
|
|
const lineIsNewline = /^[\s\n ]*$/.test(fileContentLines[i]);
|
|
|
if (!lineIsNewline) {
|
|
|
endOfSectionIndex = i;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (!endOfSectionIndex)
|
|
|
endOfSectionIndex = targetPosition;
|
|
|
return await insertTextAfterPositionInBody(formatted, fileContent, endOfSectionIndex, foundNextHeader);
|
|
|
} else {
|
|
|
return await insertTextAfterPositionInBody(formatted, fileContent, fileContentLines.length - 1, foundNextHeader);
|
|
|
}
|
|
|
}
|
|
|
async function insertTextAfterPositionInBody(text, body, pos, found) {
|
|
|
if (pos === -1) {
|
|
|
return {
|
|
|
content: `${body}
|
|
|
${text}`,
|
|
|
posNum: -1
|
|
|
};
|
|
|
}
|
|
|
const splitContent = body.split("\n");
|
|
|
if (found) {
|
|
|
const pre = splitContent.slice(0, pos + 1).join("\n");
|
|
|
const post = splitContent.slice(pos + 1).join("\n");
|
|
|
return {
|
|
|
content: `${pre}
|
|
|
${text}
|
|
|
${post}`,
|
|
|
posNum: pos
|
|
|
};
|
|
|
} else {
|
|
|
const pre = splitContent.slice(0, pos + 1).join("\n");
|
|
|
const post = splitContent.slice(pos + 1).join("\n");
|
|
|
if (/[\s\S]*?/g.test(post)) {
|
|
|
return {
|
|
|
content: `${pre}
|
|
|
${text}`,
|
|
|
posNum: pos
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
content: `${pre}${text}
|
|
|
${post}`,
|
|
|
posNum: pos
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const getAllLinesFromFile$4 = (cache) => cache.split(/\r?\n/);
|
|
|
async function restoreDeletedMemo(deletedMemoid) {
|
|
|
const { vault, metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
if (/\d{14,}/.test(deletedMemoid)) {
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/delete.md";
|
|
|
const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (deleteFile instanceof require$$0.TFile) {
|
|
|
let fileContents = await vault.read(deleteFile);
|
|
|
let fileLines = getAllLinesFromFile$3(fileContents);
|
|
|
if (fileLines.length === 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
const lineNum = parseInt(deletedMemoid.slice(14));
|
|
|
const line = fileLines[lineNum - 1];
|
|
|
const newDeletefileContents = fileContents.replace(line, "");
|
|
|
await vault.modify(deleteFile, newDeletefileContents);
|
|
|
if (/^- (.+)$/.test(line)) {
|
|
|
const id2 = extractIDfromText(line);
|
|
|
const date = require$$0.moment(id2, "YYYYMMDDHHmmss");
|
|
|
const timeHour = date.format("HH");
|
|
|
const timeMinute = date.format("mm");
|
|
|
const newEvent = `- ` + String(timeHour) + `:` + String(timeMinute) + ` ` + extractContentfromText$1(line);
|
|
|
const dailyNotes = await getAllDailyNotes_1();
|
|
|
const existingFile = getDailyNote_1(date, dailyNotes);
|
|
|
if (!existingFile) {
|
|
|
const file = await createDailyNote_1(date);
|
|
|
const fileContents2 = await vault.read(file);
|
|
|
const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents2);
|
|
|
await vault.modify(file, newFileContent.content);
|
|
|
return [
|
|
|
{
|
|
|
deletedAt: ""
|
|
|
}
|
|
|
];
|
|
|
} else {
|
|
|
const fileContents2 = await vault.read(existingFile);
|
|
|
const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents2);
|
|
|
await vault.modify(existingFile, newFileContent.content);
|
|
|
return [
|
|
|
{
|
|
|
deletedAt: ""
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async function deleteForever(deletedMemoid) {
|
|
|
const { vault, metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
if (/\d{14,}/.test(deletedMemoid)) {
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/delete.md";
|
|
|
const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (deleteFile instanceof require$$0.TFile) {
|
|
|
let fileContents = await vault.read(deleteFile);
|
|
|
let fileLines = getAllLinesFromFile$3(fileContents);
|
|
|
if (fileLines.length === 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
const lineNum = parseInt(deletedMemoid.slice(14));
|
|
|
const line = fileLines[lineNum - 1];
|
|
|
if (/^- (.+)$/.test(line)) {
|
|
|
const newFileContent = fileContents.replace(line, "");
|
|
|
await vault.modify(deleteFile, newFileContent);
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async function getDeletedMemos() {
|
|
|
const { vault, metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/delete.md";
|
|
|
const deletedMemos = [];
|
|
|
const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (deleteFile instanceof require$$0.TFile) {
|
|
|
let fileContents = await vault.read(deleteFile);
|
|
|
let fileLines = getAllLinesFromFile$3(fileContents);
|
|
|
if (fileLines.length === 0) {
|
|
|
return deletedMemos;
|
|
|
} else {
|
|
|
for (let i = 0; i < fileLines.length; i++) {
|
|
|
const line = fileLines[i];
|
|
|
if (!/- /.test(line)) {
|
|
|
continue;
|
|
|
} else {
|
|
|
const id2 = extractIDfromText(line);
|
|
|
const timeString = id2.slice(0, 13);
|
|
|
const createdDate = require$$0.moment(timeString, "YYYYMMDDHHmmss");
|
|
|
const deletedDateID = extractDeleteDatefromText(fileLines[i]);
|
|
|
const deletedDate = require$$0.moment(deletedDateID.slice(0, 13), "YYYYMMDDHHmmss");
|
|
|
const content = extractContentfromText$1(fileLines[i]);
|
|
|
deletedMemos.push({
|
|
|
id: deletedDateID,
|
|
|
content,
|
|
|
user_id: 1,
|
|
|
createdAt: createdDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
updatedAt: createdDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
deletedAt: deletedDate
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
return deletedMemos;
|
|
|
}
|
|
|
const sendMemoToDelete = async (memoContent) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/delete.md";
|
|
|
const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (deleteFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(deleteFile);
|
|
|
const fileLines = getAllLinesFromFile$3(fileContents);
|
|
|
const date = require$$0.moment();
|
|
|
const deleteDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
let lineNum;
|
|
|
if (fileLines.length === 1 && fileLines[0] === "") {
|
|
|
lineNum = 1;
|
|
|
} else {
|
|
|
lineNum = fileLines.length + 1;
|
|
|
}
|
|
|
const deleteDateID = date.format("YYYYMMDDHHmmss") + lineNum;
|
|
|
await createDeleteMemoInFile(deleteFile, fileContents, memoContent, deleteDateID);
|
|
|
return deleteDate;
|
|
|
} else {
|
|
|
const deleteFilePath = require$$0.normalizePath(absolutePath);
|
|
|
const file = await createdeleteFile(deleteFilePath);
|
|
|
const date = require$$0.moment();
|
|
|
const deleteDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
const lineNum = 1;
|
|
|
const deleteDateID = date.format("YYYYMMDDHHmmss") + lineNum;
|
|
|
await createDeleteMemoInFile(file, "", memoContent, deleteDateID);
|
|
|
return deleteDate;
|
|
|
}
|
|
|
};
|
|
|
const createDeleteMemoInFile = async (file, fileContent, memoContent, deleteDate) => {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
let newContent;
|
|
|
if (fileContent === "") {
|
|
|
newContent = memoContent + " deletedAt: " + deleteDate;
|
|
|
} else {
|
|
|
newContent = fileContent + "\n" + memoContent + " deletedAt: " + deleteDate;
|
|
|
}
|
|
|
await vault.modify(file, newContent);
|
|
|
return true;
|
|
|
};
|
|
|
const createdeleteFile = async (path) => {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
try {
|
|
|
const createdFile = await vault.create(path, "");
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${path}'`, err);
|
|
|
new require$$0.Notice("Unable to create new file.");
|
|
|
}
|
|
|
};
|
|
|
const getAllLinesFromFile$3 = (cache) => cache.split(/\r?\n/);
|
|
|
const extractIDfromText = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^- (\d{14})(\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const extractContentfromText$1 = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^- (\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[2];
|
|
|
};
|
|
|
const extractDeleteDatefromText = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^- (\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[4];
|
|
|
};
|
|
|
async function obHideMemo(memoid) {
|
|
|
const { dailyNotes } = dailyNotesService.getState();
|
|
|
if (/\d{14,}/.test(memoid)) {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const timeString = memoid.slice(0, 13);
|
|
|
const idString = parseInt(memoid.slice(14));
|
|
|
const changeDate = require$$0.moment(timeString, "YYYYMMDDHHmmSS");
|
|
|
const dailyNote = getDailyNote_1(changeDate, dailyNotes);
|
|
|
const fileContent = await vault.read(dailyNote);
|
|
|
const fileLines = getAllLinesFromFile$2(fileContent);
|
|
|
const content = extractContentfromText(fileLines[idString]);
|
|
|
const originalLine = "- " + memoid + " " + content;
|
|
|
const newLine = fileLines[idString];
|
|
|
const newFileContent = fileContent.replace(newLine, "");
|
|
|
await vault.modify(dailyNote, newFileContent);
|
|
|
const deleteDate = await sendMemoToDelete(originalLine);
|
|
|
return deleteDate;
|
|
|
}
|
|
|
}
|
|
|
const getAllLinesFromFile$2 = (cache) => cache.split(/\r?\n/);
|
|
|
const extractContentfromText = (line) => {
|
|
|
var _a;
|
|
|
let regexMatch;
|
|
|
if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) {
|
|
|
regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\<time\\>)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$");
|
|
|
} else {
|
|
|
regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\<time\\>)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?\\s?(.*)$";
|
|
|
}
|
|
|
const regexMatchRe = new RegExp(regexMatch, "");
|
|
|
return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[8];
|
|
|
};
|
|
|
async function deleteQueryForever(queryID) {
|
|
|
const { vault, metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
if (/\d{14,}/.test(queryID)) {
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
let fileContents = await vault.read(queryFile);
|
|
|
let fileLines = getAllLinesFromFile$1(fileContents);
|
|
|
if (fileLines.length === 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
const lineNum = parseInt(queryID.slice(14));
|
|
|
const line = fileLines[lineNum - 1];
|
|
|
if (/^\d{14,}(.+)$/.test(line)) {
|
|
|
const newFileContent = fileContents.replace(line, "");
|
|
|
await vault.modify(queryFile, newFileContent);
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const getAllLinesFromFile$1 = (cache) => cache.split(/\r?\n/);
|
|
|
const pinQueryInFile = async (queryID) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
if (/\d{14,}/.test(queryID)) {
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile(fileContents);
|
|
|
const date = require$$0.moment();
|
|
|
const originalLineNum = parseInt(queryID.slice(14));
|
|
|
const originalContent = fileLines[originalLineNum - 1];
|
|
|
const pinnedAtDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
let lineNum;
|
|
|
if (fileLines.length === 1 && fileLines[0] === "") {
|
|
|
lineNum = 1;
|
|
|
} else {
|
|
|
lineNum = fileLines.length + 1;
|
|
|
}
|
|
|
const pinnedAtDateID = date.format("YYYYMMDDHHmmss") + lineNum;
|
|
|
const newQuery = originalContent + " pinnedAt: " + pinnedAtDateID;
|
|
|
const newContent = fileContents.replace(originalContent, newQuery);
|
|
|
await vault.modify(queryFile, newContent);
|
|
|
return pinnedAtDate;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const unpinQueryInFile = async (queryID) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile(fileContents);
|
|
|
const originalLineNum = parseInt(queryID.slice(14));
|
|
|
const originalContent = fileLines[originalLineNum - 1];
|
|
|
const pinnedAtString = extractPinnedAtfromText(originalContent);
|
|
|
const newFileContents = fileContents.replace(pinnedAtString, "");
|
|
|
await vault.modify(queryFile, newFileContents);
|
|
|
}
|
|
|
return;
|
|
|
};
|
|
|
const getAllLinesFromFile = (cache) => cache.split(/\r?\n/);
|
|
|
const extractPinnedAtfromText = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])(\spinnedAt\: (\d{14,}))$/.exec(line)) == null ? void 0 : _a[6];
|
|
|
};
|
|
|
var api;
|
|
|
(function(api2) {
|
|
|
function getUserInfo() {
|
|
|
}
|
|
|
api2.getUserInfo = getUserInfo;
|
|
|
function checkUsernameUsable(username) {
|
|
|
}
|
|
|
api2.checkUsernameUsable = checkUsernameUsable;
|
|
|
function checkPasswordValid(password) {
|
|
|
}
|
|
|
api2.checkPasswordValid = checkPasswordValid;
|
|
|
function updateUserinfo(userinfo) {
|
|
|
}
|
|
|
api2.updateUserinfo = updateUserinfo;
|
|
|
async function getMyMemos() {
|
|
|
return await getMemos();
|
|
|
}
|
|
|
api2.getMyMemos = getMyMemos;
|
|
|
function getMyDeletedMemos() {
|
|
|
return getDeletedMemos();
|
|
|
}
|
|
|
api2.getMyDeletedMemos = getMyDeletedMemos;
|
|
|
function hideMemo(memoId) {
|
|
|
return obHideMemo(memoId);
|
|
|
}
|
|
|
api2.hideMemo = hideMemo;
|
|
|
function restoreMemo(memoId) {
|
|
|
return restoreDeletedMemo(memoId);
|
|
|
}
|
|
|
api2.restoreMemo = restoreMemo;
|
|
|
function deleteMemo(memoId) {
|
|
|
return deleteForever(memoId);
|
|
|
}
|
|
|
api2.deleteMemo = deleteMemo;
|
|
|
function getMyQueries() {
|
|
|
return findQuery();
|
|
|
}
|
|
|
api2.getMyQueries = getMyQueries;
|
|
|
function createQuery(title, querystring) {
|
|
|
return createObsidianQuery(title, querystring);
|
|
|
}
|
|
|
api2.createQuery = createQuery;
|
|
|
function updateQuery(queryId, title, querystring) {
|
|
|
return updateObsidianQuery(queryId, title, querystring);
|
|
|
}
|
|
|
api2.updateQuery = updateQuery;
|
|
|
function deleteQueryById(queryId) {
|
|
|
return deleteQueryForever(queryId);
|
|
|
}
|
|
|
api2.deleteQueryById = deleteQueryById;
|
|
|
function pinQuery(queryId) {
|
|
|
return pinQueryInFile(queryId);
|
|
|
}
|
|
|
api2.pinQuery = pinQuery;
|
|
|
function unpinQuery(queryId) {
|
|
|
return unpinQueryInFile(queryId);
|
|
|
}
|
|
|
api2.unpinQuery = unpinQuery;
|
|
|
})(api || (api = {}));
|
|
|
var api$1 = api;
|
|
|
const SHOW_SIDERBAR_MOBILE_CLASSNAME = "mobile-show-sidebar";
|
|
|
const ANIMATION_DURATION = 200;
|
|
|
const DAILY_TIMESTAMP = 3600 * 24 * 1e3;
|
|
|
const TAG_REG = /\s#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu;
|
|
|
const FIRST_TAG_REG = /(<p>|<br>)#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu;
|
|
|
const NOP_FIRST_TAG_REG = /^#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu;
|
|
|
const LINK_REG = /(\s|:|>|^)((http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-]))/g;
|
|
|
const MD_LINK_REG = /\[([\s\S]*?)\]\(([\s\S]*?)\)/gu;
|
|
|
const IMAGE_URL_REG = /([^\s<\\*>']+\.(jpeg|jpg|gif|png|svg))(\]\])?(\))?/g;
|
|
|
const MARKDOWN_URL_REG = /(!\[([^\]]*)(\|)?(.*?)\]\((.*?)("(?:.*[^"])")?\s*\))/g;
|
|
|
const MARKDOWN_WEB_URL_REG = /(\s|:|^)(http[s]?:\/\/)([^\/\s]+\/)(\S*?)(jpeg|jpg|gif|png|svg|bmp|wepg)(?!\))/g;
|
|
|
const WIKI_IMAGE_URL_REG = /!\[\[((.*?)\.(jpeg|jpg|gif|png|svg|bmp|wepg))?(\|)?(.*?)\]\]/g;
|
|
|
const MEMO_LINK_REG = /\[@(.+?)\]\((.+?)\)/g;
|
|
|
class MemoService {
|
|
|
constructor() {
|
|
|
__publicField(this, "initialized", false);
|
|
|
}
|
|
|
getState() {
|
|
|
return appStore.getState().memoState;
|
|
|
}
|
|
|
async fetchAllMemos() {
|
|
|
const data = await api$1.getMyMemos();
|
|
|
const memos = [];
|
|
|
for (const m2 of data) {
|
|
|
memos.push(m2);
|
|
|
}
|
|
|
appStore.dispatch({
|
|
|
type: "SET_MEMOS",
|
|
|
payload: {
|
|
|
memos
|
|
|
}
|
|
|
});
|
|
|
if (!this.initialized) {
|
|
|
this.initialized = true;
|
|
|
}
|
|
|
return memos;
|
|
|
}
|
|
|
async fetchDeletedMemos() {
|
|
|
const data = await api$1.getMyDeletedMemos();
|
|
|
data.sort((a, b) => utils$1.getTimeStampByDate(b.deletedAt) - utils$1.getTimeStampByDate(a.deletedAt));
|
|
|
return data;
|
|
|
}
|
|
|
pushMemo(memo2) {
|
|
|
appStore.dispatch({
|
|
|
type: "INSERT_MEMO",
|
|
|
payload: {
|
|
|
memo: __spreadValues({}, memo2)
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
getMemoById(id2) {
|
|
|
for (const m2 of this.getState().memos) {
|
|
|
if (m2.id === id2) {
|
|
|
return m2;
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
async hideMemoById(id2) {
|
|
|
await api$1.hideMemo(id2);
|
|
|
appStore.dispatch({
|
|
|
type: "DELETE_MEMO_BY_ID",
|
|
|
payload: {
|
|
|
id: id2
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
async restoreMemoById(id2) {
|
|
|
await api$1.restoreMemo(id2);
|
|
|
}
|
|
|
async deleteMemoById(id2) {
|
|
|
await api$1.deleteMemo(id2);
|
|
|
}
|
|
|
editMemo(memo2) {
|
|
|
appStore.dispatch({
|
|
|
type: "EDIT_MEMO",
|
|
|
payload: memo2
|
|
|
});
|
|
|
}
|
|
|
updateTagsState() {
|
|
|
var _a, _b, _c;
|
|
|
const { memos } = this.getState();
|
|
|
const tagsSet = new Set();
|
|
|
for (const m2 of memos) {
|
|
|
for (const t2 of Array.from((_a = m2.content.match(TAG_REG)) != null ? _a : [])) {
|
|
|
tagsSet.add(t2.replace(TAG_REG, "$1").trim());
|
|
|
}
|
|
|
for (const t2 of Array.from((_b = m2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) {
|
|
|
tagsSet.add(t2.replace(NOP_FIRST_TAG_REG, "$1").trim());
|
|
|
}
|
|
|
for (const t2 of Array.from((_c = m2.content.match(FIRST_TAG_REG)) != null ? _c : [])) {
|
|
|
tagsSet.add(t2.replace(FIRST_TAG_REG, "$2").trim());
|
|
|
}
|
|
|
}
|
|
|
appStore.dispatch({
|
|
|
type: "SET_TAGS",
|
|
|
payload: {
|
|
|
tags: Array.from(tagsSet)
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
clearMemos() {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_MEMOS",
|
|
|
payload: {
|
|
|
memos: []
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
async getLinkedMemos(memoId) {
|
|
|
const { memos } = this.getState();
|
|
|
return memos.filter((m2) => m2.content.includes(memoId));
|
|
|
}
|
|
|
async createMemo(text, isList2) {
|
|
|
const memo2 = await waitForInsert(text, isList2);
|
|
|
return memo2;
|
|
|
}
|
|
|
async updateMemo(memoId, originalText, text, type) {
|
|
|
const memo2 = await changeMemo(memoId, originalText, text, type);
|
|
|
return memo2;
|
|
|
}
|
|
|
}
|
|
|
const memoService = new MemoService();
|
|
|
class QueryService {
|
|
|
getState() {
|
|
|
return appStore.getState().queryState;
|
|
|
}
|
|
|
async getMyAllQueries() {
|
|
|
const data = await api$1.getMyQueries();
|
|
|
appStore.dispatch({
|
|
|
type: "SET_QUERIES",
|
|
|
payload: {
|
|
|
queries: data
|
|
|
}
|
|
|
});
|
|
|
return data;
|
|
|
}
|
|
|
getQueryById(id2) {
|
|
|
for (const q2 of this.getState().queries) {
|
|
|
if (q2.id === id2) {
|
|
|
return q2;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
pushQuery(query) {
|
|
|
appStore.dispatch({
|
|
|
type: "INSERT_QUERY",
|
|
|
payload: {
|
|
|
query: __spreadValues({}, query)
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
editQuery(query) {
|
|
|
appStore.dispatch({
|
|
|
type: "UPDATE_QUERY",
|
|
|
payload: query
|
|
|
});
|
|
|
}
|
|
|
async deleteQuery(queryId) {
|
|
|
await api$1.deleteQueryById(queryId);
|
|
|
appStore.dispatch({
|
|
|
type: "DELETE_QUERY_BY_ID",
|
|
|
payload: {
|
|
|
id: queryId
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
async createQuery(title, querystring) {
|
|
|
const data = await api$1.createQuery(title, querystring);
|
|
|
return data;
|
|
|
}
|
|
|
async updateQuery(queryId, title, querystring) {
|
|
|
const data = await api$1.updateQuery(queryId, title, querystring);
|
|
|
return data;
|
|
|
}
|
|
|
async pinQuery(queryId) {
|
|
|
await api$1.pinQuery(queryId);
|
|
|
}
|
|
|
async unpinQuery(queryId) {
|
|
|
await api$1.unpinQuery(queryId);
|
|
|
}
|
|
|
}
|
|
|
const queryService = new QueryService();
|
|
|
class ResourceService {
|
|
|
async upload(file) {
|
|
|
const { vault, fileManager } = appStore.getState().dailyNotesState.app;
|
|
|
const fileArray = await file.arrayBuffer();
|
|
|
const ext = getExt(file.type);
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
const date = require$$0.moment();
|
|
|
const existingFile = getDailyNote_1(date, dailyNotes);
|
|
|
let newFile;
|
|
|
if (!existingFile) {
|
|
|
const dailyFile = await createDailyNote_1(date);
|
|
|
newFile = await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, dailyFile), fileArray);
|
|
|
} else if (existingFile instanceof require$$0.TFile) {
|
|
|
newFile = await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, existingFile), fileArray);
|
|
|
}
|
|
|
const newFilePath = fileManager.generateMarkdownLink(newFile, newFile.path, "", "");
|
|
|
return newFilePath;
|
|
|
}
|
|
|
}
|
|
|
const getExt = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^image\/(.+)$/.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const resourceService = new ResourceService();
|
|
|
const getInitialAction = () => {
|
|
|
return {
|
|
|
type: "initialText",
|
|
|
value: "",
|
|
|
timestamp: Date.now(),
|
|
|
selectionStart: 0,
|
|
|
selectionEnd: 0
|
|
|
};
|
|
|
};
|
|
|
const defaultConfig = {
|
|
|
initialValue: "",
|
|
|
interval: 300
|
|
|
};
|
|
|
class TinyUndo {
|
|
|
constructor(element, config = defaultConfig) {
|
|
|
this.listeners = [];
|
|
|
this.runUndo = () => {
|
|
|
const cursorPosition = this.actions[this.currentIndex].selectionStart;
|
|
|
if (this.currentIndex > 0) {
|
|
|
this.currentIndex--;
|
|
|
}
|
|
|
this.element.value = this.actions[this.currentIndex].value;
|
|
|
this.element.setSelectionRange(cursorPosition, cursorPosition);
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.runRedo = () => {
|
|
|
if (this.currentIndex < this.actions.length - 1) {
|
|
|
this.currentIndex++;
|
|
|
}
|
|
|
const cursorPosition = this.actions[this.currentIndex].selectionEnd;
|
|
|
this.element.value = this.actions[this.currentIndex].value;
|
|
|
this.element.setSelectionRange(cursorPosition, cursorPosition);
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.getActions = () => {
|
|
|
return this.actions;
|
|
|
};
|
|
|
this.setState = (actions, index) => {
|
|
|
this.actions = [...actions];
|
|
|
this.currentIndex = index < this.actions.length ? index : this.actions.length - 1;
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.resetState = () => {
|
|
|
this.actions = [getInitialAction()];
|
|
|
this.currentIndex = 0;
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.destroy = () => {
|
|
|
this.rmEventListeners();
|
|
|
};
|
|
|
this.subscribe = (callback) => {
|
|
|
this.listeners.push(callback);
|
|
|
};
|
|
|
this.handleElementKeydown = (event) => {
|
|
|
const keyboardEvent = event;
|
|
|
if (keyboardEvent.key === "z" && !keyboardEvent.shiftKey && (keyboardEvent.metaKey || keyboardEvent.ctrlKey)) {
|
|
|
event.preventDefault();
|
|
|
this.runUndo();
|
|
|
} else if (keyboardEvent.key === "z" && keyboardEvent.shiftKey && (keyboardEvent.metaKey || keyboardEvent.ctrlKey) || keyboardEvent.key === "y" && (keyboardEvent.metaKey || keyboardEvent.ctrlKey)) {
|
|
|
event.preventDefault();
|
|
|
this.runRedo();
|
|
|
}
|
|
|
};
|
|
|
this.handleElementInput = (event) => {
|
|
|
const inputEvent = event;
|
|
|
const lastAction = this.actions[this.currentIndex];
|
|
|
this.pushNewAction({
|
|
|
type: inputEvent.inputType,
|
|
|
value: this.element.value,
|
|
|
timestamp: Date.now(),
|
|
|
selectionStart: this.element.selectionEnd - (this.element.value.length - lastAction.value.length),
|
|
|
selectionEnd: this.element.selectionEnd
|
|
|
});
|
|
|
};
|
|
|
this.addEventListeners = () => {
|
|
|
this.element.addEventListener("keydown", this.handleElementKeydown);
|
|
|
this.element.addEventListener("input", this.handleElementInput);
|
|
|
};
|
|
|
this.rmEventListeners = () => {
|
|
|
this.element.removeEventListener("keydown", this.handleElementKeydown);
|
|
|
this.element.removeEventListener("input", this.handleElementInput);
|
|
|
};
|
|
|
this.pushNewAction = (action) => {
|
|
|
const lastAction = this.actions[this.currentIndex];
|
|
|
if (lastAction && lastAction.type === action.type && action.timestamp - lastAction.timestamp < this.config.interval) {
|
|
|
this.actions[this.currentIndex] = Object.assign(Object.assign({}, lastAction), { value: action.value, selectionEnd: action.selectionEnd, timestamp: action.timestamp });
|
|
|
} else {
|
|
|
if (this.config.maxSize && this.currentIndex >= this.config.maxSize) {
|
|
|
this.actions.shift();
|
|
|
this.actions[0] = getInitialAction();
|
|
|
} else {
|
|
|
this.currentIndex++;
|
|
|
}
|
|
|
this.actions[this.currentIndex] = action;
|
|
|
this.actions = this.actions.slice(0, this.currentIndex + 1);
|
|
|
}
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.dispatchChange = () => {
|
|
|
for (const cb2 of this.listeners) {
|
|
|
cb2([...this.actions], this.currentIndex);
|
|
|
}
|
|
|
};
|
|
|
this.element = element;
|
|
|
this.config = Object.assign(Object.assign({}, defaultConfig), config);
|
|
|
if (this.config.initialActions && this.config.initialActions.length > 0) {
|
|
|
this.actions = this.config.initialActions;
|
|
|
if (this.config.initialIndex !== void 0 && this.config.initialIndex < this.actions.length) {
|
|
|
this.currentIndex = this.config.initialIndex;
|
|
|
} else {
|
|
|
this.currentIndex = this.actions.length - 1;
|
|
|
}
|
|
|
} else {
|
|
|
this.actions = [getInitialAction()];
|
|
|
this.currentIndex = 0;
|
|
|
if (this.config.initialValue !== "") {
|
|
|
this.actions.push({
|
|
|
type: "insertText",
|
|
|
value: this.config.initialValue,
|
|
|
timestamp: Date.now(),
|
|
|
selectionStart: 0,
|
|
|
selectionEnd: this.config.initialValue.length
|
|
|
});
|
|
|
this.currentIndex++;
|
|
|
}
|
|
|
}
|
|
|
this.element.value = this.actions[this.currentIndex].value;
|
|
|
this.addEventListeners();
|
|
|
}
|
|
|
}
|
|
|
function useRefresh() {
|
|
|
const [, setBoolean] = _react_17_0_2_react.exports.useState(false);
|
|
|
const refresh = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
setBoolean((ps) => {
|
|
|
return !ps;
|
|
|
});
|
|
|
}, []);
|
|
|
return refresh;
|
|
|
}
|
|
|
var jsxRuntime = { exports: {} };
|
|
|
var reactJsxRuntime_production_min = {};
|
|
|
/** @license React v17.0.2
|
|
|
* react-jsx-runtime.production.min.js
|
|
|
*
|
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
|
*
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
* LICENSE file in the root directory of this source tree.
|
|
|
*/
|
|
|
var f = _react_17_0_2_react.exports, g = 60103;
|
|
|
reactJsxRuntime_production_min.Fragment = 60107;
|
|
|
if (typeof Symbol === "function" && Symbol.for) {
|
|
|
var h = Symbol.for;
|
|
|
g = h("react.element");
|
|
|
reactJsxRuntime_production_min.Fragment = h("react.fragment");
|
|
|
}
|
|
|
var m = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, n = Object.prototype.hasOwnProperty, p = { key: true, ref: true, __self: true, __source: true };
|
|
|
function q(c, a, k) {
|
|
|
var b, d = {}, e = null, l2 = null;
|
|
|
k !== void 0 && (e = "" + k);
|
|
|
a.key !== void 0 && (e = "" + a.key);
|
|
|
a.ref !== void 0 && (l2 = a.ref);
|
|
|
for (b in a)
|
|
|
n.call(a, b) && !p.hasOwnProperty(b) && (d[b] = a[b]);
|
|
|
if (c && c.defaultProps)
|
|
|
for (b in a = c.defaultProps, a)
|
|
|
d[b] === void 0 && (d[b] = a[b]);
|
|
|
return { $$typeof: g, type: c, key: e, ref: l2, props: d, _owner: m.current };
|
|
|
}
|
|
|
reactJsxRuntime_production_min.jsx = q;
|
|
|
reactJsxRuntime_production_min.jsxs = q;
|
|
|
{
|
|
|
jsxRuntime.exports = reactJsxRuntime_production_min;
|
|
|
}
|
|
|
const jsx = jsxRuntime.exports.jsx;
|
|
|
const jsxs = jsxRuntime.exports.jsxs;
|
|
|
const Fragment = jsxRuntime.exports.Fragment;
|
|
|
const OnlyWhen = (props) => {
|
|
|
const {
|
|
|
children,
|
|
|
when
|
|
|
} = props;
|
|
|
return when ? /* @__PURE__ */ jsx(Fragment, {
|
|
|
children
|
|
|
}) : null;
|
|
|
};
|
|
|
const Only = OnlyWhen;
|
|
|
var editor = "";
|
|
|
var _textareaCaret_3_0_2_textareaCaret = { exports: {} };
|
|
|
(function(module2) {
|
|
|
(function() {
|
|
|
var properties = [
|
|
|
"direction",
|
|
|
"boxSizing",
|
|
|
"width",
|
|
|
"height",
|
|
|
"overflowX",
|
|
|
"overflowY",
|
|
|
"borderTopWidth",
|
|
|
"borderRightWidth",
|
|
|
"borderBottomWidth",
|
|
|
"borderLeftWidth",
|
|
|
"borderStyle",
|
|
|
"paddingTop",
|
|
|
"paddingRight",
|
|
|
"paddingBottom",
|
|
|
"paddingLeft",
|
|
|
"fontStyle",
|
|
|
"fontVariant",
|
|
|
"fontWeight",
|
|
|
"fontStretch",
|
|
|
"fontSize",
|
|
|
"fontSizeAdjust",
|
|
|
"lineHeight",
|
|
|
"fontFamily",
|
|
|
"textAlign",
|
|
|
"textTransform",
|
|
|
"textIndent",
|
|
|
"textDecoration",
|
|
|
"letterSpacing",
|
|
|
"wordSpacing",
|
|
|
"tabSize",
|
|
|
"MozTabSize"
|
|
|
];
|
|
|
var isBrowser = typeof window !== "undefined";
|
|
|
var isFirefox = isBrowser && window.mozInnerScreenX != null;
|
|
|
function getCaretCoordinates2(element, position, options) {
|
|
|
if (!isBrowser) {
|
|
|
throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");
|
|
|
}
|
|
|
var debug = options && options.debug || false;
|
|
|
if (debug) {
|
|
|
var el = document.querySelector("#input-textarea-caret-position-mirror-div");
|
|
|
if (el) {
|
|
|
el.parentNode.removeChild(el);
|
|
|
}
|
|
|
}
|
|
|
var div = document.createElement("div");
|
|
|
div.id = "input-textarea-caret-position-mirror-div";
|
|
|
document.body.appendChild(div);
|
|
|
var style = div.style;
|
|
|
var computed = window.getComputedStyle ? getComputedStyle(element) : element.currentStyle;
|
|
|
style.whiteSpace = "pre-wrap";
|
|
|
if (element.nodeName !== "INPUT")
|
|
|
style.wordWrap = "break-word";
|
|
|
style.position = "absolute";
|
|
|
if (!debug)
|
|
|
style.visibility = "hidden";
|
|
|
properties.forEach(function(prop) {
|
|
|
style[prop] = computed[prop];
|
|
|
});
|
|
|
if (isFirefox) {
|
|
|
if (element.scrollHeight > parseInt(computed.height))
|
|
|
style.overflowY = "scroll";
|
|
|
} else {
|
|
|
style.overflow = "hidden";
|
|
|
}
|
|
|
div.textContent = element.value.substring(0, position);
|
|
|
if (element.nodeName === "INPUT")
|
|
|
div.textContent = div.textContent.replace(/\s/g, "\xA0");
|
|
|
var span = document.createElement("span");
|
|
|
span.textContent = element.value.substring(position) || ".";
|
|
|
div.appendChild(span);
|
|
|
var coordinates = {
|
|
|
top: span.offsetTop + parseInt(computed["borderTopWidth"]),
|
|
|
left: span.offsetLeft + parseInt(computed["borderLeftWidth"])
|
|
|
};
|
|
|
if (debug) {
|
|
|
span.style.backgroundColor = "#aaa";
|
|
|
} else {
|
|
|
document.body.removeChild(div);
|
|
|
}
|
|
|
return coordinates;
|
|
|
}
|
|
|
{
|
|
|
module2.exports = getCaretCoordinates2;
|
|
|
}
|
|
|
})();
|
|
|
})(_textareaCaret_3_0_2_textareaCaret);
|
|
|
var getCaretCoordinates = _textareaCaret_3_0_2_textareaCaret.exports;
|
|
|
var NativeCustomEvent = commonjsGlobal.CustomEvent;
|
|
|
function useNative() {
|
|
|
try {
|
|
|
var p2 = new NativeCustomEvent("cat", { detail: { foo: "bar" } });
|
|
|
return p2.type === "cat" && p2.detail.foo === "bar";
|
|
|
} catch (e) {
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
var _customEvent_1_0_1_customEvent = useNative() ? NativeCustomEvent : typeof document !== "undefined" && typeof document.createEvent === "function" ? function CustomEvent(type, params) {
|
|
|
var e = document.createEvent("CustomEvent");
|
|
|
if (params) {
|
|
|
e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);
|
|
|
} else {
|
|
|
e.initCustomEvent(type, false, false, void 0);
|
|
|
}
|
|
|
return e;
|
|
|
} : function CustomEvent2(type, params) {
|
|
|
var e = document.createEventObject();
|
|
|
e.type = type;
|
|
|
if (params) {
|
|
|
e.bubbles = Boolean(params.bubbles);
|
|
|
e.cancelable = Boolean(params.cancelable);
|
|
|
e.detail = params.detail;
|
|
|
} else {
|
|
|
e.bubbles = false;
|
|
|
e.cancelable = false;
|
|
|
e.detail = void 0;
|
|
|
}
|
|
|
return e;
|
|
|
};
|
|
|
function _defineProperty$1(obj, key, value) {
|
|
|
if (key in obj) {
|
|
|
Object.defineProperty(obj, key, {
|
|
|
value,
|
|
|
enumerable: true,
|
|
|
configurable: true,
|
|
|
writable: true
|
|
|
});
|
|
|
} else {
|
|
|
obj[key] = value;
|
|
|
}
|
|
|
return obj;
|
|
|
}
|
|
|
function _objectSpread(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
var ownKeys2 = Object.keys(source);
|
|
|
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
|
ownKeys2 = ownKeys2.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
|
}));
|
|
|
}
|
|
|
ownKeys2.forEach(function(key) {
|
|
|
_defineProperty$1(target, key, source[key]);
|
|
|
});
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function _classCallCheck$1(instance, Constructor) {
|
|
|
if (!(instance instanceof Constructor)) {
|
|
|
throw new TypeError("Cannot call a class as a function");
|
|
|
}
|
|
|
}
|
|
|
function _defineProperties$1(target, props) {
|
|
|
for (var i = 0; i < props.length; i++) {
|
|
|
var descriptor = props[i];
|
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
|
descriptor.configurable = true;
|
|
|
if ("value" in descriptor)
|
|
|
descriptor.writable = true;
|
|
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
|
}
|
|
|
}
|
|
|
function _createClass$1(Constructor, protoProps, staticProps) {
|
|
|
if (protoProps)
|
|
|
_defineProperties$1(Constructor.prototype, protoProps);
|
|
|
if (staticProps)
|
|
|
_defineProperties$1(Constructor, staticProps);
|
|
|
return Constructor;
|
|
|
}
|
|
|
function _typeof2(obj) {
|
|
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
|
_typeof2 = function _typeof22(obj2) {
|
|
|
return typeof obj2;
|
|
|
};
|
|
|
} else {
|
|
|
_typeof2 = function _typeof22(obj2) {
|
|
|
return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
|
|
|
};
|
|
|
}
|
|
|
return _typeof2(obj);
|
|
|
}
|
|
|
function _typeof$1(obj) {
|
|
|
if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
|
|
|
_typeof$1 = function _typeof3(obj2) {
|
|
|
return _typeof2(obj2);
|
|
|
};
|
|
|
} else {
|
|
|
_typeof$1 = function _typeof3(obj2) {
|
|
|
return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : _typeof2(obj2);
|
|
|
};
|
|
|
}
|
|
|
return _typeof$1(obj);
|
|
|
}
|
|
|
function _assertThisInitialized$1(self2) {
|
|
|
if (self2 === void 0) {
|
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
|
}
|
|
|
return self2;
|
|
|
}
|
|
|
function _possibleConstructorReturn$1(self2, call) {
|
|
|
if (call && (_typeof$1(call) === "object" || typeof call === "function")) {
|
|
|
return call;
|
|
|
}
|
|
|
return _assertThisInitialized$1(self2);
|
|
|
}
|
|
|
function _getPrototypeOf$1(o) {
|
|
|
_getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) {
|
|
|
return o2.__proto__ || Object.getPrototypeOf(o2);
|
|
|
};
|
|
|
return _getPrototypeOf$1(o);
|
|
|
}
|
|
|
function _setPrototypeOf$1(o, p2) {
|
|
|
_setPrototypeOf$1 = Object.setPrototypeOf || function _setPrototypeOf2(o2, p3) {
|
|
|
o2.__proto__ = p3;
|
|
|
return o2;
|
|
|
};
|
|
|
return _setPrototypeOf$1(o, p2);
|
|
|
}
|
|
|
function _inherits$1(subClass, superClass) {
|
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
|
throw new TypeError("Super expression must either be null or a function");
|
|
|
}
|
|
|
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
|
constructor: {
|
|
|
value: subClass,
|
|
|
writable: true,
|
|
|
configurable: true
|
|
|
}
|
|
|
});
|
|
|
if (superClass)
|
|
|
_setPrototypeOf$1(subClass, superClass);
|
|
|
}
|
|
|
function _arrayWithoutHoles(arr) {
|
|
|
if (Array.isArray(arr)) {
|
|
|
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
|
|
|
arr2[i] = arr[i];
|
|
|
}
|
|
|
return arr2;
|
|
|
}
|
|
|
}
|
|
|
function _iterableToArray(iter) {
|
|
|
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]")
|
|
|
return Array.from(iter);
|
|
|
}
|
|
|
function _nonIterableSpread() {
|
|
|
throw new TypeError("Invalid attempt to spread non-iterable instance");
|
|
|
}
|
|
|
function _toConsumableArray(arr) {
|
|
|
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
|
|
|
}
|
|
|
var KEY_CODES = {
|
|
|
ESC: 27,
|
|
|
UP: 38,
|
|
|
DOWN: 40,
|
|
|
LEFT: 37,
|
|
|
RIGHT: 39,
|
|
|
ENTER: 13,
|
|
|
TAB: 9
|
|
|
};
|
|
|
var Listener = function Listener2() {
|
|
|
var _this = this;
|
|
|
_classCallCheck$1(this, Listener2);
|
|
|
this.startListen = function(ref) {
|
|
|
if (!ref)
|
|
|
return;
|
|
|
ref.addEventListener("keydown", _this.f);
|
|
|
};
|
|
|
this.stopListen = function(ref) {
|
|
|
if (!ref)
|
|
|
return;
|
|
|
ref.removeEventListener("keydown", _this.f);
|
|
|
};
|
|
|
this.add = function(keyCodes, fn2) {
|
|
|
var keyCode = keyCodes;
|
|
|
if (typeof keyCode !== "object")
|
|
|
keyCode = [keyCode];
|
|
|
_this.listeners[_this.index] = {
|
|
|
keyCode,
|
|
|
fn: fn2
|
|
|
};
|
|
|
return _this.index++;
|
|
|
};
|
|
|
this.remove = function(id2) {
|
|
|
delete _this.listeners[id2];
|
|
|
};
|
|
|
this.removeAll = function() {
|
|
|
_this.listeners = {};
|
|
|
_this.index = 1;
|
|
|
};
|
|
|
this.index = 1;
|
|
|
this.listeners = {};
|
|
|
this.f = function(e) {
|
|
|
if (!e)
|
|
|
return;
|
|
|
var code = e.keyCode || e.which;
|
|
|
Object.values(_this.listeners).forEach(function(_ref) {
|
|
|
var keyCode = _ref.keyCode, fn2 = _ref.fn;
|
|
|
if (keyCode.includes(code)) {
|
|
|
e.stopPropagation();
|
|
|
e.preventDefault();
|
|
|
fn2(e);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
};
|
|
|
var Listeners = new Listener();
|
|
|
var Item = /* @__PURE__ */ function(_React$Component) {
|
|
|
_inherits$1(Item2, _React$Component);
|
|
|
function Item2() {
|
|
|
var _getPrototypeOf2;
|
|
|
var _this;
|
|
|
_classCallCheck$1(this, Item2);
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
args[_key] = arguments[_key];
|
|
|
}
|
|
|
_this = _possibleConstructorReturn$1(this, (_getPrototypeOf2 = _getPrototypeOf$1(Item2)).call.apply(_getPrototypeOf2, [this].concat(args)));
|
|
|
_this.selectItem = function() {
|
|
|
var _this$props = _this.props, item = _this$props.item, onSelectHandler = _this$props.onSelectHandler;
|
|
|
onSelectHandler(item);
|
|
|
};
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass$1(Item2, [{
|
|
|
key: "shouldComponentUpdate",
|
|
|
value: function shouldComponentUpdate(nextProps) {
|
|
|
if (this.props.item !== nextProps.item || this.props.selected !== nextProps.selected || this.props.style !== nextProps.style || this.props.className !== nextProps.className) {
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this2 = this;
|
|
|
var _this$props2 = this.props, Component = _this$props2.component, style = _this$props2.style, onClickHandler = _this$props2.onClickHandler, item = _this$props2.item, selected = _this$props2.selected, className = _this$props2.className, innerRef = _this$props2.innerRef;
|
|
|
return React$1.createElement("li", {
|
|
|
className: "rta__item ".concat(selected === true ? "rta__item--selected" : "", " ").concat(className || ""),
|
|
|
style
|
|
|
}, React$1.createElement("div", {
|
|
|
className: "rta__entity ".concat(selected === true ? "rta__entity--selected" : ""),
|
|
|
role: "button",
|
|
|
tabIndex: 0,
|
|
|
onClick: onClickHandler,
|
|
|
onFocus: this.selectItem,
|
|
|
onMouseEnter: this.selectItem,
|
|
|
onTouchStart: function onTouchStart() {
|
|
|
_this2.clicked = true;
|
|
|
_this2.selectItem();
|
|
|
},
|
|
|
onTouchEnd: function onTouchEnd(e) {
|
|
|
e.preventDefault();
|
|
|
if (_this2.clicked) {
|
|
|
onClickHandler(e);
|
|
|
}
|
|
|
},
|
|
|
onTouchMove: function onTouchMove() {
|
|
|
_this2.clicked = false;
|
|
|
},
|
|
|
onTouchCancel: function onTouchCancel() {
|
|
|
_this2.clicked = false;
|
|
|
},
|
|
|
ref: innerRef
|
|
|
}, React$1.createElement(Component, {
|
|
|
selected,
|
|
|
entity: item
|
|
|
})));
|
|
|
}
|
|
|
}]);
|
|
|
return Item2;
|
|
|
}(React$1.Component);
|
|
|
var List = /* @__PURE__ */ function(_React$Component) {
|
|
|
_inherits$1(List2, _React$Component);
|
|
|
function List2() {
|
|
|
var _getPrototypeOf2;
|
|
|
var _this;
|
|
|
_classCallCheck$1(this, List2);
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
args[_key] = arguments[_key];
|
|
|
}
|
|
|
_this = _possibleConstructorReturn$1(this, (_getPrototypeOf2 = _getPrototypeOf$1(List2)).call.apply(_getPrototypeOf2, [this].concat(args)));
|
|
|
_this.state = {
|
|
|
selectedItem: null
|
|
|
};
|
|
|
_this.cachedIdOfItems = new Map();
|
|
|
_this.onPressEnter = function(e) {
|
|
|
if (typeof e !== "undefined") {
|
|
|
e.preventDefault();
|
|
|
}
|
|
|
var values = _this.props.values;
|
|
|
_this.modifyText(values[_this.getPositionInList()]);
|
|
|
};
|
|
|
_this.getPositionInList = function() {
|
|
|
var values = _this.props.values;
|
|
|
var selectedItem = _this.state.selectedItem;
|
|
|
if (!selectedItem)
|
|
|
return 0;
|
|
|
return values.findIndex(function(a) {
|
|
|
return _this.getId(a) === _this.getId(selectedItem);
|
|
|
});
|
|
|
};
|
|
|
_this.getId = function(item) {
|
|
|
if (_this.cachedIdOfItems.has(item)) {
|
|
|
return _this.cachedIdOfItems.get(item);
|
|
|
}
|
|
|
var textToReplace = _this.props.getTextToReplace(item);
|
|
|
var computeId = function computeId2() {
|
|
|
if (textToReplace) {
|
|
|
if (textToReplace.key) {
|
|
|
return textToReplace.key;
|
|
|
}
|
|
|
if (typeof item === "string" || !item.key) {
|
|
|
return textToReplace.text;
|
|
|
}
|
|
|
}
|
|
|
if (!item.key) {
|
|
|
throw new Error("Item ".concat(JSON.stringify(item), ' has to have defined "key" property'));
|
|
|
}
|
|
|
return item.key;
|
|
|
};
|
|
|
var id2 = computeId();
|
|
|
_this.cachedIdOfItems.set(item, id2);
|
|
|
return id2;
|
|
|
};
|
|
|
_this.listeners = [];
|
|
|
_this.itemsRef = {};
|
|
|
_this.modifyText = function(value) {
|
|
|
if (!value)
|
|
|
return;
|
|
|
var onSelect = _this.props.onSelect;
|
|
|
onSelect(value);
|
|
|
};
|
|
|
_this.selectItem = function(item) {
|
|
|
var keyboard = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
|
|
|
var onItemHighlighted = _this.props.onItemHighlighted;
|
|
|
if (_this.state.selectedItem === item)
|
|
|
return;
|
|
|
_this.setState({
|
|
|
selectedItem: item
|
|
|
}, function() {
|
|
|
onItemHighlighted(item);
|
|
|
if (keyboard) {
|
|
|
_this.props.dropdownScroll(_this.itemsRef[_this.getId(item)]);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
_this.scroll = function(e) {
|
|
|
e.preventDefault();
|
|
|
var values = _this.props.values;
|
|
|
var code = e.keyCode || e.which;
|
|
|
var oldPosition = _this.getPositionInList();
|
|
|
var newPosition;
|
|
|
switch (code) {
|
|
|
case KEY_CODES.DOWN:
|
|
|
newPosition = oldPosition + 1;
|
|
|
break;
|
|
|
case KEY_CODES.UP:
|
|
|
newPosition = oldPosition - 1;
|
|
|
break;
|
|
|
default:
|
|
|
newPosition = oldPosition;
|
|
|
break;
|
|
|
}
|
|
|
newPosition = (newPosition % values.length + values.length) % values.length;
|
|
|
_this.selectItem(values[newPosition], [KEY_CODES.DOWN, KEY_CODES.UP].includes(code));
|
|
|
};
|
|
|
_this.isSelected = function(item) {
|
|
|
var selectedItem = _this.state.selectedItem;
|
|
|
if (!selectedItem)
|
|
|
return false;
|
|
|
return _this.getId(selectedItem) === _this.getId(item);
|
|
|
};
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass$1(List2, [{
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
this.listeners.push(Listeners.add([KEY_CODES.DOWN, KEY_CODES.UP], this.scroll), Listeners.add([KEY_CODES.ENTER, KEY_CODES.TAB], this.onPressEnter));
|
|
|
var values = this.props.values;
|
|
|
if (values && values[0])
|
|
|
this.selectItem(values[0]);
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidUpdate",
|
|
|
value: function componentDidUpdate(_ref) {
|
|
|
var _this2 = this;
|
|
|
var oldValues = _ref.values;
|
|
|
var values = this.props.values;
|
|
|
var oldValuesSerialized = oldValues.map(function(val) {
|
|
|
return _this2.getId(val);
|
|
|
}).join("");
|
|
|
var newValuesSerialized = values.map(function(val) {
|
|
|
return _this2.getId(val);
|
|
|
}).join("");
|
|
|
if (oldValuesSerialized !== newValuesSerialized && values && values[0]) {
|
|
|
this.selectItem(values[0]);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentWillUnmount",
|
|
|
value: function componentWillUnmount() {
|
|
|
var listener;
|
|
|
while (this.listeners.length) {
|
|
|
listener = this.listeners.pop();
|
|
|
Listeners.remove(listener);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this3 = this;
|
|
|
var _this$props = this.props, values = _this$props.values, component = _this$props.component, style = _this$props.style, itemClassName = _this$props.itemClassName, className = _this$props.className, itemStyle = _this$props.itemStyle;
|
|
|
return React$1.createElement("ul", {
|
|
|
className: "rta__list ".concat(className || ""),
|
|
|
style
|
|
|
}, values.map(function(item) {
|
|
|
return React$1.createElement(Item, {
|
|
|
key: _this3.getId(item),
|
|
|
innerRef: function innerRef(ref) {
|
|
|
_this3.itemsRef[_this3.getId(item)] = ref;
|
|
|
},
|
|
|
selected: _this3.isSelected(item),
|
|
|
item,
|
|
|
className: itemClassName,
|
|
|
style: itemStyle,
|
|
|
onClickHandler: _this3.onPressEnter,
|
|
|
onSelectHandler: _this3.selectItem,
|
|
|
component
|
|
|
});
|
|
|
}));
|
|
|
}
|
|
|
}]);
|
|
|
return List2;
|
|
|
}(React$1.Component);
|
|
|
function defaultScrollToItem(container, item) {
|
|
|
var itemHeight = parseInt(getComputedStyle(item).getPropertyValue("height"), 10);
|
|
|
var containerHight = parseInt(getComputedStyle(container).getPropertyValue("height"), 10) - itemHeight;
|
|
|
var itemOffsetTop = item.offsetTop;
|
|
|
var actualScrollTop = container.scrollTop;
|
|
|
if (itemOffsetTop < actualScrollTop + containerHight && actualScrollTop < itemOffsetTop) {
|
|
|
return;
|
|
|
}
|
|
|
container.scrollTop = itemOffsetTop;
|
|
|
}
|
|
|
var DEFAULT_CARET_POSITION = "next";
|
|
|
var POSITION_CONFIGURATION = {
|
|
|
X: {
|
|
|
LEFT: "rta__autocomplete--left",
|
|
|
RIGHT: "rta__autocomplete--right"
|
|
|
},
|
|
|
Y: {
|
|
|
TOP: "rta__autocomplete--top",
|
|
|
BOTTOM: "rta__autocomplete--bottom"
|
|
|
}
|
|
|
};
|
|
|
var errorMessage = function errorMessage2(message) {
|
|
|
return console.error("RTA: dataProvider fails: ".concat(message, "\n \nCheck the documentation or create issue if you think it's bug. https://github.com/webscopeio/react-textarea-autocomplete/issues"));
|
|
|
};
|
|
|
var reservedRegexChars = [".", "^", "$", "*", "+", "-", "?", "(", ")", "[", "]", "{", "}", "\\", "|"];
|
|
|
var escapeRegex = function escapeRegex2(text) {
|
|
|
return _toConsumableArray(text).map(function(character) {
|
|
|
return reservedRegexChars.includes(character) ? "\\".concat(character) : character;
|
|
|
}).join("");
|
|
|
};
|
|
|
var Autocomplete = /* @__PURE__ */ function(_React$Component) {
|
|
|
_inherits$1(Autocomplete2, _React$Component);
|
|
|
function Autocomplete2() {
|
|
|
_classCallCheck$1(this, Autocomplete2);
|
|
|
return _possibleConstructorReturn$1(this, _getPrototypeOf$1(Autocomplete2).apply(this, arguments));
|
|
|
}
|
|
|
_createClass$1(Autocomplete2, [{
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
var boundariesElement = this.props.boundariesElement;
|
|
|
if (typeof boundariesElement === "string") {
|
|
|
var elem = document.querySelector(boundariesElement);
|
|
|
if (!elem) {
|
|
|
throw new Error("RTA: Invalid prop boundariesElement: it has to be string or HTMLElement.");
|
|
|
}
|
|
|
this.containerElem = elem;
|
|
|
} else if (boundariesElement instanceof HTMLElement) {
|
|
|
this.containerElem = boundariesElement;
|
|
|
} else {
|
|
|
throw new Error("RTA: Invalid prop boundariesElement: it has to be string or HTMLElement.");
|
|
|
}
|
|
|
if (!this.containerElem || !this.containerElem.contains(this.ref)) {
|
|
|
{
|
|
|
throw new Error("RTA: Invalid prop boundariesElement: it has to be one of the parents of the RTA.");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidUpdate",
|
|
|
value: function componentDidUpdate() {
|
|
|
var _this$ref$classList, _this$ref$classList2;
|
|
|
var top2 = this.props.top || 0;
|
|
|
var left2 = this.props.left || 0;
|
|
|
var usedClasses = [];
|
|
|
var unusedClasses = [];
|
|
|
var topPosition = 0;
|
|
|
var leftPosition = 0;
|
|
|
var containerBounds = this.containerElem.getBoundingClientRect();
|
|
|
var dropdownBounds = this.ref.getBoundingClientRect();
|
|
|
var textareaBounds = this.props.textareaRef.getBoundingClientRect();
|
|
|
var computedStyle = window.getComputedStyle(this.ref);
|
|
|
var marginTop = parseInt(computedStyle.getPropertyValue("margin-top"), 10);
|
|
|
var marginBottom = parseInt(computedStyle.getPropertyValue("margin-bottom"), 10);
|
|
|
var marginLeft = parseInt(computedStyle.getPropertyValue("margin-left"), 10);
|
|
|
var marginRight = parseInt(computedStyle.getPropertyValue("margin-right"), 10);
|
|
|
var dropdownBottom = marginTop + marginBottom + textareaBounds.top + top2 + dropdownBounds.height;
|
|
|
var dropdownRight = marginLeft + marginRight + textareaBounds.left + left2 + dropdownBounds.width;
|
|
|
if (dropdownRight > containerBounds.right && textareaBounds.left + left2 > dropdownBounds.width) {
|
|
|
leftPosition = left2 - dropdownBounds.width;
|
|
|
usedClasses.push(POSITION_CONFIGURATION.X.LEFT);
|
|
|
unusedClasses.push(POSITION_CONFIGURATION.X.RIGHT);
|
|
|
} else {
|
|
|
leftPosition = left2;
|
|
|
usedClasses.push(POSITION_CONFIGURATION.X.RIGHT);
|
|
|
unusedClasses.push(POSITION_CONFIGURATION.X.LEFT);
|
|
|
}
|
|
|
if (dropdownBottom > containerBounds.bottom && textareaBounds.top + top2 > dropdownBounds.height) {
|
|
|
topPosition = top2 - dropdownBounds.height;
|
|
|
usedClasses.push(POSITION_CONFIGURATION.Y.TOP);
|
|
|
unusedClasses.push(POSITION_CONFIGURATION.Y.BOTTOM);
|
|
|
} else {
|
|
|
topPosition = top2;
|
|
|
usedClasses.push(POSITION_CONFIGURATION.Y.BOTTOM);
|
|
|
unusedClasses.push(POSITION_CONFIGURATION.Y.TOP);
|
|
|
}
|
|
|
if (this.props.renderToBody) {
|
|
|
topPosition += textareaBounds.top;
|
|
|
leftPosition += textareaBounds.left;
|
|
|
}
|
|
|
this.ref.style.top = "".concat(topPosition, "px");
|
|
|
this.ref.style.left = "".concat(leftPosition, "px");
|
|
|
(_this$ref$classList = this.ref.classList).remove.apply(_this$ref$classList, unusedClasses);
|
|
|
(_this$ref$classList2 = this.ref.classList).add.apply(_this$ref$classList2, usedClasses);
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this = this;
|
|
|
var _this$props = this.props, style = _this$props.style, className = _this$props.className, innerRef = _this$props.innerRef, children = _this$props.children, renderToBody = _this$props.renderToBody;
|
|
|
var body = document.body;
|
|
|
var autocompleteContainer = React$1.createElement("div", {
|
|
|
ref: function ref(_ref) {
|
|
|
_this.ref = _ref;
|
|
|
innerRef(_ref);
|
|
|
},
|
|
|
className: "rta__autocomplete ".concat(className || ""),
|
|
|
style
|
|
|
}, children);
|
|
|
return renderToBody && body !== null ? ReactDOM$1.createPortal(autocompleteContainer, body) : autocompleteContainer;
|
|
|
}
|
|
|
}]);
|
|
|
return Autocomplete2;
|
|
|
}(React$1.Component);
|
|
|
var ReactTextareaAutocomplete = /* @__PURE__ */ function(_React$Component2) {
|
|
|
_inherits$1(ReactTextareaAutocomplete2, _React$Component2);
|
|
|
function ReactTextareaAutocomplete2(_props) {
|
|
|
var _this2;
|
|
|
_classCallCheck$1(this, ReactTextareaAutocomplete2);
|
|
|
_this2 = _possibleConstructorReturn$1(this, _getPrototypeOf$1(ReactTextareaAutocomplete2).call(this, _props));
|
|
|
_this2.state = {
|
|
|
top: null,
|
|
|
left: null,
|
|
|
currentTrigger: null,
|
|
|
actualToken: "",
|
|
|
data: null,
|
|
|
value: "",
|
|
|
dataLoading: false,
|
|
|
selectionEnd: 0,
|
|
|
component: null,
|
|
|
textToReplace: null
|
|
|
};
|
|
|
_this2.escListenerInit = function() {
|
|
|
if (!_this2.escListener) {
|
|
|
_this2.escListener = Listeners.add(KEY_CODES.ESC, _this2._closeAutocomplete);
|
|
|
}
|
|
|
};
|
|
|
_this2.escListenerDestroy = function() {
|
|
|
if (_this2.escListener) {
|
|
|
Listeners.remove(_this2.escListener);
|
|
|
_this2.escListener = null;
|
|
|
}
|
|
|
};
|
|
|
_this2.getSelectionPosition = function() {
|
|
|
if (!_this2.textareaRef)
|
|
|
return null;
|
|
|
return {
|
|
|
selectionStart: _this2.textareaRef.selectionStart,
|
|
|
selectionEnd: _this2.textareaRef.selectionEnd
|
|
|
};
|
|
|
};
|
|
|
_this2.getSelectedText = function() {
|
|
|
if (!_this2.textareaRef)
|
|
|
return null;
|
|
|
var _this2$textareaRef = _this2.textareaRef, selectionStart = _this2$textareaRef.selectionStart, selectionEnd = _this2$textareaRef.selectionEnd;
|
|
|
if (selectionStart === selectionEnd)
|
|
|
return null;
|
|
|
return _this2.state.value.substr(selectionStart, selectionEnd - selectionStart);
|
|
|
};
|
|
|
_this2.setCaretPosition = function() {
|
|
|
var position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0;
|
|
|
if (!_this2.textareaRef)
|
|
|
return;
|
|
|
_this2.textareaRef.focus();
|
|
|
_this2.textareaRef.setSelectionRange(position, position);
|
|
|
};
|
|
|
_this2.getCaretPosition = function() {
|
|
|
if (!_this2.textareaRef) {
|
|
|
return 0;
|
|
|
}
|
|
|
var position = _this2.textareaRef.selectionEnd;
|
|
|
return position;
|
|
|
};
|
|
|
_this2._handleCaretChange = function(e) {
|
|
|
var cleanLastTrigger = function cleanLastTrigger2() {
|
|
|
var beforeHandle = _this2.getCaretPosition() - 1;
|
|
|
_this2.lastTrigger = _this2.lastTrigger ? beforeHandle : 0;
|
|
|
};
|
|
|
if (e.type === "keydown") {
|
|
|
var code = e.keyCode || e.which;
|
|
|
switch (code) {
|
|
|
case KEY_CODES.UP:
|
|
|
case KEY_CODES.DOWN:
|
|
|
if (!_this2._isAutocompleteOpen()) {
|
|
|
cleanLastTrigger();
|
|
|
}
|
|
|
break;
|
|
|
case KEY_CODES.LEFT:
|
|
|
case KEY_CODES.RIGHT:
|
|
|
cleanLastTrigger();
|
|
|
break;
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
cleanLastTrigger();
|
|
|
};
|
|
|
_this2._onSelect = function(item) {
|
|
|
var _this2$state = _this2.state, selectionEnd = _this2$state.selectionEnd, currentTrigger = _this2$state.currentTrigger, textareaValue = _this2$state.value;
|
|
|
var onItemSelected = _this2.props.onItemSelected;
|
|
|
if (!currentTrigger)
|
|
|
return;
|
|
|
var getTextToReplaceForCurrentTrigger = _this2._getTextToReplace(currentTrigger);
|
|
|
if (!getTextToReplaceForCurrentTrigger) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
var newToken = getTextToReplaceForCurrentTrigger(item);
|
|
|
if (!newToken) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
if (onItemSelected) {
|
|
|
onItemSelected({
|
|
|
currentTrigger,
|
|
|
item
|
|
|
});
|
|
|
}
|
|
|
var computeCaretPosition = function computeCaretPosition2(position, token, startToken) {
|
|
|
switch (position) {
|
|
|
case "start":
|
|
|
return startToken;
|
|
|
case "next":
|
|
|
case "end":
|
|
|
return startToken + token.length;
|
|
|
default:
|
|
|
if (!Number.isInteger(position)) {
|
|
|
throw new Error('RTA: caretPosition should be "start", "next", "end" or number.');
|
|
|
}
|
|
|
return position;
|
|
|
}
|
|
|
};
|
|
|
var textToModify = textareaValue.slice(0, selectionEnd);
|
|
|
var escapedCurrentTrigger = escapeRegex(currentTrigger);
|
|
|
var triggerOffset = textToModify.length - textToModify.lastIndexOf(currentTrigger);
|
|
|
var startOfTokenPosition = textToModify.search(new RegExp("(?!".concat(escapedCurrentTrigger, ")$"))) - triggerOffset;
|
|
|
var newTokenString = newToken.caretPosition === "next" ? "".concat(newToken.text, " ") : newToken.text;
|
|
|
var newCaretPosition = computeCaretPosition(newToken.caretPosition, newTokenString, startOfTokenPosition);
|
|
|
var modifiedText = textToModify.substring(0, startOfTokenPosition) + newTokenString;
|
|
|
var newValue = textareaValue.replace(textToModify, modifiedText);
|
|
|
_this2.setState({
|
|
|
value: newValue,
|
|
|
dataLoading: false
|
|
|
}, function() {
|
|
|
var insertedTrigger = _this2.tokenRegExpEnding.exec(newTokenString);
|
|
|
var insertedTriggerModifier = insertedTrigger ? insertedTrigger[0].length : 1;
|
|
|
_this2.lastTrigger = newCaretPosition ? newCaretPosition - insertedTriggerModifier : newCaretPosition;
|
|
|
_this2.textareaRef.value = newValue;
|
|
|
_this2.textareaRef.selectionEnd = newCaretPosition;
|
|
|
_this2._changeHandler();
|
|
|
var scrollTop = _this2.textareaRef.scrollTop;
|
|
|
_this2.setCaretPosition(newCaretPosition);
|
|
|
if (window.chrome) {
|
|
|
_this2.textareaRef.scrollTop = scrollTop;
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
_this2._getTextToReplace = function(currentTrigger) {
|
|
|
var triggerSettings = _this2.props.trigger[currentTrigger];
|
|
|
if (!currentTrigger || !triggerSettings)
|
|
|
return null;
|
|
|
var output = triggerSettings.output;
|
|
|
return function(item) {
|
|
|
if (typeof item === "object" && (!output || typeof output !== "function")) {
|
|
|
throw new Error('Output functor is not defined! If you are using items as object you have to define "output" function. https://github.com/webscopeio/react-textarea-autocomplete#trigger-type');
|
|
|
}
|
|
|
if (output) {
|
|
|
var textToReplace = output(item, currentTrigger);
|
|
|
if (textToReplace === void 0 || typeof textToReplace === "number") {
|
|
|
throw new Error('Output functor should return string or object in shape {text: string, caretPosition: string | number}.\nGot "'.concat(String(textToReplace), '". Check the implementation for trigger "').concat(currentTrigger, '"\n\nSee https://github.com/webscopeio/react-textarea-autocomplete#trigger-type for more information.\n'));
|
|
|
}
|
|
|
if (textToReplace === null)
|
|
|
return null;
|
|
|
if (typeof textToReplace === "string") {
|
|
|
return {
|
|
|
text: textToReplace,
|
|
|
caretPosition: DEFAULT_CARET_POSITION
|
|
|
};
|
|
|
}
|
|
|
if (!textToReplace.text && typeof textToReplace.text !== "string") {
|
|
|
throw new Error('Output "text" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger "'.concat(currentTrigger, '"\n'));
|
|
|
}
|
|
|
if (!textToReplace.caretPosition) {
|
|
|
throw new Error('Output "caretPosition" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger "'.concat(currentTrigger, '"\n'));
|
|
|
}
|
|
|
return textToReplace;
|
|
|
}
|
|
|
if (typeof item !== "string") {
|
|
|
throw new Error("Output item should be string\n");
|
|
|
}
|
|
|
return {
|
|
|
text: "".concat(currentTrigger).concat(item).concat(currentTrigger),
|
|
|
caretPosition: DEFAULT_CARET_POSITION
|
|
|
};
|
|
|
};
|
|
|
};
|
|
|
_this2._getCurrentTriggerSettings = function() {
|
|
|
var currentTrigger = _this2.state.currentTrigger;
|
|
|
if (!currentTrigger)
|
|
|
return null;
|
|
|
return _this2.props.trigger[currentTrigger];
|
|
|
};
|
|
|
_this2._getValuesFromProvider = function() {
|
|
|
var _this2$state2 = _this2.state, currentTrigger = _this2$state2.currentTrigger, actualToken2 = _this2$state2.actualToken;
|
|
|
var triggerSettings = _this2._getCurrentTriggerSettings();
|
|
|
if (!currentTrigger || !triggerSettings) {
|
|
|
return;
|
|
|
}
|
|
|
var dataProvider = triggerSettings.dataProvider, component = triggerSettings.component;
|
|
|
if (typeof dataProvider !== "function") {
|
|
|
throw new Error("Trigger provider has to be a function!");
|
|
|
}
|
|
|
_this2.setState({
|
|
|
dataLoading: true
|
|
|
});
|
|
|
var providedData = dataProvider(actualToken2);
|
|
|
if (!(providedData instanceof Promise)) {
|
|
|
providedData = Promise.resolve(providedData);
|
|
|
}
|
|
|
providedData.then(function(data) {
|
|
|
if (!Array.isArray(data)) {
|
|
|
throw new Error("Trigger provider has to provide an array!");
|
|
|
}
|
|
|
if (typeof component !== "function") {
|
|
|
throw new Error("Component should be defined!");
|
|
|
}
|
|
|
if (currentTrigger !== _this2.state.currentTrigger)
|
|
|
return;
|
|
|
if (!data.length) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
_this2.setState({
|
|
|
dataLoading: false,
|
|
|
data,
|
|
|
component
|
|
|
});
|
|
|
}).catch(function(e) {
|
|
|
return errorMessage(e.message);
|
|
|
});
|
|
|
};
|
|
|
_this2._getSuggestions = function() {
|
|
|
var _this2$state3 = _this2.state, currentTrigger = _this2$state3.currentTrigger, data = _this2$state3.data;
|
|
|
if (!currentTrigger || !data || data && !data.length)
|
|
|
return null;
|
|
|
return data;
|
|
|
};
|
|
|
_this2._createRegExp = function() {
|
|
|
var trigger = _this2.props.trigger;
|
|
|
_this2.tokenRegExp = new RegExp("(".concat(Object.keys(trigger).sort(function(a, b) {
|
|
|
if (a < b) {
|
|
|
return 1;
|
|
|
}
|
|
|
if (a > b) {
|
|
|
return -1;
|
|
|
}
|
|
|
return 0;
|
|
|
}).map(function(a) {
|
|
|
return escapeRegex(a);
|
|
|
}).join("|"), ")((?:(?!\\1)[^\\s])*$)"));
|
|
|
_this2.tokenRegExpEnding = new RegExp("(".concat(Object.keys(trigger).sort(function(a, b) {
|
|
|
if (a < b) {
|
|
|
return 1;
|
|
|
}
|
|
|
if (a > b) {
|
|
|
return -1;
|
|
|
}
|
|
|
return 0;
|
|
|
}).map(function(a) {
|
|
|
return escapeRegex(a);
|
|
|
}).join("|"), ")$"));
|
|
|
};
|
|
|
_this2._closeAutocomplete = function() {
|
|
|
var currentTrigger = _this2.state.currentTrigger;
|
|
|
_this2.escListenerDestroy();
|
|
|
_this2.setState({
|
|
|
data: null,
|
|
|
dataLoading: false,
|
|
|
currentTrigger: null
|
|
|
}, function() {
|
|
|
if (currentTrigger)
|
|
|
_this2._onItemHighlightedHandler(null);
|
|
|
});
|
|
|
};
|
|
|
_this2._cleanUpProps = function() {
|
|
|
var props = _objectSpread({}, _this2.props);
|
|
|
var notSafe = ["loadingComponent", "boundariesElement", "containerStyle", "minChar", "scrollToItem", "ref", "innerRef", "onChange", "onCaretPositionChange", "className", "value", "trigger", "listStyle", "itemStyle", "containerStyle", "loaderStyle", "className", "containerClassName", "listClassName", "itemClassName", "loaderClassName", "dropdownStyle", "dropdownClassName", "movePopupAsYouType", "textAreaComponent", "renderToBody", "onItemSelected", "onItemHighlighted"];
|
|
|
for (var prop in props) {
|
|
|
if (notSafe.includes(prop))
|
|
|
delete props[prop];
|
|
|
}
|
|
|
return props;
|
|
|
};
|
|
|
_this2._changeHandler = function(e) {
|
|
|
var _this2$props = _this2.props, trigger = _this2$props.trigger, onChange = _this2$props.onChange, minChar = _this2$props.minChar, onCaretPositionChange = _this2$props.onCaretPositionChange, movePopupAsYouType = _this2$props.movePopupAsYouType;
|
|
|
var _this2$state4 = _this2.state, top2 = _this2$state4.top, left2 = _this2$state4.left;
|
|
|
var event = e;
|
|
|
if (!event) {
|
|
|
event = new _customEvent_1_0_1_customEvent("change", {
|
|
|
bubbles: true
|
|
|
});
|
|
|
_this2.textareaRef.dispatchEvent(event);
|
|
|
}
|
|
|
var textarea = event.target || _this2.textareaRef;
|
|
|
var selectionEnd = textarea.selectionEnd;
|
|
|
var value = textarea.value;
|
|
|
_this2.lastValueBubbledEvent = value;
|
|
|
if (onChange && event) {
|
|
|
event.persist && event.persist();
|
|
|
onChange(new Proxy(event, {
|
|
|
get: function get(original, prop, receiver) {
|
|
|
if (prop === "target") {
|
|
|
return textarea;
|
|
|
}
|
|
|
return Reflect.get(original, prop, receiver);
|
|
|
}
|
|
|
}));
|
|
|
}
|
|
|
if (onCaretPositionChange) {
|
|
|
var caretPosition = _this2.getCaretPosition();
|
|
|
onCaretPositionChange(caretPosition);
|
|
|
}
|
|
|
_this2.setState({
|
|
|
value
|
|
|
});
|
|
|
var setTopLeft = function setTopLeft2() {
|
|
|
var _getCaretCoordinates = getCaretCoordinates(textarea, selectionEnd), newTop = _getCaretCoordinates.top, newLeft = _getCaretCoordinates.left;
|
|
|
_this2.setState({
|
|
|
top: newTop - _this2.textareaRef.scrollTop || 0,
|
|
|
left: newLeft
|
|
|
});
|
|
|
};
|
|
|
var cleanLastTrigger = function cleanLastTrigger2(triggerLength) {
|
|
|
_this2.lastTrigger = selectionEnd - triggerLength;
|
|
|
_this2._closeAutocomplete();
|
|
|
setTopLeft();
|
|
|
};
|
|
|
if (selectionEnd <= _this2.lastTrigger) {
|
|
|
var _affectedTextareaValue = value.slice(0, selectionEnd);
|
|
|
var _newTrigger = _this2.tokenRegExp.exec(_affectedTextareaValue);
|
|
|
cleanLastTrigger(_newTrigger ? _newTrigger[0].length : 0);
|
|
|
}
|
|
|
var affectedTextareaValue = value.slice(_this2.lastTrigger, selectionEnd);
|
|
|
var tokenMatch = _this2.tokenRegExp.exec(affectedTextareaValue);
|
|
|
var lastToken = tokenMatch && tokenMatch[0];
|
|
|
var currentTrigger = tokenMatch && tokenMatch[1] || null;
|
|
|
var currentTriggerLength = currentTrigger ? currentTrigger.length - 1 : 0;
|
|
|
var newTrigger = _this2.tokenRegExpEnding.exec(affectedTextareaValue);
|
|
|
if (newTrigger) {
|
|
|
cleanLastTrigger(newTrigger[0].length);
|
|
|
} else if (!_this2._isAutocompleteOpen()) {
|
|
|
_this2._closeAutocomplete();
|
|
|
}
|
|
|
if ((!lastToken || lastToken.length <= minChar + currentTriggerLength) && (_this2.state.currentTrigger && !trigger[_this2.state.currentTrigger].allowWhitespace || !_this2.state.currentTrigger)) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
if (currentTrigger && trigger[currentTrigger].afterWhitespace && !/\s/.test(value[selectionEnd - lastToken.length - 1]) && value[selectionEnd - lastToken.length - 1] !== void 0) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
if (_this2.state.currentTrigger && trigger[_this2.state.currentTrigger].allowWhitespace) {
|
|
|
tokenMatch = new RegExp("".concat(escapeRegex(_this2.state.currentTrigger), ".*$")).exec(value.slice(0, selectionEnd));
|
|
|
lastToken = tokenMatch && tokenMatch[0];
|
|
|
if (!lastToken) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
currentTrigger = Object.keys(trigger).find(function(a) {
|
|
|
return a.slice(0, currentTriggerLength + 1) === lastToken.slice(0, currentTriggerLength + 1);
|
|
|
}) || null;
|
|
|
}
|
|
|
var actualToken2 = lastToken.slice(1);
|
|
|
if (!currentTrigger) {
|
|
|
return;
|
|
|
}
|
|
|
if (movePopupAsYouType || top2 === null && left2 === null || _this2.state.currentTrigger !== currentTrigger) {
|
|
|
setTopLeft();
|
|
|
}
|
|
|
_this2.escListenerInit();
|
|
|
var textToReplace = _this2._getTextToReplace(currentTrigger);
|
|
|
_this2.setState({
|
|
|
selectionEnd,
|
|
|
currentTrigger,
|
|
|
textToReplace,
|
|
|
actualToken: actualToken2
|
|
|
}, function() {
|
|
|
try {
|
|
|
_this2._getValuesFromProvider();
|
|
|
} catch (err) {
|
|
|
errorMessage(err.message);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
_this2._selectHandler = function(e) {
|
|
|
var _this2$props2 = _this2.props, onCaretPositionChange = _this2$props2.onCaretPositionChange, onSelect = _this2$props2.onSelect;
|
|
|
if (onCaretPositionChange) {
|
|
|
var caretPosition = _this2.getCaretPosition();
|
|
|
onCaretPositionChange(caretPosition);
|
|
|
}
|
|
|
if (onSelect) {
|
|
|
e.persist();
|
|
|
onSelect(e);
|
|
|
}
|
|
|
};
|
|
|
_this2._shouldStayOpen = function(e) {
|
|
|
var el = e.relatedTarget;
|
|
|
if (el === null) {
|
|
|
el = document.activeElement;
|
|
|
}
|
|
|
if (_this2.dropdownRef && el instanceof Node && _this2.dropdownRef.contains(el)) {
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
_this2._onClick = function(e) {
|
|
|
var onClick = _this2.props.onClick;
|
|
|
if (onClick) {
|
|
|
e.persist();
|
|
|
onClick(e);
|
|
|
}
|
|
|
if (_this2._shouldStayOpen(e)) {
|
|
|
return;
|
|
|
}
|
|
|
_this2._closeAutocomplete();
|
|
|
};
|
|
|
_this2._onBlur = function(e) {
|
|
|
var onBlur = _this2.props.onBlur;
|
|
|
if (onBlur) {
|
|
|
e.persist();
|
|
|
onBlur(e);
|
|
|
}
|
|
|
if (_this2._shouldStayOpen(e)) {
|
|
|
return;
|
|
|
}
|
|
|
_this2._closeAutocomplete();
|
|
|
};
|
|
|
_this2._onScrollHandler = function() {
|
|
|
_this2._closeAutocomplete();
|
|
|
};
|
|
|
_this2._onItemHighlightedHandler = function(item) {
|
|
|
var onItemHighlighted = _this2.props.onItemHighlighted;
|
|
|
var currentTrigger = _this2.state.currentTrigger;
|
|
|
if (onItemHighlighted) {
|
|
|
if (typeof onItemHighlighted === "function") {
|
|
|
onItemHighlighted({
|
|
|
currentTrigger,
|
|
|
item
|
|
|
});
|
|
|
} else {
|
|
|
throw new Error("`onItemHighlighted` has to be a function");
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
_this2._dropdownScroll = function(item) {
|
|
|
var scrollToItem = _this2.props.scrollToItem;
|
|
|
if (!scrollToItem)
|
|
|
return;
|
|
|
if (scrollToItem === true) {
|
|
|
defaultScrollToItem(_this2.dropdownRef, item);
|
|
|
return;
|
|
|
}
|
|
|
if (typeof scrollToItem !== "function" || scrollToItem.length !== 2) {
|
|
|
throw new Error("`scrollToItem` has to be boolean (true for default implementation) or function with two parameters: container, item.");
|
|
|
}
|
|
|
scrollToItem(_this2.dropdownRef, item);
|
|
|
};
|
|
|
_this2._isAutocompleteOpen = function() {
|
|
|
var _this2$state5 = _this2.state, dataLoading = _this2$state5.dataLoading, currentTrigger = _this2$state5.currentTrigger;
|
|
|
var suggestionData = _this2._getSuggestions();
|
|
|
return !!((dataLoading || suggestionData) && currentTrigger);
|
|
|
};
|
|
|
_this2._textareaRef = function(ref) {
|
|
|
_this2.props.innerRef && _this2.props.innerRef(ref);
|
|
|
_this2.textareaRef = ref;
|
|
|
};
|
|
|
_this2.lastTrigger = 0;
|
|
|
_this2.escListener = null;
|
|
|
var _this2$props3 = _this2.props, loadingComponent = _this2$props3.loadingComponent, _trigger = _this2$props3.trigger, _value = _this2$props3.value;
|
|
|
if (_value)
|
|
|
_this2.state.value = _value;
|
|
|
_this2._createRegExp();
|
|
|
if (!loadingComponent) {
|
|
|
throw new Error("RTA: loadingComponent is not defined");
|
|
|
}
|
|
|
if (!_trigger) {
|
|
|
throw new Error("RTA: trigger is not defined");
|
|
|
}
|
|
|
return _this2;
|
|
|
}
|
|
|
_createClass$1(ReactTextareaAutocomplete2, [{
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
Listeners.startListen(this.textareaRef);
|
|
|
this.textareaRef && this.textareaRef.addEventListener("focus", this._handleCaretChange);
|
|
|
this.textareaRef && this.textareaRef.addEventListener("click", this._handleCaretChange);
|
|
|
this.textareaRef && this.textareaRef.addEventListener("keydown", this._handleCaretChange);
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidUpdate",
|
|
|
value: function componentDidUpdate(_ref2) {
|
|
|
var oldTrigger = _ref2.trigger, oldValue = _ref2.value;
|
|
|
var _this$props2 = this.props, trigger = _this$props2.trigger, value = _this$props2.value;
|
|
|
if (Object.keys(trigger).join("") !== Object.keys(oldTrigger).join("")) {
|
|
|
this._createRegExp();
|
|
|
}
|
|
|
if (oldValue !== value && this.lastValueBubbledEvent !== value) {
|
|
|
this.lastTrigger = 0;
|
|
|
this._changeHandler();
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentWillUnmount",
|
|
|
value: function componentWillUnmount() {
|
|
|
this.escListenerDestroy();
|
|
|
Listeners.stopListen(this.textareaRef);
|
|
|
this.textareaRef && this.textareaRef.removeEventListener("focus", this._handleCaretChange);
|
|
|
this.textareaRef && this.textareaRef.removeEventListener("click", this._handleCaretChange);
|
|
|
this.textareaRef && this.textareaRef.removeEventListener("keydown", this._handleCaretChange);
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this3 = this;
|
|
|
var _this$props3 = this.props, Loader = _this$props3.loadingComponent, style = _this$props3.style, className = _this$props3.className, listStyle = _this$props3.listStyle, itemStyle = _this$props3.itemStyle, boundariesElement = _this$props3.boundariesElement, movePopupAsYouType = _this$props3.movePopupAsYouType, listClassName = _this$props3.listClassName, itemClassName = _this$props3.itemClassName, dropdownClassName = _this$props3.dropdownClassName, dropdownStyle = _this$props3.dropdownStyle, containerStyle = _this$props3.containerStyle, containerClassName = _this$props3.containerClassName, loaderStyle = _this$props3.loaderStyle, loaderClassName = _this$props3.loaderClassName, textAreaComponent = _this$props3.textAreaComponent, renderToBody = _this$props3.renderToBody;
|
|
|
var _this$state = this.state, left2 = _this$state.left, top2 = _this$state.top, dataLoading = _this$state.dataLoading, component = _this$state.component, value = _this$state.value, textToReplace = _this$state.textToReplace;
|
|
|
var isAutocompleteOpen = this._isAutocompleteOpen();
|
|
|
var suggestionData = this._getSuggestions();
|
|
|
var extraAttrs = {};
|
|
|
var TextAreaComponent;
|
|
|
if (textAreaComponent.component) {
|
|
|
TextAreaComponent = textAreaComponent.component;
|
|
|
extraAttrs[textAreaComponent.ref] = this._textareaRef;
|
|
|
} else {
|
|
|
TextAreaComponent = textAreaComponent;
|
|
|
extraAttrs.ref = this._textareaRef;
|
|
|
}
|
|
|
return React$1.createElement("div", {
|
|
|
className: "rta ".concat(dataLoading === true ? "rta--loading" : "", " ").concat(containerClassName || ""),
|
|
|
style: containerStyle
|
|
|
}, React$1.createElement(TextAreaComponent, Object.assign({}, this._cleanUpProps(), {
|
|
|
className: "rta__textarea ".concat(className || ""),
|
|
|
onChange: this._changeHandler,
|
|
|
onSelect: this._selectHandler,
|
|
|
onScroll: this._onScrollHandler,
|
|
|
onClick: this._onClick,
|
|
|
onBlur: this._onBlur,
|
|
|
value,
|
|
|
style
|
|
|
}, extraAttrs)), isAutocompleteOpen && React$1.createElement(Autocomplete, {
|
|
|
innerRef: function innerRef(ref) {
|
|
|
_this3.dropdownRef = ref;
|
|
|
},
|
|
|
top: top2,
|
|
|
left: left2,
|
|
|
style: dropdownStyle,
|
|
|
className: dropdownClassName,
|
|
|
movePopupAsYouType,
|
|
|
boundariesElement,
|
|
|
textareaRef: this.textareaRef,
|
|
|
renderToBody
|
|
|
}, suggestionData && component && textToReplace && React$1.createElement(List, {
|
|
|
values: suggestionData,
|
|
|
component,
|
|
|
style: listStyle,
|
|
|
className: listClassName,
|
|
|
itemClassName,
|
|
|
itemStyle,
|
|
|
getTextToReplace: textToReplace,
|
|
|
onItemHighlighted: this._onItemHighlightedHandler,
|
|
|
onSelect: this._onSelect,
|
|
|
dropdownScroll: this._dropdownScroll
|
|
|
}), dataLoading && React$1.createElement("div", {
|
|
|
className: "rta__loader ".concat(suggestionData !== null ? "rta__loader--suggestion-data" : "rta__loader--empty-suggestion-data", " ").concat(loaderClassName || ""),
|
|
|
style: loaderStyle
|
|
|
}, React$1.createElement(Loader, {
|
|
|
data: suggestionData
|
|
|
}))));
|
|
|
}
|
|
|
}], [{
|
|
|
key: "getDerivedStateFromProps",
|
|
|
value: function getDerivedStateFromProps(_ref3) {
|
|
|
var value = _ref3.value;
|
|
|
if (value === null || value === void 0)
|
|
|
return null;
|
|
|
return {
|
|
|
value
|
|
|
};
|
|
|
}
|
|
|
}]);
|
|
|
return ReactTextareaAutocomplete2;
|
|
|
}(React$1.Component);
|
|
|
ReactTextareaAutocomplete.defaultProps = {
|
|
|
movePopupAsYouType: false,
|
|
|
value: null,
|
|
|
minChar: 1,
|
|
|
boundariesElement: "body",
|
|
|
scrollToItem: true,
|
|
|
textAreaComponent: "textarea",
|
|
|
renderToBody: false
|
|
|
};
|
|
|
const etTags = () => {
|
|
|
const { app: app2 } = dailyNotesService.getState();
|
|
|
const tags = app2.metadataCache.getTags();
|
|
|
return [...Object.keys(tags)].map((p2) => p2.split("#").pop());
|
|
|
};
|
|
|
const usedTags = (seletecText) => {
|
|
|
let allTags;
|
|
|
if (UseVaultTags) {
|
|
|
allTags = etTags();
|
|
|
} else {
|
|
|
const { tags } = memoService.getState();
|
|
|
allTags = tags;
|
|
|
}
|
|
|
const lowerCaseInputStr = seletecText.toLowerCase();
|
|
|
const usedTags2 = [];
|
|
|
allTags.forEach((tag2) => {
|
|
|
if (tag2 && tag2.toLowerCase().contains(lowerCaseInputStr)) {
|
|
|
usedTags2.push({
|
|
|
name: tag2,
|
|
|
char: tag2
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
return usedTags2;
|
|
|
};
|
|
|
var suggest = "";
|
|
|
const getSuggestions = (inputStr) => {
|
|
|
const { app: app2 } = dailyNotesService.getState();
|
|
|
const abstractFiles = app2.vault.getAllLoadedFiles();
|
|
|
const files = [];
|
|
|
let actualInput;
|
|
|
abstractFiles.forEach((file) => {
|
|
|
if (inputStr === "[") {
|
|
|
actualInput = "";
|
|
|
const lowerCaseInputStr = actualInput.toLowerCase();
|
|
|
if (file instanceof require$$0.TFile && (file.extension === "md" || file.extension === "png" || file.extension === "jpg" || file.extension === "jpeg" || file.extension === "gif") && file.path.toLowerCase().contains(lowerCaseInputStr)) {
|
|
|
files.push({
|
|
|
name: file.basename,
|
|
|
char: file.name,
|
|
|
file
|
|
|
});
|
|
|
}
|
|
|
} else if (inputStr.contains("[")) {
|
|
|
actualInput = inputStr.slice(1);
|
|
|
const lowerCaseInputStr = actualInput.toLowerCase();
|
|
|
if (file instanceof require$$0.TFile && (file.extension === "md" || file.extension === "png" || file.extension === "jpg" || file.extension === "jpeg" || file.extension === "gif") && file.path.toLowerCase().contains(lowerCaseInputStr)) {
|
|
|
files.push({
|
|
|
name: file.basename,
|
|
|
char: file.name,
|
|
|
file
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return files;
|
|
|
};
|
|
|
var ar = {};
|
|
|
var cz = {};
|
|
|
var da = {};
|
|
|
var de = {};
|
|
|
var en = {
|
|
|
welcome: "Welcome to the Memos",
|
|
|
ribbonIconTitle: "Memos",
|
|
|
to: "to",
|
|
|
months: [
|
|
|
"January",
|
|
|
"February",
|
|
|
"March",
|
|
|
"April",
|
|
|
"May",
|
|
|
"June",
|
|
|
"July",
|
|
|
"August",
|
|
|
"September",
|
|
|
"October",
|
|
|
"November",
|
|
|
"December"
|
|
|
],
|
|
|
monthsShort: ["Jan.", "Feb.", "Mar.", "Apr.", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."],
|
|
|
weekDays: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
|
|
|
weekDaysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
|
|
year: null,
|
|
|
month: null,
|
|
|
"Basic Options": "Basic Options",
|
|
|
"User name in Memos": "User name in Memos",
|
|
|
"Set your user name here. 'Memos \u{1F60F}' By default": "Set your user name here. 'Memos \u{1F60F}' By default",
|
|
|
"Insert after heading": "Insert after heading",
|
|
|
"You should set the same heading below if you want to insert and process memos below the same heading.": "You should set the same heading below if you want to insert and process memos below the same heading.",
|
|
|
"Allows admonitions to be created using ": "Allows admonitions to be created using ",
|
|
|
"Process Memos below": "Process Memos below",
|
|
|
"Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.": "Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.",
|
|
|
"Save Memo button label": "Save Memo button label",
|
|
|
"The text shown on the save Memo button in the UI. 'NOTEIT' by default.": "The text shown on the save Memo button in the UI. 'NOTEIT' by default.",
|
|
|
"Focus on editor when open memos": "Focus on editor when open memos",
|
|
|
"Focus on editor when open memos. Focus by default.": "Focus on editor when open memos. Focus by default.",
|
|
|
"Open daily memos with open memos": "Open daily memos with open memos",
|
|
|
"Open daily memos with open memos. Open by default.": "Open daily memos with open memos. Open by default.",
|
|
|
"Open Memos when obsidian opens": "Open Memos when obsidian opens",
|
|
|
"When enable this, Memos will open when Obsidian opens. False by default.": "When enable this, Memos will open when Obsidian opens. False by default.",
|
|
|
"Hide done tasks in Memo list": "Hide done tasks in Memo list",
|
|
|
"Hide all done tasks in Memo list. Show done tasks by default.": "Hide all done tasks in Memo list. Show done tasks by default.",
|
|
|
"Advanced Options": "Advanced Options",
|
|
|
"UI language for date": "UI language for date",
|
|
|
"Translates the date UI language. Only 'en' and 'zh' are available.": "Translates the date UI language. Only 'en' and 'zh' are available.",
|
|
|
"Default prefix": "Default prefix",
|
|
|
"Set the default prefix when create memo, 'List' by default.": "Set the default prefix when create memo, 'List' by default.",
|
|
|
"Default insert date format": "Default insert date format",
|
|
|
"Set the default date format when insert date by @, 'Tasks' by default.": "Set the default date format when insert date by @, 'Tasks' by default.",
|
|
|
"Default editor position on mobile": "Default editor position on mobile",
|
|
|
"Set the default editor position on Mobile, 'Top' by default.": "Set the default editor position on Mobile, 'Top' by default.",
|
|
|
"Use button to show editor on mobile": "Use button to show editor on mobile",
|
|
|
"Set a float button to call editor on mobile. Only when editor located at the bottom works.": "Set a float button to call editor on mobile. Only when editor located at the bottom works.",
|
|
|
"Show Time When Copy Results": "Show Time When Copy Results",
|
|
|
"Show time when you copy results, like 12:00. Copy time by default.": "Show time when you copy results, like 12:00. Copy time by default.",
|
|
|
"Show Date When Copy Results": "Show Date When Copy Results",
|
|
|
"Show date when you copy results, like [[2022-01-01]]. Copy date by default.": "Show date when you copy results, like [[2022-01-01]]. Copy date by default.",
|
|
|
"Add Blank Line Between Different Date": "Add Blank Line Between Different Date",
|
|
|
"Add blank line when copy result with date. No blank line by default.": "Add blank line when copy result with date. No blank line by default.",
|
|
|
"Share Options": "Share Options",
|
|
|
"Share Memos Image Footer Start": "Share Memos Image Footer Start",
|
|
|
"Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default": "Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default",
|
|
|
"Share Memos Image Footer End": "Share Memos Image Footer End",
|
|
|
"Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default": "Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default",
|
|
|
"Save Shared Image To Folder For Mobile": "Save Shared Image To Folder For Mobile",
|
|
|
"Save image to folder for mobile. False by Default": "Save image to folder for mobile. False by Default",
|
|
|
"Say Thank You": "Say Thank You",
|
|
|
Donate: "Donate",
|
|
|
"If you like this plugin, consider donating to support continued development:": "If you like this plugin, consider donating to support continued development:",
|
|
|
"File Name of Recycle Bin": "File Name of Recycle Bin",
|
|
|
"Set the filename for recycle bin. 'delete' By default": "Set the filename for recycle bin. 'delete' By default",
|
|
|
"File Name of Query File": "File Name of Query File",
|
|
|
"Set the filename for query file. 'query' By default": "Set the filename for query file. 'query' By default",
|
|
|
"Use Tags In Vault": "Use Tags In Vault",
|
|
|
"Use tags in vault rather than only in Memos. False by default.": "Use tags in vault rather than only in Memos. False by default.",
|
|
|
"Ready to convert image into background": "Ready to convert image into background",
|
|
|
List: "List",
|
|
|
Task: "Task",
|
|
|
Top: "Top",
|
|
|
Bottom: "Bottom",
|
|
|
TAG: "TAG",
|
|
|
DAY: "DAY",
|
|
|
QUERY: "QUERY",
|
|
|
EDIT: "EDIT",
|
|
|
PIN: "PIN",
|
|
|
UNPIN: "UNPIN",
|
|
|
DELETE: "DELETE",
|
|
|
"CONFIRM\uFF01": "CONFIRM\uFF01",
|
|
|
"CREATE FILTER": "CREATE FILTER",
|
|
|
Settings: "Settings",
|
|
|
"Recycle bin": "Recycle bin",
|
|
|
"About Me": "About Me",
|
|
|
"Fetching data...": "Fetching data...",
|
|
|
"Here is No Zettels.": "Here is No Zettels.",
|
|
|
"Frequently Used Tags": "Frequently Used Tags",
|
|
|
"What do you think now...": "What do you think now...",
|
|
|
READ: "READ",
|
|
|
MARK: "MARK",
|
|
|
SHARE: "SHARE",
|
|
|
SOURCE: "SOURCE",
|
|
|
RESTORE: "RESTORE",
|
|
|
"DELETE AT": "DELETE AT",
|
|
|
"Noooop!": "Noooop!",
|
|
|
"All Data is Loaded \u{1F389}": "All Data is Loaded \u{1F389}",
|
|
|
"Quick filter": "Quick filter",
|
|
|
TYPE: "TYPE",
|
|
|
LINKED: "LINKED",
|
|
|
"NO TAGS": "NO TAGS",
|
|
|
"HAS LINKS": "HAS LINKS",
|
|
|
"HAS IMAGES": "HAS IMAGES",
|
|
|
INCLUDE: "INCLUDE",
|
|
|
EXCLUDE: "EXCLUDE",
|
|
|
TEXT: "TEXT",
|
|
|
IS: "IS",
|
|
|
ISNOT: "ISNOT",
|
|
|
SELECT: "SELECT",
|
|
|
"ADD FILTER TERMS": "ADD FILTER TERMS",
|
|
|
FILTER: "FILTER",
|
|
|
TITLE: "TITLE",
|
|
|
"CREATE QUERY": "CREATE QUERY",
|
|
|
"EDIT QUERY": "EDIT QUERY",
|
|
|
MATCH: "MATCH",
|
|
|
TIMES: "TIMES",
|
|
|
"Share Memo Image": "Share Memo Image",
|
|
|
"\u2197Click the button to save": "\u2197Click the button to save",
|
|
|
"Image is generating...": "Image is generating...",
|
|
|
"Image is loading...": "Image is loading...",
|
|
|
"Loading...": "Loading...",
|
|
|
"\u{1F61F} Cannot load image, image link maybe broken": "\u{1F61F} Cannot load image, image link maybe broken",
|
|
|
"Daily Memos": "Daily Memos",
|
|
|
"CANCEL EDIT": "CANCEL EDIT",
|
|
|
"LINK TO THE": "LINK TO THE",
|
|
|
"Mobile Options": "Mobile Options",
|
|
|
"Experimental Options": "Experimental Options",
|
|
|
"Don't support web image yet, please input image path in vault": "Don't support web image yet, please input image path in vault",
|
|
|
"Background Image in Dark Theme": "Background Image in Dark Theme",
|
|
|
"Background Image in Light Theme": "Background Image in Light Theme",
|
|
|
'Set background image in dark theme. Set something like "Daily/one.png"': 'Set background image in dark theme. Set something like "Daily/one.png"',
|
|
|
'Set background image in light theme. Set something like "Daily/one.png"': 'Set background image in light theme. Set something like "Daily/one.png"',
|
|
|
'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default': 'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default',
|
|
|
"Default Memo Composition": "Default Memo Composition",
|
|
|
"Show Tasks Label": "Show Tasks Label",
|
|
|
"Show tasks label near the time text. False by default": "Show tasks label near the time text. False by default"
|
|
|
};
|
|
|
var enGB = {};
|
|
|
var es = {};
|
|
|
var fr = {
|
|
|
welcome: "Bienvenue dans M\xE9mo !",
|
|
|
ribbonIconTitle: "M\xE9mos",
|
|
|
months: [
|
|
|
"Janvier",
|
|
|
"F\xE9vrier",
|
|
|
"Mars",
|
|
|
"Avril",
|
|
|
"Mai",
|
|
|
"Juin",
|
|
|
"Juillet",
|
|
|
"Aout",
|
|
|
"Septembre",
|
|
|
"Octobre",
|
|
|
"Novembre",
|
|
|
"D\xE9cembre"
|
|
|
],
|
|
|
monthsShort: ["Jan.", "Feb.", "Mar.", "Apr.", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."],
|
|
|
weekDays: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
|
|
|
weekDaysShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"],
|
|
|
to: "\xE0",
|
|
|
year: null,
|
|
|
month: null,
|
|
|
"Basic Options": "Options basique",
|
|
|
"User name in Memos": "Username dans M\xE9mos",
|
|
|
"Set your user name here. 'Memos \u{1F60F}' By default": "D\xE9finissez votre username ici. D\xE9faut : 'Memo \u{1F60F}'",
|
|
|
"Insert after heading": "Ins\xE9rer apr\xE8s le titre",
|
|
|
"You should set the same heading below if you want to insert and process memos below the same heading.": "Vous devez d\xE9finir le m\xEAme titre en-dessous si vous voulez ins\xE9rer et traiter des m\xE9mos sous le m\xEAme titre.",
|
|
|
"Allows admonitions to be created using ": "Permet de cr\xE9er des admonitions en utilisant",
|
|
|
"Process Memos below": "Ins\xE9rer M\xE9mo sous",
|
|
|
"Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.": "Seulement les entr\xE9e sous cette section/phrase dans vos notes seront consid\xE9r\xE9s. S'il n'existe pas, aucune notes ne sera trait\xE9 pour ce fichier.",
|
|
|
"Save Memo button label": "Titre du bouton de sauvegarde",
|
|
|
"The text shown on the save Memo button in the UI. 'NOTEIT' by default.": "Le texte affich\xE9 sur le bouton de sauvegarde dans l'UI. D\xE9faut : 'NOTEIT'",
|
|
|
"Focus on editor when open memos": "Focus sur l'\xE9diteur lors de l'ouverture du m\xE9mo.",
|
|
|
"Focus on editor when open memos. Focus by default.": "Focus sur l'\xE9diteur lors de l'ouverture du m\xE9mo. Focus par d\xE9faut.",
|
|
|
"Open daily memos with open memos": "Ouvrir les m\xE9mos quotidiens quand m\xE9mo est ouvert.",
|
|
|
"Open daily memos with open memos. Open by default.": "Ouvrir les m\xE9mos quotidiens quand m\xE9mo est ouvert.",
|
|
|
"Open Memos when obsidian opens": "Ouvrir M\xE9mo quand Obsidian est ouvert.",
|
|
|
"When enable this, Memos will open when Obsidian opens. False by default.": "Quand activ\xE9, Memo sera ouvert quand Obsidian \xE0 l'ouverture d'Obsidian. D\xE9sactiv\xE9 par d\xE9faut.",
|
|
|
"Hide done tasks in Memo list": "Masquer les t\xE2ches accomplies dans la liste des m\xE9mos.",
|
|
|
"Hide all done tasks in Memo list. Show done tasks by default.": "Masquer les t\xE2ches accomplies dans les m\xE9mos. Affiche les t\xE2ches accomplies par d\xE9faut.",
|
|
|
"Advanced Options": "Options avanc\xE9es",
|
|
|
"UI language for date": "Langue de l'UI pour la date",
|
|
|
"Translates the date UI language. Only 'en' and 'zh' are available.": "Traduit la langue des dates dans l'UI. Seuls 'en', 'fr' et 'zh' sont disponibles. ",
|
|
|
"Default prefix": "Pr\xE9fix par d\xE9faut.",
|
|
|
"Set the default prefix when create memo, 'List' by default.": "D\xE9finit le pr\xE9fix par d\xE9faut lors de la cr\xE9ation d'un m\xE9mo. D\xE9fault : 'Liste'",
|
|
|
"Default insert date format": "Format de la date ins\xE9r\xE9e par d\xE9faut.",
|
|
|
"Default editor position on mobile": "Position par d\xE9faut de l'\xE9diteur sur mobile.",
|
|
|
"Set the default date format when insert date by @, 'Tasks' by default.": "D\xE9finit le format de la date par d\xE9faut lors de l'insertion de la date par @. D\xE9faut : 'T\xE2ches'.",
|
|
|
"Set the default editor position on Mobile, 'Top' by default.": "Position par d\xE9faut de l'\xE9diteur sur le mobile. D\xE9faut : 'Haut'.",
|
|
|
"Use button to show editor on mobile": "Utilisation du bouton pour afficher l'\xE9diteur sur le mobile.",
|
|
|
"Show Time When Copy Results": "Aficher l'heure quand les r\xE9sultats sont copi\xE9s",
|
|
|
"Set a float button to call editor on mobile. Only when editor located at the bottom works.": "Place un bouton flottant pour appeler l'\xE9diteur sur mobile. Fonctionne uniquement quand l'\xE9diteur est plac\xE9 en bas.",
|
|
|
"Show time when you copy results, like 12:00. Copy time by default.": "Affiche l'heure quand les r\xE9sultats sont copi\xE9s, comme '12:00'. Copie l'heure par d\xE9faut",
|
|
|
"Show Date When Copy Results": "Affiche la date quand les r\xE9sultats sont copi\xE9s",
|
|
|
"Show date when you copy results, like [[2022-01-01]]. Copy date by default.": "Affiche la date quand les r\xE9sultats sont copi\xE9s, comme [[2022-01-01]]. Par d\xE9faut, copie la date.",
|
|
|
"Add Blank Line Between Different Date": "Ajoute une ligne entre les diff\xE9rentes dates.",
|
|
|
"Add blank line when copy result with date. No blank line by default.": "Ajoute une ligne lors de la copie du r\xE9sultat avec la date. Pas de ligne par d\xE9faut.",
|
|
|
"Share Options": "Options de partage",
|
|
|
"Share Memos Image Footer Start": "D\xE9but du pied de page \u2014 Partage de m\xE9mo de m\xE9mos",
|
|
|
"Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default": "D\xE9finissez ce que vous voulez ici, utilisez {MemosNum} pour afficher le nombre de m\xE9mos, {UsedDay} pour les jours. Par d\xE9faut : '{MemosNum} Memos {UsedDay} Days.",
|
|
|
"Share Memos Image Footer End": "Fin du pied de page \u2014 Partage de m\xE9mo",
|
|
|
"Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default": "D\xE9finissez ce que vous voulez ici. Utilisez {UserName} comme username. Par d\xE9faut : '\u270D\uFE0F By {UserName}'",
|
|
|
"Save Shared Image To Folder For Mobile": "Sauvegarde des images partag\xE9s dans un dossier sur mobile.",
|
|
|
"Save image to folder for mobile. False by Default": "Sauvegarder les images dans un dossier sur mobile. D\xE9sactiv\xE9 par d\xE9faut.",
|
|
|
"Say Thank You": "Dites Merci",
|
|
|
Donate: "Faire un don",
|
|
|
"If you like this plugin, consider donating to support continued development:": "Si vous aimez ce plugin, envisagez de faire un don pour soutenir le d\xE9veloppement continu :",
|
|
|
"File Name of Recycle Bin": "Nom de la corbeille",
|
|
|
"Set the filename for recycle bin. 'delete' By default": "D\xE9finition du nom de la poubelle. D\xE9faut : 'Delete'",
|
|
|
"Set the filename for query file. 'query' By default": "D\xE9finit le nom de fichier pour les requ\xEAte. D\xE9faut : 'Query'",
|
|
|
"Use Tags In Vault": "Utiliser des tags dans le Coffre",
|
|
|
"Use tags in vault rather than only in Memos. False by default.": "Utiliser des tags du coffre plut\xF4t que ceux que seulement dans M\xE9mo. D\xE9sactiv\xE9 par d\xE9faut.",
|
|
|
"Ready to convert image into background": "Pr\xEAt pour convertir des image en arri\xE8re-plan.",
|
|
|
List: "Liste",
|
|
|
Task: "T\xE2che",
|
|
|
Top: "Haut",
|
|
|
Bottom: "Bas",
|
|
|
TAG: "TAG",
|
|
|
DAY: "JOUR",
|
|
|
QUERY: "RECHERCHE",
|
|
|
EDIT: "EDITER",
|
|
|
PIN: "PIN",
|
|
|
UNPIN: "\xC9PINGLER",
|
|
|
DELETE: "DES\xC9PINGLER",
|
|
|
"CONFIRM\uFF01": "CONFIRMER \uFF01",
|
|
|
"CREATE FILTER": "CR\xC9ER FILTRE",
|
|
|
Settings: "Param\xE8tres",
|
|
|
"Recycle bin": "Corbeille",
|
|
|
"About Me": "\xC0 propos de moi",
|
|
|
"Fetching data...": "R\xE9cup\xE9ration des donn\xE9es...",
|
|
|
"Here is No Zettels.": "Il n'y a pas de Zettels.",
|
|
|
"Frequently Used Tags": "Tags fr\xE9quemment utilis\xE9s",
|
|
|
"What do you think now...": "Que pensez-vous maintenant...",
|
|
|
READ: "LU",
|
|
|
MARK: "MARQUER",
|
|
|
SHARE: "PARTAGER",
|
|
|
SOURCE: "SOURCE",
|
|
|
RESTORE: "RESTAURER",
|
|
|
"DELETE AT": "SUPPRIMER",
|
|
|
"Noooop!": "Noooop!",
|
|
|
"All Data is Loaded \u{1F389}": "Toutes les donn\xE9es sont charg\xE9es \u{1F389}",
|
|
|
"Quick filter": "Filtre rapide",
|
|
|
TYPE: "TYPE",
|
|
|
LINKED: "LIEN",
|
|
|
"NO TAGS": "PAS DE TAGS",
|
|
|
"HAS LINKS": "A DES LIENS",
|
|
|
"HAS IMAGES": "A DES IMAGES",
|
|
|
INCLUDE: "INCLUS",
|
|
|
EXCLUDE: "EXCLUS",
|
|
|
TEXT: "TEXTE",
|
|
|
IS: "EST",
|
|
|
ISNOT: "N'EST PAS",
|
|
|
SELECT: "SELECTION",
|
|
|
"ADD FILTER TERMS": "AJOUTER DES TERMES FILTR\xC9",
|
|
|
FILTER: "FILTRE",
|
|
|
TITLE: "TITRE",
|
|
|
"CREATE QUERY": "CR\xC9ER UNE RECHERCHE",
|
|
|
"EDIT QUERY": "\xC9DITER UNE RECHERCHE",
|
|
|
MATCH: "MATCH",
|
|
|
TIMES: "HEURE",
|
|
|
"Share Memo Image": "Partager un m\xE9mo image",
|
|
|
"\u2197Click the button to save": "\u2197Clique pour sauvegarder",
|
|
|
"Image is generating...": "G\xE9n\xE9ration de l'image...",
|
|
|
"Image is loading...": "Image en chargement...",
|
|
|
"Loading...": "Chargement...",
|
|
|
"\u{1F61F} Cannot load image, image link maybe broken": "\u{1F61F} Impossible de charger l'image, le lien peut \xEAtre bris\xE9",
|
|
|
"Daily Memos": "M\xE9mo quotidien",
|
|
|
"CANCEL EDIT": "ANNULER L'\xC9DITION",
|
|
|
"LINK TO THE": "LIENS \xC0",
|
|
|
"Mobile Options": "Options mobile",
|
|
|
"Don't support web image yet, please input image path in vault": "Ne supporte pas les images webs. Merci d'ins\xE9rer le chemin de l'image depuis le coffre.",
|
|
|
"Background Image in Dark Theme": "Image de fond en th\xE8me sombre",
|
|
|
"Background Image in Light Theme": "Image de fond en th\xE8me clair",
|
|
|
'Set background image in dark theme. Set something like "Daily/one.png"': "D\xE9finir l'image de fond en th\xE8me sombre. D\xE9finir 'Daily/one.png' par exemple.",
|
|
|
'Set background image in light theme. Set something like "Daily/one.png"': "D\xE9finir l'image de fond en th\xE8me clair. D\xE9finir 'Daily/one.png' par exemple.",
|
|
|
'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default': 'D\xE9finir la composition par d\xE9faut du m\xE9mo, vous devez utiliser {TIME} comme "HH:mm" et {CONTENT} comme contenu. "{TIME} {CONTENT}" par d\xE9faut',
|
|
|
"Default Memo Composition": "Composition par d\xE9faut du m\xE9mo",
|
|
|
"Show Tasks Label": "Afficher les \xE9tiquettes des t\xE2ches",
|
|
|
"Show tasks label near the time text. False by default": "Afficher les \xE9tiquettes des t\xE2ches \xE0 c\xF4t\xE9 du texte horaire. D\xE9sactiv\xE9 par d\xE9faut."
|
|
|
};
|
|
|
var hi = {};
|
|
|
var id$1 = {};
|
|
|
var it = {};
|
|
|
var ja = {};
|
|
|
var ko = {};
|
|
|
var nl = {};
|
|
|
var no = {};
|
|
|
var pl = {};
|
|
|
var pt = {
|
|
|
welcome: "Bem-vindo ao Memos!",
|
|
|
ribbonIconTitle: "Memos",
|
|
|
months: [
|
|
|
"Janeiro",
|
|
|
"Fevereiro",
|
|
|
"Mar\xE7o",
|
|
|
"Abril",
|
|
|
"Maio",
|
|
|
"Junho",
|
|
|
"Julho",
|
|
|
"Agosto",
|
|
|
"Setembro",
|
|
|
"Outubro",
|
|
|
"Novembro",
|
|
|
"Dezembro"
|
|
|
],
|
|
|
monthsShort: ["Jan.", "Feb.", "Mar.", "Apr.", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."],
|
|
|
weekDays: ["Domingo", "Segunda", "Ter\xE7a", "Quarta", "Quinta", "Sexta", "S\xE1bado"],
|
|
|
weekDaysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\xE1b"],
|
|
|
to: "para",
|
|
|
year: null,
|
|
|
month: null,
|
|
|
"Basic Options": "Op\xE7\xF5es B\xE1sicas",
|
|
|
"User name in Memos": "Nome de Usu\xE1rio no Memos",
|
|
|
"Set your user name here. 'Memos \u{1F60F}' By default": "Define o nome de usu\xE1rio. Padr\xE3o: 'Memos \u{1F60F}'",
|
|
|
"Insert after heading": "Inserir ap\xF3s o t\xEDtulo",
|
|
|
"You should set the same heading below if you want to insert and process memos below the same heading.": "Deve definir o mesmo t\xEDtulo na op\xE7\xE3o abaixo se pretende inserir e processar Memos abaixo do t\xEDtulo aqui definido.",
|
|
|
"Allows admonitions to be created using ": "Permite que admonitions sejam criadas usando ",
|
|
|
"Process Memos below": "Processar Memos abaixo",
|
|
|
"Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.": "Somente as entradas abaixo deste T\xEDtulo/Sec\xE7\xE3o ser\xE3o processadas nas suas notas. Se esta Sec\xE7\xE3o n\xE3o estiver definida, nenhuma nota ser\xE1 processada para esse ficheiro.",
|
|
|
"Save Memo button label": "Legenda do bot\xE3o Guardar Memo",
|
|
|
"The text shown on the save Memo button in the UI. 'NOTEIT' by default.": 'Define o texto apresentado no bot\xE3o "Guardar Memo" na interface de usu\xE1rio. Padr\xE3o: "NOTEIT".',
|
|
|
"Focus on editor when open memos": "Focar no Editor ao iniciar o Memos",
|
|
|
"Focus on Editor when open memos. Focus by default.": "Focar no editor ao iniciar o Memos. Focar est\xE1 definido como padr\xE3o.",
|
|
|
"Open daily memos with open memos": "Abrir memorandos di\xE1rios ao iniciar o Memos",
|
|
|
"Open daily memos with open memos. Open by default.": "Abrir memorandos di\xE1rios ao iniciar o Memos. Abrir est\xE1 definido como padr\xE3o.",
|
|
|
"Open Memos when obsidian opens": "Abrir Memos quando o Obsidian inicia",
|
|
|
"When enable this, Memos will open when Obsidian opens. False by default.": "Quando esta op\xE7\xE3o est\xE1 activa, o Memos abrir\xE1 quando o Obsidian inicia. Desactivado por padr\xE3o.",
|
|
|
"Hide done tasks in Memo list": "Ocultar tarefas conclu\xEDdas na lista de Memos",
|
|
|
"Hide all done tasks in Memo list. Show done tasks by default.": "Ocultar todas as tarefas conclu\xEDdas na lista de Memos. Mostrar as tarefas conclu\xEDdas est\xE1 definido como padr\xE3o.",
|
|
|
"Advanced Options": "Op\xE7\xF5es Avan\xE7adas",
|
|
|
"UI language for date": "Idioma da Data na interface do usu\xE1rio",
|
|
|
"Translates the date UI language. Only 'en' and 'zh' are available.": "Define o idioma da Data na interface do usu\xE1rio. De momento, apenas 'en', 'fr', 'pt' e 'zh' est\xE3o dispon\xEDveis.",
|
|
|
"Default prefix": "Prefixo padr\xE3o",
|
|
|
"Set the default prefix when create memo, 'List' by default.": "Define o prefixo padr\xE3o quando um memorando \xE9 criado. Padr\xE3o: 'Lista'.",
|
|
|
"Default insert date format": "Formato padr\xE3o para inser\xE7\xE3o de Data",
|
|
|
"Set the default date format when insert date by @, 'Tasks' by default.": "Define o formato de Data padr\xE3o ao inserir a data usando @. Padr\xE3o: 'Tarefas'.",
|
|
|
"Default editor position on mobile": "Posi\xE7\xE3o padr\xE3o do editor de memos na vers\xE3o m\xF3vel.",
|
|
|
"Set the default editor position on Mobile, 'Top' by default.": "Define a posi\xE7\xE3o padr\xE3o do editor de Memos na vers\xE3o m\xF3vel. Padr\xE3o: 'Topo'.",
|
|
|
"Use button to show editor on mobile": "Usar um bot\xE3o para mostrar o editor na vers\xE3o m\xF3vel",
|
|
|
"Set a float button to call editor on mobile. Only when editor located at the bottom works.": "Define um bot\xE3o flutuante para abrir o editor na vers\xE3o m\xF3vel. Op\xE7\xE3o dispon\xEDvel somente quando a posi\xE7\xE3o do editor est\xE1 definida para 'Fundo'",
|
|
|
"Show Time When Copy Results": "Mostrar a Hora ao copiar os resultados",
|
|
|
"Show time when you copy results, like 12:00. Copy time by default.": "Mostrar a Hora ao copiar os resultados, como '12:00'. Copiar a Hora est\xE1 activado por padr\xE3o.",
|
|
|
"Show Date When Copy Results": "Mostrar a Data ao copiar os resultados",
|
|
|
"Show date when you copy results, like [[2022-01-01]]. Copy date by default.": "Mostrar a Data ao copiar os resultados, como [[2022-01-01]]. Copiar a Data est\xE1 activado por padr\xE3o.",
|
|
|
"Add Blank Line Between Different Date": "Adicionar linha em branco entre Datas diferentes.",
|
|
|
"Add blank line when copy result with date. No blank line by default.": "Adicionar linha em branco ao copiar resultados com Data. Por padr\xE3o nenhuma linha \xE9 adicionada.",
|
|
|
"Share Options": "Op\xE7\xF5es de Partilha",
|
|
|
"Share Memos Image Footer Start": "Partilhar a Imagem de um Memo - In\xEDcio do rodap\xE9",
|
|
|
"Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default": "Defina o que quiser, use {MemosNum} para mostrar o n\xFAmero de Memos e use {UsedDay} para dias. 'Padr\xE3o: {MemosNum} Memos {UsedDay} Days'.",
|
|
|
"Share Memos Image Footer End": "Partilhar a Imagem de um Memo - Fim do rodap\xE9",
|
|
|
"Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default": "Defina o que quiser, use {UserName} como o seu nome de usu\xE1rio. Padr\xE3o: '\u270D\uFE0F Por {UserName}'.",
|
|
|
"Save Shared Image To Folder For Mobile": "Guardar a imagem partilhada para pasta na vers\xE3o m\xF3vel",
|
|
|
"Save image to folder for mobile. False by Default": "Guardar a imagem partilhada para pasta na vers\xE3o m\xF3vel. Desactivado por padr\xE3o.",
|
|
|
"Say Thank You": "Agrade\xE7a",
|
|
|
Donate: "Doar",
|
|
|
"If you like this plugin, consider donating to support continued development:": "Se gosta deste plugin, considere doar para apoiar o seu desenvolvimento cont\xEDnuo:",
|
|
|
"File Name of Recycle Bin": "Nome da Reciclagem",
|
|
|
"Set the filename for recycle bin. 'delete' By default": "Define o nome do ficheiro para a Reciclagem. Padr\xE3o: 'delete'.",
|
|
|
"File Name of Query File": "Nome do arquivo do ficheiro de Consulta",
|
|
|
"Set the filename for query file. 'query' By default": "Define o nome do ficheiro para Consultas. Padr\xE3o: 'Query'.",
|
|
|
"Use Tags In Vault": "Usar Tags no Vault",
|
|
|
"Use tags in vault rather than only in Memos. False by default.": "Usar as Tags do Vault e n\xE3o somente do Memos. Desactivado por padr\xE3o.",
|
|
|
"Ready to convert image into background": "Pronto para converter imagem em fundo",
|
|
|
List: "Lista",
|
|
|
Task: "Tarefa",
|
|
|
Top: "Topo",
|
|
|
Bottom: "Fundo",
|
|
|
TAG: "TAG",
|
|
|
DAY: "DIA",
|
|
|
QUERY: "QUERY",
|
|
|
EDIT: "EDITAR",
|
|
|
PIN: "FIXAR",
|
|
|
UNPIN: "DESAFIXAR",
|
|
|
DELETE: "ELIMINAR",
|
|
|
"CONFIRM\uFF01": "CONFIRMAR\uFF01",
|
|
|
"CREATE FILTER": "CRIAR FILTRO",
|
|
|
Settings: "Defini\xE7\xF5es",
|
|
|
"Recycle bin": "Reciclagem",
|
|
|
"About Me": "Acerca de mim",
|
|
|
"Fetching data...": "A procurar dados...",
|
|
|
"Here is No Zettels.": "N\xE3o existem Zettels.",
|
|
|
"Frequently Used Tags": "Tags Usadas Frequentemente",
|
|
|
"What do you think now...": "Em que est\xE1 a pensar...",
|
|
|
READ: "LER",
|
|
|
MARK: "ASSINALAR",
|
|
|
SHARE: "PARTILHAR",
|
|
|
SOURCE: "ORIGEM",
|
|
|
RESTORE: "RESTAURAR",
|
|
|
"DELETE AT": "ELIMINADO EM",
|
|
|
"Noooop!": "Noooop!",
|
|
|
"All Data is Loaded \u{1F389}": "Todos os dados foram carregados \u{1F389}",
|
|
|
"Quick filter": "Filtro r\xE1pido",
|
|
|
TYPE: "TIPO",
|
|
|
LINKED: "LINKED",
|
|
|
"NO TAGS": "SEM TAGS",
|
|
|
"HAS LINKS": "TEM LINKS",
|
|
|
"HAS IMAGES": "TEM IMAGENS",
|
|
|
INCLUDE: "INCLUIR",
|
|
|
EXCLUDE: "EXCLUIR",
|
|
|
TEXT: "TEXTO",
|
|
|
IS: "\xC9",
|
|
|
ISNOT: "N\xC3O \xC9",
|
|
|
SELECT: "SELECCIONAR",
|
|
|
"ADD FILTER TERMS": "ADICIONAR TERMOS DE FILTRAGEM",
|
|
|
FILTER: "FILTRAR",
|
|
|
TITLE: "T\xCDTULO",
|
|
|
"CREATE QUERY": "CRIAR QUERY",
|
|
|
"EDIT QUERY": "EDITAR QUERY",
|
|
|
MATCH: "IGUALA",
|
|
|
TIMES: "VEZES",
|
|
|
"Share Memo Image": "Partilhar imagem do Memo",
|
|
|
"\u2197Click the button to save": "\u2197Clique no bot\xE3o para guardar",
|
|
|
"Image is generating...": "A gerar Imagem..",
|
|
|
"Image is loading...": "A carregar Imagem...",
|
|
|
"Loading...": "Carregando...",
|
|
|
"\u{1F61F} Cannot load image, image link maybe broken": "\u{1F61F} N\xE3o \xE9 poss\xEDvel carregar a imagem, o link da imagem parece estar quebrado",
|
|
|
"Daily Memos": "Memos Di\xE1rios",
|
|
|
"CANCEL EDIT": "CANCELAR EDI\xC7\xC3O",
|
|
|
"LINK TO THE": "LINK PARA O",
|
|
|
"Mobile Options": "Op\xE7\xF5es M\xF3veis",
|
|
|
"Don't support web image yet, please input image path in vault": "Ainda n\xE3o existe suporte para imagens de web. Por favor, insira o link para uma imagem no vault",
|
|
|
"Experimental Options": "Op\xE7\xF5es Experimentais",
|
|
|
"Background Image in Dark Theme": "Imagem de fundo no Tema Escuro",
|
|
|
"Background Image in Light Theme": "Imagem de fundo no Tema Claro",
|
|
|
'Set background image in dark theme. Set something like "Daily/one.png"': 'Defina a imagem de fundo no Tema Escuro. Defina algo como "Daily/one.png"',
|
|
|
'Set background image in light theme. Set something like "Daily/one.png"': 'Defina a imagem de fundo no Tema Claro. Defina algo como "Daily/one.png"',
|
|
|
'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default': 'Defina a composi\xE7\xE3o padr\xE3o do Memo, deve usar {TIME} como "HH:mm" e {CONTENT} como conte\xFAdo. Padr\xE3o: "{TIME} {CONTENT}"',
|
|
|
"Default Memo Composition": "Composi\xE7\xE3o Padr\xE3o do Memo",
|
|
|
"Show Tasks Label": "Mostrar Etiquetas de Tarefas",
|
|
|
"Show tasks label near the time text. False by default": "Mostrar etiquetas de tarefas pr\xF3ximo ao texto de tempo. Desactivado por padr\xE3o"
|
|
|
};
|
|
|
var ptBR = {};
|
|
|
var ro = {};
|
|
|
var ru = {};
|
|
|
var tr = {};
|
|
|
var zhCN = {
|
|
|
welcome: "\u6B22\u8FCE\u4F7F\u7528 Memos ",
|
|
|
ribbonIconTitle: "Memos",
|
|
|
months: ["\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708"],
|
|
|
monthsShort: [null, null, null, null, null, null, null, null, null, null, null, null],
|
|
|
weekDays: ["\u5468\u65E5", "\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D"],
|
|
|
weekDaysShort: ["\u5468\u65E5", "\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D"],
|
|
|
to: "\u81F3",
|
|
|
year: "\u5E74",
|
|
|
month: "\u6708",
|
|
|
"Basic Options": "\u57FA\u7840\u9009\u9879",
|
|
|
"User name in Memos": "\u5728 Memos \u4E2D\u663E\u793A\u7684\u7528\u6237\u540D",
|
|
|
"Set your user name here. 'Memos \u{1F60F}' By default": "\u5728\u8FD9\u91CC\u8BBE\u7F6E\u4F60\u559C\u6B22\u7684\u7528\u6237\u540D\u3002 \u9ED8\u8BA4\u4E3A 'Memos \u{1F60F}'",
|
|
|
"Insert after heading": "\u5728\u6307\u5B9A\u6807\u9898\u540E\u63D2\u5165 Memo",
|
|
|
"You should set the same heading below if you want to insert and process memos below the same heading.": "\u4F60\u5982\u679C\u60F3\u8981\u63D2\u5165\u6807\u9898\u7684\u540C\u65F6\u663E\u793A\u5BF9\u5E94\u6807\u9898\u4E0B\u7684 Memo\uFF0C\u4F60\u5FC5\u987B\u4FDD\u8BC1\u5F53\u524D\u8BBE\u7F6E\u4E0E\u4E0B\u65B9\u7684\u89E3\u6790\u8BBE\u7F6E\u662F\u4E00\u81F4\u7684\u3002\u5F53\u4E3A\u7A7A\u65F6\u63D2\u5165\u5230\u6587\u672B",
|
|
|
"Process Memos below": "\u89E3\u6790\u6307\u5B9A\u6807\u9898\u540E\u7684 Memo",
|
|
|
"Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.": "\u53EA\u6709\u5728\u8BBE\u7F6E\u7684\u6807\u9898\u540E\u7684 Memo \u624D\u4F1A\u88AB\u89E3\u6790\u3002\u5F53\u4E3A\u7A7A\u65F6\u89E3\u6790\u5168\u6587\u7684 Memo",
|
|
|
"Save Memo button label": "\u4FDD\u5B58\u6309\u94AE\u4E0A\u7684\u6587\u672C",
|
|
|
"The text shown on the save Memo button in the UI. 'NOTEIT' by default.": "\u5728\u4FDD\u5B58\u6309\u94AE\u4E0A\u5C55\u793A\u7684\u6587\u672C\u3002\u9ED8\u8BA4\u4E3A 'NOTEIT'",
|
|
|
"Focus on editor when open memos": "\u81EA\u52A8\u805A\u7126\u5230 Memos \u8F93\u5165\u6846",
|
|
|
"Focus on editor when open memos. Focus by default.": "\u5F53\u6253\u5F00 Memos \u7684\u65F6\u5019\u81EA\u52A8\u805A\u7126\u5230 Memos \u8F93\u5165\u6846\u3002\u9ED8\u8BA4\u5F00\u542F",
|
|
|
"Open daily memos with open memos": "\u6253\u5F00\u6BCF\u65E5 Memo \u7684\u65F6\u5019\u6253\u5F00 Memos \u754C\u9762",
|
|
|
"Open daily memos with open memos. Open by default.": "\u6253\u5F00\u6BCF\u65E5 Memo \u7684\u65F6\u5019\u6253\u5F00 Memos \u754C\u9762\u3002\u9ED8\u8BA4\u5F00\u542F",
|
|
|
"Open Memos when obsidian opens": "\u5F53\u5F00\u542F Obsidian \u7684\u65F6\u5019\u81EA\u52A8\u6253\u5F00 Memos",
|
|
|
"When enable this, Memos will open when Obsidian opens. False by default.": "\u5F53\u5F00\u542F\u8BE5\u9009\u9879, Memos \u4F1A\u5728 Obsidian \u6253\u5F00\u65F6\u81EA\u52A8\u6253\u5F00\u3002\u9ED8\u8BA4\u4E0D\u5F00\u542F\u3002",
|
|
|
"Hide done tasks in Memo list": "\u5728 memo \u5217\u8868\u4E2D\u9690\u85CF\u5DF2\u5B8C\u6210 memo",
|
|
|
"Hide all done tasks in Memo list. Show done tasks by default.": "\u5728 memo \u5217\u8868\u4E2D\u9690\u85CF\u5DF2\u5B8C\u6210 memo\u3002\u9ED8\u8BA4\u4E0D\u5F00\u542F",
|
|
|
"Advanced Options": "\u8FDB\u9636\u9009\u9879",
|
|
|
"UI language for date": "\u9488\u5BF9\u65E5\u671F\u5C55\u793A\u7684\u8BED\u8A00\u754C\u9762",
|
|
|
"Translates the date UI language. Only 'en' and 'zh' are available.": "\u5BF9\u65E5\u671F\u7684\u4E0D\u540C\u7FFB\u8BD1\u3002\u76EE\u524D\u53EA\u80FD\u9009\u62E9 'en' \u548C 'zh'\uFF08\u672A\u6765\u4F1A\u5E9F\u7F6E\uFF09",
|
|
|
"Default prefix": "\u9ED8\u8BA4\u524D\u7F00",
|
|
|
"Set the default prefix when create memo, 'List' by default.": "\u8BBE\u7F6E\u9ED8\u8BA4\u7684\u524D\u7F00\u6837\u5F0F\u3002\u9ED8\u8BA4\u4E3A\u5217\u8868",
|
|
|
"Default insert date format": "\u63D2\u5165\u65E5\u671F\u9644\u5E26\u7684\u6837\u5F0F",
|
|
|
"Set the default date format when insert date by @, 'Tasks' by default.": "\u5F53\u4F7F\u7528 @ \u6765\u5FEB\u901F\u63D2\u5165\u65E5\u671F\u65F6\uFF0C\u63D2\u5165\u65E5\u671F\u9644\u5E26\u7684\u6837\u5F0F\uFF0C\u9ED8\u8BA4\u4E3A 'Tasks' \u6837\u5F0F",
|
|
|
"Default editor position on mobile": "\u5728\u79FB\u52A8\u7AEF\u4E0A\u7684\u9ED8\u8BA4\u7F16\u8F91\u5668\u4F4D\u7F6E",
|
|
|
"Set the default editor position on Mobile, 'Top' by default.": "\u8BBE\u7F6E\u5728\u79FB\u52A8\u7AEF\u4E0A\u7684\u9ED8\u8BA4\u7F16\u8F91\u5668\u4F4D\u7F6E\uFF0C\u9ED8\u8BA4\u5728\u9876\u90E8\u3002",
|
|
|
"Use button to show editor on mobile": "\u5F53\u7F16\u8F91\u5668\u4F4D\u7F6E\u5728\u5E95\u90E8\u65F6\uFF0C\u7528\u6309\u94AE\u6765\u5524\u51FA\u7F16\u8F91\u5668",
|
|
|
"Set a float button to call editor on mobile. Only when editor located at the bottom works.": "\u8BBE\u7F6E\u4E00\u4E2A\u6D6E\u52A8\u6309\u94AE\u6765\u5524\u51FA\u7F16\u8F91\u5668\u3002\u5F53\u5728\u79FB\u52A8\u7AEF\u4E0A\u542F\u7528\u8BE5\u9009\u9879\u624D\u4F1A\u751F\u6548",
|
|
|
"Show Time When Copy Results": "\u5F53\u590D\u5236\u68C0\u7D22\u7ED3\u679C\u65F6\u9644\u5E26\u65F6\u95F4",
|
|
|
"Show time when you copy results, like 12:00. Copy time by default.": "\u5728\u590D\u5236\u68C0\u7D22\u7ED3\u679C\u65F6\u9644\u5E26\u5176\u65F6\u95F4\uFF0C\u4F8B\u5982 12:00 \u3002\u9ED8\u8BA4\u5F00\u542F",
|
|
|
"Show Date When Copy Results": "\u5F53\u590D\u5236\u68C0\u7D22\u7ED3\u679C\u65F6\u9644\u5E26\u65E5\u671F",
|
|
|
"Show date when you copy results, like [[2022-01-01]]. Copy date by default.": "\u5728\u590D\u5236\u68C0\u7D22\u7ED3\u679C\u65F6\u9644\u5E26\u5176\u65E5\u671F\uFF0C\u4F8B\u5982 [[2022-01-01]]\u3002\u9ED8\u8BA4\u5F00\u542F",
|
|
|
"Add Blank Line Between Different Date": "\u5728\u590D\u5236\u65E5\u671F\u7684\u65F6\u5019\u52A0\u4E0A\u7A7A\u884C",
|
|
|
"Add blank line when copy result with date. No blank line by default.": "\u5728\u590D\u5236\u65E5\u671F\u7684\u65F6\u5019\u5728\u76F8\u90BB\u7684\u65E5\u671F\u4E4B\u95F4\u52A0\u4E0A\u7A7A\u884C\u3002\u9ED8\u8BA4\u65E0\u7A7A\u884C",
|
|
|
"Share Options": "\u5206\u4EAB\u9009\u9879",
|
|
|
"Share Memos Image Footer Start": "\u5206\u4EAB memo \u56FE\u7247\u7684\u5DE6\u8FB9\u9875\u811A",
|
|
|
"Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default": "\u4F60\u53EF\u4EE5\u5728\u8FD9\u91CC\u8BBE\u7F6E\u4F60\u60F3\u8981\u7684\u4EFB\u610F\u6587\u672C\uFF0C\u7528 {MemosNum} \u6765\u5C55\u793A\u4F60\u8BB0\u5F55\u7684 memo \u6570\u91CF\uFF0C{UsedDay} \u6765\u5C55\u793A\u4F7F\u7528\u65E5\u671F\u3002\u9ED8\u8BA4\u4E3A'{MemosNum} Memos {UsedDay} Days'",
|
|
|
"Share Memos Image Footer End": "\u5206\u4EAB memo \u56FE\u7247\u7684\u53F3\u8FB9\u9875\u811A",
|
|
|
"Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default": "\u4F60\u53EF\u4EE5\u5728\u8FD9\u91CC\u8BBE\u7F6E\u4F60\u60F3\u8981\u7684\u4EFB\u610F\u6587\u672C\uFF0C\u7528 {UserName} \u6765\u5C55\u793A\u4F60\u7684\u7528\u6237\u540D\u3002\u9ED8\u8BA4\u4E3A '\u270D\uFE0F By {UserName}'",
|
|
|
"Save Shared Image To Folder For Mobile": "\u5F53\u5728\u79FB\u52A8\u7AEF\u4E0A\u65F6\u4FDD\u5B58\u56FE\u7247\u5230\u6587\u4EF6\u5939",
|
|
|
"Save image to folder for mobile. False by Default": "\u5F53\u5728\u79FB\u52A8\u7AEF\u4E0A\u65F6\uFF0C\u4FDD\u5B58\u751F\u6210\u7684\u56FE\u7247\u5230\u6587\u4EF6\u5939",
|
|
|
"Say Thank You": "\u611F\u8C22\u5F00\u53D1",
|
|
|
Donate: "\u6350\u8D60",
|
|
|
"If you like this plugin, consider donating to support continued development:": "\u5982\u679C\u4F60\u559C\u6B22\u8FD9\u4E2A\u63D2\u4EF6\uFF0C\u800C\u4E14\u4E5F\u5E0C\u671B\u7ED9\u6211\u4E70\u9E21\u817F\uFF0C\u90A3\u4E48\u53EF\u4EE5\u8003\u8651 Github \u9875\u9762\u53F3\u8FB9\u7684 Sponsor~",
|
|
|
"File Name of Recycle Bin": "\u56DE\u6536\u7AD9\u7684\u6587\u4EF6\u540D",
|
|
|
"Set the filename for recycle bin. 'delete' By default": "\u7ED9\u56DE\u6536\u7AD9\u8BBE\u7F6E\u4E00\u4E2A\u6587\u4EF6\u540D\u3002\u9ED8\u8BA4\u4E3A'delete'",
|
|
|
"File Name of Query File": "\u68C0\u7D22\u6587\u4EF6\u7684\u6587\u4EF6\u540D",
|
|
|
"Set the filename for query file. 'query' By default": "\u8BBE\u7F6E\u5B58\u653E\u68C0\u7D22\u5F0F\u7684\u6587\u4EF6\u7684\u6587\u4EF6\u540D\u3002\u9ED8\u8BA4\u4E3A'query'",
|
|
|
"Use Tags In Vault": "\u4F7F\u7528\u5728\u5E93\u5185\u7684\u6240\u6709\u6807\u7B7E",
|
|
|
"Use tags in vault rather than only in Memos. False by default.": "\u4F7F\u7528\u5728\u5E93\u5185\u7684\u800C\u4E0D\u662F Memos \u5185\u7684\u6807\u7B7E\u3002\u9ED8\u8BA4\u5173\u95ED",
|
|
|
"Don't support web image yet, please input image path in vault": "\u6682\u4E0D\u652F\u6301\u7F51\u7EDC\u56FE\u7247\uFF0C\u8BF7\u4F7F\u7528\u672C\u5730\u56FE\u7247",
|
|
|
"Ready to convert image into background": "\u6B63\u5728\u5C06\u56FE\u7247\u8F6C\u6362\u4E3A\u80CC\u666F\u56FE",
|
|
|
List: "\u5217\u8868",
|
|
|
Task: "\u4EFB\u52A1",
|
|
|
Top: "\u9876\u90E8",
|
|
|
Bottom: "\u5E95\u90E8",
|
|
|
TAG: "\u6807\u7B7E",
|
|
|
DAY: "\u5929",
|
|
|
QUERY: "\u68C0\u7D22\u5F0F",
|
|
|
EDIT: "\u7F16\u8F91",
|
|
|
PIN: "\u7F6E\u9876",
|
|
|
UNPIN: "\u53D6\u6D88\u7F6E\u9876",
|
|
|
DELETE: "\u5220\u9664",
|
|
|
"CONFIRM\uFF01": "\u786E\u5B9A\u5220\u9664",
|
|
|
"CREATE FILTER": "\u521B\u5EFA\u68C0\u7D22\u5F0F",
|
|
|
Settings: "\u8BBE\u7F6E",
|
|
|
"Recycle bin": "\u56DE\u6536\u7AD9",
|
|
|
"About Me": "\u5173\u4E8E",
|
|
|
"Fetching data...": "\u83B7\u53D6\u6570\u636E\u4E2D...",
|
|
|
"Here is No Zettels.": "\u6CA1\u6709\u627E\u5230 memo",
|
|
|
"Frequently Used Tags": "\u5E38\u7528\u6807\u7B7E",
|
|
|
"What do you think now...": "\u4F60\u73B0\u5728\u5728\u60F3\u4EC0\u4E48\uFF1F",
|
|
|
READ: "\u9605\u8BFB",
|
|
|
MARK: "\u5F15\u7528",
|
|
|
SHARE: "\u5206\u4EAB",
|
|
|
SOURCE: "\u6765\u6E90",
|
|
|
RESTORE: "\u6062\u590D",
|
|
|
"DELETE AT": "\u5220\u9664\u4E8E",
|
|
|
"Noooop!": "\u5565\u90FD\u6CA1\u6709\uFF01",
|
|
|
"All Data is Loaded \u{1F389}": "\u6240\u6709\u6570\u636E\u90FD\u52A0\u8F7D\u597D\u5566 \u{1F389}",
|
|
|
"Quick filter": "\u5FEB\u901F\u7B5B\u9009",
|
|
|
TYPE: "\u7C7B\u578B",
|
|
|
LINKED: "\u6709\u94FE\u63A5",
|
|
|
"NO TAGS": "\u65E0\u6807\u7B7E",
|
|
|
"HAS LINKS": "\u6709\u8D85\u94FE\u63A5",
|
|
|
"HAS IMAGES": "\u6709\u56FE\u7247",
|
|
|
INCLUDE: "\u5305\u62EC",
|
|
|
EXCLUDE: "\u6392\u9664",
|
|
|
TEXT: "\u6587\u672C",
|
|
|
IS: "\u662F",
|
|
|
ISNOT: "\u4E0D\u662F",
|
|
|
SELECT: "\u9009\u62E9",
|
|
|
"ADD FILTER TERMS": "\u6DFB\u52A0\u68C0\u7D22\u6761\u4EF6",
|
|
|
FILTER: "\u68C0\u7D22\u5668",
|
|
|
TITLE: "\u6807\u9898",
|
|
|
"CREATE QUERY": "\u521B\u5EFA\u68C0\u7D22\u5F0F",
|
|
|
"EDIT QUERY": "\u7F16\u8F91\u68C0\u7D22\u5F0F",
|
|
|
MATCH: "\u5339\u914D",
|
|
|
TIMES: "\u6B21",
|
|
|
"Share Memo Image": "\u5206\u4EAB Memo \u56FE\u7247",
|
|
|
"\u2197Click the button to save": "\u2197\u70B9\u51FB\u53F3\u4E0A\u89D2\u7684\u6309\u94AE\u6765\u4FDD\u5B58",
|
|
|
"Image is generating...": "\u56FE\u7247\u6B63\u5728\u751F\u6210\u4E2D...",
|
|
|
"Image is loading...": "\u56FE\u7247\u6B63\u5728\u52A0\u8F7D\u4E2D...",
|
|
|
"\u{1F61F} Cannot load image, image link maybe broken": "\u{1F61F} \u65E0\u6CD5\u52A0\u8F7D\u56FE\u7247\uFF0C\u56FE\u7247\u94FE\u63A5\u4E5F\u8BB8\u4E0D\u5B58\u5728",
|
|
|
"Loading...": "\u52AA\u529B\u52A0\u8F7D\u4E2D...",
|
|
|
"Daily Memos": "\u6BCF\u65E5 Memos",
|
|
|
"CANCEL EDIT": "\u53D6\u6D88\u7F16\u8F91",
|
|
|
"LINK TO THE": "\u94FE\u63A5\u5230",
|
|
|
"Mobile Options": "\u79FB\u52A8\u7AEF\u9009\u9879",
|
|
|
"Experimental Options": "\u5B9E\u9A8C\u6027\u9009\u9879",
|
|
|
"Background Image in Dark Theme": "\u6DF1\u8272\u4E3B\u9898\u7684\u80CC\u666F\u56FE",
|
|
|
"Background Image in Light Theme": "\u6D45\u8272\u4E3B\u9898\u7684\u80CC\u666F\u56FE",
|
|
|
'Set background image in dark theme. Set something like "Daily/one.png"': '\u8BBE\u7F6E\u6DF1\u8272\u4E3B\u9898\u7684\u80CC\u666F\u56FE\u3002\u8BF7\u8BBE\u7F6E\u7C7B\u4F3C"Daily/one.png"\u7684\u8DEF\u5F84',
|
|
|
'Set background image in light theme. Set something like "Daily/one.png"': '\u8BBE\u7F6E\u6D45\u8272\u4E3B\u9898\u7684\u80CC\u666F\u56FE\u3002\u8BF7\u8BBE\u7F6E\u7C7B\u4F3C"Daily/one.png"\u7684\u8DEF\u5F84',
|
|
|
'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default': '\u8BBE\u7F6E\u9ED8\u8BA4 Memo \u7EC4\u6210\uFF0C\u4F60\u5FC5\u987B\u8981\u4F7F\u7528 {TIME} \u4F5C\u4E3A "HH:mm" \u800C\u4E14\u8981\u8BBE\u7F6E {CONTENT} \u4F5C\u4E3A\u5185\u5BB9\u8BC6\u522B\u3002\u9ED8\u8BA4\u60C5\u51B5\u4E0B\uFF0C Memo \u57FA\u4E8E "{TIME} {CONTENT}" \u8BC6\u522B',
|
|
|
"Default Memo Composition": "\u9ED8\u8BA4 Memo \u7EC4\u6210",
|
|
|
"Show Tasks Label": "\u5C55\u793A\u4EFB\u52A1\u6807\u7B7E",
|
|
|
"Show tasks label near the time text. False by default": "\u5728 Memo \u7684\u65F6\u95F4\u65C1\u5C55\u793A\u4EFB\u52A1\u6807\u7B7E\u3002\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4E0D\u5C55\u793A"
|
|
|
};
|
|
|
var zhTW = {};
|
|
|
const localeMap = {
|
|
|
ar,
|
|
|
cs: cz,
|
|
|
da,
|
|
|
de,
|
|
|
en,
|
|
|
"en-gb": enGB,
|
|
|
es,
|
|
|
fr,
|
|
|
hi,
|
|
|
id: id$1,
|
|
|
it,
|
|
|
ja,
|
|
|
ko,
|
|
|
nl,
|
|
|
nn: no,
|
|
|
pl,
|
|
|
pt,
|
|
|
"pt-br": ptBR,
|
|
|
ro,
|
|
|
ru,
|
|
|
tr,
|
|
|
"zh-cn": zhCN,
|
|
|
"zh-tw": zhTW
|
|
|
};
|
|
|
const locale$1 = localeMap[require$$0.moment.locale()];
|
|
|
function t(str) {
|
|
|
return locale$1 && locale$1[str] || en[str];
|
|
|
}
|
|
|
const TItem = ({
|
|
|
entity: {
|
|
|
name,
|
|
|
char,
|
|
|
file
|
|
|
}
|
|
|
}) => {
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
children: `${char}`
|
|
|
});
|
|
|
};
|
|
|
const Loading = ({
|
|
|
data
|
|
|
}) => {
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
children: "Loading"
|
|
|
});
|
|
|
};
|
|
|
let actualToken;
|
|
|
const Editor = _react_17_0_2_react.exports.forwardRef((props, ref) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
globalState: {
|
|
|
useTinyUndoHistoryCache
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const {
|
|
|
className,
|
|
|
initialContent,
|
|
|
placeholder,
|
|
|
showConfirmBtn,
|
|
|
showCancelBtn,
|
|
|
onConfirmBtnClick: handleConfirmBtnClickCallback,
|
|
|
onCancelBtnClick: handleCancelBtnClickCallback,
|
|
|
onContentChange: handleContentChangeCallback
|
|
|
} = props;
|
|
|
const editorRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const tinyUndoRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const refresh = useRefresh();
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (initialContent) {
|
|
|
editorRef.current.value = initialContent;
|
|
|
refresh();
|
|
|
}
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a2;
|
|
|
if (useTinyUndoHistoryCache) {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const {
|
|
|
tinyUndoActionsCache,
|
|
|
tinyUndoIndexCache
|
|
|
} = storage.get(["tinyUndoActionsCache", "tinyUndoIndexCache"]);
|
|
|
tinyUndoRef.current = new TinyUndo(editorRef.current, {
|
|
|
interval: 5e3,
|
|
|
initialActions: tinyUndoActionsCache,
|
|
|
initialIndex: tinyUndoIndexCache
|
|
|
});
|
|
|
tinyUndoRef.current.subscribe((actions, index) => {
|
|
|
storage.set({
|
|
|
tinyUndoActionsCache: actions,
|
|
|
tinyUndoIndexCache: index
|
|
|
});
|
|
|
});
|
|
|
return () => {
|
|
|
var _a3;
|
|
|
(_a3 = tinyUndoRef.current) == null ? void 0 : _a3.destroy();
|
|
|
};
|
|
|
} else {
|
|
|
(_a2 = tinyUndoRef.current) == null ? void 0 : _a2.destroy();
|
|
|
tinyUndoRef.current = null;
|
|
|
storage.remove(["tinyUndoActionsCache", "tinyUndoIndexCache"]);
|
|
|
}
|
|
|
}, [useTinyUndoHistoryCache]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a2;
|
|
|
if (editorRef.current) {
|
|
|
editorRef.current.style.height = "auto";
|
|
|
editorRef.current.style.height = ((_a2 = editorRef.current.scrollHeight) != null ? _a2 : 0) + "px";
|
|
|
}
|
|
|
}, [(_a = editorRef.current) == null ? void 0 : _a.value]);
|
|
|
_react_17_0_2_react.exports.useImperativeHandle(ref, () => ({
|
|
|
element: editorRef.current,
|
|
|
focus: () => {
|
|
|
var _a2;
|
|
|
if (FocusOnEditor) {
|
|
|
(_a2 = editorRef.current) == null ? void 0 : _a2.focus();
|
|
|
}
|
|
|
},
|
|
|
insertText: (rawText) => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const prevValue = editorRef.current.value;
|
|
|
editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart) + rawText + prevValue.slice(editorRef.current.selectionStart);
|
|
|
handleContentChangeCallback(editorRef.current.value);
|
|
|
refresh();
|
|
|
},
|
|
|
setContent: (text) => {
|
|
|
if (editorRef.current) {
|
|
|
editorRef.current.value = text;
|
|
|
handleContentChangeCallback(editorRef.current.value);
|
|
|
refresh();
|
|
|
}
|
|
|
},
|
|
|
getContent: () => {
|
|
|
var _a2, _b2;
|
|
|
return (_b2 = (_a2 = editorRef.current) == null ? void 0 : _a2.value) != null ? _b2 : "";
|
|
|
}
|
|
|
}), []);
|
|
|
const handleInsertTrigger = (event) => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const {
|
|
|
fileManager
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
if (event.currentTrigger === "#") {
|
|
|
const prevValue = editorRef.current.value;
|
|
|
let removeCharNum;
|
|
|
if (actualToken !== null && actualToken !== void 0) {
|
|
|
removeCharNum = actualToken.length;
|
|
|
} else {
|
|
|
removeCharNum = 0;
|
|
|
}
|
|
|
let behindCharNum = editorRef.current.selectionStart;
|
|
|
for (let i = 0; i < prevValue.length; i++) {
|
|
|
if (!/\s/g.test(prevValue[behindCharNum])) {
|
|
|
behindCharNum++;
|
|
|
}
|
|
|
}
|
|
|
editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart - removeCharNum) + event.item.char + prevValue.slice(behindCharNum);
|
|
|
handleContentChangeCallback(editorRef.current.value);
|
|
|
refresh();
|
|
|
} else if (event.currentTrigger === "[[") {
|
|
|
const filePath = fileManager.generateMarkdownLink(event.item.file, event.item.file.path, "", "");
|
|
|
const prevValue = editorRef.current.value;
|
|
|
let removeCharNum;
|
|
|
if (actualToken !== null && actualToken !== void 0) {
|
|
|
if (filePath.contains("[[")) {
|
|
|
removeCharNum = actualToken.length + 1;
|
|
|
} else if (event.item.file.extension !== "md") {
|
|
|
removeCharNum = actualToken.length + 1;
|
|
|
} else {
|
|
|
removeCharNum = actualToken.length + 2;
|
|
|
}
|
|
|
} else {
|
|
|
removeCharNum = 2;
|
|
|
}
|
|
|
let behindCharNum = editorRef.current.selectionStart;
|
|
|
for (let i = 0; i < prevValue.length; i++) {
|
|
|
if (!/\s/g.test(prevValue[behindCharNum])) {
|
|
|
behindCharNum++;
|
|
|
}
|
|
|
}
|
|
|
editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart - removeCharNum) + filePath + prevValue.slice(behindCharNum);
|
|
|
handleContentChangeCallback(editorRef.current.value);
|
|
|
refresh();
|
|
|
}
|
|
|
};
|
|
|
const handleEditorInput = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
var _a2, _b2;
|
|
|
handleContentChangeCallback((_b2 = (_a2 = editorRef.current) == null ? void 0 : _a2.value) != null ? _b2 : "");
|
|
|
refresh();
|
|
|
}, []);
|
|
|
const handleEditorKeyDown = _react_17_0_2_react.exports.useCallback((event) => {
|
|
|
event.stopPropagation();
|
|
|
if (event.code === "Enter") {
|
|
|
if (event.metaKey || event.ctrlKey) {
|
|
|
handleCommonConfirmBtnClick();
|
|
|
}
|
|
|
}
|
|
|
refresh();
|
|
|
}, []);
|
|
|
const handleCommonConfirmBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
var _a2;
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
editorRef.current.value = getEditorContentCache2();
|
|
|
handleConfirmBtnClickCallback(editorRef.current.value);
|
|
|
editorRef.current.value = "";
|
|
|
refresh();
|
|
|
(_a2 = tinyUndoRef.current) == null ? void 0 : _a2.resetState();
|
|
|
}, []);
|
|
|
const handleCommonCancelBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
handleCancelBtnClickCallback();
|
|
|
}, []);
|
|
|
const getEditorContentCache2 = () => {
|
|
|
var _a2;
|
|
|
return (_a2 = storage.get(["editorContentCache"]).editorContentCache) != null ? _a2 : "";
|
|
|
};
|
|
|
const getEditorContent = () => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
editorRef.current.value = getEditorContentCache2();
|
|
|
return editorRef.current.value;
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "common-editor-wrapper " + className,
|
|
|
children: [/* @__PURE__ */ jsx(ReactTextareaAutocomplete, {
|
|
|
className: "common-editor-inputer scroll",
|
|
|
loadingComponent: Loading,
|
|
|
placeholder,
|
|
|
movePopupAsYouType: true,
|
|
|
ref: (rta) => {
|
|
|
},
|
|
|
value: getEditorContent(),
|
|
|
innerRef: (textarea) => {
|
|
|
editorRef.current = textarea;
|
|
|
},
|
|
|
onInput: handleEditorInput,
|
|
|
onKeyDown: handleEditorKeyDown,
|
|
|
style: {
|
|
|
minHeight: 48
|
|
|
},
|
|
|
dropdownStyle: {
|
|
|
minWidth: 180,
|
|
|
maxHeight: 250,
|
|
|
overflowY: "auto"
|
|
|
},
|
|
|
minChar: 0,
|
|
|
onItemSelected: handleInsertTrigger,
|
|
|
scrollToItem: true,
|
|
|
trigger: {
|
|
|
"#": {
|
|
|
dataProvider: (token) => {
|
|
|
actualToken = token;
|
|
|
return usedTags(token).map(({
|
|
|
name,
|
|
|
char
|
|
|
}) => ({
|
|
|
name,
|
|
|
char
|
|
|
}));
|
|
|
},
|
|
|
component: TItem,
|
|
|
afterWhitespace: true,
|
|
|
output: (item) => item.char
|
|
|
},
|
|
|
"[[": {
|
|
|
dataProvider: (token) => {
|
|
|
actualToken = token;
|
|
|
return getSuggestions(token).slice(0, 10).map(({
|
|
|
name,
|
|
|
char,
|
|
|
file
|
|
|
}) => ({
|
|
|
name,
|
|
|
char,
|
|
|
file
|
|
|
}));
|
|
|
},
|
|
|
component: TItem,
|
|
|
afterWhitespace: true,
|
|
|
output: (item) => item.char
|
|
|
}
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "common-tools-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "common-tools-container",
|
|
|
children: /* @__PURE__ */ jsx(Only, {
|
|
|
when: props.tools !== void 0,
|
|
|
children: props.tools
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: showCancelBtn,
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "action-btn cancel-btn",
|
|
|
onClick: handleCommonCancelBtnClick,
|
|
|
children: t("CANCEL EDIT")
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: showConfirmBtn,
|
|
|
children: /* @__PURE__ */ jsxs("button", {
|
|
|
className: "action-btn confirm-btn",
|
|
|
disabled: !((_b = editorRef.current) == null ? void 0 : _b.value),
|
|
|
onClick: handleCommonConfirmBtnClick,
|
|
|
children: [SaveMemoButtonLabel, /* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u270D\uFE0F"
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
});
|
|
|
var memoEditor = "";
|
|
|
var selectDatePicker = "";
|
|
|
var tag = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0cHgiIGZpbGw9IiMwMDAwMDAiPjxnPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjwvZz48Zz48cGF0aCBkPSJNMjAsMTBWOGgtNFY0aC0ydjRoLTRWNEg4djRINHYyaDR2NEg0djJoNHY0aDJ2LTRoNHY0aDJ2LTRoNHYtMmgtNHYtNEgyMHogTTE0LDE0aC00di00aDRWMTR6Ii8+PC9nPjwvc3ZnPg==";
|
|
|
var imageSvg = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS00Ljg2IDguODZsLTMgMy44N0w5IDEzLjE0IDYgMTdoMTJsLTMuODYtNS4xNHoiLz48L3N2Zz4=";
|
|
|
var task = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNDA3MDQzMTQ2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE4ODEiIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0iIzEyOTZkYiI+PHBhdGggZD0iTTIyNCA4MDAuMjU2TDIyMy43MTIgMjI0SDMyMHYzMS42OGMwIDM1LjQ1NiAyOC42NCA2NC4zMiA2My44NzIgNjQuMzJoMjU2LjI1NkE2NC4xNiA2NC4xNiAwIDAgMCA3MDQgMjU1LjY4VjIyNGw5Ni0wLjI1Nkw4MDAuMjU2IDgwMCAyMjQgODAwLjI1NnpNNjQwIDE5Mi4zMkw2NDAuMTI4IDI1NiAzODQgMjU1LjY4VjE5Mi4zMkwzODMuODcyIDE5MiA2NDAgMTkyLjMyek03OTkuODQgMTYwSDY5NS4wNGMtMTEuMDcyLTE5LjA0LTMxLjQyNC0zMi01NC45MTItMzJoLTI1Ni4yNTZjLTIzLjQ4OCAwLTQzLjgwOCAxMi45MjgtNTQuOTEyIDMySDIyMy43MTJBNjMuNzc2IDYzLjc3NiAwIDAgMCAxNjAgMjIzLjc0NHY1NzYuNTEyQzE2MCA4MzUuMzkyIDE4OC42MDggODY0IDIyMy43NDQgODY0aDU3Ni41MTJBNjMuODQgNjMuODQgMCAwIDAgODY0IDgwMC4yNTZWMjIzLjc0NEE2NCA2NCAwIDAgMCA3OTkuODQgMTYweiIgcC1pZD0iMTg4MiI+PC9wYXRoPjxwYXRoIGQ9Ik02MTkuMDcyIDQyOS4wODhsLTE1MS43NDQgMTY1Ljg4OC02Mi4xMTItNjkuNmEzMiAzMiAwIDEgMC00Ny43NDQgNDIuNjI0bDg1LjY5NiA5NmEzMiAzMiAwIDAgMCAyMy42OCAxMC42ODhoMC4xOTJjOC45NiAwIDE3LjUzNi0zLjc3NiAyMy42MTYtMTAuNGwxNzUuNjQ4LTE5MmEzMiAzMiAwIDAgMC00Ny4yMzItNDMuMiIgcC1pZD0iMTg4MyI+PC9wYXRoPjwvc3ZnPg0K";
|
|
|
var showEditorSvg = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNTY0NDUyMjA4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjYxOTQiIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiI+PHBhdGggZD0iTTUxMiAzMkMyNDggMzIgMzIgMjQ4IDMyIDUxMnMyMTYgNDgwIDQ4MCA0ODAgNDgwLTIxNiA0ODAtNDgwUzc3NiAzMiA1MTIgMzJ6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSI2MTk1Ij48L3BhdGg+PHBhdGggZD0iTTUxMiAwQzIyOC44IDAgMCAyMjguOCAwIDUxMnMyMjguOCA1MTIgNTEyIDUxMiA1MTItMjI4LjggNTEyLTUxMlM3OTUuMiAwIDUxMiAweiBtMCA5OTJDMjQ4IDk5MiAzMiA3NzYgMzIgNTEyUzI0OCAzMiA1MTIgMzJzNDgwIDIxNiA0ODAgNDgwLTIxNiA0ODAtNDgwIDQ4MHoiIGZpbGw9IiIgcC1pZD0iNjE5NiI+PC9wYXRoPjxwYXRoIGQ9Ik01MTIgNTEybS0zOTIgMGEzOTIgMzkyIDAgMSAwIDc4NCAwIDM5MiAzOTIgMCAxIDAtNzg0IDBaIiBmaWxsPSIjOURFOEY3IiBwLWlkPSI2MTk3Ij48L3BhdGg+PHBhdGggZD0iTTc4NCA0OTZINTI4VjI0MGgtMzJ2MjU2SDI0MHYzMmgyNTZ2MjU2aDMyVjUyOGgyNTZ6IiBmaWxsPSIjMUExNzE4IiBwLWlkPSI2MTk4Ij48L3BhdGg+PC9zdmc+";
|
|
|
var journalSvg = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNDA2OTY3MTE1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2NTIiIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0iIzEyOTZkYiI+PHBhdGggZD0iTTU0NCA4MDAuMTI4bC0zMjAgMC4xNi0wLjA2NC05Ni4zMi0wLjA2NC0xNjAtMC4wMzItNjQtMC4wOTYtMTYwLTAuMDMyLTk2aDU3Ni4xMjhMODAwIDIyMy43NzYgODAwLjI1NiA4MDAgNTQ0IDgwMC4xMjh6TTc5OS44NCAxNjBIMjIzLjcxMkE2My44MDggNjMuODA4IDAgMCAwIDE2MCAyMjMuNzQ0djU3Ni41NDRjMCAzNS4xMzYgMjguNjA4IDYzLjY4IDYzLjc0NCA2My42OGg1NzYuNTEyQTYzLjgwOCA2My44MDggMCAwIDAgODY0IDgwMC4zMlYyMjMuNzQ0QTY0IDY0IDAgMCAwIDc5OS44NCAxNjB6IiBwLWlkPSIxNjUzIj48L3BhdGg+PHBhdGggZD0iTTY4MC42MDggMzIwaC0yMjRhMzIgMzIgMCAwIDAgMCA2NGgyMjRhMzIgMzIgMCAwIDAgMC02NE02ODAuNjA4IDQ4MGgtMjI0YTMyIDMyIDAgMCAwIDAgNjRoMjI0YTMyIDMyIDAgMCAwIDAtNjRNNjgwLjYwOCA2NDBoLTIyNGEzMiAzMiAwIDAgMCAwIDY0aDIyNGEzMiAzMiAwIDAgMCAwLTY0TTM1MiAzMjBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDAgMCAwLTY0TTM1MiA0ODBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDAgMCAwLTY0TTM1MiA2NDBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDAgMCAwLTY0IiBwLWlkPSIxNjU0Ij48L3BhdGg+PC9zdmc+";
|
|
|
/*! *****************************************************************************
|
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
|
purpose with or without fee is hereby granted.
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
|
***************************************************************************** */
|
|
|
var __assign = function() {
|
|
|
__assign = Object.assign || function __assign2(t2) {
|
|
|
for (var s, i = 1, n2 = arguments.length; i < n2; i++) {
|
|
|
s = arguments[i];
|
|
|
for (var p2 in s)
|
|
|
if (Object.prototype.hasOwnProperty.call(s, p2))
|
|
|
t2[p2] = s[p2];
|
|
|
}
|
|
|
return t2;
|
|
|
};
|
|
|
return __assign.apply(this, arguments);
|
|
|
};
|
|
|
function __rest(s, e) {
|
|
|
var t2 = {};
|
|
|
for (var p2 in s)
|
|
|
if (Object.prototype.hasOwnProperty.call(s, p2) && e.indexOf(p2) < 0)
|
|
|
t2[p2] = s[p2];
|
|
|
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
|
for (var i = 0, p2 = Object.getOwnPropertySymbols(s); i < p2.length; i++) {
|
|
|
if (e.indexOf(p2[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i]))
|
|
|
t2[p2[i]] = s[p2[i]];
|
|
|
}
|
|
|
return t2;
|
|
|
}
|
|
|
function __spreadArray(to, from, pack) {
|
|
|
if (pack || arguments.length === 2)
|
|
|
for (var i = 0, l2 = from.length, ar2; i < l2; i++) {
|
|
|
if (ar2 || !(i in from)) {
|
|
|
if (!ar2)
|
|
|
ar2 = Array.prototype.slice.call(from, 0, i);
|
|
|
ar2[i] = from[i];
|
|
|
}
|
|
|
}
|
|
|
return to.concat(ar2 || Array.prototype.slice.call(from));
|
|
|
}
|
|
|
function canUseDOM() {
|
|
|
return !!(typeof window !== "undefined" && window.document && window.document.createElement);
|
|
|
}
|
|
|
var useIsomorphicLayoutEffect$1 = /* @__PURE__ */ canUseDOM() ? _react_17_0_2_react.exports.useLayoutEffect : _react_17_0_2_react.exports.useEffect;
|
|
|
var serverHandoffComplete = false;
|
|
|
var id = 0;
|
|
|
var genId = function genId2() {
|
|
|
return ++id;
|
|
|
};
|
|
|
function useId(idFromProps) {
|
|
|
var initialId = idFromProps || (serverHandoffComplete ? genId() : null);
|
|
|
var _React$useState = _react_17_0_2_react.exports.useState(initialId), id2 = _React$useState[0], setId = _React$useState[1];
|
|
|
useIsomorphicLayoutEffect$1(function() {
|
|
|
if (id2 === null) {
|
|
|
setId(genId());
|
|
|
}
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(function() {
|
|
|
if (serverHandoffComplete === false) {
|
|
|
serverHandoffComplete = true;
|
|
|
}
|
|
|
}, []);
|
|
|
return id2 != null ? String(id2) : void 0;
|
|
|
}
|
|
|
function buildFormatLongFn(args) {
|
|
|
return function() {
|
|
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
|
var width = options.width ? String(options.width) : args.defaultWidth;
|
|
|
var format2 = args.formats[width] || args.formats[args.defaultWidth];
|
|
|
return format2;
|
|
|
};
|
|
|
}
|
|
|
function buildLocalizeFn(args) {
|
|
|
return function(dirtyIndex, dirtyOptions) {
|
|
|
var options = dirtyOptions || {};
|
|
|
var context = options.context ? String(options.context) : "standalone";
|
|
|
var valuesArray;
|
|
|
if (context === "formatting" && args.formattingValues) {
|
|
|
var defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
|
|
|
var width = options.width ? String(options.width) : defaultWidth;
|
|
|
valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
|
|
|
} else {
|
|
|
var _defaultWidth = args.defaultWidth;
|
|
|
var _width = options.width ? String(options.width) : args.defaultWidth;
|
|
|
valuesArray = args.values[_width] || args.values[_defaultWidth];
|
|
|
}
|
|
|
var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex;
|
|
|
return valuesArray[index];
|
|
|
};
|
|
|
}
|
|
|
function buildMatchPatternFn(args) {
|
|
|
return function(string) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
var matchResult = string.match(args.matchPattern);
|
|
|
if (!matchResult)
|
|
|
return null;
|
|
|
var matchedString = matchResult[0];
|
|
|
var parseResult = string.match(args.parsePattern);
|
|
|
if (!parseResult)
|
|
|
return null;
|
|
|
var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];
|
|
|
value = options.valueCallback ? options.valueCallback(value) : value;
|
|
|
var rest = string.slice(matchedString.length);
|
|
|
return {
|
|
|
value,
|
|
|
rest
|
|
|
};
|
|
|
};
|
|
|
}
|
|
|
function buildMatchFn(args) {
|
|
|
return function(string) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
var width = options.width;
|
|
|
var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
|
|
|
var matchResult = string.match(matchPattern);
|
|
|
if (!matchResult) {
|
|
|
return null;
|
|
|
}
|
|
|
var matchedString = matchResult[0];
|
|
|
var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
|
|
|
var key = Array.isArray(parsePatterns) ? findIndex$1(parsePatterns, function(pattern) {
|
|
|
return pattern.test(matchedString);
|
|
|
}) : findKey(parsePatterns, function(pattern) {
|
|
|
return pattern.test(matchedString);
|
|
|
});
|
|
|
var value;
|
|
|
value = args.valueCallback ? args.valueCallback(key) : key;
|
|
|
value = options.valueCallback ? options.valueCallback(value) : value;
|
|
|
var rest = string.slice(matchedString.length);
|
|
|
return {
|
|
|
value,
|
|
|
rest
|
|
|
};
|
|
|
};
|
|
|
}
|
|
|
function findKey(object, predicate) {
|
|
|
for (var key in object) {
|
|
|
if (object.hasOwnProperty(key) && predicate(object[key])) {
|
|
|
return key;
|
|
|
}
|
|
|
}
|
|
|
return void 0;
|
|
|
}
|
|
|
function findIndex$1(array, predicate) {
|
|
|
for (var key = 0; key < array.length; key++) {
|
|
|
if (predicate(array[key])) {
|
|
|
return key;
|
|
|
}
|
|
|
}
|
|
|
return void 0;
|
|
|
}
|
|
|
function requiredArgs(required, args) {
|
|
|
if (args.length < required) {
|
|
|
throw new TypeError(required + " argument" + (required > 1 ? "s" : "") + " required, but only " + args.length + " present");
|
|
|
}
|
|
|
}
|
|
|
function toDate(argument) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var argStr = Object.prototype.toString.call(argument);
|
|
|
if (argument instanceof Date || typeof argument === "object" && argStr === "[object Date]") {
|
|
|
return new Date(argument.getTime());
|
|
|
} else if (typeof argument === "number" || argStr === "[object Number]") {
|
|
|
return new Date(argument);
|
|
|
} else {
|
|
|
if ((typeof argument === "string" || argStr === "[object String]") && typeof console !== "undefined") {
|
|
|
console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule");
|
|
|
console.warn(new Error().stack);
|
|
|
}
|
|
|
return new Date(NaN);
|
|
|
}
|
|
|
}
|
|
|
function toInteger(dirtyNumber) {
|
|
|
if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) {
|
|
|
return NaN;
|
|
|
}
|
|
|
var number = Number(dirtyNumber);
|
|
|
if (isNaN(number)) {
|
|
|
return number;
|
|
|
}
|
|
|
return number < 0 ? Math.ceil(number) : Math.floor(number);
|
|
|
}
|
|
|
function startOfUTCWeek(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeWeekStartsOn = locale2 && locale2.options && locale2.options.weekStartsOn;
|
|
|
var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);
|
|
|
var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);
|
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
|
}
|
|
|
var date = toDate(dirtyDate);
|
|
|
var day = date.getUTCDay();
|
|
|
var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
|
|
|
date.setUTCDate(date.getUTCDate() - diff);
|
|
|
date.setUTCHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function addDays(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
if (isNaN(amount)) {
|
|
|
return new Date(NaN);
|
|
|
}
|
|
|
if (!amount) {
|
|
|
return date;
|
|
|
}
|
|
|
date.setDate(date.getDate() + amount);
|
|
|
return date;
|
|
|
}
|
|
|
function addMonths(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
if (isNaN(amount)) {
|
|
|
return new Date(NaN);
|
|
|
}
|
|
|
if (!amount) {
|
|
|
return date;
|
|
|
}
|
|
|
var dayOfMonth = date.getDate();
|
|
|
var endOfDesiredMonth = new Date(date.getTime());
|
|
|
endOfDesiredMonth.setMonth(date.getMonth() + amount + 1, 0);
|
|
|
var daysInMonth = endOfDesiredMonth.getDate();
|
|
|
if (dayOfMonth >= daysInMonth) {
|
|
|
return endOfDesiredMonth;
|
|
|
} else {
|
|
|
date.setFullYear(endOfDesiredMonth.getFullYear(), endOfDesiredMonth.getMonth(), dayOfMonth);
|
|
|
return date;
|
|
|
}
|
|
|
}
|
|
|
function addMilliseconds(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var timestamp = toDate(dirtyDate).getTime();
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
return new Date(timestamp + amount);
|
|
|
}
|
|
|
function startOfWeek(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeWeekStartsOn = locale2 && locale2.options && locale2.options.weekStartsOn;
|
|
|
var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);
|
|
|
var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);
|
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
|
}
|
|
|
var date = toDate(dirtyDate);
|
|
|
var day = date.getDay();
|
|
|
var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
|
|
|
date.setDate(date.getDate() - diff);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function getTimezoneOffsetInMilliseconds(date) {
|
|
|
var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));
|
|
|
utcDate.setUTCFullYear(date.getFullYear());
|
|
|
return date.getTime() - utcDate.getTime();
|
|
|
}
|
|
|
function startOfDay(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
var MILLISECONDS_IN_DAY$1 = 864e5;
|
|
|
function differenceInCalendarDays(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var startOfDayLeft = startOfDay(dirtyDateLeft);
|
|
|
var startOfDayRight = startOfDay(dirtyDateRight);
|
|
|
var timestampLeft = startOfDayLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfDayLeft);
|
|
|
var timestampRight = startOfDayRight.getTime() - getTimezoneOffsetInMilliseconds(startOfDayRight);
|
|
|
return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY$1);
|
|
|
}
|
|
|
function addWeeks(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
var days = amount * 7;
|
|
|
return addDays(dirtyDate, days);
|
|
|
}
|
|
|
function addYears(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
return addMonths(dirtyDate, amount * 12);
|
|
|
}
|
|
|
function isSameDay(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var dateLeftStartOfDay = startOfDay(dirtyDateLeft);
|
|
|
var dateRightStartOfDay = startOfDay(dirtyDateRight);
|
|
|
return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime();
|
|
|
}
|
|
|
function isDate(value) {
|
|
|
requiredArgs(1, arguments);
|
|
|
return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]";
|
|
|
}
|
|
|
function isValid(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
if (!isDate(dirtyDate) && typeof dirtyDate !== "number") {
|
|
|
return false;
|
|
|
}
|
|
|
var date = toDate(dirtyDate);
|
|
|
return !isNaN(Number(date));
|
|
|
}
|
|
|
function differenceInCalendarMonths(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
|
var dateRight = toDate(dirtyDateRight);
|
|
|
var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear();
|
|
|
var monthDiff = dateLeft.getMonth() - dateRight.getMonth();
|
|
|
return yearDiff * 12 + monthDiff;
|
|
|
}
|
|
|
var MILLISECONDS_IN_WEEK$3 = 6048e5;
|
|
|
function differenceInCalendarWeeks(dirtyDateLeft, dirtyDateRight, dirtyOptions) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var startOfWeekLeft = startOfWeek(dirtyDateLeft, dirtyOptions);
|
|
|
var startOfWeekRight = startOfWeek(dirtyDateRight, dirtyOptions);
|
|
|
var timestampLeft = startOfWeekLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfWeekLeft);
|
|
|
var timestampRight = startOfWeekRight.getTime() - getTimezoneOffsetInMilliseconds(startOfWeekRight);
|
|
|
return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK$3);
|
|
|
}
|
|
|
function endOfMonth(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var month = date.getMonth();
|
|
|
date.setFullYear(date.getFullYear(), month + 1, 0);
|
|
|
date.setHours(23, 59, 59, 999);
|
|
|
return date;
|
|
|
}
|
|
|
function startOfMonth(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
date.setDate(1);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function startOfYear(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var cleanDate = toDate(dirtyDate);
|
|
|
var date = new Date(0);
|
|
|
date.setFullYear(cleanDate.getFullYear(), 0, 1);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function endOfWeek(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeWeekStartsOn = locale2 && locale2.options && locale2.options.weekStartsOn;
|
|
|
var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);
|
|
|
var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);
|
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
|
}
|
|
|
var date = toDate(dirtyDate);
|
|
|
var day = date.getDay();
|
|
|
var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);
|
|
|
date.setDate(date.getDate() + diff);
|
|
|
date.setHours(23, 59, 59, 999);
|
|
|
return date;
|
|
|
}
|
|
|
var formatDistanceLocale = {
|
|
|
lessThanXSeconds: {
|
|
|
one: "less than a second",
|
|
|
other: "less than {{count}} seconds"
|
|
|
},
|
|
|
xSeconds: {
|
|
|
one: "1 second",
|
|
|
other: "{{count}} seconds"
|
|
|
},
|
|
|
halfAMinute: "half a minute",
|
|
|
lessThanXMinutes: {
|
|
|
one: "less than a minute",
|
|
|
other: "less than {{count}} minutes"
|
|
|
},
|
|
|
xMinutes: {
|
|
|
one: "1 minute",
|
|
|
other: "{{count}} minutes"
|
|
|
},
|
|
|
aboutXHours: {
|
|
|
one: "about 1 hour",
|
|
|
other: "about {{count}} hours"
|
|
|
},
|
|
|
xHours: {
|
|
|
one: "1 hour",
|
|
|
other: "{{count}} hours"
|
|
|
},
|
|
|
xDays: {
|
|
|
one: "1 day",
|
|
|
other: "{{count}} days"
|
|
|
},
|
|
|
aboutXWeeks: {
|
|
|
one: "about 1 week",
|
|
|
other: "about {{count}} weeks"
|
|
|
},
|
|
|
xWeeks: {
|
|
|
one: "1 week",
|
|
|
other: "{{count}} weeks"
|
|
|
},
|
|
|
aboutXMonths: {
|
|
|
one: "about 1 month",
|
|
|
other: "about {{count}} months"
|
|
|
},
|
|
|
xMonths: {
|
|
|
one: "1 month",
|
|
|
other: "{{count}} months"
|
|
|
},
|
|
|
aboutXYears: {
|
|
|
one: "about 1 year",
|
|
|
other: "about {{count}} years"
|
|
|
},
|
|
|
xYears: {
|
|
|
one: "1 year",
|
|
|
other: "{{count}} years"
|
|
|
},
|
|
|
overXYears: {
|
|
|
one: "over 1 year",
|
|
|
other: "over {{count}} years"
|
|
|
},
|
|
|
almostXYears: {
|
|
|
one: "almost 1 year",
|
|
|
other: "almost {{count}} years"
|
|
|
}
|
|
|
};
|
|
|
var formatDistance = function(token, count, options) {
|
|
|
var result;
|
|
|
var tokenValue = formatDistanceLocale[token];
|
|
|
if (typeof tokenValue === "string") {
|
|
|
result = tokenValue;
|
|
|
} else if (count === 1) {
|
|
|
result = tokenValue.one;
|
|
|
} else {
|
|
|
result = tokenValue.other.replace("{{count}}", count.toString());
|
|
|
}
|
|
|
if (options !== null && options !== void 0 && options.addSuffix) {
|
|
|
if (options.comparison && options.comparison > 0) {
|
|
|
return "in " + result;
|
|
|
} else {
|
|
|
return result + " ago";
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
};
|
|
|
var formatDistance$1 = formatDistance;
|
|
|
var dateFormats = {
|
|
|
full: "EEEE, MMMM do, y",
|
|
|
long: "MMMM do, y",
|
|
|
medium: "MMM d, y",
|
|
|
short: "MM/dd/yyyy"
|
|
|
};
|
|
|
var timeFormats = {
|
|
|
full: "h:mm:ss a zzzz",
|
|
|
long: "h:mm:ss a z",
|
|
|
medium: "h:mm:ss a",
|
|
|
short: "h:mm a"
|
|
|
};
|
|
|
var dateTimeFormats = {
|
|
|
full: "{{date}} 'at' {{time}}",
|
|
|
long: "{{date}} 'at' {{time}}",
|
|
|
medium: "{{date}}, {{time}}",
|
|
|
short: "{{date}}, {{time}}"
|
|
|
};
|
|
|
var formatLong = {
|
|
|
date: buildFormatLongFn({
|
|
|
formats: dateFormats,
|
|
|
defaultWidth: "full"
|
|
|
}),
|
|
|
time: buildFormatLongFn({
|
|
|
formats: timeFormats,
|
|
|
defaultWidth: "full"
|
|
|
}),
|
|
|
dateTime: buildFormatLongFn({
|
|
|
formats: dateTimeFormats,
|
|
|
defaultWidth: "full"
|
|
|
})
|
|
|
};
|
|
|
var formatLong$1 = formatLong;
|
|
|
var formatRelativeLocale = {
|
|
|
lastWeek: "'last' eeee 'at' p",
|
|
|
yesterday: "'yesterday at' p",
|
|
|
today: "'today at' p",
|
|
|
tomorrow: "'tomorrow at' p",
|
|
|
nextWeek: "eeee 'at' p",
|
|
|
other: "P"
|
|
|
};
|
|
|
var formatRelative = function(token, _date, _baseDate, _options) {
|
|
|
return formatRelativeLocale[token];
|
|
|
};
|
|
|
var formatRelative$1 = formatRelative;
|
|
|
var eraValues = {
|
|
|
narrow: ["B", "A"],
|
|
|
abbreviated: ["BC", "AD"],
|
|
|
wide: ["Before Christ", "Anno Domini"]
|
|
|
};
|
|
|
var quarterValues = {
|
|
|
narrow: ["1", "2", "3", "4"],
|
|
|
abbreviated: ["Q1", "Q2", "Q3", "Q4"],
|
|
|
wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"]
|
|
|
};
|
|
|
var monthValues = {
|
|
|
narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
|
|
|
abbreviated: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
|
|
wide: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
|
|
|
};
|
|
|
var dayValues = {
|
|
|
narrow: ["S", "M", "T", "W", "T", "F", "S"],
|
|
|
short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
|
|
|
abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
|
|
wide: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
|
|
|
};
|
|
|
var dayPeriodValues = {
|
|
|
narrow: {
|
|
|
am: "a",
|
|
|
pm: "p",
|
|
|
midnight: "mi",
|
|
|
noon: "n",
|
|
|
morning: "morning",
|
|
|
afternoon: "afternoon",
|
|
|
evening: "evening",
|
|
|
night: "night"
|
|
|
},
|
|
|
abbreviated: {
|
|
|
am: "AM",
|
|
|
pm: "PM",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "morning",
|
|
|
afternoon: "afternoon",
|
|
|
evening: "evening",
|
|
|
night: "night"
|
|
|
},
|
|
|
wide: {
|
|
|
am: "a.m.",
|
|
|
pm: "p.m.",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "morning",
|
|
|
afternoon: "afternoon",
|
|
|
evening: "evening",
|
|
|
night: "night"
|
|
|
}
|
|
|
};
|
|
|
var formattingDayPeriodValues = {
|
|
|
narrow: {
|
|
|
am: "a",
|
|
|
pm: "p",
|
|
|
midnight: "mi",
|
|
|
noon: "n",
|
|
|
morning: "in the morning",
|
|
|
afternoon: "in the afternoon",
|
|
|
evening: "in the evening",
|
|
|
night: "at night"
|
|
|
},
|
|
|
abbreviated: {
|
|
|
am: "AM",
|
|
|
pm: "PM",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "in the morning",
|
|
|
afternoon: "in the afternoon",
|
|
|
evening: "in the evening",
|
|
|
night: "at night"
|
|
|
},
|
|
|
wide: {
|
|
|
am: "a.m.",
|
|
|
pm: "p.m.",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "in the morning",
|
|
|
afternoon: "in the afternoon",
|
|
|
evening: "in the evening",
|
|
|
night: "at night"
|
|
|
}
|
|
|
};
|
|
|
var ordinalNumber = function(dirtyNumber, _options) {
|
|
|
var number = Number(dirtyNumber);
|
|
|
var rem100 = number % 100;
|
|
|
if (rem100 > 20 || rem100 < 10) {
|
|
|
switch (rem100 % 10) {
|
|
|
case 1:
|
|
|
return number + "st";
|
|
|
case 2:
|
|
|
return number + "nd";
|
|
|
case 3:
|
|
|
return number + "rd";
|
|
|
}
|
|
|
}
|
|
|
return number + "th";
|
|
|
};
|
|
|
var localize = {
|
|
|
ordinalNumber,
|
|
|
era: buildLocalizeFn({
|
|
|
values: eraValues,
|
|
|
defaultWidth: "wide"
|
|
|
}),
|
|
|
quarter: buildLocalizeFn({
|
|
|
values: quarterValues,
|
|
|
defaultWidth: "wide",
|
|
|
argumentCallback: function(quarter) {
|
|
|
return quarter - 1;
|
|
|
}
|
|
|
}),
|
|
|
month: buildLocalizeFn({
|
|
|
values: monthValues,
|
|
|
defaultWidth: "wide"
|
|
|
}),
|
|
|
day: buildLocalizeFn({
|
|
|
values: dayValues,
|
|
|
defaultWidth: "wide"
|
|
|
}),
|
|
|
dayPeriod: buildLocalizeFn({
|
|
|
values: dayPeriodValues,
|
|
|
defaultWidth: "wide",
|
|
|
formattingValues: formattingDayPeriodValues,
|
|
|
defaultFormattingWidth: "wide"
|
|
|
})
|
|
|
};
|
|
|
var localize$1 = localize;
|
|
|
var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i;
|
|
|
var parseOrdinalNumberPattern = /\d+/i;
|
|
|
var matchEraPatterns = {
|
|
|
narrow: /^(b|a)/i,
|
|
|
abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
|
|
|
wide: /^(before christ|before common era|anno domini|common era)/i
|
|
|
};
|
|
|
var parseEraPatterns = {
|
|
|
any: [/^b/i, /^(a|c)/i]
|
|
|
};
|
|
|
var matchQuarterPatterns = {
|
|
|
narrow: /^[1234]/i,
|
|
|
abbreviated: /^q[1234]/i,
|
|
|
wide: /^[1234](th|st|nd|rd)? quarter/i
|
|
|
};
|
|
|
var parseQuarterPatterns = {
|
|
|
any: [/1/i, /2/i, /3/i, /4/i]
|
|
|
};
|
|
|
var matchMonthPatterns = {
|
|
|
narrow: /^[jfmasond]/i,
|
|
|
abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
|
|
|
wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i
|
|
|
};
|
|
|
var parseMonthPatterns = {
|
|
|
narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],
|
|
|
any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]
|
|
|
};
|
|
|
var matchDayPatterns = {
|
|
|
narrow: /^[smtwf]/i,
|
|
|
short: /^(su|mo|tu|we|th|fr|sa)/i,
|
|
|
abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
|
|
|
wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i
|
|
|
};
|
|
|
var parseDayPatterns = {
|
|
|
narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],
|
|
|
any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]
|
|
|
};
|
|
|
var matchDayPeriodPatterns = {
|
|
|
narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
|
|
|
any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i
|
|
|
};
|
|
|
var parseDayPeriodPatterns = {
|
|
|
any: {
|
|
|
am: /^a/i,
|
|
|
pm: /^p/i,
|
|
|
midnight: /^mi/i,
|
|
|
noon: /^no/i,
|
|
|
morning: /morning/i,
|
|
|
afternoon: /afternoon/i,
|
|
|
evening: /evening/i,
|
|
|
night: /night/i
|
|
|
}
|
|
|
};
|
|
|
var match = {
|
|
|
ordinalNumber: buildMatchPatternFn({
|
|
|
matchPattern: matchOrdinalNumberPattern,
|
|
|
parsePattern: parseOrdinalNumberPattern,
|
|
|
valueCallback: function(value) {
|
|
|
return parseInt(value, 10);
|
|
|
}
|
|
|
}),
|
|
|
era: buildMatchFn({
|
|
|
matchPatterns: matchEraPatterns,
|
|
|
defaultMatchWidth: "wide",
|
|
|
parsePatterns: parseEraPatterns,
|
|
|
defaultParseWidth: "any"
|
|
|
}),
|
|
|
quarter: buildMatchFn({
|
|
|
matchPatterns: matchQuarterPatterns,
|
|
|
defaultMatchWidth: "wide",
|
|
|
parsePatterns: parseQuarterPatterns,
|
|
|
defaultParseWidth: "any",
|
|
|
valueCallback: function(index) {
|
|
|
return index + 1;
|
|
|
}
|
|
|
}),
|
|
|
month: buildMatchFn({
|
|
|
matchPatterns: matchMonthPatterns,
|
|
|
defaultMatchWidth: "wide",
|
|
|
parsePatterns: parseMonthPatterns,
|
|
|
defaultParseWidth: "any"
|
|
|
}),
|
|
|
day: buildMatchFn({
|
|
|
matchPatterns: matchDayPatterns,
|
|
|
defaultMatchWidth: "wide",
|
|
|
parsePatterns: parseDayPatterns,
|
|
|
defaultParseWidth: "any"
|
|
|
}),
|
|
|
dayPeriod: buildMatchFn({
|
|
|
matchPatterns: matchDayPeriodPatterns,
|
|
|
defaultMatchWidth: "any",
|
|
|
parsePatterns: parseDayPeriodPatterns,
|
|
|
defaultParseWidth: "any"
|
|
|
})
|
|
|
};
|
|
|
var match$1 = match;
|
|
|
var locale = {
|
|
|
code: "en-US",
|
|
|
formatDistance: formatDistance$1,
|
|
|
formatLong: formatLong$1,
|
|
|
formatRelative: formatRelative$1,
|
|
|
localize: localize$1,
|
|
|
match: match$1,
|
|
|
options: {
|
|
|
weekStartsOn: 0,
|
|
|
firstWeekContainsDate: 1
|
|
|
}
|
|
|
};
|
|
|
var enUS = locale;
|
|
|
function subMilliseconds(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
return addMilliseconds(dirtyDate, -amount);
|
|
|
}
|
|
|
var MILLISECONDS_IN_DAY = 864e5;
|
|
|
function getUTCDayOfYear(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var timestamp = date.getTime();
|
|
|
date.setUTCMonth(0, 1);
|
|
|
date.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfYearTimestamp = date.getTime();
|
|
|
var difference = timestamp - startOfYearTimestamp;
|
|
|
return Math.floor(difference / MILLISECONDS_IN_DAY) + 1;
|
|
|
}
|
|
|
function startOfUTCISOWeek(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var weekStartsOn = 1;
|
|
|
var date = toDate(dirtyDate);
|
|
|
var day = date.getUTCDay();
|
|
|
var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
|
|
|
date.setUTCDate(date.getUTCDate() - diff);
|
|
|
date.setUTCHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function getUTCISOWeekYear(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = date.getUTCFullYear();
|
|
|
var fourthOfJanuaryOfNextYear = new Date(0);
|
|
|
fourthOfJanuaryOfNextYear.setUTCFullYear(year + 1, 0, 4);
|
|
|
fourthOfJanuaryOfNextYear.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfNextYear = startOfUTCISOWeek(fourthOfJanuaryOfNextYear);
|
|
|
var fourthOfJanuaryOfThisYear = new Date(0);
|
|
|
fourthOfJanuaryOfThisYear.setUTCFullYear(year, 0, 4);
|
|
|
fourthOfJanuaryOfThisYear.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfThisYear = startOfUTCISOWeek(fourthOfJanuaryOfThisYear);
|
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
|
return year + 1;
|
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
|
return year;
|
|
|
} else {
|
|
|
return year - 1;
|
|
|
}
|
|
|
}
|
|
|
function startOfUTCISOWeekYear(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var year = getUTCISOWeekYear(dirtyDate);
|
|
|
var fourthOfJanuary = new Date(0);
|
|
|
fourthOfJanuary.setUTCFullYear(year, 0, 4);
|
|
|
fourthOfJanuary.setUTCHours(0, 0, 0, 0);
|
|
|
var date = startOfUTCISOWeek(fourthOfJanuary);
|
|
|
return date;
|
|
|
}
|
|
|
var MILLISECONDS_IN_WEEK$2 = 6048e5;
|
|
|
function getUTCISOWeek(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var diff = startOfUTCISOWeek(date).getTime() - startOfUTCISOWeekYear(date).getTime();
|
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK$2) + 1;
|
|
|
}
|
|
|
function getUTCWeekYear(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = date.getUTCFullYear();
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeFirstWeekContainsDate = locale2 && locale2.options && locale2.options.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
|
throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");
|
|
|
}
|
|
|
var firstWeekOfNextYear = new Date(0);
|
|
|
firstWeekOfNextYear.setUTCFullYear(year + 1, 0, firstWeekContainsDate);
|
|
|
firstWeekOfNextYear.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfNextYear = startOfUTCWeek(firstWeekOfNextYear, dirtyOptions);
|
|
|
var firstWeekOfThisYear = new Date(0);
|
|
|
firstWeekOfThisYear.setUTCFullYear(year, 0, firstWeekContainsDate);
|
|
|
firstWeekOfThisYear.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfThisYear = startOfUTCWeek(firstWeekOfThisYear, dirtyOptions);
|
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
|
return year + 1;
|
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
|
return year;
|
|
|
} else {
|
|
|
return year - 1;
|
|
|
}
|
|
|
}
|
|
|
function startOfUTCWeekYear(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeFirstWeekContainsDate = locale2 && locale2.options && locale2.options.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
var year = getUTCWeekYear(dirtyDate, dirtyOptions);
|
|
|
var firstWeek = new Date(0);
|
|
|
firstWeek.setUTCFullYear(year, 0, firstWeekContainsDate);
|
|
|
firstWeek.setUTCHours(0, 0, 0, 0);
|
|
|
var date = startOfUTCWeek(firstWeek, dirtyOptions);
|
|
|
return date;
|
|
|
}
|
|
|
var MILLISECONDS_IN_WEEK$1 = 6048e5;
|
|
|
function getUTCWeek(dirtyDate, options) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var diff = startOfUTCWeek(date, options).getTime() - startOfUTCWeekYear(date, options).getTime();
|
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK$1) + 1;
|
|
|
}
|
|
|
function addLeadingZeros(number, targetLength) {
|
|
|
var sign = number < 0 ? "-" : "";
|
|
|
var output = Math.abs(number).toString();
|
|
|
while (output.length < targetLength) {
|
|
|
output = "0" + output;
|
|
|
}
|
|
|
return sign + output;
|
|
|
}
|
|
|
var formatters$3 = {
|
|
|
y: function(date, token) {
|
|
|
var signedYear = date.getUTCFullYear();
|
|
|
var year = signedYear > 0 ? signedYear : 1 - signedYear;
|
|
|
return addLeadingZeros(token === "yy" ? year % 100 : year, token.length);
|
|
|
},
|
|
|
M: function(date, token) {
|
|
|
var month = date.getUTCMonth();
|
|
|
return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2);
|
|
|
},
|
|
|
d: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCDate(), token.length);
|
|
|
},
|
|
|
a: function(date, token) {
|
|
|
var dayPeriodEnumValue = date.getUTCHours() / 12 >= 1 ? "pm" : "am";
|
|
|
switch (token) {
|
|
|
case "a":
|
|
|
case "aa":
|
|
|
return dayPeriodEnumValue.toUpperCase();
|
|
|
case "aaa":
|
|
|
return dayPeriodEnumValue;
|
|
|
case "aaaaa":
|
|
|
return dayPeriodEnumValue[0];
|
|
|
case "aaaa":
|
|
|
default:
|
|
|
return dayPeriodEnumValue === "am" ? "a.m." : "p.m.";
|
|
|
}
|
|
|
},
|
|
|
h: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCHours() % 12 || 12, token.length);
|
|
|
},
|
|
|
H: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCHours(), token.length);
|
|
|
},
|
|
|
m: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCMinutes(), token.length);
|
|
|
},
|
|
|
s: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCSeconds(), token.length);
|
|
|
},
|
|
|
S: function(date, token) {
|
|
|
var numberOfDigits = token.length;
|
|
|
var milliseconds = date.getUTCMilliseconds();
|
|
|
var fractionalSeconds = Math.floor(milliseconds * Math.pow(10, numberOfDigits - 3));
|
|
|
return addLeadingZeros(fractionalSeconds, token.length);
|
|
|
}
|
|
|
};
|
|
|
var formatters$4 = formatters$3;
|
|
|
var dayPeriodEnum = {
|
|
|
am: "am",
|
|
|
pm: "pm",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "morning",
|
|
|
afternoon: "afternoon",
|
|
|
evening: "evening",
|
|
|
night: "night"
|
|
|
};
|
|
|
var formatters$1 = {
|
|
|
G: function(date, token, localize2) {
|
|
|
var era = date.getUTCFullYear() > 0 ? 1 : 0;
|
|
|
switch (token) {
|
|
|
case "G":
|
|
|
case "GG":
|
|
|
case "GGG":
|
|
|
return localize2.era(era, {
|
|
|
width: "abbreviated"
|
|
|
});
|
|
|
case "GGGGG":
|
|
|
return localize2.era(era, {
|
|
|
width: "narrow"
|
|
|
});
|
|
|
case "GGGG":
|
|
|
default:
|
|
|
return localize2.era(era, {
|
|
|
width: "wide"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
y: function(date, token, localize2) {
|
|
|
if (token === "yo") {
|
|
|
var signedYear = date.getUTCFullYear();
|
|
|
var year = signedYear > 0 ? signedYear : 1 - signedYear;
|
|
|
return localize2.ordinalNumber(year, {
|
|
|
unit: "year"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.y(date, token);
|
|
|
},
|
|
|
Y: function(date, token, localize2, options) {
|
|
|
var signedWeekYear = getUTCWeekYear(date, options);
|
|
|
var weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;
|
|
|
if (token === "YY") {
|
|
|
var twoDigitYear = weekYear % 100;
|
|
|
return addLeadingZeros(twoDigitYear, 2);
|
|
|
}
|
|
|
if (token === "Yo") {
|
|
|
return localize2.ordinalNumber(weekYear, {
|
|
|
unit: "year"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(weekYear, token.length);
|
|
|
},
|
|
|
R: function(date, token) {
|
|
|
var isoWeekYear = getUTCISOWeekYear(date);
|
|
|
return addLeadingZeros(isoWeekYear, token.length);
|
|
|
},
|
|
|
u: function(date, token) {
|
|
|
var year = date.getUTCFullYear();
|
|
|
return addLeadingZeros(year, token.length);
|
|
|
},
|
|
|
Q: function(date, token, localize2) {
|
|
|
var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);
|
|
|
switch (token) {
|
|
|
case "Q":
|
|
|
return String(quarter);
|
|
|
case "QQ":
|
|
|
return addLeadingZeros(quarter, 2);
|
|
|
case "Qo":
|
|
|
return localize2.ordinalNumber(quarter, {
|
|
|
unit: "quarter"
|
|
|
});
|
|
|
case "QQQ":
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "QQQQQ":
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "QQQQ":
|
|
|
default:
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
q: function(date, token, localize2) {
|
|
|
var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);
|
|
|
switch (token) {
|
|
|
case "q":
|
|
|
return String(quarter);
|
|
|
case "qq":
|
|
|
return addLeadingZeros(quarter, 2);
|
|
|
case "qo":
|
|
|
return localize2.ordinalNumber(quarter, {
|
|
|
unit: "quarter"
|
|
|
});
|
|
|
case "qqq":
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "abbreviated",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "qqqqq":
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "narrow",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "qqqq":
|
|
|
default:
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "wide",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
M: function(date, token, localize2) {
|
|
|
var month = date.getUTCMonth();
|
|
|
switch (token) {
|
|
|
case "M":
|
|
|
case "MM":
|
|
|
return formatters$4.M(date, token);
|
|
|
case "Mo":
|
|
|
return localize2.ordinalNumber(month + 1, {
|
|
|
unit: "month"
|
|
|
});
|
|
|
case "MMM":
|
|
|
return localize2.month(month, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "MMMMM":
|
|
|
return localize2.month(month, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "MMMM":
|
|
|
default:
|
|
|
return localize2.month(month, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
L: function(date, token, localize2) {
|
|
|
var month = date.getUTCMonth();
|
|
|
switch (token) {
|
|
|
case "L":
|
|
|
return String(month + 1);
|
|
|
case "LL":
|
|
|
return addLeadingZeros(month + 1, 2);
|
|
|
case "Lo":
|
|
|
return localize2.ordinalNumber(month + 1, {
|
|
|
unit: "month"
|
|
|
});
|
|
|
case "LLL":
|
|
|
return localize2.month(month, {
|
|
|
width: "abbreviated",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "LLLLL":
|
|
|
return localize2.month(month, {
|
|
|
width: "narrow",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "LLLL":
|
|
|
default:
|
|
|
return localize2.month(month, {
|
|
|
width: "wide",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
w: function(date, token, localize2, options) {
|
|
|
var week = getUTCWeek(date, options);
|
|
|
if (token === "wo") {
|
|
|
return localize2.ordinalNumber(week, {
|
|
|
unit: "week"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(week, token.length);
|
|
|
},
|
|
|
I: function(date, token, localize2) {
|
|
|
var isoWeek = getUTCISOWeek(date);
|
|
|
if (token === "Io") {
|
|
|
return localize2.ordinalNumber(isoWeek, {
|
|
|
unit: "week"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(isoWeek, token.length);
|
|
|
},
|
|
|
d: function(date, token, localize2) {
|
|
|
if (token === "do") {
|
|
|
return localize2.ordinalNumber(date.getUTCDate(), {
|
|
|
unit: "date"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.d(date, token);
|
|
|
},
|
|
|
D: function(date, token, localize2) {
|
|
|
var dayOfYear = getUTCDayOfYear(date);
|
|
|
if (token === "Do") {
|
|
|
return localize2.ordinalNumber(dayOfYear, {
|
|
|
unit: "dayOfYear"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(dayOfYear, token.length);
|
|
|
},
|
|
|
E: function(date, token, localize2) {
|
|
|
var dayOfWeek = date.getUTCDay();
|
|
|
switch (token) {
|
|
|
case "E":
|
|
|
case "EE":
|
|
|
case "EEE":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "EEEEE":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "EEEEEE":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "short",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "EEEE":
|
|
|
default:
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
e: function(date, token, localize2, options) {
|
|
|
var dayOfWeek = date.getUTCDay();
|
|
|
var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
|
|
|
switch (token) {
|
|
|
case "e":
|
|
|
return String(localDayOfWeek);
|
|
|
case "ee":
|
|
|
return addLeadingZeros(localDayOfWeek, 2);
|
|
|
case "eo":
|
|
|
return localize2.ordinalNumber(localDayOfWeek, {
|
|
|
unit: "day"
|
|
|
});
|
|
|
case "eee":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "eeeee":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "eeeeee":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "short",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "eeee":
|
|
|
default:
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
c: function(date, token, localize2, options) {
|
|
|
var dayOfWeek = date.getUTCDay();
|
|
|
var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
|
|
|
switch (token) {
|
|
|
case "c":
|
|
|
return String(localDayOfWeek);
|
|
|
case "cc":
|
|
|
return addLeadingZeros(localDayOfWeek, token.length);
|
|
|
case "co":
|
|
|
return localize2.ordinalNumber(localDayOfWeek, {
|
|
|
unit: "day"
|
|
|
});
|
|
|
case "ccc":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "abbreviated",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "ccccc":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "narrow",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "cccccc":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "short",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "cccc":
|
|
|
default:
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "wide",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
i: function(date, token, localize2) {
|
|
|
var dayOfWeek = date.getUTCDay();
|
|
|
var isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;
|
|
|
switch (token) {
|
|
|
case "i":
|
|
|
return String(isoDayOfWeek);
|
|
|
case "ii":
|
|
|
return addLeadingZeros(isoDayOfWeek, token.length);
|
|
|
case "io":
|
|
|
return localize2.ordinalNumber(isoDayOfWeek, {
|
|
|
unit: "day"
|
|
|
});
|
|
|
case "iii":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "iiiii":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "iiiiii":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "short",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "iiii":
|
|
|
default:
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
a: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours();
|
|
|
var dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
|
|
|
switch (token) {
|
|
|
case "a":
|
|
|
case "aa":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "aaa":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
}).toLowerCase();
|
|
|
case "aaaaa":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "aaaa":
|
|
|
default:
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
b: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours();
|
|
|
var dayPeriodEnumValue;
|
|
|
if (hours === 12) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.noon;
|
|
|
} else if (hours === 0) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.midnight;
|
|
|
} else {
|
|
|
dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
|
|
|
}
|
|
|
switch (token) {
|
|
|
case "b":
|
|
|
case "bb":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "bbb":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
}).toLowerCase();
|
|
|
case "bbbbb":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "bbbb":
|
|
|
default:
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
B: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours();
|
|
|
var dayPeriodEnumValue;
|
|
|
if (hours >= 17) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.evening;
|
|
|
} else if (hours >= 12) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.afternoon;
|
|
|
} else if (hours >= 4) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.morning;
|
|
|
} else {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.night;
|
|
|
}
|
|
|
switch (token) {
|
|
|
case "B":
|
|
|
case "BB":
|
|
|
case "BBB":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "BBBBB":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "BBBB":
|
|
|
default:
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
h: function(date, token, localize2) {
|
|
|
if (token === "ho") {
|
|
|
var hours = date.getUTCHours() % 12;
|
|
|
if (hours === 0)
|
|
|
hours = 12;
|
|
|
return localize2.ordinalNumber(hours, {
|
|
|
unit: "hour"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.h(date, token);
|
|
|
},
|
|
|
H: function(date, token, localize2) {
|
|
|
if (token === "Ho") {
|
|
|
return localize2.ordinalNumber(date.getUTCHours(), {
|
|
|
unit: "hour"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.H(date, token);
|
|
|
},
|
|
|
K: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours() % 12;
|
|
|
if (token === "Ko") {
|
|
|
return localize2.ordinalNumber(hours, {
|
|
|
unit: "hour"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(hours, token.length);
|
|
|
},
|
|
|
k: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours();
|
|
|
if (hours === 0)
|
|
|
hours = 24;
|
|
|
if (token === "ko") {
|
|
|
return localize2.ordinalNumber(hours, {
|
|
|
unit: "hour"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(hours, token.length);
|
|
|
},
|
|
|
m: function(date, token, localize2) {
|
|
|
if (token === "mo") {
|
|
|
return localize2.ordinalNumber(date.getUTCMinutes(), {
|
|
|
unit: "minute"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.m(date, token);
|
|
|
},
|
|
|
s: function(date, token, localize2) {
|
|
|
if (token === "so") {
|
|
|
return localize2.ordinalNumber(date.getUTCSeconds(), {
|
|
|
unit: "second"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.s(date, token);
|
|
|
},
|
|
|
S: function(date, token) {
|
|
|
return formatters$4.S(date, token);
|
|
|
},
|
|
|
X: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
|
if (timezoneOffset === 0) {
|
|
|
return "Z";
|
|
|
}
|
|
|
switch (token) {
|
|
|
case "X":
|
|
|
return formatTimezoneWithOptionalMinutes(timezoneOffset);
|
|
|
case "XXXX":
|
|
|
case "XX":
|
|
|
return formatTimezone(timezoneOffset);
|
|
|
case "XXXXX":
|
|
|
case "XXX":
|
|
|
default:
|
|
|
return formatTimezone(timezoneOffset, ":");
|
|
|
}
|
|
|
},
|
|
|
x: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
|
switch (token) {
|
|
|
case "x":
|
|
|
return formatTimezoneWithOptionalMinutes(timezoneOffset);
|
|
|
case "xxxx":
|
|
|
case "xx":
|
|
|
return formatTimezone(timezoneOffset);
|
|
|
case "xxxxx":
|
|
|
case "xxx":
|
|
|
default:
|
|
|
return formatTimezone(timezoneOffset, ":");
|
|
|
}
|
|
|
},
|
|
|
O: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
|
switch (token) {
|
|
|
case "O":
|
|
|
case "OO":
|
|
|
case "OOO":
|
|
|
return "GMT" + formatTimezoneShort(timezoneOffset, ":");
|
|
|
case "OOOO":
|
|
|
default:
|
|
|
return "GMT" + formatTimezone(timezoneOffset, ":");
|
|
|
}
|
|
|
},
|
|
|
z: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
|
switch (token) {
|
|
|
case "z":
|
|
|
case "zz":
|
|
|
case "zzz":
|
|
|
return "GMT" + formatTimezoneShort(timezoneOffset, ":");
|
|
|
case "zzzz":
|
|
|
default:
|
|
|
return "GMT" + formatTimezone(timezoneOffset, ":");
|
|
|
}
|
|
|
},
|
|
|
t: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timestamp = Math.floor(originalDate.getTime() / 1e3);
|
|
|
return addLeadingZeros(timestamp, token.length);
|
|
|
},
|
|
|
T: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timestamp = originalDate.getTime();
|
|
|
return addLeadingZeros(timestamp, token.length);
|
|
|
}
|
|
|
};
|
|
|
function formatTimezoneShort(offset2, dirtyDelimiter) {
|
|
|
var sign = offset2 > 0 ? "-" : "+";
|
|
|
var absOffset = Math.abs(offset2);
|
|
|
var hours = Math.floor(absOffset / 60);
|
|
|
var minutes = absOffset % 60;
|
|
|
if (minutes === 0) {
|
|
|
return sign + String(hours);
|
|
|
}
|
|
|
var delimiter = dirtyDelimiter || "";
|
|
|
return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);
|
|
|
}
|
|
|
function formatTimezoneWithOptionalMinutes(offset2, dirtyDelimiter) {
|
|
|
if (offset2 % 60 === 0) {
|
|
|
var sign = offset2 > 0 ? "-" : "+";
|
|
|
return sign + addLeadingZeros(Math.abs(offset2) / 60, 2);
|
|
|
}
|
|
|
return formatTimezone(offset2, dirtyDelimiter);
|
|
|
}
|
|
|
function formatTimezone(offset2, dirtyDelimiter) {
|
|
|
var delimiter = dirtyDelimiter || "";
|
|
|
var sign = offset2 > 0 ? "-" : "+";
|
|
|
var absOffset = Math.abs(offset2);
|
|
|
var hours = addLeadingZeros(Math.floor(absOffset / 60), 2);
|
|
|
var minutes = addLeadingZeros(absOffset % 60, 2);
|
|
|
return sign + hours + delimiter + minutes;
|
|
|
}
|
|
|
var formatters$2 = formatters$1;
|
|
|
function dateLongFormatter(pattern, formatLong2) {
|
|
|
switch (pattern) {
|
|
|
case "P":
|
|
|
return formatLong2.date({
|
|
|
width: "short"
|
|
|
});
|
|
|
case "PP":
|
|
|
return formatLong2.date({
|
|
|
width: "medium"
|
|
|
});
|
|
|
case "PPP":
|
|
|
return formatLong2.date({
|
|
|
width: "long"
|
|
|
});
|
|
|
case "PPPP":
|
|
|
default:
|
|
|
return formatLong2.date({
|
|
|
width: "full"
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
function timeLongFormatter(pattern, formatLong2) {
|
|
|
switch (pattern) {
|
|
|
case "p":
|
|
|
return formatLong2.time({
|
|
|
width: "short"
|
|
|
});
|
|
|
case "pp":
|
|
|
return formatLong2.time({
|
|
|
width: "medium"
|
|
|
});
|
|
|
case "ppp":
|
|
|
return formatLong2.time({
|
|
|
width: "long"
|
|
|
});
|
|
|
case "pppp":
|
|
|
default:
|
|
|
return formatLong2.time({
|
|
|
width: "full"
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
function dateTimeLongFormatter(pattern, formatLong2) {
|
|
|
var matchResult = pattern.match(/(P+)(p+)?/) || [];
|
|
|
var datePattern = matchResult[1];
|
|
|
var timePattern = matchResult[2];
|
|
|
if (!timePattern) {
|
|
|
return dateLongFormatter(pattern, formatLong2);
|
|
|
}
|
|
|
var dateTimeFormat;
|
|
|
switch (datePattern) {
|
|
|
case "P":
|
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
|
width: "short"
|
|
|
});
|
|
|
break;
|
|
|
case "PP":
|
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
|
width: "medium"
|
|
|
});
|
|
|
break;
|
|
|
case "PPP":
|
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
|
width: "long"
|
|
|
});
|
|
|
break;
|
|
|
case "PPPP":
|
|
|
default:
|
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
|
width: "full"
|
|
|
});
|
|
|
break;
|
|
|
}
|
|
|
return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2));
|
|
|
}
|
|
|
var longFormatters = {
|
|
|
p: timeLongFormatter,
|
|
|
P: dateTimeLongFormatter
|
|
|
};
|
|
|
var longFormatters$1 = longFormatters;
|
|
|
var protectedDayOfYearTokens = ["D", "DD"];
|
|
|
var protectedWeekYearTokens = ["YY", "YYYY"];
|
|
|
function isProtectedDayOfYearToken(token) {
|
|
|
return protectedDayOfYearTokens.indexOf(token) !== -1;
|
|
|
}
|
|
|
function isProtectedWeekYearToken(token) {
|
|
|
return protectedWeekYearTokens.indexOf(token) !== -1;
|
|
|
}
|
|
|
function throwProtectedError(token, format2, input) {
|
|
|
if (token === "YYYY") {
|
|
|
throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(format2, "`) for formatting years to the input `").concat(input, "`; see: https://git.io/fxCyr"));
|
|
|
} else if (token === "YY") {
|
|
|
throw new RangeError("Use `yy` instead of `YY` (in `".concat(format2, "`) for formatting years to the input `").concat(input, "`; see: https://git.io/fxCyr"));
|
|
|
} else if (token === "D") {
|
|
|
throw new RangeError("Use `d` instead of `D` (in `".concat(format2, "`) for formatting days of the month to the input `").concat(input, "`; see: https://git.io/fxCyr"));
|
|
|
} else if (token === "DD") {
|
|
|
throw new RangeError("Use `dd` instead of `DD` (in `".concat(format2, "`) for formatting days of the month to the input `").concat(input, "`; see: https://git.io/fxCyr"));
|
|
|
}
|
|
|
}
|
|
|
var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
|
|
|
var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
|
|
|
var escapedStringRegExp = /^'([^]*?)'?$/;
|
|
|
var doubleQuoteRegExp = /''/g;
|
|
|
var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
|
|
|
function format(dirtyDate, dirtyFormatStr, dirtyOptions) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var formatStr = String(dirtyFormatStr);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale || enUS;
|
|
|
var localeFirstWeekContainsDate = locale2.options && locale2.options.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
|
throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");
|
|
|
}
|
|
|
var localeWeekStartsOn = locale2.options && locale2.options.weekStartsOn;
|
|
|
var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);
|
|
|
var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);
|
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
|
}
|
|
|
if (!locale2.localize) {
|
|
|
throw new RangeError("locale must contain localize property");
|
|
|
}
|
|
|
if (!locale2.formatLong) {
|
|
|
throw new RangeError("locale must contain formatLong property");
|
|
|
}
|
|
|
var originalDate = toDate(dirtyDate);
|
|
|
if (!isValid(originalDate)) {
|
|
|
throw new RangeError("Invalid time value");
|
|
|
}
|
|
|
var timezoneOffset = getTimezoneOffsetInMilliseconds(originalDate);
|
|
|
var utcDate = subMilliseconds(originalDate, timezoneOffset);
|
|
|
var formatterOptions = {
|
|
|
firstWeekContainsDate,
|
|
|
weekStartsOn,
|
|
|
locale: locale2,
|
|
|
_originalDate: originalDate
|
|
|
};
|
|
|
var result = formatStr.match(longFormattingTokensRegExp).map(function(substring) {
|
|
|
var firstCharacter = substring[0];
|
|
|
if (firstCharacter === "p" || firstCharacter === "P") {
|
|
|
var longFormatter = longFormatters$1[firstCharacter];
|
|
|
return longFormatter(substring, locale2.formatLong, formatterOptions);
|
|
|
}
|
|
|
return substring;
|
|
|
}).join("").match(formattingTokensRegExp).map(function(substring) {
|
|
|
if (substring === "''") {
|
|
|
return "'";
|
|
|
}
|
|
|
var firstCharacter = substring[0];
|
|
|
if (firstCharacter === "'") {
|
|
|
return cleanEscapedString(substring);
|
|
|
}
|
|
|
var formatter = formatters$2[firstCharacter];
|
|
|
if (formatter) {
|
|
|
if (!options.useAdditionalWeekYearTokens && isProtectedWeekYearToken(substring)) {
|
|
|
throwProtectedError(substring, dirtyFormatStr, dirtyDate);
|
|
|
}
|
|
|
if (!options.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(substring)) {
|
|
|
throwProtectedError(substring, dirtyFormatStr, dirtyDate);
|
|
|
}
|
|
|
return formatter(utcDate, substring, locale2.localize, formatterOptions);
|
|
|
}
|
|
|
if (firstCharacter.match(unescapedLatinCharacterRegExp)) {
|
|
|
throw new RangeError("Format string contains an unescaped latin alphabet character `" + firstCharacter + "`");
|
|
|
}
|
|
|
return substring;
|
|
|
}).join("");
|
|
|
return result;
|
|
|
}
|
|
|
function cleanEscapedString(input) {
|
|
|
return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, "'");
|
|
|
}
|
|
|
function getDaysInMonth(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = date.getFullYear();
|
|
|
var monthIndex = date.getMonth();
|
|
|
var lastDayOfMonth2 = new Date(0);
|
|
|
lastDayOfMonth2.setFullYear(year, monthIndex + 1, 0);
|
|
|
lastDayOfMonth2.setHours(0, 0, 0, 0);
|
|
|
return lastDayOfMonth2.getDate();
|
|
|
}
|
|
|
function getTime(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var timestamp = date.getTime();
|
|
|
return timestamp;
|
|
|
}
|
|
|
function getUnixTime(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
return Math.floor(getTime(dirtyDate) / 1e3);
|
|
|
}
|
|
|
function getWeekYear(dirtyDate, options) {
|
|
|
var _options$locale, _options$locale$optio;
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = date.getFullYear();
|
|
|
var localeFirstWeekContainsDate = options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = (options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
|
throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");
|
|
|
}
|
|
|
var firstWeekOfNextYear = new Date(0);
|
|
|
firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
|
|
|
firstWeekOfNextYear.setHours(0, 0, 0, 0);
|
|
|
var startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
|
|
|
var firstWeekOfThisYear = new Date(0);
|
|
|
firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
|
|
|
firstWeekOfThisYear.setHours(0, 0, 0, 0);
|
|
|
var startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
|
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
|
return year + 1;
|
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
|
return year;
|
|
|
} else {
|
|
|
return year - 1;
|
|
|
}
|
|
|
}
|
|
|
function startOfWeekYear(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeFirstWeekContainsDate = locale2 && locale2.options && locale2.options.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
var year = getWeekYear(dirtyDate, dirtyOptions);
|
|
|
var firstWeek = new Date(0);
|
|
|
firstWeek.setFullYear(year, 0, firstWeekContainsDate);
|
|
|
firstWeek.setHours(0, 0, 0, 0);
|
|
|
var date = startOfWeek(firstWeek, dirtyOptions);
|
|
|
return date;
|
|
|
}
|
|
|
var MILLISECONDS_IN_WEEK = 6048e5;
|
|
|
function getWeek(dirtyDate, options) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var diff = startOfWeek(date, options).getTime() - startOfWeekYear(date, options).getTime();
|
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK) + 1;
|
|
|
}
|
|
|
function lastDayOfMonth(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var month = date.getMonth();
|
|
|
date.setFullYear(date.getFullYear(), month + 1, 0);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function getWeeksInMonth(date, options) {
|
|
|
requiredArgs(1, arguments);
|
|
|
return differenceInCalendarWeeks(lastDayOfMonth(date), startOfMonth(date), options) + 1;
|
|
|
}
|
|
|
function isAfter(dirtyDate, dirtyDateToCompare) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var dateToCompare = toDate(dirtyDateToCompare);
|
|
|
return date.getTime() > dateToCompare.getTime();
|
|
|
}
|
|
|
function isBefore(dirtyDate, dirtyDateToCompare) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var dateToCompare = toDate(dirtyDateToCompare);
|
|
|
return date.getTime() < dateToCompare.getTime();
|
|
|
}
|
|
|
function isSameMonth(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
|
var dateRight = toDate(dirtyDateRight);
|
|
|
return dateLeft.getFullYear() === dateRight.getFullYear() && dateLeft.getMonth() === dateRight.getMonth();
|
|
|
}
|
|
|
function isSameYear(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
|
var dateRight = toDate(dirtyDateRight);
|
|
|
return dateLeft.getFullYear() === dateRight.getFullYear();
|
|
|
}
|
|
|
function setMonth(dirtyDate, dirtyMonth) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var month = toInteger(dirtyMonth);
|
|
|
var year = date.getFullYear();
|
|
|
var day = date.getDate();
|
|
|
var dateWithDesiredMonth = new Date(0);
|
|
|
dateWithDesiredMonth.setFullYear(year, month, 15);
|
|
|
dateWithDesiredMonth.setHours(0, 0, 0, 0);
|
|
|
var daysInMonth = getDaysInMonth(dateWithDesiredMonth);
|
|
|
date.setMonth(month, Math.min(day, daysInMonth));
|
|
|
return date;
|
|
|
}
|
|
|
function setYear(dirtyDate, dirtyYear) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = toInteger(dirtyYear);
|
|
|
if (isNaN(date.getTime())) {
|
|
|
return new Date(NaN);
|
|
|
}
|
|
|
date.setFullYear(year);
|
|
|
return date;
|
|
|
}
|
|
|
function MonthsDropdown(props) {
|
|
|
var displayMonth = props.displayMonth;
|
|
|
var _a = useDayPicker(), fromDate = _a.fromDate, toDate2 = _a.toDate, styles = _a.styles, locale2 = _a.locale, formatMonthCaption2 = _a.formatters.formatMonthCaption, classNames = _a.classNames, Dropdown2 = _a.components.Dropdown, labelMonthDropdown2 = _a.labels.labelMonthDropdown;
|
|
|
if (!fromDate && !toDate2) {
|
|
|
return React$1.createElement(React$1.Fragment, null);
|
|
|
}
|
|
|
var dropdownMonths = [];
|
|
|
if (fromDate && toDate2) {
|
|
|
if (isSameYear(fromDate, toDate2)) {
|
|
|
for (var month = fromDate.getMonth(); month <= toDate2.getMonth(); month++) {
|
|
|
dropdownMonths.push(setMonth(startOfMonth(fromDate), month));
|
|
|
}
|
|
|
} else {
|
|
|
for (var month = 0; month <= 11; month++) {
|
|
|
var anyDate = new Date();
|
|
|
dropdownMonths.push(setMonth(startOfMonth(anyDate), month));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
var handleChange = function(e) {
|
|
|
var newMonth = setMonth(new Date(displayMonth), Number(e.target.value));
|
|
|
props.onChange(newMonth);
|
|
|
};
|
|
|
return React$1.createElement(Dropdown2, { "aria-label": labelMonthDropdown2(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getMonth(), caption: formatMonthCaption2(displayMonth, { locale: locale2 }) }, dropdownMonths.map(function(m2) {
|
|
|
return React$1.createElement("option", { key: m2.getMonth(), value: m2.getMonth() }, formatMonthCaption2(m2, { locale: locale2 }));
|
|
|
}));
|
|
|
}
|
|
|
var Button = React$1.forwardRef(function(props, ref) {
|
|
|
var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles;
|
|
|
var classNamesArr = [classNames.button_reset, classNames.button];
|
|
|
if (props.className) {
|
|
|
classNamesArr.push(props.className);
|
|
|
}
|
|
|
var className = classNamesArr.join(" ");
|
|
|
var style = __assign(__assign({}, styles.button_reset), styles.button);
|
|
|
if (props.style) {
|
|
|
Object.assign(style, props.style);
|
|
|
}
|
|
|
return React$1.createElement("button", __assign({}, props, { ref, type: "button", className, style }));
|
|
|
});
|
|
|
function Navigation(props) {
|
|
|
var _a;
|
|
|
var _b = useDayPicker(), dir = _b.dir, locale2 = _b.locale, classNames = _b.classNames, styles = _b.styles, _c = _b.labels, labelPrevious2 = _c.labelPrevious, labelNext2 = _c.labelNext, _d = _b.components, IconRight2 = _d.IconRight, IconLeft2 = _d.IconLeft;
|
|
|
var onPreviousClick = props.onPreviousClick, onNextClick = props.onNextClick;
|
|
|
if (dir === "rtl") {
|
|
|
_a = [onPreviousClick, onNextClick], onNextClick = _a[0], onPreviousClick = _a[1];
|
|
|
}
|
|
|
var previousMonth = props.previousMonth, nextMonth = props.nextMonth;
|
|
|
var previousLabel = labelPrevious2(previousMonth, { locale: locale2 });
|
|
|
var previousClassName = [
|
|
|
classNames.nav_button,
|
|
|
classNames.nav_button_previous
|
|
|
].join(" ");
|
|
|
var nextLabel = labelNext2(nextMonth, { locale: locale2 });
|
|
|
var nextClassName = [
|
|
|
classNames.nav_button,
|
|
|
classNames.nav_button_next
|
|
|
].join(" ");
|
|
|
if (!nextMonth && !previousMonth) {
|
|
|
return React$1.createElement(React$1.Fragment, null);
|
|
|
}
|
|
|
return React$1.createElement("div", { className: classNames.nav, style: styles.nav }, !props.hidePrevious && React$1.createElement(Button, { "aria-label": previousLabel, className: previousClassName, style: styles.nav_button_next, disabled: !previousMonth, onClick: dir === "rtl" ? onNextClick : onPreviousClick }, dir === "rtl" ? React$1.createElement(IconRight2, { className: classNames.nav_icon, style: styles.nav_icon }) : React$1.createElement(IconLeft2, { className: classNames.nav_icon, style: styles.nav_icon })), !props.hideNext && React$1.createElement(Button, { "aria-label": nextLabel, className: nextClassName, style: styles.nav_button_next, disabled: !nextMonth, onClick: dir === "rtl" ? onPreviousClick : onNextClick }, dir === "rtl" ? React$1.createElement(IconLeft2, { className: classNames.nav_icon, style: styles.nav_icon }) : React$1.createElement(IconRight2, { className: classNames.nav_icon, style: styles.nav_icon })));
|
|
|
}
|
|
|
function YearsDropdown(props) {
|
|
|
var displayMonth = props.displayMonth;
|
|
|
var _a = useDayPicker(), fromDate = _a.fromDate, toDate2 = _a.toDate, locale2 = _a.locale, styles = _a.styles, classNames = _a.classNames, Dropdown2 = _a.components.Dropdown, formatYearCaption2 = _a.formatters.formatYearCaption, labelYearDropdown2 = _a.labels.labelYearDropdown;
|
|
|
var years = [];
|
|
|
if (fromDate && toDate2) {
|
|
|
var fromYear = fromDate.getFullYear();
|
|
|
var toYear = toDate2.getFullYear();
|
|
|
for (var year = fromYear; year <= toYear; year++) {
|
|
|
years.push(setYear(startOfYear(new Date()), year));
|
|
|
}
|
|
|
}
|
|
|
var handleChange = function(e) {
|
|
|
var newMonth = setYear(new Date(displayMonth), Number(e.target.value));
|
|
|
props.onChange(newMonth);
|
|
|
};
|
|
|
return React$1.createElement(Dropdown2, { "aria-label": labelYearDropdown2(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getFullYear(), caption: formatYearCaption2(displayMonth, { locale: locale2 }) }, years.map(function(year2) {
|
|
|
return React$1.createElement("option", { key: year2.getFullYear(), value: year2.getFullYear() }, formatYearCaption2(year2, { locale: locale2 }));
|
|
|
}));
|
|
|
}
|
|
|
function useControlledValue(defaultValue, controlledValue) {
|
|
|
var _a = React$1.useState(defaultValue), uncontrolledValue = _a[0], setValue = _a[1];
|
|
|
var value = controlledValue === void 0 ? uncontrolledValue : controlledValue;
|
|
|
return [value, setValue];
|
|
|
}
|
|
|
function getInitialMonth(context) {
|
|
|
var month = context.month, defaultMonth = context.defaultMonth, today = context.today;
|
|
|
var initialMonth = month || defaultMonth || today || new Date();
|
|
|
var toDate2 = context.toDate, fromDate = context.fromDate, _a = context.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
|
|
|
if (toDate2 && differenceInCalendarMonths(toDate2, initialMonth) < 0) {
|
|
|
var offset2 = -1 * (numberOfMonths - 1);
|
|
|
initialMonth = addMonths(toDate2, offset2);
|
|
|
}
|
|
|
if (fromDate && differenceInCalendarMonths(initialMonth, fromDate) < 0) {
|
|
|
initialMonth = fromDate;
|
|
|
}
|
|
|
return startOfMonth(initialMonth);
|
|
|
}
|
|
|
function useNavigationState() {
|
|
|
var context = useDayPicker();
|
|
|
var initialMonth = getInitialMonth(context);
|
|
|
var _a = useControlledValue(initialMonth, context.month), month = _a[0], setMonth2 = _a[1];
|
|
|
var goToMonth = function(date) {
|
|
|
if (context.disableNavigation)
|
|
|
return;
|
|
|
setMonth2(date);
|
|
|
};
|
|
|
return [month, goToMonth];
|
|
|
}
|
|
|
function getDisplayMonths(month, _a) {
|
|
|
var reverseMonths = _a.reverseMonths, numberOfMonths = _a.numberOfMonths;
|
|
|
var start2 = startOfMonth(month);
|
|
|
var end2 = startOfMonth(addMonths(start2, numberOfMonths));
|
|
|
var monthsDiff = differenceInCalendarMonths(end2, start2);
|
|
|
var months = [];
|
|
|
for (var i = 0; i < monthsDiff; i++) {
|
|
|
var nextMonth = addMonths(start2, i);
|
|
|
months.push(nextMonth);
|
|
|
}
|
|
|
if (reverseMonths)
|
|
|
months = months.reverse();
|
|
|
return months;
|
|
|
}
|
|
|
function getNextMonth(startingMonth, options) {
|
|
|
if (options.disableNavigation) {
|
|
|
return void 0;
|
|
|
}
|
|
|
var toDate2 = options.toDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
|
|
|
var offset2 = pagedNavigation ? numberOfMonths : 1;
|
|
|
var month = startOfMonth(startingMonth);
|
|
|
if (!toDate2) {
|
|
|
return addMonths(month, offset2);
|
|
|
}
|
|
|
var monthsDiff = differenceInCalendarMonths(toDate2, startingMonth);
|
|
|
if (monthsDiff < numberOfMonths) {
|
|
|
return void 0;
|
|
|
}
|
|
|
return addMonths(month, offset2);
|
|
|
}
|
|
|
function getPreviousMonth(startingMonth, options) {
|
|
|
if (options.disableNavigation) {
|
|
|
return void 0;
|
|
|
}
|
|
|
var fromDate = options.fromDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
|
|
|
var offset2 = pagedNavigation ? numberOfMonths : 1;
|
|
|
var month = startOfMonth(startingMonth);
|
|
|
if (!fromDate) {
|
|
|
return addMonths(month, -offset2);
|
|
|
}
|
|
|
var monthsDiff = differenceInCalendarMonths(month, fromDate);
|
|
|
if (monthsDiff <= 0) {
|
|
|
return void 0;
|
|
|
}
|
|
|
return addMonths(month, -offset2);
|
|
|
}
|
|
|
var NavigationContext = React$1.createContext(void 0);
|
|
|
function NavigationProvider(props) {
|
|
|
var context = useDayPicker();
|
|
|
var _a = useNavigationState(), month = _a[0], goToMonth = _a[1];
|
|
|
var displayMonths = getDisplayMonths(month, context);
|
|
|
var nextMonth = getNextMonth(month, context);
|
|
|
var previousMonth = getPreviousMonth(month, context);
|
|
|
return React$1.createElement(NavigationContext.Provider, { value: {
|
|
|
month,
|
|
|
displayMonths,
|
|
|
goToMonth,
|
|
|
previousMonth,
|
|
|
nextMonth
|
|
|
} }, props.children);
|
|
|
}
|
|
|
function useNavigation() {
|
|
|
var context = React$1.useContext(NavigationContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useNavigation must be used within a NavigationProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function Caption(props) {
|
|
|
var _a;
|
|
|
var displayMonth = props.displayMonth;
|
|
|
var context = useDayPicker();
|
|
|
var classNames = context.classNames, numberOfMonths = context.numberOfMonths, disableNavigation = context.disableNavigation, styles = context.styles, captionLayout = context.captionLayout, onMonthChange = context.onMonthChange, dir = context.dir, CaptionLabel2 = context.components.CaptionLabel;
|
|
|
var _b = useNavigation(), previousMonth = _b.previousMonth, nextMonth = _b.nextMonth, goToMonth = _b.goToMonth, displayMonths = _b.displayMonths;
|
|
|
var handlePreviousClick = function() {
|
|
|
if (!previousMonth)
|
|
|
return;
|
|
|
goToMonth(previousMonth);
|
|
|
onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(previousMonth);
|
|
|
};
|
|
|
var handleNextClick = function() {
|
|
|
if (!nextMonth)
|
|
|
return;
|
|
|
goToMonth(nextMonth);
|
|
|
onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(nextMonth);
|
|
|
};
|
|
|
var handleMonthChange = function(newMonth) {
|
|
|
goToMonth(newMonth);
|
|
|
onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(newMonth);
|
|
|
};
|
|
|
var displayIndex = displayMonths.findIndex(function(month) {
|
|
|
return isSameMonth(displayMonth, month);
|
|
|
});
|
|
|
var isFirst = displayIndex === 0;
|
|
|
var isLast = displayIndex === displayMonths.length - 1;
|
|
|
if (dir === "rtl") {
|
|
|
_a = [isFirst, isLast], isLast = _a[0], isFirst = _a[1];
|
|
|
}
|
|
|
var hideNext = numberOfMonths > 1 && (isFirst || !isLast);
|
|
|
var hidePrevious = numberOfMonths > 1 && (isLast || !isFirst);
|
|
|
var captionLabel = React$1.createElement(CaptionLabel2, { id: props.id, displayMonth });
|
|
|
var captionContent;
|
|
|
if (disableNavigation) {
|
|
|
captionContent = captionLabel;
|
|
|
} else if (captionLayout === "dropdown") {
|
|
|
captionContent = React$1.createElement("div", { className: classNames.caption_dropdowns, style: styles.caption_dropdowns }, React$1.createElement("div", { className: classNames.vhidden }, captionLabel), React$1.createElement(MonthsDropdown, { onChange: handleMonthChange, displayMonth }), React$1.createElement(YearsDropdown, { onChange: handleMonthChange, displayMonth }));
|
|
|
} else {
|
|
|
captionContent = React$1.createElement(React$1.Fragment, null, captionLabel, React$1.createElement(Navigation, { displayMonth, hideNext, hidePrevious, nextMonth, previousMonth, onPreviousClick: handlePreviousClick, onNextClick: handleNextClick }));
|
|
|
}
|
|
|
return React$1.createElement("div", { className: classNames.caption, style: styles.caption }, captionContent);
|
|
|
}
|
|
|
function CaptionLabel(props) {
|
|
|
var _a = useDayPicker(), locale2 = _a.locale, classNames = _a.classNames, styles = _a.styles, formatCaption2 = _a.formatters.formatCaption;
|
|
|
return React$1.createElement("h2", { className: classNames.caption_label, style: styles.caption_label, "aria-live": "polite", "aria-atomic": "true", id: props.id }, formatCaption2(props.displayMonth, { locale: locale2 }));
|
|
|
}
|
|
|
function isDayPickerMultiple(props) {
|
|
|
return props.mode === "multiple";
|
|
|
}
|
|
|
var SelectMultipleContext = React$1.createContext(void 0);
|
|
|
function SelectMultipleProvider(props) {
|
|
|
if (!isDayPickerMultiple(props.initialProps)) {
|
|
|
var emptyContextValue = {
|
|
|
selected: void 0,
|
|
|
modifiers: {
|
|
|
disabled: []
|
|
|
}
|
|
|
};
|
|
|
return React$1.createElement(SelectMultipleContext.Provider, { value: emptyContextValue }, props.children);
|
|
|
}
|
|
|
return React$1.createElement(SelectMultipleProviderInternal, { initialProps: props.initialProps, children: props.children });
|
|
|
}
|
|
|
function SelectMultipleProviderInternal(_a) {
|
|
|
var initialProps = _a.initialProps, children = _a.children;
|
|
|
var selected = initialProps.selected;
|
|
|
var onDayClick = function(day, modifiers2, e) {
|
|
|
var _a2, _b;
|
|
|
(_a2 = initialProps.onDayClick) === null || _a2 === void 0 ? void 0 : _a2.call(initialProps, day, modifiers2, e);
|
|
|
var isMinSelected = Boolean(initialProps.min && modifiers2.selected && selected && selected.length === initialProps.min);
|
|
|
if (isMinSelected) {
|
|
|
return;
|
|
|
}
|
|
|
var isMaxSelected = Boolean(initialProps.max && !modifiers2.selected && selected && selected.length === initialProps.max);
|
|
|
if (isMaxSelected) {
|
|
|
return;
|
|
|
}
|
|
|
var days = selected ? __spreadArray([], selected, true) : [];
|
|
|
if (modifiers2.selected) {
|
|
|
var index = days.findIndex(function(selectedDay) {
|
|
|
return isSameDay(day, selectedDay);
|
|
|
});
|
|
|
days.splice(index, 1);
|
|
|
} else {
|
|
|
days.push(day);
|
|
|
}
|
|
|
(_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, days, day, modifiers2, e);
|
|
|
};
|
|
|
var modifiers = {
|
|
|
disabled: []
|
|
|
};
|
|
|
if (selected) {
|
|
|
modifiers.disabled = [
|
|
|
function disableDay(day) {
|
|
|
var isMaxSelected = initialProps.max && selected && selected.length > initialProps.max - 1;
|
|
|
var isSelected = selected === null || selected === void 0 ? void 0 : selected.some(function(selectedDay) {
|
|
|
return isSameDay(selectedDay, day);
|
|
|
});
|
|
|
return Boolean(isMaxSelected && !isSelected);
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
var contextValue = { selected, onDayClick, modifiers };
|
|
|
return React$1.createElement(SelectMultipleContext.Provider, { value: contextValue }, children);
|
|
|
}
|
|
|
function useSelectMultiple() {
|
|
|
var context = React$1.useContext(SelectMultipleContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useSelectMultiple must be used within a SelectMultipleProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function isDayPickerRange(props) {
|
|
|
return props.mode === "range";
|
|
|
}
|
|
|
function addToRange(day, range) {
|
|
|
var _a = range || {}, from = _a.from, to = _a.to;
|
|
|
if (!from) {
|
|
|
return { from: day, to: day };
|
|
|
}
|
|
|
if (!to && isSameDay(from, day)) {
|
|
|
return void 0;
|
|
|
}
|
|
|
if (!to && isBefore(day, from)) {
|
|
|
return { from: day, to: from };
|
|
|
}
|
|
|
if (!to) {
|
|
|
return { from, to: day };
|
|
|
}
|
|
|
if (isSameDay(to, day) && isSameDay(from, day)) {
|
|
|
return void 0;
|
|
|
}
|
|
|
if (isSameDay(to, day)) {
|
|
|
return { from: to, to };
|
|
|
}
|
|
|
if (isSameDay(from, day)) {
|
|
|
return void 0;
|
|
|
}
|
|
|
if (isAfter(from, day)) {
|
|
|
return { from: day, to };
|
|
|
}
|
|
|
return { from, to: day };
|
|
|
}
|
|
|
var SelectRangeContext = React$1.createContext(void 0);
|
|
|
function SelectRangeProvider(props) {
|
|
|
if (!isDayPickerRange(props.initialProps)) {
|
|
|
var emptyContextValue = {
|
|
|
selected: void 0,
|
|
|
modifiers: {
|
|
|
range_start: [],
|
|
|
range_end: [],
|
|
|
range_middle: [],
|
|
|
disabled: []
|
|
|
}
|
|
|
};
|
|
|
return React$1.createElement(SelectRangeContext.Provider, { value: emptyContextValue }, props.children);
|
|
|
}
|
|
|
return React$1.createElement(SelectRangeProviderInternal, { initialProps: props.initialProps, children: props.children });
|
|
|
}
|
|
|
function SelectRangeProviderInternal(_a) {
|
|
|
var initialProps = _a.initialProps, children = _a.children;
|
|
|
var selected = initialProps.selected;
|
|
|
var min2 = initialProps.min;
|
|
|
var max2 = initialProps.max;
|
|
|
var onDayClick = function(day, modifiers2, e) {
|
|
|
var _a2, _b;
|
|
|
(_a2 = initialProps.onDayClick) === null || _a2 === void 0 ? void 0 : _a2.call(initialProps, day, modifiers2, e);
|
|
|
var newValue = addToRange(day, selected);
|
|
|
if ((min2 || max2) && selected && (newValue === null || newValue === void 0 ? void 0 : newValue.to) && newValue.from && newValue.from !== newValue.to) {
|
|
|
var diff = Math.abs(differenceInCalendarDays(newValue === null || newValue === void 0 ? void 0 : newValue.to, newValue === null || newValue === void 0 ? void 0 : newValue.from));
|
|
|
if (min2 && diff < min2) {
|
|
|
return;
|
|
|
}
|
|
|
if (max2 && diff >= max2) {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
(_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, newValue, day, modifiers2, e);
|
|
|
};
|
|
|
var modifiers = {
|
|
|
range_start: [],
|
|
|
range_end: [],
|
|
|
range_middle: [],
|
|
|
disabled: []
|
|
|
};
|
|
|
if (selected) {
|
|
|
if (selected.from) {
|
|
|
modifiers.range_start = [selected.from];
|
|
|
if (selected.to) {
|
|
|
modifiers.range_middle = [
|
|
|
{
|
|
|
after: selected.from,
|
|
|
before: selected.to
|
|
|
}
|
|
|
];
|
|
|
if (max2 || min2) {
|
|
|
modifiers.disabled = [
|
|
|
function(date) {
|
|
|
if (max2 && selected.to && selected.from && isBefore(date, selected.from)) {
|
|
|
var diff = differenceInCalendarDays(selected.to, date);
|
|
|
if (diff >= max2) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
if (max2 && selected.to && selected.from && isAfter(date, selected.to)) {
|
|
|
var diff = differenceInCalendarDays(date, selected.from);
|
|
|
if (diff >= max2) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
if (min2 && selected.from && isBefore(date, selected.from)) {
|
|
|
var diff = differenceInCalendarDays(selected.from, date);
|
|
|
if (diff < min2) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
if (min2 && selected.to && selected.from && isAfter(date, selected.to)) {
|
|
|
var diff = differenceInCalendarDays(date, selected.from);
|
|
|
if (diff < min2) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
modifiers.range_end = [selected.to];
|
|
|
} else {
|
|
|
modifiers.range_end = [selected.from];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return React$1.createElement(SelectRangeContext.Provider, { value: { selected, onDayClick, modifiers } }, children);
|
|
|
}
|
|
|
function useSelectRange() {
|
|
|
var context = React$1.useContext(SelectRangeContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useSelectRange must be used within a SelectRangeProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function isDayPickerSingle(props) {
|
|
|
return props.mode === "single";
|
|
|
}
|
|
|
var SelectSingleContext = React$1.createContext(void 0);
|
|
|
function SelectSingleProvider(props) {
|
|
|
if (!isDayPickerSingle(props.initialProps)) {
|
|
|
var emptyContextValue = {
|
|
|
selected: void 0
|
|
|
};
|
|
|
return React$1.createElement(SelectSingleContext.Provider, { value: emptyContextValue }, props.children);
|
|
|
}
|
|
|
return React$1.createElement(SelectSingleProviderInternal, { initialProps: props.initialProps, children: props.children });
|
|
|
}
|
|
|
function SelectSingleProviderInternal(_a) {
|
|
|
var initialProps = _a.initialProps, children = _a.children;
|
|
|
var onDayClick = function(day, dayModifiers, e) {
|
|
|
var _a2, _b;
|
|
|
if (dayModifiers.selected && !initialProps.required) {
|
|
|
(_a2 = initialProps.onSelect) === null || _a2 === void 0 ? void 0 : _a2.call(initialProps, void 0, day, dayModifiers, e);
|
|
|
return;
|
|
|
}
|
|
|
(_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, day, day, dayModifiers, e);
|
|
|
};
|
|
|
var contextValue = {
|
|
|
selected: initialProps.selected,
|
|
|
onDayClick
|
|
|
};
|
|
|
return React$1.createElement(SelectSingleContext.Provider, { value: contextValue }, children);
|
|
|
}
|
|
|
function useSelectSingle() {
|
|
|
var context = React$1.useContext(SelectSingleContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useSelectSingle must be used within a SelectSingleProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function toMatcherArray(modifierFromProp) {
|
|
|
if (Array.isArray(modifierFromProp)) {
|
|
|
return modifierFromProp;
|
|
|
} else if (modifierFromProp !== void 0) {
|
|
|
return [modifierFromProp];
|
|
|
} else {
|
|
|
return [];
|
|
|
}
|
|
|
}
|
|
|
function getCustomModifiers(dayPicker) {
|
|
|
var customModifiers = {};
|
|
|
Object.entries(dayPicker.modifiers).forEach(function(_a) {
|
|
|
var modifier = _a[0], matcher = _a[1];
|
|
|
customModifiers[modifier] = toMatcherArray(matcher);
|
|
|
});
|
|
|
return customModifiers;
|
|
|
}
|
|
|
var InternalModifier;
|
|
|
(function(InternalModifier2) {
|
|
|
InternalModifier2["Disabled"] = "disabled";
|
|
|
InternalModifier2["Selected"] = "selected";
|
|
|
InternalModifier2["Hidden"] = "hidden";
|
|
|
InternalModifier2["Today"] = "today";
|
|
|
InternalModifier2["RangeStart"] = "range_start";
|
|
|
InternalModifier2["RangeEnd"] = "range_end";
|
|
|
InternalModifier2["RangeMiddle"] = "range_middle";
|
|
|
})(InternalModifier || (InternalModifier = {}));
|
|
|
function getInternalModifiers(dayPicker, selectMultiple, selectRange) {
|
|
|
var _a;
|
|
|
var internalModifiers = (_a = {}, _a[InternalModifier.Selected] = toMatcherArray(dayPicker.selected), _a[InternalModifier.Disabled] = toMatcherArray(dayPicker.disabled), _a[InternalModifier.Hidden] = toMatcherArray(dayPicker.hidden), _a[InternalModifier.Today] = [dayPicker.today], _a[InternalModifier.RangeEnd] = [], _a[InternalModifier.RangeMiddle] = [], _a[InternalModifier.RangeStart] = [], _a);
|
|
|
if (dayPicker.fromDate) {
|
|
|
internalModifiers.disabled.push({ before: dayPicker.fromDate });
|
|
|
}
|
|
|
if (dayPicker.toDate) {
|
|
|
internalModifiers.disabled.push({ after: dayPicker.toDate });
|
|
|
}
|
|
|
if (isDayPickerMultiple(dayPicker)) {
|
|
|
internalModifiers.disabled = internalModifiers.disabled.concat(selectMultiple.modifiers.disabled);
|
|
|
} else if (isDayPickerRange(dayPicker)) {
|
|
|
internalModifiers.disabled = internalModifiers.disabled.concat(selectRange.modifiers.disabled);
|
|
|
internalModifiers.range_start = selectRange.modifiers.range_start;
|
|
|
internalModifiers.range_middle = selectRange.modifiers.range_middle;
|
|
|
internalModifiers.range_end = selectRange.modifiers.range_end;
|
|
|
}
|
|
|
return internalModifiers;
|
|
|
}
|
|
|
var ModifiersContext = React$1.createContext(void 0);
|
|
|
function ModifiersProvider(props) {
|
|
|
var dayPicker = useDayPicker();
|
|
|
var selectMultiple = useSelectMultiple();
|
|
|
var selectRange = useSelectRange();
|
|
|
var internalModifiers = getInternalModifiers(dayPicker, selectMultiple, selectRange);
|
|
|
var customModifiers = getCustomModifiers(dayPicker);
|
|
|
var modifiers = __assign(__assign({}, internalModifiers), customModifiers);
|
|
|
return React$1.createElement(ModifiersContext.Provider, { value: modifiers }, props.children);
|
|
|
}
|
|
|
function useModifiers() {
|
|
|
var context = React$1.useContext(ModifiersContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useModifiers must be used within a ModifiersProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function isDateInterval(matcher) {
|
|
|
return Boolean(matcher && typeof matcher === "object" && "before" in matcher && "after" in matcher);
|
|
|
}
|
|
|
function isDateRange(value) {
|
|
|
return Boolean(value && typeof value === "object" && "from" in value);
|
|
|
}
|
|
|
function isDateAfterType(value) {
|
|
|
return Boolean(value && typeof value === "object" && "after" in value);
|
|
|
}
|
|
|
function isDateBeforeType(value) {
|
|
|
return Boolean(value && typeof value === "object" && "before" in value);
|
|
|
}
|
|
|
function isDayOfWeekType(value) {
|
|
|
return Boolean(value && typeof value === "object" && "dayOfWeek" in value);
|
|
|
}
|
|
|
function isDateInRange(date, range) {
|
|
|
var _a;
|
|
|
var from = range.from, to = range.to;
|
|
|
if (!from) {
|
|
|
return false;
|
|
|
}
|
|
|
if (!to && isSameDay(from, date)) {
|
|
|
return true;
|
|
|
}
|
|
|
if (!to) {
|
|
|
return false;
|
|
|
}
|
|
|
var isToBeforeFrom = differenceInCalendarDays(to, from) < 0;
|
|
|
if (to && isToBeforeFrom) {
|
|
|
_a = [to, from], from = _a[0], to = _a[1];
|
|
|
}
|
|
|
return differenceInCalendarDays(date, from) >= 0 && differenceInCalendarDays(to, date) >= 0;
|
|
|
}
|
|
|
function isDateType(value) {
|
|
|
return isDate(value);
|
|
|
}
|
|
|
function isArrayOfDates(value) {
|
|
|
return Array.isArray(value) && value.every(isDate);
|
|
|
}
|
|
|
function isMatch(day, matchers) {
|
|
|
return matchers.some(function(matcher) {
|
|
|
if (typeof matcher === "boolean") {
|
|
|
return matcher;
|
|
|
}
|
|
|
if (isDateType(matcher)) {
|
|
|
return isSameDay(day, matcher);
|
|
|
}
|
|
|
if (isArrayOfDates(matcher)) {
|
|
|
return matcher.includes(day);
|
|
|
}
|
|
|
if (isDateRange(matcher)) {
|
|
|
return isDateInRange(day, matcher);
|
|
|
}
|
|
|
if (isDayOfWeekType(matcher)) {
|
|
|
return matcher.dayOfWeek.includes(day.getDay());
|
|
|
}
|
|
|
if (isDateInterval(matcher)) {
|
|
|
var isBefore2 = differenceInCalendarDays(matcher.before, day) > 0;
|
|
|
var isAfter2 = differenceInCalendarDays(day, matcher.after) > 0;
|
|
|
return isBefore2 && isAfter2;
|
|
|
}
|
|
|
if (isDateAfterType(matcher)) {
|
|
|
return differenceInCalendarDays(day, matcher.after) > 0;
|
|
|
}
|
|
|
if (isDateBeforeType(matcher)) {
|
|
|
return differenceInCalendarDays(matcher.before, day) > 0;
|
|
|
}
|
|
|
if (typeof matcher === "function") {
|
|
|
return matcher(day);
|
|
|
}
|
|
|
return false;
|
|
|
});
|
|
|
}
|
|
|
function getModifierStatus(date, modifiers) {
|
|
|
var modifiersList = Object.keys(modifiers).reduce(function(previousValue, key) {
|
|
|
var modifier = modifiers[key];
|
|
|
if (isMatch(date, modifier)) {
|
|
|
previousValue.push(key);
|
|
|
}
|
|
|
return previousValue;
|
|
|
}, []);
|
|
|
var modifiersStatus = {};
|
|
|
modifiersList.forEach(function(modifier) {
|
|
|
return modifiersStatus[modifier] = true;
|
|
|
});
|
|
|
return modifiersStatus;
|
|
|
}
|
|
|
function useDayModifiers(date) {
|
|
|
var context = useDayPicker();
|
|
|
var modifiersContext = useModifiers();
|
|
|
var modifiers = getModifierStatus(date, modifiersContext);
|
|
|
var modifierClassNames = [];
|
|
|
Object.keys(modifiers).forEach(function(modifier) {
|
|
|
var customClassName = context.modifierClassNames[modifier];
|
|
|
if (customClassName) {
|
|
|
modifierClassNames.push(customClassName);
|
|
|
} else {
|
|
|
modifierClassNames.push("" + context.modifierPrefix + modifier);
|
|
|
}
|
|
|
});
|
|
|
var modifierStyle = {};
|
|
|
if (context.modifierStyles) {
|
|
|
Object.keys(modifiers).forEach(function(modifier) {
|
|
|
var _a;
|
|
|
modifierStyle = __assign(__assign({}, modifierStyle), (_a = context.modifierStyles) === null || _a === void 0 ? void 0 : _a[modifier]);
|
|
|
});
|
|
|
}
|
|
|
return {
|
|
|
modifiers,
|
|
|
modifierClassNames,
|
|
|
modifierStyle
|
|
|
};
|
|
|
}
|
|
|
var isFocusable$1 = function(modifiers) {
|
|
|
return !modifiers.disabled && !modifiers.hidden;
|
|
|
};
|
|
|
function getInitialFocusTarget(displayMonths, modifiersContext) {
|
|
|
var firstDayInMonth = startOfMonth(displayMonths[0]);
|
|
|
var lastDayInMonth = endOfMonth(displayMonths[displayMonths.length - 1]);
|
|
|
var firstFocusableDay;
|
|
|
var today;
|
|
|
var date = firstDayInMonth;
|
|
|
while (date <= lastDayInMonth) {
|
|
|
var modifiers = getModifierStatus(date, modifiersContext);
|
|
|
if (!isFocusable$1(modifiers)) {
|
|
|
date = addDays(date, 1);
|
|
|
continue;
|
|
|
}
|
|
|
if (modifiers.selected) {
|
|
|
return date;
|
|
|
}
|
|
|
if (modifiers.today && !today) {
|
|
|
today = date;
|
|
|
}
|
|
|
if (!firstFocusableDay) {
|
|
|
firstFocusableDay = date;
|
|
|
}
|
|
|
date = addDays(date, 1);
|
|
|
}
|
|
|
if (today) {
|
|
|
return today;
|
|
|
} else {
|
|
|
return firstFocusableDay;
|
|
|
}
|
|
|
}
|
|
|
var FocusContext = React$1.createContext(void 0);
|
|
|
function FocusProvider(_a) {
|
|
|
var children = _a.children;
|
|
|
var _b = React$1.useState(), focusedDay = _b[0], setDay = _b[1];
|
|
|
var _c = useNavigation(), goToMonth = _c.goToMonth, displayMonths = _c.displayMonths;
|
|
|
var numberOfMonths = useDayPicker().numberOfMonths;
|
|
|
var modifiersContext = useModifiers();
|
|
|
var initialFocusTarget = getInitialFocusTarget(displayMonths, modifiersContext);
|
|
|
var _d = React$1.useState(), lastFocusedDay = _d[0], setLastFocusedDay = _d[1];
|
|
|
var isWithinDisplayMonths = function(date) {
|
|
|
return displayMonths.some(function(displayMonth) {
|
|
|
return isSameMonth(date, displayMonth);
|
|
|
});
|
|
|
};
|
|
|
var focusTarget = (focusedDay !== null && focusedDay !== void 0 ? focusedDay : lastFocusedDay && isWithinDisplayMonths(lastFocusedDay)) ? lastFocusedDay : initialFocusTarget;
|
|
|
var blur = function() {
|
|
|
setLastFocusedDay(focusedDay);
|
|
|
setDay(void 0);
|
|
|
};
|
|
|
var focus = function(date) {
|
|
|
return setDay(date);
|
|
|
};
|
|
|
var switchMonth = function(date, offset2) {
|
|
|
if (displayMonths.some(function(m2) {
|
|
|
return isSameMonth(date, m2);
|
|
|
}))
|
|
|
return;
|
|
|
if (offset2 < 0) {
|
|
|
goToMonth(addMonths(date, 1 + offset2));
|
|
|
} else {
|
|
|
goToMonth(date);
|
|
|
}
|
|
|
};
|
|
|
var focusDayBefore = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var before = addDays(focusedDay, -1);
|
|
|
focus(before);
|
|
|
switchMonth(before, numberOfMonths * -1);
|
|
|
};
|
|
|
var focusDayAfter = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var after = addDays(focusedDay, 1);
|
|
|
focus(after);
|
|
|
switchMonth(after, numberOfMonths);
|
|
|
};
|
|
|
var focusWeekBeforeDay = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var up = addWeeks(focusedDay, -1);
|
|
|
focus(up);
|
|
|
switchMonth(up, numberOfMonths * -1);
|
|
|
};
|
|
|
var focusWeekAfterDay = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var down = addWeeks(focusedDay, 1);
|
|
|
focus(down);
|
|
|
switchMonth(down, numberOfMonths);
|
|
|
};
|
|
|
var focusStartOfWeek = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var dayToFocus = startOfWeek(focusedDay);
|
|
|
switchMonth(dayToFocus, numberOfMonths);
|
|
|
focus(dayToFocus);
|
|
|
};
|
|
|
var focusEndOfWeek = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var dayToFocus = endOfWeek(focusedDay);
|
|
|
switchMonth(dayToFocus, numberOfMonths);
|
|
|
focus(dayToFocus);
|
|
|
};
|
|
|
var focusMonthBefore = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var monthBefore = addMonths(focusedDay, -1);
|
|
|
switchMonth(monthBefore, numberOfMonths);
|
|
|
focus(monthBefore);
|
|
|
};
|
|
|
var focusMonthAfter = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var monthAfter = addMonths(focusedDay, 1);
|
|
|
switchMonth(monthAfter, numberOfMonths);
|
|
|
focus(monthAfter);
|
|
|
};
|
|
|
var focusYearBefore = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var yearBefore = addYears(focusedDay, -1);
|
|
|
switchMonth(yearBefore, numberOfMonths);
|
|
|
focus(yearBefore);
|
|
|
};
|
|
|
var focusYearAfter = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var yearAfter = addYears(focusedDay, 1);
|
|
|
switchMonth(yearAfter, numberOfMonths);
|
|
|
focus(yearAfter);
|
|
|
};
|
|
|
var value = {
|
|
|
focusedDay,
|
|
|
focusTarget,
|
|
|
blur,
|
|
|
focus,
|
|
|
focusDayAfter,
|
|
|
focusDayBefore,
|
|
|
focusWeekAfterDay,
|
|
|
focusWeekBeforeDay,
|
|
|
focusMonthBefore,
|
|
|
focusMonthAfter,
|
|
|
focusYearBefore,
|
|
|
focusYearAfter,
|
|
|
focusStartOfWeek,
|
|
|
focusEndOfWeek
|
|
|
};
|
|
|
return React$1.createElement(FocusContext.Provider, { value }, children);
|
|
|
}
|
|
|
function useFocus() {
|
|
|
var context = React$1.useContext(FocusContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useFocus must be used within a FocusProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function useDayFocus(date, buttonRef) {
|
|
|
var _a = useFocus(), focusedDay = _a.focusedDay, focusTarget = _a.focusTarget, focusDayAfter = _a.focusDayAfter, focusDayBefore = _a.focusDayBefore, focusWeekAfterDay = _a.focusWeekAfterDay, focusWeekBeforeDay = _a.focusWeekBeforeDay, blur = _a.blur, focus = _a.focus, focusMonthBefore = _a.focusMonthBefore, focusMonthAfter = _a.focusMonthAfter, focusYearBefore = _a.focusYearBefore, focusYearAfter = _a.focusYearAfter, focusStartOfWeek = _a.focusStartOfWeek, focusEndOfWeek = _a.focusEndOfWeek;
|
|
|
var dir = useDayPicker().dir;
|
|
|
React$1.useEffect(function() {
|
|
|
var _a2;
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
if (isSameDay(focusedDay, date)) {
|
|
|
(_a2 = buttonRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();
|
|
|
}
|
|
|
}, [focusedDay, date, buttonRef]);
|
|
|
var focusOnKeyDown = function(e) {
|
|
|
switch (e.key) {
|
|
|
case "ArrowLeft":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
dir === "rtl" ? focusDayAfter() : focusDayBefore();
|
|
|
break;
|
|
|
case "ArrowRight":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
dir === "rtl" ? focusDayBefore() : focusDayAfter();
|
|
|
break;
|
|
|
case "ArrowDown":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
focusWeekAfterDay();
|
|
|
break;
|
|
|
case "ArrowUp":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
focusWeekBeforeDay();
|
|
|
break;
|
|
|
case "PageUp":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
e.shiftKey ? focusYearBefore() : focusMonthBefore();
|
|
|
break;
|
|
|
case "PageDown":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
e.shiftKey ? focusYearAfter() : focusMonthAfter();
|
|
|
break;
|
|
|
case "Home":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
focusStartOfWeek();
|
|
|
break;
|
|
|
case "End":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
focusEndOfWeek();
|
|
|
break;
|
|
|
}
|
|
|
};
|
|
|
var isFocusTarget = Boolean(focusTarget && isSameDay(focusTarget, date));
|
|
|
return { focus, blur, focusOnKeyDown, isFocusTarget };
|
|
|
}
|
|
|
function useDay(date, displayMonth, buttonRef) {
|
|
|
var context = useDayPicker();
|
|
|
var single = useSelectSingle();
|
|
|
var multiple = useSelectMultiple();
|
|
|
var range = useSelectRange();
|
|
|
var _a = useDayFocus(date, buttonRef), focus = _a.focus, blur = _a.blur, focusOnKeyDown = _a.focusOnKeyDown, isFocusTarget = _a.isFocusTarget;
|
|
|
var _b = useDayModifiers(date), modifiers = _b.modifiers, modifierClassNames = _b.modifierClassNames, modifierStyle = _b.modifierStyle;
|
|
|
var isOutside = !isSameMonth(date, displayMonth);
|
|
|
var returnValue = {
|
|
|
isOutside,
|
|
|
modifiers,
|
|
|
selected: isDayPickerSingle(context) ? single.selected : isDayPickerMultiple(context) ? multiple.selected : isDayPickerRange(context) ? range.selected : void 0,
|
|
|
single,
|
|
|
multiple,
|
|
|
range
|
|
|
};
|
|
|
if (isOutside && !context.showOutsideDays) {
|
|
|
return returnValue;
|
|
|
}
|
|
|
if (modifiers.hidden) {
|
|
|
return returnValue;
|
|
|
}
|
|
|
var classNames = [context.classNames.day].concat(modifierClassNames);
|
|
|
var style = __assign(__assign({}, context.styles.day), modifierStyle);
|
|
|
if (isOutside) {
|
|
|
classNames.push(context.classNames.day_outside);
|
|
|
style = __assign(__assign({}, context.styles), context.styles.day_outside);
|
|
|
}
|
|
|
var DayContent2 = context.components.DayContent;
|
|
|
var children = React$1.createElement(DayContent2, { date, displayMonth, modifiers });
|
|
|
var className = classNames.join(" ");
|
|
|
if (!context.mode && !context.onDayClick) {
|
|
|
return __assign(__assign({}, returnValue), { nonInteractiveProps: {
|
|
|
style,
|
|
|
className,
|
|
|
children
|
|
|
} });
|
|
|
}
|
|
|
var handleClick = function(e) {
|
|
|
var _a2, _b2, _c, _d;
|
|
|
if (isDayPickerSingle(context)) {
|
|
|
(_a2 = single.onDayClick) === null || _a2 === void 0 ? void 0 : _a2.call(single, date, modifiers, e);
|
|
|
} else if (isDayPickerMultiple(context)) {
|
|
|
(_b2 = multiple.onDayClick) === null || _b2 === void 0 ? void 0 : _b2.call(multiple, date, modifiers, e);
|
|
|
} else if (isDayPickerRange(context)) {
|
|
|
(_c = range.onDayClick) === null || _c === void 0 ? void 0 : _c.call(range, date, modifiers, e);
|
|
|
}
|
|
|
(_d = context.onDayClick) === null || _d === void 0 ? void 0 : _d.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleFocus = function(e) {
|
|
|
var _a2;
|
|
|
focus(date);
|
|
|
(_a2 = context.onDayFocus) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleBlur = function(e) {
|
|
|
var _a2;
|
|
|
blur();
|
|
|
(_a2 = context.onDayBlur) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleKeyDown = function(e) {
|
|
|
var _a2;
|
|
|
focusOnKeyDown(e);
|
|
|
(_a2 = context.onDayKeyDown) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleKeyUp = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayKeyUp) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleMouseEnter = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayMouseEnter) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleMouseLeave = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayMouseLeave) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleTouchCancel = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayTouchCancel) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleTouchEnd = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayTouchEnd) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleTouchMove = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayTouchMove) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleTouchStart = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayTouchStart) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
if (isOutside) {
|
|
|
classNames.push(context.classNames.day_outside);
|
|
|
style = __assign(__assign({}, context.styles), context.styles.day_outside);
|
|
|
}
|
|
|
className = classNames.join(" ");
|
|
|
var selected = modifiers.selected, disabled = modifiers.disabled;
|
|
|
var tabIndex = isFocusTarget ? 0 : -1;
|
|
|
return __assign(__assign({}, returnValue), { buttonProps: {
|
|
|
children,
|
|
|
"aria-pressed": selected,
|
|
|
style,
|
|
|
disabled,
|
|
|
className,
|
|
|
tabIndex,
|
|
|
onClick: handleClick,
|
|
|
onFocus: handleFocus,
|
|
|
onBlur: handleBlur,
|
|
|
onKeyDown: handleKeyDown,
|
|
|
onKeyUp: handleKeyUp,
|
|
|
onMouseEnter: handleMouseEnter,
|
|
|
onMouseLeave: handleMouseLeave,
|
|
|
onTouchCancel: handleTouchCancel,
|
|
|
onTouchEnd: handleTouchEnd,
|
|
|
onTouchMove: handleTouchMove,
|
|
|
onTouchStart: handleTouchStart
|
|
|
} });
|
|
|
}
|
|
|
function Day(props) {
|
|
|
var buttonRef = React$1.useRef(null);
|
|
|
var day = useDay(props.date, props.displayMonth, buttonRef);
|
|
|
var buttonProps = day.buttonProps, nonInteractiveProps = day.nonInteractiveProps;
|
|
|
if (!buttonProps && !nonInteractiveProps) {
|
|
|
return React$1.createElement(React$1.Fragment, null);
|
|
|
}
|
|
|
if (nonInteractiveProps) {
|
|
|
return React$1.createElement("div", __assign({}, nonInteractiveProps));
|
|
|
}
|
|
|
return React$1.createElement(Button, __assign({ ref: buttonRef }, buttonProps));
|
|
|
}
|
|
|
function DayContent(props) {
|
|
|
var _a = useDayPicker(), locale2 = _a.locale, classNames = _a.classNames, styles = _a.styles, labelDay2 = _a.labels.labelDay, formatDay2 = _a.formatters.formatDay;
|
|
|
return React$1.createElement(React$1.Fragment, null, React$1.createElement("span", { "aria-hidden": "true" }, formatDay2(props.date, { locale: locale2 })), React$1.createElement("span", { className: classNames.vhidden, style: styles.vhidden }, labelDay2(props.date, props.modifiers, { locale: locale2 })));
|
|
|
}
|
|
|
function Dropdown(props) {
|
|
|
var onChange = props.onChange, value = props.value, children = props.children, caption = props.caption, className = props.className, style = props.style;
|
|
|
var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles, IconDropdown2 = _a.components.IconDropdown;
|
|
|
return React$1.createElement("div", { className, style }, React$1.createElement("span", { className: classNames.vhidden }, props["aria-label"]), React$1.createElement("select", { "aria-label": props["aria-label"], className: classNames.dropdown, style: styles.dropdown, value, onChange }, children), React$1.createElement("div", { className: classNames.caption_label, style: styles.caption_label, "aria-hidden": "true" }, caption, React$1.createElement(IconDropdown2, { className: classNames.dropdown_icon, style: styles.dropdown_icon })));
|
|
|
}
|
|
|
function Footer() {
|
|
|
var _a = useDayPicker(), footer = _a.footer, styles = _a.styles, tfoot = _a.classNames.tfoot;
|
|
|
if (!footer)
|
|
|
return React$1.createElement(React$1.Fragment, null);
|
|
|
return React$1.createElement("tfoot", { className: tfoot, style: styles.tfoot }, React$1.createElement("tr", null, React$1.createElement("td", { colSpan: 8 }, footer)));
|
|
|
}
|
|
|
function getWeekdays(locale2) {
|
|
|
var start2 = startOfWeek(new Date(), { locale: locale2 });
|
|
|
var days = [];
|
|
|
for (var i = 0; i < 7; i++) {
|
|
|
var day = addDays(start2, i);
|
|
|
days.push(day);
|
|
|
}
|
|
|
return days;
|
|
|
}
|
|
|
function Head() {
|
|
|
var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles, showWeekNumber = _a.showWeekNumber, locale2 = _a.locale, formatWeekdayName2 = _a.formatters.formatWeekdayName, labelWeekday2 = _a.labels.labelWeekday;
|
|
|
var weekdays = getWeekdays(locale2);
|
|
|
return React$1.createElement("thead", { style: styles.head, className: classNames.head }, React$1.createElement("tr", { style: styles.head_row, className: classNames.head_row }, showWeekNumber && React$1.createElement("th", { scope: "col", style: styles.head_cell, className: classNames.head_cell }), weekdays.map(function(weekday, i) {
|
|
|
return React$1.createElement("th", { key: i, scope: "col", className: classNames.head_cell, style: styles.head_cell }, React$1.createElement("span", { "aria-hidden": true }, formatWeekdayName2(weekday, { locale: locale2 })), React$1.createElement("span", { className: classNames.vhidden }, labelWeekday2(weekday, { locale: locale2 })));
|
|
|
})));
|
|
|
}
|
|
|
function IconDropdown(props) {
|
|
|
return React$1.createElement("svg", __assign({ width: "8px", height: "8px", viewBox: "0 0 120 120", "data-testid": "iconDropdown" }, props), React$1.createElement("path", { d: "M4.22182541,48.2218254 C8.44222828,44.0014225 15.2388494,43.9273804 19.5496459,47.9996989 L19.7781746,48.2218254 L60,88.443 L100.221825,48.2218254 C104.442228,44.0014225 111.238849,43.9273804 115.549646,47.9996989 L115.778175,48.2218254 C119.998577,52.4422283 120.07262,59.2388494 116.000301,63.5496459 L115.778175,63.7781746 L67.7781746,111.778175 C63.5577717,115.998577 56.7611506,116.07262 52.4503541,112.000301 L52.2218254,111.778175 L4.22182541,63.7781746 C-0.0739418023,59.4824074 -0.0739418023,52.5175926 4.22182541,48.2218254 Z", fill: "currentColor", fillRule: "nonzero" }));
|
|
|
}
|
|
|
function IconLeft(props) {
|
|
|
return React$1.createElement("svg", __assign({ width: "16px", height: "16px", viewBox: "0 0 120 120", "data-testid": "iconLeft" }, props), React$1.createElement("path", { d: "M69.490332,3.34314575 C72.6145263,0.218951416 77.6798462,0.218951416 80.8040405,3.34314575 C83.8617626,6.40086786 83.9268205,11.3179931 80.9992143,14.4548388 L80.8040405,14.6568542 L35.461,60 L80.8040405,105.343146 C83.8617626,108.400868 83.9268205,113.317993 80.9992143,116.454839 L80.8040405,116.656854 C77.7463184,119.714576 72.8291931,119.779634 69.6923475,116.852028 L69.490332,116.656854 L18.490332,65.6568542 C15.4326099,62.5991321 15.367552,57.6820069 18.2951583,54.5451612 L18.490332,54.3431458 L69.490332,3.34314575 Z", fill: "currentColor", fillRule: "nonzero" }));
|
|
|
}
|
|
|
function IconRight(props) {
|
|
|
return React$1.createElement("svg", __assign({ width: "16px", height: "16px", viewBox: "0 0 120 120" }, props, { "data-testid": "iconRight" }), React$1.createElement("path", { d: "M49.8040405,3.34314575 C46.6798462,0.218951416 41.6145263,0.218951416 38.490332,3.34314575 C35.4326099,6.40086786 35.367552,11.3179931 38.2951583,14.4548388 L38.490332,14.6568542 L83.8333725,60 L38.490332,105.343146 C35.4326099,108.400868 35.367552,113.317993 38.2951583,116.454839 L38.490332,116.656854 C41.5480541,119.714576 46.4651794,119.779634 49.602025,116.852028 L49.8040405,116.656854 L100.804041,65.6568542 C103.861763,62.5991321 103.926821,57.6820069 100.999214,54.5451612 L100.804041,54.3431458 L49.8040405,3.34314575 Z", fill: "currentColor" }));
|
|
|
}
|
|
|
function Row(props) {
|
|
|
var _a = useDayPicker(), styles = _a.styles, classNames = _a.classNames, showWeekNumber = _a.showWeekNumber, _b = _a.components, Day2 = _b.Day, WeekNumber2 = _b.WeekNumber;
|
|
|
var weekNumberCell;
|
|
|
if (showWeekNumber) {
|
|
|
weekNumberCell = React$1.createElement("td", { className: classNames.cell, style: styles.cell }, React$1.createElement(WeekNumber2, { number: props.weekNumber, dates: props.dates }));
|
|
|
}
|
|
|
return React$1.createElement("tr", { className: classNames.row, style: styles.row }, weekNumberCell, props.dates.map(function(date) {
|
|
|
return React$1.createElement("td", { className: classNames.cell, style: styles.cell, key: getUnixTime(date) }, React$1.createElement(Day2, { displayMonth: props.displayMonth, date }));
|
|
|
}));
|
|
|
}
|
|
|
function WeekNumber(props) {
|
|
|
var weekNumber = props.number, dates = props.dates;
|
|
|
var _a = useDayPicker(), onWeekNumberClick = _a.onWeekNumberClick, styles = _a.styles, classNames = _a.classNames, locale2 = _a.locale, labelWeekNumber2 = _a.labels.labelWeekNumber, formatWeekNumber2 = _a.formatters.formatWeekNumber;
|
|
|
var handleClick = function(e) {
|
|
|
onWeekNumberClick === null || onWeekNumberClick === void 0 ? void 0 : onWeekNumberClick(weekNumber, dates, e);
|
|
|
};
|
|
|
var content = formatWeekNumber2(Number(weekNumber), { locale: locale2 });
|
|
|
if (!onWeekNumberClick) {
|
|
|
return React$1.createElement("span", { className: classNames.weeknumber, style: styles.weeknumber }, content);
|
|
|
}
|
|
|
var label = labelWeekNumber2(Number(weekNumber), { locale: locale2 });
|
|
|
return React$1.createElement(Button, { "aria-label": label, className: classNames.weeknumber, style: styles.weeknumber, onClick: handleClick }, content);
|
|
|
}
|
|
|
var defaultClassNames = {
|
|
|
root: "rdp",
|
|
|
multiple_months: "rdp-multiple_months",
|
|
|
with_weeknumber: "rdp-with_weeknumber",
|
|
|
vhidden: "rdp-vhidden",
|
|
|
button_reset: "rdp-button_reset",
|
|
|
button: "rdp-button",
|
|
|
caption: "rdp-caption",
|
|
|
caption_start: "rdp-caption_start",
|
|
|
caption_end: "rdp-caption_end",
|
|
|
caption_between: "rdp-caption_between",
|
|
|
caption_label: "rdp-caption_label",
|
|
|
caption_dropdowns: "rdp-caption_dropdowns",
|
|
|
dropdown: "rdp-dropdown",
|
|
|
dropdown_month: "rdp-dropdown_month",
|
|
|
dropdown_year: "rdp-dropdown_year",
|
|
|
dropdown_icon: "rdp-dropdown_icon",
|
|
|
months: "rdp-months",
|
|
|
month: "rdp-month",
|
|
|
table: "rdp-table",
|
|
|
tbody: "rdp-tbody",
|
|
|
tfoot: "rdp-tfoot",
|
|
|
head: "rdp-head",
|
|
|
head_row: "rdp-head_row",
|
|
|
head_cell: "rdp-head_cell",
|
|
|
nav: "rdp-nav",
|
|
|
nav_button: "rdp-nav_button",
|
|
|
nav_button_previous: "rdp-nav_button_previous",
|
|
|
nav_button_next: "rdp-nav_button_next",
|
|
|
nav_icon: "rdp-nav_icon",
|
|
|
row: "rdp-row",
|
|
|
weeknumber: "rdp-weeknumber",
|
|
|
cell: "rdp-cell",
|
|
|
day: "rdp-day",
|
|
|
day_outside: "rdp-day_outside"
|
|
|
};
|
|
|
function formatCaption(month, options) {
|
|
|
return format(month, "LLLL y", options);
|
|
|
}
|
|
|
function formatDay(day, options) {
|
|
|
return format(day, "d", options);
|
|
|
}
|
|
|
function formatMonthCaption(month, options) {
|
|
|
return format(month, "LLLL", options);
|
|
|
}
|
|
|
function formatWeekNumber(weekNumber) {
|
|
|
return "" + weekNumber;
|
|
|
}
|
|
|
function formatWeekdayName(weekday, options) {
|
|
|
return format(weekday, "cccccc", options);
|
|
|
}
|
|
|
function formatYearCaption(year, options) {
|
|
|
return format(year, "yyyy", options);
|
|
|
}
|
|
|
var formatters = /* @__PURE__ */ Object.freeze({
|
|
|
__proto__: null,
|
|
|
[Symbol.toStringTag]: "Module",
|
|
|
formatCaption,
|
|
|
formatDay,
|
|
|
formatMonthCaption,
|
|
|
formatWeekNumber,
|
|
|
formatWeekdayName,
|
|
|
formatYearCaption
|
|
|
});
|
|
|
var labelDay = function(day, modifers, options) {
|
|
|
return format(day, "do MMMM (EEEE)", options);
|
|
|
};
|
|
|
var labelMonthDropdown = function() {
|
|
|
return "Month: ";
|
|
|
};
|
|
|
var labelNext = function() {
|
|
|
return "Go to next month";
|
|
|
};
|
|
|
var labelPrevious = function() {
|
|
|
return "Go to previous month";
|
|
|
};
|
|
|
var labelWeekday = function(day, options) {
|
|
|
return format(day, "cccc", options);
|
|
|
};
|
|
|
var labelWeekNumber = function(n2) {
|
|
|
return "Week n. " + n2;
|
|
|
};
|
|
|
var labelYearDropdown = function() {
|
|
|
return "Year: ";
|
|
|
};
|
|
|
var labels = /* @__PURE__ */ Object.freeze({
|
|
|
__proto__: null,
|
|
|
[Symbol.toStringTag]: "Module",
|
|
|
labelDay,
|
|
|
labelMonthDropdown,
|
|
|
labelNext,
|
|
|
labelPrevious,
|
|
|
labelWeekday,
|
|
|
labelWeekNumber,
|
|
|
labelYearDropdown
|
|
|
});
|
|
|
function parseFromToProps(props) {
|
|
|
var fromYear = props.fromYear, toYear = props.toYear, fromMonth = props.fromMonth, toMonth = props.toMonth;
|
|
|
var fromDate = props.fromDate, toDate2 = props.toDate;
|
|
|
if (fromMonth) {
|
|
|
fromDate = startOfMonth(fromMonth);
|
|
|
} else if (fromYear) {
|
|
|
fromDate = new Date(fromYear, 0, 1);
|
|
|
}
|
|
|
if (toMonth) {
|
|
|
toDate2 = startOfMonth(toMonth);
|
|
|
} else if (toYear) {
|
|
|
toDate2 = new Date(toYear, 11, 31);
|
|
|
}
|
|
|
return {
|
|
|
fromDate: fromDate ? startOfDay(fromDate) : void 0,
|
|
|
toDate: toDate2 ? startOfDay(toDate2) : void 0
|
|
|
};
|
|
|
}
|
|
|
var DayPickerContext = React$1.createContext(void 0);
|
|
|
function DayPickerProvider(props) {
|
|
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
|
var children = props.children, initialProps = props.initialProps;
|
|
|
var locale2 = (_a = initialProps.locale) !== null && _a !== void 0 ? _a : enUS;
|
|
|
var numberOfMonths = (_b = initialProps.numberOfMonths) !== null && _b !== void 0 ? _b : 1;
|
|
|
var today = (_c = initialProps.today) !== null && _c !== void 0 ? _c : new Date();
|
|
|
var _h = parseFromToProps(initialProps), fromDate = _h.fromDate, toDate2 = _h.toDate;
|
|
|
var captionLayout = (_d = initialProps.captionLayout) !== null && _d !== void 0 ? _d : "buttons";
|
|
|
if (!fromDate && !toDate2)
|
|
|
captionLayout = "buttons";
|
|
|
initialProps.toYear;
|
|
|
initialProps.fromYear;
|
|
|
initialProps.toMonth;
|
|
|
initialProps.fromMonth;
|
|
|
var contextProps = __rest(initialProps, ["toYear", "fromYear", "toMonth", "fromMonth"]);
|
|
|
var context = __assign(__assign({}, contextProps), {
|
|
|
captionLayout,
|
|
|
fromDate,
|
|
|
toDate: toDate2,
|
|
|
today,
|
|
|
locale: locale2,
|
|
|
modifierClassNames: (_e = initialProps.modifierClassNames) !== null && _e !== void 0 ? _e : {},
|
|
|
modifierPrefix: "rdp-day_",
|
|
|
modifiers: (_f = initialProps.modifiers) !== null && _f !== void 0 ? _f : {},
|
|
|
numberOfMonths,
|
|
|
styles: (_g = initialProps.styles) !== null && _g !== void 0 ? _g : {},
|
|
|
classNames: __assign(__assign({}, defaultClassNames), initialProps.classNames),
|
|
|
formatters: __assign(__assign({}, formatters), initialProps.formatters),
|
|
|
labels: __assign(__assign({}, labels), initialProps.labels),
|
|
|
components: __assign({ Caption, CaptionLabel, Day, DayContent, Dropdown, Footer, Head, IconDropdown, IconRight, IconLeft, Row, WeekNumber }, initialProps.components)
|
|
|
});
|
|
|
return React$1.createElement(DayPickerContext.Provider, { value: context }, children);
|
|
|
}
|
|
|
function useDayPicker() {
|
|
|
var context = React$1.useContext(DayPickerContext);
|
|
|
if (!context) {
|
|
|
throw new Error("Context is not defined. useDayPicker must be used within a DayPickerProvider with a valid values.");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function getOutsideEndDays(month, options) {
|
|
|
var days = [];
|
|
|
var lastDayOfWeek = endOfWeek(month, options);
|
|
|
var endDiff = differenceInCalendarDays(lastDayOfWeek, month);
|
|
|
for (var i = 1; i <= endDiff; i++) {
|
|
|
var dayDate = addDays(month, i);
|
|
|
days.push(dayDate);
|
|
|
}
|
|
|
return days;
|
|
|
}
|
|
|
function getOutsideStartDays(month, options) {
|
|
|
var days = [];
|
|
|
var firstDayOfWeek = startOfWeek(month, options);
|
|
|
var startDiff = differenceInCalendarDays(month, firstDayOfWeek);
|
|
|
for (var i = 0; i < startDiff; i++) {
|
|
|
var newDay = addDays(firstDayOfWeek, i);
|
|
|
days.push(newDay);
|
|
|
}
|
|
|
return days;
|
|
|
}
|
|
|
function getWeeks(month, _a) {
|
|
|
var locale2 = _a.locale, fixedWeeks = _a.fixedWeeks;
|
|
|
var monthStart = startOfMonth(month);
|
|
|
var monthEnd = endOfMonth(month);
|
|
|
var diff = differenceInCalendarDays(monthEnd, monthStart);
|
|
|
var weeks = [];
|
|
|
var lastWeek = { weekNumber: 0, dates: [] };
|
|
|
for (var i = 0; i <= diff; i++) {
|
|
|
var date = addDays(monthStart, i);
|
|
|
var week = getWeek(date, { locale: locale2 });
|
|
|
if (lastWeek.weekNumber !== week) {
|
|
|
var startDays = getOutsideStartDays(date, { locale: locale2 });
|
|
|
lastWeek = { weekNumber: week, dates: startDays };
|
|
|
weeks.push(lastWeek);
|
|
|
}
|
|
|
lastWeek.dates.push(date);
|
|
|
}
|
|
|
var lastDay = lastWeek.dates[lastWeek.dates.length - 1];
|
|
|
var endDays = getOutsideEndDays(lastDay, { locale: locale2 });
|
|
|
lastWeek.dates = lastWeek.dates.concat(endDays);
|
|
|
if (fixedWeeks) {
|
|
|
var lastWeekDate = lastWeek.dates[lastWeek.dates.length - 1];
|
|
|
var weeksInMonth = getWeeksInMonth(month, { locale: locale2 });
|
|
|
if (weeksInMonth < 6) {
|
|
|
var diffDays = differenceInCalendarDays(addWeeks(lastWeekDate, 6 - weeksInMonth), lastWeekDate);
|
|
|
for (var i = 0; i < diffDays; i++) {
|
|
|
var date = addDays(lastWeekDate, i + 1);
|
|
|
var week = getWeek(date, { locale: locale2 });
|
|
|
if (lastWeek.weekNumber !== week) {
|
|
|
lastWeek = { weekNumber: week, dates: [] };
|
|
|
weeks.push(lastWeek);
|
|
|
}
|
|
|
lastWeek.dates.push(date);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return weeks;
|
|
|
}
|
|
|
function Table(props) {
|
|
|
var _a = useDayPicker(), locale2 = _a.locale, classNames = _a.classNames, styles = _a.styles, hideHead = _a.hideHead, fixedWeeks = _a.fixedWeeks, _b = _a.components, Head2 = _b.Head, Row2 = _b.Row, Footer2 = _b.Footer;
|
|
|
var weeks = getWeeks(props.displayMonth, { locale: locale2, fixedWeeks });
|
|
|
return React$1.createElement("table", { className: classNames.table, style: styles.table, role: "grid", "aria-labelledby": props["aria-labelledby"] }, !hideHead && React$1.createElement(Head2, null), React$1.createElement("tbody", { className: classNames.tbody, style: styles.tbody }, weeks.map(function(week) {
|
|
|
return React$1.createElement(Row2, { displayMonth: props.displayMonth, key: week.weekNumber, dates: week.dates, weekNumber: week.weekNumber });
|
|
|
})), React$1.createElement(Footer2, null));
|
|
|
}
|
|
|
function Month(props) {
|
|
|
var _a;
|
|
|
var _b = useDayPicker(), dir = _b.dir, classNames = _b.classNames, styles = _b.styles, Caption2 = _b.components.Caption;
|
|
|
var displayMonths = useNavigation().displayMonths;
|
|
|
var captionId = useId();
|
|
|
var className = [classNames.month];
|
|
|
var style = styles.month;
|
|
|
var isStart = props.displayIndex === 0;
|
|
|
var isEnd = props.displayIndex === displayMonths.length - 1;
|
|
|
var isCenter = !isStart && !isEnd;
|
|
|
if (dir === "rtl") {
|
|
|
_a = [isStart, isEnd], isEnd = _a[0], isStart = _a[1];
|
|
|
}
|
|
|
if (isStart) {
|
|
|
className.push(classNames.caption_start);
|
|
|
style = __assign(__assign({}, style), styles.caption_start);
|
|
|
}
|
|
|
if (isEnd) {
|
|
|
className.push(classNames.caption_end);
|
|
|
style = __assign(__assign({}, style), styles.caption_end);
|
|
|
}
|
|
|
if (isCenter) {
|
|
|
className.push(classNames.caption_between);
|
|
|
style = __assign(__assign({}, style), styles.caption_between);
|
|
|
}
|
|
|
return React$1.createElement("div", { key: props.displayIndex, className: className.join(" "), style }, React$1.createElement(Caption2, { id: captionId, displayMonth: props.displayMonth }), React$1.createElement(Table, { "aria-labelledby": captionId, displayMonth: props.displayMonth }));
|
|
|
}
|
|
|
function Root() {
|
|
|
var _a = useDayPicker(), dir = _a.dir, className = _a.className, classNames = _a.classNames, style = _a.style, styles = _a.styles, numberOfMonths = _a.numberOfMonths, showWeekNumber = _a.showWeekNumber, initialFocus = _a.initialFocus;
|
|
|
var _b = useFocus(), focusTarget = _b.focusTarget, focus = _b.focus;
|
|
|
var _c = React$1.useState(false), hasInitialFocus = _c[0], setHasInitialFocus = _c[1];
|
|
|
var displayMonths = useNavigation().displayMonths;
|
|
|
var rootClassNames = [className !== null && className !== void 0 ? className : classNames.root];
|
|
|
if (numberOfMonths > 1) {
|
|
|
rootClassNames.push(classNames.multiple_months);
|
|
|
}
|
|
|
if (showWeekNumber) {
|
|
|
rootClassNames.push(classNames.with_weeknumber);
|
|
|
}
|
|
|
React$1.useEffect(function() {
|
|
|
if (initialFocus && !hasInitialFocus && focusTarget) {
|
|
|
focus(focusTarget);
|
|
|
setHasInitialFocus(true);
|
|
|
}
|
|
|
}, [initialFocus, hasInitialFocus, focus, focusTarget]);
|
|
|
return React$1.createElement("div", { className: rootClassNames.join(" "), style: __assign(__assign({}, styles.root), style), dir }, React$1.createElement("div", { className: classNames.months, style: styles.months }, displayMonths.map(function(month, i) {
|
|
|
return React$1.createElement(Month, { key: i, displayIndex: i, displayMonth: month });
|
|
|
})));
|
|
|
}
|
|
|
function RootProvider(props) {
|
|
|
var children = props.children, initialProps = __rest(props, ["children"]);
|
|
|
return React$1.createElement(DayPickerProvider, { initialProps }, React$1.createElement(NavigationProvider, null, React$1.createElement(SelectSingleProvider, { initialProps }, React$1.createElement(SelectMultipleProvider, { initialProps }, React$1.createElement(SelectRangeProvider, { initialProps }, React$1.createElement(ModifiersProvider, null, React$1.createElement(FocusProvider, null, children)))))));
|
|
|
}
|
|
|
function DayPicker(props) {
|
|
|
return React$1.createElement(RootProvider, __assign({}, props), React$1.createElement(Root, null));
|
|
|
}
|
|
|
var fromEntries = function fromEntries2(entries) {
|
|
|
return entries.reduce(function(acc, _ref) {
|
|
|
var key = _ref[0], value = _ref[1];
|
|
|
acc[key] = value;
|
|
|
return acc;
|
|
|
}, {});
|
|
|
};
|
|
|
var useIsomorphicLayoutEffect = typeof window !== "undefined" && window.document && window.document.createElement ? _react_17_0_2_react.exports.useLayoutEffect : _react_17_0_2_react.exports.useEffect;
|
|
|
var top = "top";
|
|
|
var bottom = "bottom";
|
|
|
var right = "right";
|
|
|
var left = "left";
|
|
|
var auto = "auto";
|
|
|
var basePlacements = [top, bottom, right, left];
|
|
|
var start = "start";
|
|
|
var end = "end";
|
|
|
var clippingParents = "clippingParents";
|
|
|
var viewport = "viewport";
|
|
|
var popper = "popper";
|
|
|
var reference = "reference";
|
|
|
var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) {
|
|
|
return acc.concat([placement + "-" + start, placement + "-" + end]);
|
|
|
}, []);
|
|
|
var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) {
|
|
|
return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
|
|
|
}, []);
|
|
|
var beforeRead = "beforeRead";
|
|
|
var read = "read";
|
|
|
var afterRead = "afterRead";
|
|
|
var beforeMain = "beforeMain";
|
|
|
var main = "main";
|
|
|
var afterMain = "afterMain";
|
|
|
var beforeWrite = "beforeWrite";
|
|
|
var write = "write";
|
|
|
var afterWrite = "afterWrite";
|
|
|
var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
|
|
|
function getNodeName(element) {
|
|
|
return element ? (element.nodeName || "").toLowerCase() : null;
|
|
|
}
|
|
|
function getWindow(node) {
|
|
|
if (node == null) {
|
|
|
return window;
|
|
|
}
|
|
|
if (node.toString() !== "[object Window]") {
|
|
|
var ownerDocument = node.ownerDocument;
|
|
|
return ownerDocument ? ownerDocument.defaultView || window : window;
|
|
|
}
|
|
|
return node;
|
|
|
}
|
|
|
function isElement(node) {
|
|
|
var OwnElement = getWindow(node).Element;
|
|
|
return node instanceof OwnElement || node instanceof Element;
|
|
|
}
|
|
|
function isHTMLElement(node) {
|
|
|
var OwnElement = getWindow(node).HTMLElement;
|
|
|
return node instanceof OwnElement || node instanceof HTMLElement;
|
|
|
}
|
|
|
function isShadowRoot(node) {
|
|
|
if (typeof ShadowRoot === "undefined") {
|
|
|
return false;
|
|
|
}
|
|
|
var OwnElement = getWindow(node).ShadowRoot;
|
|
|
return node instanceof OwnElement || node instanceof ShadowRoot;
|
|
|
}
|
|
|
function applyStyles(_ref) {
|
|
|
var state = _ref.state;
|
|
|
Object.keys(state.elements).forEach(function(name) {
|
|
|
var style = state.styles[name] || {};
|
|
|
var attributes = state.attributes[name] || {};
|
|
|
var element = state.elements[name];
|
|
|
if (!isHTMLElement(element) || !getNodeName(element)) {
|
|
|
return;
|
|
|
}
|
|
|
Object.assign(element.style, style);
|
|
|
Object.keys(attributes).forEach(function(name2) {
|
|
|
var value = attributes[name2];
|
|
|
if (value === false) {
|
|
|
element.removeAttribute(name2);
|
|
|
} else {
|
|
|
element.setAttribute(name2, value === true ? "" : value);
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
function effect$2(_ref2) {
|
|
|
var state = _ref2.state;
|
|
|
var initialStyles = {
|
|
|
popper: {
|
|
|
position: state.options.strategy,
|
|
|
left: "0",
|
|
|
top: "0",
|
|
|
margin: "0"
|
|
|
},
|
|
|
arrow: {
|
|
|
position: "absolute"
|
|
|
},
|
|
|
reference: {}
|
|
|
};
|
|
|
Object.assign(state.elements.popper.style, initialStyles.popper);
|
|
|
state.styles = initialStyles;
|
|
|
if (state.elements.arrow) {
|
|
|
Object.assign(state.elements.arrow.style, initialStyles.arrow);
|
|
|
}
|
|
|
return function() {
|
|
|
Object.keys(state.elements).forEach(function(name) {
|
|
|
var element = state.elements[name];
|
|
|
var attributes = state.attributes[name] || {};
|
|
|
var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]);
|
|
|
var style = styleProperties.reduce(function(style2, property) {
|
|
|
style2[property] = "";
|
|
|
return style2;
|
|
|
}, {});
|
|
|
if (!isHTMLElement(element) || !getNodeName(element)) {
|
|
|
return;
|
|
|
}
|
|
|
Object.assign(element.style, style);
|
|
|
Object.keys(attributes).forEach(function(attribute) {
|
|
|
element.removeAttribute(attribute);
|
|
|
});
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
var applyStyles$1 = {
|
|
|
name: "applyStyles",
|
|
|
enabled: true,
|
|
|
phase: "write",
|
|
|
fn: applyStyles,
|
|
|
effect: effect$2,
|
|
|
requires: ["computeStyles"]
|
|
|
};
|
|
|
function getBasePlacement(placement) {
|
|
|
return placement.split("-")[0];
|
|
|
}
|
|
|
var max = Math.max;
|
|
|
var min = Math.min;
|
|
|
var round = Math.round;
|
|
|
function getBoundingClientRect(element, includeScale) {
|
|
|
if (includeScale === void 0) {
|
|
|
includeScale = false;
|
|
|
}
|
|
|
var rect = element.getBoundingClientRect();
|
|
|
var scaleX = 1;
|
|
|
var scaleY = 1;
|
|
|
if (isHTMLElement(element) && includeScale) {
|
|
|
var offsetHeight = element.offsetHeight;
|
|
|
var offsetWidth = element.offsetWidth;
|
|
|
if (offsetWidth > 0) {
|
|
|
scaleX = round(rect.width) / offsetWidth || 1;
|
|
|
}
|
|
|
if (offsetHeight > 0) {
|
|
|
scaleY = round(rect.height) / offsetHeight || 1;
|
|
|
}
|
|
|
}
|
|
|
return {
|
|
|
width: rect.width / scaleX,
|
|
|
height: rect.height / scaleY,
|
|
|
top: rect.top / scaleY,
|
|
|
right: rect.right / scaleX,
|
|
|
bottom: rect.bottom / scaleY,
|
|
|
left: rect.left / scaleX,
|
|
|
x: rect.left / scaleX,
|
|
|
y: rect.top / scaleY
|
|
|
};
|
|
|
}
|
|
|
function getLayoutRect(element) {
|
|
|
var clientRect = getBoundingClientRect(element);
|
|
|
var width = element.offsetWidth;
|
|
|
var height = element.offsetHeight;
|
|
|
if (Math.abs(clientRect.width - width) <= 1) {
|
|
|
width = clientRect.width;
|
|
|
}
|
|
|
if (Math.abs(clientRect.height - height) <= 1) {
|
|
|
height = clientRect.height;
|
|
|
}
|
|
|
return {
|
|
|
x: element.offsetLeft,
|
|
|
y: element.offsetTop,
|
|
|
width,
|
|
|
height
|
|
|
};
|
|
|
}
|
|
|
function contains(parent, child) {
|
|
|
var rootNode = child.getRootNode && child.getRootNode();
|
|
|
if (parent.contains(child)) {
|
|
|
return true;
|
|
|
} else if (rootNode && isShadowRoot(rootNode)) {
|
|
|
var next = child;
|
|
|
do {
|
|
|
if (next && parent.isSameNode(next)) {
|
|
|
return true;
|
|
|
}
|
|
|
next = next.parentNode || next.host;
|
|
|
} while (next);
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function getComputedStyle$1(element) {
|
|
|
return getWindow(element).getComputedStyle(element);
|
|
|
}
|
|
|
function isTableElement(element) {
|
|
|
return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0;
|
|
|
}
|
|
|
function getDocumentElement(element) {
|
|
|
return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement;
|
|
|
}
|
|
|
function getParentNode(element) {
|
|
|
if (getNodeName(element) === "html") {
|
|
|
return element;
|
|
|
}
|
|
|
return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element);
|
|
|
}
|
|
|
function getTrueOffsetParent(element) {
|
|
|
if (!isHTMLElement(element) || getComputedStyle$1(element).position === "fixed") {
|
|
|
return null;
|
|
|
}
|
|
|
return element.offsetParent;
|
|
|
}
|
|
|
function getContainingBlock(element) {
|
|
|
var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1;
|
|
|
var isIE = navigator.userAgent.indexOf("Trident") !== -1;
|
|
|
if (isIE && isHTMLElement(element)) {
|
|
|
var elementCss = getComputedStyle$1(element);
|
|
|
if (elementCss.position === "fixed") {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
var currentNode = getParentNode(element);
|
|
|
while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) {
|
|
|
var css = getComputedStyle$1(currentNode);
|
|
|
if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") {
|
|
|
return currentNode;
|
|
|
} else {
|
|
|
currentNode = currentNode.parentNode;
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function getOffsetParent(element) {
|
|
|
var window2 = getWindow(element);
|
|
|
var offsetParent = getTrueOffsetParent(element);
|
|
|
while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === "static") {
|
|
|
offsetParent = getTrueOffsetParent(offsetParent);
|
|
|
}
|
|
|
if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle$1(offsetParent).position === "static")) {
|
|
|
return window2;
|
|
|
}
|
|
|
return offsetParent || getContainingBlock(element) || window2;
|
|
|
}
|
|
|
function getMainAxisFromPlacement(placement) {
|
|
|
return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y";
|
|
|
}
|
|
|
function within(min$1, value, max$1) {
|
|
|
return max(min$1, min(value, max$1));
|
|
|
}
|
|
|
function withinMaxClamp(min2, value, max2) {
|
|
|
var v2 = within(min2, value, max2);
|
|
|
return v2 > max2 ? max2 : v2;
|
|
|
}
|
|
|
function getFreshSideObject() {
|
|
|
return {
|
|
|
top: 0,
|
|
|
right: 0,
|
|
|
bottom: 0,
|
|
|
left: 0
|
|
|
};
|
|
|
}
|
|
|
function mergePaddingObject(paddingObject) {
|
|
|
return Object.assign({}, getFreshSideObject(), paddingObject);
|
|
|
}
|
|
|
function expandToHashMap(value, keys) {
|
|
|
return keys.reduce(function(hashMap, key) {
|
|
|
hashMap[key] = value;
|
|
|
return hashMap;
|
|
|
}, {});
|
|
|
}
|
|
|
var toPaddingObject = function toPaddingObject2(padding, state) {
|
|
|
padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, {
|
|
|
placement: state.placement
|
|
|
})) : padding;
|
|
|
return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
|
|
|
};
|
|
|
function arrow(_ref) {
|
|
|
var _state$modifiersData$;
|
|
|
var state = _ref.state, name = _ref.name, options = _ref.options;
|
|
|
var arrowElement = state.elements.arrow;
|
|
|
var popperOffsets2 = state.modifiersData.popperOffsets;
|
|
|
var basePlacement = getBasePlacement(state.placement);
|
|
|
var axis = getMainAxisFromPlacement(basePlacement);
|
|
|
var isVertical = [left, right].indexOf(basePlacement) >= 0;
|
|
|
var len = isVertical ? "height" : "width";
|
|
|
if (!arrowElement || !popperOffsets2) {
|
|
|
return;
|
|
|
}
|
|
|
var paddingObject = toPaddingObject(options.padding, state);
|
|
|
var arrowRect = getLayoutRect(arrowElement);
|
|
|
var minProp = axis === "y" ? top : left;
|
|
|
var maxProp = axis === "y" ? bottom : right;
|
|
|
var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len];
|
|
|
var startDiff = popperOffsets2[axis] - state.rects.reference[axis];
|
|
|
var arrowOffsetParent = getOffsetParent(arrowElement);
|
|
|
var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
|
|
|
var centerToReference = endDiff / 2 - startDiff / 2;
|
|
|
var min2 = paddingObject[minProp];
|
|
|
var max2 = clientSize - arrowRect[len] - paddingObject[maxProp];
|
|
|
var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
|
|
|
var offset2 = within(min2, center, max2);
|
|
|
var axisProp = axis;
|
|
|
state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$);
|
|
|
}
|
|
|
function effect$1(_ref2) {
|
|
|
var state = _ref2.state, options = _ref2.options;
|
|
|
var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element;
|
|
|
if (arrowElement == null) {
|
|
|
return;
|
|
|
}
|
|
|
if (typeof arrowElement === "string") {
|
|
|
arrowElement = state.elements.popper.querySelector(arrowElement);
|
|
|
if (!arrowElement) {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
if (!contains(state.elements.popper, arrowElement)) {
|
|
|
return;
|
|
|
}
|
|
|
state.elements.arrow = arrowElement;
|
|
|
}
|
|
|
var arrow$1 = {
|
|
|
name: "arrow",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
fn: arrow,
|
|
|
effect: effect$1,
|
|
|
requires: ["popperOffsets"],
|
|
|
requiresIfExists: ["preventOverflow"]
|
|
|
};
|
|
|
function getVariation(placement) {
|
|
|
return placement.split("-")[1];
|
|
|
}
|
|
|
var unsetSides = {
|
|
|
top: "auto",
|
|
|
right: "auto",
|
|
|
bottom: "auto",
|
|
|
left: "auto"
|
|
|
};
|
|
|
function roundOffsetsByDPR(_ref) {
|
|
|
var x2 = _ref.x, y2 = _ref.y;
|
|
|
var win = window;
|
|
|
var dpr = win.devicePixelRatio || 1;
|
|
|
return {
|
|
|
x: round(x2 * dpr) / dpr || 0,
|
|
|
y: round(y2 * dpr) / dpr || 0
|
|
|
};
|
|
|
}
|
|
|
function mapToStyles(_ref2) {
|
|
|
var _Object$assign2;
|
|
|
var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed;
|
|
|
var _offsets$x = offsets.x, x2 = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y2 = _offsets$y === void 0 ? 0 : _offsets$y;
|
|
|
var _ref3 = typeof roundOffsets === "function" ? roundOffsets({
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
}) : {
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
};
|
|
|
x2 = _ref3.x;
|
|
|
y2 = _ref3.y;
|
|
|
var hasX = offsets.hasOwnProperty("x");
|
|
|
var hasY = offsets.hasOwnProperty("y");
|
|
|
var sideX = left;
|
|
|
var sideY = top;
|
|
|
var win = window;
|
|
|
if (adaptive) {
|
|
|
var offsetParent = getOffsetParent(popper2);
|
|
|
var heightProp = "clientHeight";
|
|
|
var widthProp = "clientWidth";
|
|
|
if (offsetParent === getWindow(popper2)) {
|
|
|
offsetParent = getDocumentElement(popper2);
|
|
|
if (getComputedStyle$1(offsetParent).position !== "static" && position === "absolute") {
|
|
|
heightProp = "scrollHeight";
|
|
|
widthProp = "scrollWidth";
|
|
|
}
|
|
|
}
|
|
|
offsetParent = offsetParent;
|
|
|
if (placement === top || (placement === left || placement === right) && variation === end) {
|
|
|
sideY = bottom;
|
|
|
var offsetY = isFixed && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp];
|
|
|
y2 -= offsetY - popperRect.height;
|
|
|
y2 *= gpuAcceleration ? 1 : -1;
|
|
|
}
|
|
|
if (placement === left || (placement === top || placement === bottom) && variation === end) {
|
|
|
sideX = right;
|
|
|
var offsetX = isFixed && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp];
|
|
|
x2 -= offsetX - popperRect.width;
|
|
|
x2 *= gpuAcceleration ? 1 : -1;
|
|
|
}
|
|
|
}
|
|
|
var commonStyles = Object.assign({
|
|
|
position
|
|
|
}, adaptive && unsetSides);
|
|
|
var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
}) : {
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
};
|
|
|
x2 = _ref4.x;
|
|
|
y2 = _ref4.y;
|
|
|
if (gpuAcceleration) {
|
|
|
var _Object$assign;
|
|
|
return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x2 + "px, " + y2 + "px)" : "translate3d(" + x2 + "px, " + y2 + "px, 0)", _Object$assign));
|
|
|
}
|
|
|
return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y2 + "px" : "", _Object$assign2[sideX] = hasX ? x2 + "px" : "", _Object$assign2.transform = "", _Object$assign2));
|
|
|
}
|
|
|
function computeStyles(_ref5) {
|
|
|
var state = _ref5.state, options = _ref5.options;
|
|
|
var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
|
|
|
var commonStyles = {
|
|
|
placement: getBasePlacement(state.placement),
|
|
|
variation: getVariation(state.placement),
|
|
|
popper: state.elements.popper,
|
|
|
popperRect: state.rects.popper,
|
|
|
gpuAcceleration,
|
|
|
isFixed: state.options.strategy === "fixed"
|
|
|
};
|
|
|
if (state.modifiersData.popperOffsets != null) {
|
|
|
state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
|
|
|
offsets: state.modifiersData.popperOffsets,
|
|
|
position: state.options.strategy,
|
|
|
adaptive,
|
|
|
roundOffsets
|
|
|
})));
|
|
|
}
|
|
|
if (state.modifiersData.arrow != null) {
|
|
|
state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
|
|
|
offsets: state.modifiersData.arrow,
|
|
|
position: "absolute",
|
|
|
adaptive: false,
|
|
|
roundOffsets
|
|
|
})));
|
|
|
}
|
|
|
state.attributes.popper = Object.assign({}, state.attributes.popper, {
|
|
|
"data-popper-placement": state.placement
|
|
|
});
|
|
|
}
|
|
|
var computeStyles$1 = {
|
|
|
name: "computeStyles",
|
|
|
enabled: true,
|
|
|
phase: "beforeWrite",
|
|
|
fn: computeStyles,
|
|
|
data: {}
|
|
|
};
|
|
|
var passive = {
|
|
|
passive: true
|
|
|
};
|
|
|
function effect(_ref) {
|
|
|
var state = _ref.state, instance = _ref.instance, options = _ref.options;
|
|
|
var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize;
|
|
|
var window2 = getWindow(state.elements.popper);
|
|
|
var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
|
|
|
if (scroll) {
|
|
|
scrollParents.forEach(function(scrollParent) {
|
|
|
scrollParent.addEventListener("scroll", instance.update, passive);
|
|
|
});
|
|
|
}
|
|
|
if (resize) {
|
|
|
window2.addEventListener("resize", instance.update, passive);
|
|
|
}
|
|
|
return function() {
|
|
|
if (scroll) {
|
|
|
scrollParents.forEach(function(scrollParent) {
|
|
|
scrollParent.removeEventListener("scroll", instance.update, passive);
|
|
|
});
|
|
|
}
|
|
|
if (resize) {
|
|
|
window2.removeEventListener("resize", instance.update, passive);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
var eventListeners = {
|
|
|
name: "eventListeners",
|
|
|
enabled: true,
|
|
|
phase: "write",
|
|
|
fn: function fn() {
|
|
|
},
|
|
|
effect,
|
|
|
data: {}
|
|
|
};
|
|
|
var hash$1 = {
|
|
|
left: "right",
|
|
|
right: "left",
|
|
|
bottom: "top",
|
|
|
top: "bottom"
|
|
|
};
|
|
|
function getOppositePlacement(placement) {
|
|
|
return placement.replace(/left|right|bottom|top/g, function(matched) {
|
|
|
return hash$1[matched];
|
|
|
});
|
|
|
}
|
|
|
var hash = {
|
|
|
start: "end",
|
|
|
end: "start"
|
|
|
};
|
|
|
function getOppositeVariationPlacement(placement) {
|
|
|
return placement.replace(/start|end/g, function(matched) {
|
|
|
return hash[matched];
|
|
|
});
|
|
|
}
|
|
|
function getWindowScroll(node) {
|
|
|
var win = getWindow(node);
|
|
|
var scrollLeft = win.pageXOffset;
|
|
|
var scrollTop = win.pageYOffset;
|
|
|
return {
|
|
|
scrollLeft,
|
|
|
scrollTop
|
|
|
};
|
|
|
}
|
|
|
function getWindowScrollBarX(element) {
|
|
|
return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
|
|
|
}
|
|
|
function getViewportRect(element) {
|
|
|
var win = getWindow(element);
|
|
|
var html = getDocumentElement(element);
|
|
|
var visualViewport = win.visualViewport;
|
|
|
var width = html.clientWidth;
|
|
|
var height = html.clientHeight;
|
|
|
var x2 = 0;
|
|
|
var y2 = 0;
|
|
|
if (visualViewport) {
|
|
|
width = visualViewport.width;
|
|
|
height = visualViewport.height;
|
|
|
if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
|
|
|
x2 = visualViewport.offsetLeft;
|
|
|
y2 = visualViewport.offsetTop;
|
|
|
}
|
|
|
}
|
|
|
return {
|
|
|
width,
|
|
|
height,
|
|
|
x: x2 + getWindowScrollBarX(element),
|
|
|
y: y2
|
|
|
};
|
|
|
}
|
|
|
function getDocumentRect(element) {
|
|
|
var _element$ownerDocumen;
|
|
|
var html = getDocumentElement(element);
|
|
|
var winScroll = getWindowScroll(element);
|
|
|
var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
|
|
|
var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
|
|
|
var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
|
|
|
var x2 = -winScroll.scrollLeft + getWindowScrollBarX(element);
|
|
|
var y2 = -winScroll.scrollTop;
|
|
|
if (getComputedStyle$1(body || html).direction === "rtl") {
|
|
|
x2 += max(html.clientWidth, body ? body.clientWidth : 0) - width;
|
|
|
}
|
|
|
return {
|
|
|
width,
|
|
|
height,
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
};
|
|
|
}
|
|
|
function isScrollParent(element) {
|
|
|
var _getComputedStyle = getComputedStyle$1(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY;
|
|
|
return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
|
|
|
}
|
|
|
function getScrollParent(node) {
|
|
|
if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) {
|
|
|
return node.ownerDocument.body;
|
|
|
}
|
|
|
if (isHTMLElement(node) && isScrollParent(node)) {
|
|
|
return node;
|
|
|
}
|
|
|
return getScrollParent(getParentNode(node));
|
|
|
}
|
|
|
function listScrollParents(element, list) {
|
|
|
var _element$ownerDocumen;
|
|
|
if (list === void 0) {
|
|
|
list = [];
|
|
|
}
|
|
|
var scrollParent = getScrollParent(element);
|
|
|
var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
|
|
|
var win = getWindow(scrollParent);
|
|
|
var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
|
|
|
var updatedList = list.concat(target);
|
|
|
return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target)));
|
|
|
}
|
|
|
function rectToClientRect(rect) {
|
|
|
return Object.assign({}, rect, {
|
|
|
left: rect.x,
|
|
|
top: rect.y,
|
|
|
right: rect.x + rect.width,
|
|
|
bottom: rect.y + rect.height
|
|
|
});
|
|
|
}
|
|
|
function getInnerBoundingClientRect(element) {
|
|
|
var rect = getBoundingClientRect(element);
|
|
|
rect.top = rect.top + element.clientTop;
|
|
|
rect.left = rect.left + element.clientLeft;
|
|
|
rect.bottom = rect.top + element.clientHeight;
|
|
|
rect.right = rect.left + element.clientWidth;
|
|
|
rect.width = element.clientWidth;
|
|
|
rect.height = element.clientHeight;
|
|
|
rect.x = rect.left;
|
|
|
rect.y = rect.top;
|
|
|
return rect;
|
|
|
}
|
|
|
function getClientRectFromMixedType(element, clippingParent) {
|
|
|
return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
|
|
|
}
|
|
|
function getClippingParents(element) {
|
|
|
var clippingParents2 = listScrollParents(getParentNode(element));
|
|
|
var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle$1(element).position) >= 0;
|
|
|
var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
|
|
|
if (!isElement(clipperElement)) {
|
|
|
return [];
|
|
|
}
|
|
|
return clippingParents2.filter(function(clippingParent) {
|
|
|
return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body";
|
|
|
});
|
|
|
}
|
|
|
function getClippingRect(element, boundary, rootBoundary) {
|
|
|
var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary);
|
|
|
var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]);
|
|
|
var firstClippingParent = clippingParents2[0];
|
|
|
var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) {
|
|
|
var rect = getClientRectFromMixedType(element, clippingParent);
|
|
|
accRect.top = max(rect.top, accRect.top);
|
|
|
accRect.right = min(rect.right, accRect.right);
|
|
|
accRect.bottom = min(rect.bottom, accRect.bottom);
|
|
|
accRect.left = max(rect.left, accRect.left);
|
|
|
return accRect;
|
|
|
}, getClientRectFromMixedType(element, firstClippingParent));
|
|
|
clippingRect.width = clippingRect.right - clippingRect.left;
|
|
|
clippingRect.height = clippingRect.bottom - clippingRect.top;
|
|
|
clippingRect.x = clippingRect.left;
|
|
|
clippingRect.y = clippingRect.top;
|
|
|
return clippingRect;
|
|
|
}
|
|
|
function computeOffsets(_ref) {
|
|
|
var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement;
|
|
|
var basePlacement = placement ? getBasePlacement(placement) : null;
|
|
|
var variation = placement ? getVariation(placement) : null;
|
|
|
var commonX = reference2.x + reference2.width / 2 - element.width / 2;
|
|
|
var commonY = reference2.y + reference2.height / 2 - element.height / 2;
|
|
|
var offsets;
|
|
|
switch (basePlacement) {
|
|
|
case top:
|
|
|
offsets = {
|
|
|
x: commonX,
|
|
|
y: reference2.y - element.height
|
|
|
};
|
|
|
break;
|
|
|
case bottom:
|
|
|
offsets = {
|
|
|
x: commonX,
|
|
|
y: reference2.y + reference2.height
|
|
|
};
|
|
|
break;
|
|
|
case right:
|
|
|
offsets = {
|
|
|
x: reference2.x + reference2.width,
|
|
|
y: commonY
|
|
|
};
|
|
|
break;
|
|
|
case left:
|
|
|
offsets = {
|
|
|
x: reference2.x - element.width,
|
|
|
y: commonY
|
|
|
};
|
|
|
break;
|
|
|
default:
|
|
|
offsets = {
|
|
|
x: reference2.x,
|
|
|
y: reference2.y
|
|
|
};
|
|
|
}
|
|
|
var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
|
|
|
if (mainAxis != null) {
|
|
|
var len = mainAxis === "y" ? "height" : "width";
|
|
|
switch (variation) {
|
|
|
case start:
|
|
|
offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2);
|
|
|
break;
|
|
|
case end:
|
|
|
offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
return offsets;
|
|
|
}
|
|
|
function detectOverflow(state, options) {
|
|
|
if (options === void 0) {
|
|
|
options = {};
|
|
|
}
|
|
|
var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
|
|
|
var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
|
|
|
var altContext = elementContext === popper ? reference : popper;
|
|
|
var popperRect = state.rects.popper;
|
|
|
var element = state.elements[altBoundary ? altContext : elementContext];
|
|
|
var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);
|
|
|
var referenceClientRect = getBoundingClientRect(state.elements.reference);
|
|
|
var popperOffsets2 = computeOffsets({
|
|
|
reference: referenceClientRect,
|
|
|
element: popperRect,
|
|
|
strategy: "absolute",
|
|
|
placement
|
|
|
});
|
|
|
var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2));
|
|
|
var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect;
|
|
|
var overflowOffsets = {
|
|
|
top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
|
|
|
bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
|
|
|
left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
|
|
|
right: elementClientRect.right - clippingClientRect.right + paddingObject.right
|
|
|
};
|
|
|
var offsetData = state.modifiersData.offset;
|
|
|
if (elementContext === popper && offsetData) {
|
|
|
var offset2 = offsetData[placement];
|
|
|
Object.keys(overflowOffsets).forEach(function(key) {
|
|
|
var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
|
|
|
var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x";
|
|
|
overflowOffsets[key] += offset2[axis] * multiply;
|
|
|
});
|
|
|
}
|
|
|
return overflowOffsets;
|
|
|
}
|
|
|
function computeAutoPlacement(state, options) {
|
|
|
if (options === void 0) {
|
|
|
options = {};
|
|
|
}
|
|
|
var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
|
|
|
var variation = getVariation(placement);
|
|
|
var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) {
|
|
|
return getVariation(placement2) === variation;
|
|
|
}) : basePlacements;
|
|
|
var allowedPlacements = placements$1.filter(function(placement2) {
|
|
|
return allowedAutoPlacements.indexOf(placement2) >= 0;
|
|
|
});
|
|
|
if (allowedPlacements.length === 0) {
|
|
|
allowedPlacements = placements$1;
|
|
|
}
|
|
|
var overflows = allowedPlacements.reduce(function(acc, placement2) {
|
|
|
acc[placement2] = detectOverflow(state, {
|
|
|
placement: placement2,
|
|
|
boundary,
|
|
|
rootBoundary,
|
|
|
padding
|
|
|
})[getBasePlacement(placement2)];
|
|
|
return acc;
|
|
|
}, {});
|
|
|
return Object.keys(overflows).sort(function(a, b) {
|
|
|
return overflows[a] - overflows[b];
|
|
|
});
|
|
|
}
|
|
|
function getExpandedFallbackPlacements(placement) {
|
|
|
if (getBasePlacement(placement) === auto) {
|
|
|
return [];
|
|
|
}
|
|
|
var oppositePlacement = getOppositePlacement(placement);
|
|
|
return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
|
|
|
}
|
|
|
function flip(_ref) {
|
|
|
var state = _ref.state, options = _ref.options, name = _ref.name;
|
|
|
if (state.modifiersData[name]._skip) {
|
|
|
return;
|
|
|
}
|
|
|
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements;
|
|
|
var preferredPlacement = state.options.placement;
|
|
|
var basePlacement = getBasePlacement(preferredPlacement);
|
|
|
var isBasePlacement = basePlacement === preferredPlacement;
|
|
|
var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
|
|
|
var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) {
|
|
|
return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, {
|
|
|
placement: placement2,
|
|
|
boundary,
|
|
|
rootBoundary,
|
|
|
padding,
|
|
|
flipVariations,
|
|
|
allowedAutoPlacements
|
|
|
}) : placement2);
|
|
|
}, []);
|
|
|
var referenceRect = state.rects.reference;
|
|
|
var popperRect = state.rects.popper;
|
|
|
var checksMap = new Map();
|
|
|
var makeFallbackChecks = true;
|
|
|
var firstFittingPlacement = placements2[0];
|
|
|
for (var i = 0; i < placements2.length; i++) {
|
|
|
var placement = placements2[i];
|
|
|
var _basePlacement = getBasePlacement(placement);
|
|
|
var isStartVariation = getVariation(placement) === start;
|
|
|
var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
|
|
|
var len = isVertical ? "width" : "height";
|
|
|
var overflow = detectOverflow(state, {
|
|
|
placement,
|
|
|
boundary,
|
|
|
rootBoundary,
|
|
|
altBoundary,
|
|
|
padding
|
|
|
});
|
|
|
var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
|
|
|
if (referenceRect[len] > popperRect[len]) {
|
|
|
mainVariationSide = getOppositePlacement(mainVariationSide);
|
|
|
}
|
|
|
var altVariationSide = getOppositePlacement(mainVariationSide);
|
|
|
var checks = [];
|
|
|
if (checkMainAxis) {
|
|
|
checks.push(overflow[_basePlacement] <= 0);
|
|
|
}
|
|
|
if (checkAltAxis) {
|
|
|
checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
|
|
|
}
|
|
|
if (checks.every(function(check) {
|
|
|
return check;
|
|
|
})) {
|
|
|
firstFittingPlacement = placement;
|
|
|
makeFallbackChecks = false;
|
|
|
break;
|
|
|
}
|
|
|
checksMap.set(placement, checks);
|
|
|
}
|
|
|
if (makeFallbackChecks) {
|
|
|
var numberOfChecks = flipVariations ? 3 : 1;
|
|
|
var _loop = function _loop2(_i2) {
|
|
|
var fittingPlacement = placements2.find(function(placement2) {
|
|
|
var checks2 = checksMap.get(placement2);
|
|
|
if (checks2) {
|
|
|
return checks2.slice(0, _i2).every(function(check) {
|
|
|
return check;
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
if (fittingPlacement) {
|
|
|
firstFittingPlacement = fittingPlacement;
|
|
|
return "break";
|
|
|
}
|
|
|
};
|
|
|
for (var _i = numberOfChecks; _i > 0; _i--) {
|
|
|
var _ret = _loop(_i);
|
|
|
if (_ret === "break")
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (state.placement !== firstFittingPlacement) {
|
|
|
state.modifiersData[name]._skip = true;
|
|
|
state.placement = firstFittingPlacement;
|
|
|
state.reset = true;
|
|
|
}
|
|
|
}
|
|
|
var flip$1 = {
|
|
|
name: "flip",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
fn: flip,
|
|
|
requiresIfExists: ["offset"],
|
|
|
data: {
|
|
|
_skip: false
|
|
|
}
|
|
|
};
|
|
|
function getSideOffsets(overflow, rect, preventedOffsets) {
|
|
|
if (preventedOffsets === void 0) {
|
|
|
preventedOffsets = {
|
|
|
x: 0,
|
|
|
y: 0
|
|
|
};
|
|
|
}
|
|
|
return {
|
|
|
top: overflow.top - rect.height - preventedOffsets.y,
|
|
|
right: overflow.right - rect.width + preventedOffsets.x,
|
|
|
bottom: overflow.bottom - rect.height + preventedOffsets.y,
|
|
|
left: overflow.left - rect.width - preventedOffsets.x
|
|
|
};
|
|
|
}
|
|
|
function isAnySideFullyClipped(overflow) {
|
|
|
return [top, right, bottom, left].some(function(side) {
|
|
|
return overflow[side] >= 0;
|
|
|
});
|
|
|
}
|
|
|
function hide(_ref) {
|
|
|
var state = _ref.state, name = _ref.name;
|
|
|
var referenceRect = state.rects.reference;
|
|
|
var popperRect = state.rects.popper;
|
|
|
var preventedOffsets = state.modifiersData.preventOverflow;
|
|
|
var referenceOverflow = detectOverflow(state, {
|
|
|
elementContext: "reference"
|
|
|
});
|
|
|
var popperAltOverflow = detectOverflow(state, {
|
|
|
altBoundary: true
|
|
|
});
|
|
|
var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
|
|
|
var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
|
|
|
var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
|
|
|
var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
|
|
|
state.modifiersData[name] = {
|
|
|
referenceClippingOffsets,
|
|
|
popperEscapeOffsets,
|
|
|
isReferenceHidden,
|
|
|
hasPopperEscaped
|
|
|
};
|
|
|
state.attributes.popper = Object.assign({}, state.attributes.popper, {
|
|
|
"data-popper-reference-hidden": isReferenceHidden,
|
|
|
"data-popper-escaped": hasPopperEscaped
|
|
|
});
|
|
|
}
|
|
|
var hide$1 = {
|
|
|
name: "hide",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
requiresIfExists: ["preventOverflow"],
|
|
|
fn: hide
|
|
|
};
|
|
|
function distanceAndSkiddingToXY(placement, rects, offset2) {
|
|
|
var basePlacement = getBasePlacement(placement);
|
|
|
var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
|
|
|
var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, {
|
|
|
placement
|
|
|
})) : offset2, skidding = _ref[0], distance = _ref[1];
|
|
|
skidding = skidding || 0;
|
|
|
distance = (distance || 0) * invertDistance;
|
|
|
return [left, right].indexOf(basePlacement) >= 0 ? {
|
|
|
x: distance,
|
|
|
y: skidding
|
|
|
} : {
|
|
|
x: skidding,
|
|
|
y: distance
|
|
|
};
|
|
|
}
|
|
|
function offset(_ref2) {
|
|
|
var state = _ref2.state, options = _ref2.options, name = _ref2.name;
|
|
|
var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset;
|
|
|
var data = placements.reduce(function(acc, placement) {
|
|
|
acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2);
|
|
|
return acc;
|
|
|
}, {});
|
|
|
var _data$state$placement = data[state.placement], x2 = _data$state$placement.x, y2 = _data$state$placement.y;
|
|
|
if (state.modifiersData.popperOffsets != null) {
|
|
|
state.modifiersData.popperOffsets.x += x2;
|
|
|
state.modifiersData.popperOffsets.y += y2;
|
|
|
}
|
|
|
state.modifiersData[name] = data;
|
|
|
}
|
|
|
var offset$1 = {
|
|
|
name: "offset",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
requires: ["popperOffsets"],
|
|
|
fn: offset
|
|
|
};
|
|
|
function popperOffsets(_ref) {
|
|
|
var state = _ref.state, name = _ref.name;
|
|
|
state.modifiersData[name] = computeOffsets({
|
|
|
reference: state.rects.reference,
|
|
|
element: state.rects.popper,
|
|
|
strategy: "absolute",
|
|
|
placement: state.placement
|
|
|
});
|
|
|
}
|
|
|
var popperOffsets$1 = {
|
|
|
name: "popperOffsets",
|
|
|
enabled: true,
|
|
|
phase: "read",
|
|
|
fn: popperOffsets,
|
|
|
data: {}
|
|
|
};
|
|
|
function getAltAxis(axis) {
|
|
|
return axis === "x" ? "y" : "x";
|
|
|
}
|
|
|
function preventOverflow(_ref) {
|
|
|
var state = _ref.state, options = _ref.options, name = _ref.name;
|
|
|
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
|
|
|
var overflow = detectOverflow(state, {
|
|
|
boundary,
|
|
|
rootBoundary,
|
|
|
padding,
|
|
|
altBoundary
|
|
|
});
|
|
|
var basePlacement = getBasePlacement(state.placement);
|
|
|
var variation = getVariation(state.placement);
|
|
|
var isBasePlacement = !variation;
|
|
|
var mainAxis = getMainAxisFromPlacement(basePlacement);
|
|
|
var altAxis = getAltAxis(mainAxis);
|
|
|
var popperOffsets2 = state.modifiersData.popperOffsets;
|
|
|
var referenceRect = state.rects.reference;
|
|
|
var popperRect = state.rects.popper;
|
|
|
var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, {
|
|
|
placement: state.placement
|
|
|
})) : tetherOffset;
|
|
|
var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? {
|
|
|
mainAxis: tetherOffsetValue,
|
|
|
altAxis: tetherOffsetValue
|
|
|
} : Object.assign({
|
|
|
mainAxis: 0,
|
|
|
altAxis: 0
|
|
|
}, tetherOffsetValue);
|
|
|
var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
|
|
|
var data = {
|
|
|
x: 0,
|
|
|
y: 0
|
|
|
};
|
|
|
if (!popperOffsets2) {
|
|
|
return;
|
|
|
}
|
|
|
if (checkMainAxis) {
|
|
|
var _offsetModifierState$;
|
|
|
var mainSide = mainAxis === "y" ? top : left;
|
|
|
var altSide = mainAxis === "y" ? bottom : right;
|
|
|
var len = mainAxis === "y" ? "height" : "width";
|
|
|
var offset2 = popperOffsets2[mainAxis];
|
|
|
var min$1 = offset2 + overflow[mainSide];
|
|
|
var max$1 = offset2 - overflow[altSide];
|
|
|
var additive = tether ? -popperRect[len] / 2 : 0;
|
|
|
var minLen = variation === start ? referenceRect[len] : popperRect[len];
|
|
|
var maxLen = variation === start ? -popperRect[len] : -referenceRect[len];
|
|
|
var arrowElement = state.elements.arrow;
|
|
|
var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
|
|
|
width: 0,
|
|
|
height: 0
|
|
|
};
|
|
|
var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject();
|
|
|
var arrowPaddingMin = arrowPaddingObject[mainSide];
|
|
|
var arrowPaddingMax = arrowPaddingObject[altSide];
|
|
|
var arrowLen = within(0, referenceRect[len], arrowRect[len]);
|
|
|
var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
|
|
|
var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
|
|
|
var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
|
|
|
var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
|
|
|
var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
|
|
|
var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset;
|
|
|
var tetherMax = offset2 + maxOffset - offsetModifierValue;
|
|
|
var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset2, tether ? max(max$1, tetherMax) : max$1);
|
|
|
popperOffsets2[mainAxis] = preventedOffset;
|
|
|
data[mainAxis] = preventedOffset - offset2;
|
|
|
}
|
|
|
if (checkAltAxis) {
|
|
|
var _offsetModifierState$2;
|
|
|
var _mainSide = mainAxis === "x" ? top : left;
|
|
|
var _altSide = mainAxis === "x" ? bottom : right;
|
|
|
var _offset = popperOffsets2[altAxis];
|
|
|
var _len = altAxis === "y" ? "height" : "width";
|
|
|
var _min = _offset + overflow[_mainSide];
|
|
|
var _max = _offset - overflow[_altSide];
|
|
|
var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
|
|
|
var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
|
|
|
var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
|
|
|
var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
|
|
|
var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
|
|
|
popperOffsets2[altAxis] = _preventedOffset;
|
|
|
data[altAxis] = _preventedOffset - _offset;
|
|
|
}
|
|
|
state.modifiersData[name] = data;
|
|
|
}
|
|
|
var preventOverflow$1 = {
|
|
|
name: "preventOverflow",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
fn: preventOverflow,
|
|
|
requiresIfExists: ["offset"]
|
|
|
};
|
|
|
function getHTMLElementScroll(element) {
|
|
|
return {
|
|
|
scrollLeft: element.scrollLeft,
|
|
|
scrollTop: element.scrollTop
|
|
|
};
|
|
|
}
|
|
|
function getNodeScroll(node) {
|
|
|
if (node === getWindow(node) || !isHTMLElement(node)) {
|
|
|
return getWindowScroll(node);
|
|
|
} else {
|
|
|
return getHTMLElementScroll(node);
|
|
|
}
|
|
|
}
|
|
|
function isElementScaled(element) {
|
|
|
var rect = element.getBoundingClientRect();
|
|
|
var scaleX = round(rect.width) / element.offsetWidth || 1;
|
|
|
var scaleY = round(rect.height) / element.offsetHeight || 1;
|
|
|
return scaleX !== 1 || scaleY !== 1;
|
|
|
}
|
|
|
function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
|
|
|
if (isFixed === void 0) {
|
|
|
isFixed = false;
|
|
|
}
|
|
|
var isOffsetParentAnElement = isHTMLElement(offsetParent);
|
|
|
var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
|
|
|
var documentElement = getDocumentElement(offsetParent);
|
|
|
var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);
|
|
|
var scroll = {
|
|
|
scrollLeft: 0,
|
|
|
scrollTop: 0
|
|
|
};
|
|
|
var offsets = {
|
|
|
x: 0,
|
|
|
y: 0
|
|
|
};
|
|
|
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
|
|
if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) {
|
|
|
scroll = getNodeScroll(offsetParent);
|
|
|
}
|
|
|
if (isHTMLElement(offsetParent)) {
|
|
|
offsets = getBoundingClientRect(offsetParent, true);
|
|
|
offsets.x += offsetParent.clientLeft;
|
|
|
offsets.y += offsetParent.clientTop;
|
|
|
} else if (documentElement) {
|
|
|
offsets.x = getWindowScrollBarX(documentElement);
|
|
|
}
|
|
|
}
|
|
|
return {
|
|
|
x: rect.left + scroll.scrollLeft - offsets.x,
|
|
|
y: rect.top + scroll.scrollTop - offsets.y,
|
|
|
width: rect.width,
|
|
|
height: rect.height
|
|
|
};
|
|
|
}
|
|
|
function order(modifiers) {
|
|
|
var map = new Map();
|
|
|
var visited = new Set();
|
|
|
var result = [];
|
|
|
modifiers.forEach(function(modifier) {
|
|
|
map.set(modifier.name, modifier);
|
|
|
});
|
|
|
function sort(modifier) {
|
|
|
visited.add(modifier.name);
|
|
|
var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
|
|
|
requires.forEach(function(dep) {
|
|
|
if (!visited.has(dep)) {
|
|
|
var depModifier = map.get(dep);
|
|
|
if (depModifier) {
|
|
|
sort(depModifier);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
result.push(modifier);
|
|
|
}
|
|
|
modifiers.forEach(function(modifier) {
|
|
|
if (!visited.has(modifier.name)) {
|
|
|
sort(modifier);
|
|
|
}
|
|
|
});
|
|
|
return result;
|
|
|
}
|
|
|
function orderModifiers(modifiers) {
|
|
|
var orderedModifiers = order(modifiers);
|
|
|
return modifierPhases.reduce(function(acc, phase) {
|
|
|
return acc.concat(orderedModifiers.filter(function(modifier) {
|
|
|
return modifier.phase === phase;
|
|
|
}));
|
|
|
}, []);
|
|
|
}
|
|
|
function debounce(fn2) {
|
|
|
var pending;
|
|
|
return function() {
|
|
|
if (!pending) {
|
|
|
pending = new Promise(function(resolve) {
|
|
|
Promise.resolve().then(function() {
|
|
|
pending = void 0;
|
|
|
resolve(fn2());
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
return pending;
|
|
|
};
|
|
|
}
|
|
|
function mergeByName(modifiers) {
|
|
|
var merged = modifiers.reduce(function(merged2, current) {
|
|
|
var existing = merged2[current.name];
|
|
|
merged2[current.name] = existing ? Object.assign({}, existing, current, {
|
|
|
options: Object.assign({}, existing.options, current.options),
|
|
|
data: Object.assign({}, existing.data, current.data)
|
|
|
}) : current;
|
|
|
return merged2;
|
|
|
}, {});
|
|
|
return Object.keys(merged).map(function(key) {
|
|
|
return merged[key];
|
|
|
});
|
|
|
}
|
|
|
var DEFAULT_OPTIONS = {
|
|
|
placement: "bottom",
|
|
|
modifiers: [],
|
|
|
strategy: "absolute"
|
|
|
};
|
|
|
function areValidElements() {
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
args[_key] = arguments[_key];
|
|
|
}
|
|
|
return !args.some(function(element) {
|
|
|
return !(element && typeof element.getBoundingClientRect === "function");
|
|
|
});
|
|
|
}
|
|
|
function popperGenerator(generatorOptions) {
|
|
|
if (generatorOptions === void 0) {
|
|
|
generatorOptions = {};
|
|
|
}
|
|
|
var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
|
|
|
return function createPopper2(reference2, popper2, options) {
|
|
|
if (options === void 0) {
|
|
|
options = defaultOptions;
|
|
|
}
|
|
|
var state = {
|
|
|
placement: "bottom",
|
|
|
orderedModifiers: [],
|
|
|
options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
|
|
|
modifiersData: {},
|
|
|
elements: {
|
|
|
reference: reference2,
|
|
|
popper: popper2
|
|
|
},
|
|
|
attributes: {},
|
|
|
styles: {}
|
|
|
};
|
|
|
var effectCleanupFns = [];
|
|
|
var isDestroyed = false;
|
|
|
var instance = {
|
|
|
state,
|
|
|
setOptions: function setOptions(setOptionsAction) {
|
|
|
var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction;
|
|
|
cleanupModifierEffects();
|
|
|
state.options = Object.assign({}, defaultOptions, state.options, options2);
|
|
|
state.scrollParents = {
|
|
|
reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [],
|
|
|
popper: listScrollParents(popper2)
|
|
|
};
|
|
|
var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers)));
|
|
|
state.orderedModifiers = orderedModifiers.filter(function(m2) {
|
|
|
return m2.enabled;
|
|
|
});
|
|
|
runModifierEffects();
|
|
|
return instance.update();
|
|
|
},
|
|
|
forceUpdate: function forceUpdate() {
|
|
|
if (isDestroyed) {
|
|
|
return;
|
|
|
}
|
|
|
var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper;
|
|
|
if (!areValidElements(reference3, popper3)) {
|
|
|
return;
|
|
|
}
|
|
|
state.rects = {
|
|
|
reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"),
|
|
|
popper: getLayoutRect(popper3)
|
|
|
};
|
|
|
state.reset = false;
|
|
|
state.placement = state.options.placement;
|
|
|
state.orderedModifiers.forEach(function(modifier) {
|
|
|
return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
|
|
|
});
|
|
|
for (var index = 0; index < state.orderedModifiers.length; index++) {
|
|
|
if (state.reset === true) {
|
|
|
state.reset = false;
|
|
|
index = -1;
|
|
|
continue;
|
|
|
}
|
|
|
var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name;
|
|
|
if (typeof fn2 === "function") {
|
|
|
state = fn2({
|
|
|
state,
|
|
|
options: _options,
|
|
|
name,
|
|
|
instance
|
|
|
}) || state;
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
update: debounce(function() {
|
|
|
return new Promise(function(resolve) {
|
|
|
instance.forceUpdate();
|
|
|
resolve(state);
|
|
|
});
|
|
|
}),
|
|
|
destroy: function destroy() {
|
|
|
cleanupModifierEffects();
|
|
|
isDestroyed = true;
|
|
|
}
|
|
|
};
|
|
|
if (!areValidElements(reference2, popper2)) {
|
|
|
return instance;
|
|
|
}
|
|
|
instance.setOptions(options).then(function(state2) {
|
|
|
if (!isDestroyed && options.onFirstUpdate) {
|
|
|
options.onFirstUpdate(state2);
|
|
|
}
|
|
|
});
|
|
|
function runModifierEffects() {
|
|
|
state.orderedModifiers.forEach(function(_ref3) {
|
|
|
var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect2 = _ref3.effect;
|
|
|
if (typeof effect2 === "function") {
|
|
|
var cleanupFn = effect2({
|
|
|
state,
|
|
|
name,
|
|
|
instance,
|
|
|
options: options2
|
|
|
});
|
|
|
var noopFn = function noopFn2() {
|
|
|
};
|
|
|
effectCleanupFns.push(cleanupFn || noopFn);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
function cleanupModifierEffects() {
|
|
|
effectCleanupFns.forEach(function(fn2) {
|
|
|
return fn2();
|
|
|
});
|
|
|
effectCleanupFns = [];
|
|
|
}
|
|
|
return instance;
|
|
|
};
|
|
|
}
|
|
|
var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];
|
|
|
var createPopper = /* @__PURE__ */ popperGenerator({
|
|
|
defaultModifiers
|
|
|
});
|
|
|
var hasElementType = typeof Element !== "undefined";
|
|
|
var hasMap = typeof Map === "function";
|
|
|
var hasSet = typeof Set === "function";
|
|
|
var hasArrayBuffer = typeof ArrayBuffer === "function" && !!ArrayBuffer.isView;
|
|
|
function equal(a, b) {
|
|
|
if (a === b)
|
|
|
return true;
|
|
|
if (a && b && typeof a == "object" && typeof b == "object") {
|
|
|
if (a.constructor !== b.constructor)
|
|
|
return false;
|
|
|
var length, i, keys;
|
|
|
if (Array.isArray(a)) {
|
|
|
length = a.length;
|
|
|
if (length != b.length)
|
|
|
return false;
|
|
|
for (i = length; i-- !== 0; )
|
|
|
if (!equal(a[i], b[i]))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
var it2;
|
|
|
if (hasMap && a instanceof Map && b instanceof Map) {
|
|
|
if (a.size !== b.size)
|
|
|
return false;
|
|
|
it2 = a.entries();
|
|
|
while (!(i = it2.next()).done)
|
|
|
if (!b.has(i.value[0]))
|
|
|
return false;
|
|
|
it2 = a.entries();
|
|
|
while (!(i = it2.next()).done)
|
|
|
if (!equal(i.value[1], b.get(i.value[0])))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
if (hasSet && a instanceof Set && b instanceof Set) {
|
|
|
if (a.size !== b.size)
|
|
|
return false;
|
|
|
it2 = a.entries();
|
|
|
while (!(i = it2.next()).done)
|
|
|
if (!b.has(i.value[0]))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
|
|
|
length = a.length;
|
|
|
if (length != b.length)
|
|
|
return false;
|
|
|
for (i = length; i-- !== 0; )
|
|
|
if (a[i] !== b[i])
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
if (a.constructor === RegExp)
|
|
|
return a.source === b.source && a.flags === b.flags;
|
|
|
if (a.valueOf !== Object.prototype.valueOf)
|
|
|
return a.valueOf() === b.valueOf();
|
|
|
if (a.toString !== Object.prototype.toString)
|
|
|
return a.toString() === b.toString();
|
|
|
keys = Object.keys(a);
|
|
|
length = keys.length;
|
|
|
if (length !== Object.keys(b).length)
|
|
|
return false;
|
|
|
for (i = length; i-- !== 0; )
|
|
|
if (!Object.prototype.hasOwnProperty.call(b, keys[i]))
|
|
|
return false;
|
|
|
if (hasElementType && a instanceof Element)
|
|
|
return false;
|
|
|
for (i = length; i-- !== 0; ) {
|
|
|
if ((keys[i] === "_owner" || keys[i] === "__v" || keys[i] === "__o") && a.$$typeof) {
|
|
|
continue;
|
|
|
}
|
|
|
if (!equal(a[keys[i]], b[keys[i]]))
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
return a !== a && b !== b;
|
|
|
}
|
|
|
var _reactFastCompare_3_2_0_reactFastCompare = function isEqual(a, b) {
|
|
|
try {
|
|
|
return equal(a, b);
|
|
|
} catch (error) {
|
|
|
if ((error.message || "").match(/stack|recursion/i)) {
|
|
|
console.warn("react-fast-compare cannot handle circular refs");
|
|
|
return false;
|
|
|
}
|
|
|
throw error;
|
|
|
}
|
|
|
};
|
|
|
var EMPTY_MODIFIERS = [];
|
|
|
var usePopper = function usePopper2(referenceElement, popperElement, options) {
|
|
|
if (options === void 0) {
|
|
|
options = {};
|
|
|
}
|
|
|
var prevOptions = _react_17_0_2_react.exports.useRef(null);
|
|
|
var optionsWithDefaults = {
|
|
|
onFirstUpdate: options.onFirstUpdate,
|
|
|
placement: options.placement || "bottom",
|
|
|
strategy: options.strategy || "absolute",
|
|
|
modifiers: options.modifiers || EMPTY_MODIFIERS
|
|
|
};
|
|
|
var _React$useState = _react_17_0_2_react.exports.useState({
|
|
|
styles: {
|
|
|
popper: {
|
|
|
position: optionsWithDefaults.strategy,
|
|
|
left: "0",
|
|
|
top: "0"
|
|
|
},
|
|
|
arrow: {
|
|
|
position: "absolute"
|
|
|
}
|
|
|
},
|
|
|
attributes: {}
|
|
|
}), state = _React$useState[0], setState = _React$useState[1];
|
|
|
var updateStateModifier = _react_17_0_2_react.exports.useMemo(function() {
|
|
|
return {
|
|
|
name: "updateState",
|
|
|
enabled: true,
|
|
|
phase: "write",
|
|
|
fn: function fn2(_ref) {
|
|
|
var state2 = _ref.state;
|
|
|
var elements = Object.keys(state2.elements);
|
|
|
setState({
|
|
|
styles: fromEntries(elements.map(function(element) {
|
|
|
return [element, state2.styles[element] || {}];
|
|
|
})),
|
|
|
attributes: fromEntries(elements.map(function(element) {
|
|
|
return [element, state2.attributes[element]];
|
|
|
}))
|
|
|
});
|
|
|
},
|
|
|
requires: ["computeStyles"]
|
|
|
};
|
|
|
}, []);
|
|
|
var popperOptions = _react_17_0_2_react.exports.useMemo(function() {
|
|
|
var newOptions = {
|
|
|
onFirstUpdate: optionsWithDefaults.onFirstUpdate,
|
|
|
placement: optionsWithDefaults.placement,
|
|
|
strategy: optionsWithDefaults.strategy,
|
|
|
modifiers: [].concat(optionsWithDefaults.modifiers, [updateStateModifier, {
|
|
|
name: "applyStyles",
|
|
|
enabled: false
|
|
|
}])
|
|
|
};
|
|
|
if (_reactFastCompare_3_2_0_reactFastCompare(prevOptions.current, newOptions)) {
|
|
|
return prevOptions.current || newOptions;
|
|
|
} else {
|
|
|
prevOptions.current = newOptions;
|
|
|
return newOptions;
|
|
|
}
|
|
|
}, [optionsWithDefaults.onFirstUpdate, optionsWithDefaults.placement, optionsWithDefaults.strategy, optionsWithDefaults.modifiers, updateStateModifier]);
|
|
|
var popperInstanceRef = _react_17_0_2_react.exports.useRef();
|
|
|
useIsomorphicLayoutEffect(function() {
|
|
|
if (popperInstanceRef.current) {
|
|
|
popperInstanceRef.current.setOptions(popperOptions);
|
|
|
}
|
|
|
}, [popperOptions]);
|
|
|
useIsomorphicLayoutEffect(function() {
|
|
|
if (referenceElement == null || popperElement == null) {
|
|
|
return;
|
|
|
}
|
|
|
var createPopper$1 = options.createPopper || createPopper;
|
|
|
var popperInstance = createPopper$1(referenceElement, popperElement, popperOptions);
|
|
|
popperInstanceRef.current = popperInstance;
|
|
|
return function() {
|
|
|
popperInstance.destroy();
|
|
|
popperInstanceRef.current = null;
|
|
|
};
|
|
|
}, [referenceElement, popperElement, options.createPopper]);
|
|
|
return {
|
|
|
state: popperInstanceRef.current ? popperInstanceRef.current.state : null,
|
|
|
styles: state.styles,
|
|
|
attributes: state.attributes,
|
|
|
update: popperInstanceRef.current ? popperInstanceRef.current.update : null,
|
|
|
forceUpdate: popperInstanceRef.current ? popperInstanceRef.current.forceUpdate : null
|
|
|
};
|
|
|
};
|
|
|
var _propTypes_15_8_1_propTypes = { exports: {} };
|
|
|
var ReactPropTypesSecret$1 = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
|
|
|
var ReactPropTypesSecret_1 = ReactPropTypesSecret$1;
|
|
|
var ReactPropTypesSecret = ReactPropTypesSecret_1;
|
|
|
function emptyFunction() {
|
|
|
}
|
|
|
function emptyFunctionWithReset() {
|
|
|
}
|
|
|
emptyFunctionWithReset.resetWarningCache = emptyFunction;
|
|
|
var factoryWithThrowingShims = function() {
|
|
|
function shim(props, propName, componentName, location, propFullName, secret) {
|
|
|
if (secret === ReactPropTypesSecret) {
|
|
|
return;
|
|
|
}
|
|
|
var err = new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");
|
|
|
err.name = "Invariant Violation";
|
|
|
throw err;
|
|
|
}
|
|
|
shim.isRequired = shim;
|
|
|
function getShim() {
|
|
|
return shim;
|
|
|
}
|
|
|
var ReactPropTypes = {
|
|
|
array: shim,
|
|
|
bigint: shim,
|
|
|
bool: shim,
|
|
|
func: shim,
|
|
|
number: shim,
|
|
|
object: shim,
|
|
|
string: shim,
|
|
|
symbol: shim,
|
|
|
any: shim,
|
|
|
arrayOf: getShim,
|
|
|
element: shim,
|
|
|
elementType: shim,
|
|
|
instanceOf: getShim,
|
|
|
node: shim,
|
|
|
objectOf: getShim,
|
|
|
oneOf: getShim,
|
|
|
oneOfType: getShim,
|
|
|
shape: getShim,
|
|
|
exact: getShim,
|
|
|
checkPropTypes: emptyFunctionWithReset,
|
|
|
resetWarningCache: emptyFunction
|
|
|
};
|
|
|
ReactPropTypes.PropTypes = ReactPropTypes;
|
|
|
return ReactPropTypes;
|
|
|
};
|
|
|
{
|
|
|
_propTypes_15_8_1_propTypes.exports = factoryWithThrowingShims();
|
|
|
}
|
|
|
/*!
|
|
|
* tabbable 5.2.1
|
|
|
* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE
|
|
|
*/
|
|
|
var candidateSelectors = ["input", "select", "textarea", "a[href]", "button", "[tabindex]", "audio[controls]", "video[controls]", '[contenteditable]:not([contenteditable="false"])', "details>summary:first-of-type", "details"];
|
|
|
var candidateSelector = /* @__PURE__ */ candidateSelectors.join(",");
|
|
|
var matches = typeof Element === "undefined" ? function() {
|
|
|
} : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
|
|
|
var getCandidates = function getCandidates2(el, includeContainer, filter) {
|
|
|
var candidates = Array.prototype.slice.apply(el.querySelectorAll(candidateSelector));
|
|
|
if (includeContainer && matches.call(el, candidateSelector)) {
|
|
|
candidates.unshift(el);
|
|
|
}
|
|
|
candidates = candidates.filter(filter);
|
|
|
return candidates;
|
|
|
};
|
|
|
var isContentEditable = function isContentEditable2(node) {
|
|
|
return node.contentEditable === "true";
|
|
|
};
|
|
|
var getTabindex = function getTabindex2(node) {
|
|
|
var tabindexAttr = parseInt(node.getAttribute("tabindex"), 10);
|
|
|
if (!isNaN(tabindexAttr)) {
|
|
|
return tabindexAttr;
|
|
|
}
|
|
|
if (isContentEditable(node)) {
|
|
|
return 0;
|
|
|
}
|
|
|
if ((node.nodeName === "AUDIO" || node.nodeName === "VIDEO" || node.nodeName === "DETAILS") && node.getAttribute("tabindex") === null) {
|
|
|
return 0;
|
|
|
}
|
|
|
return node.tabIndex;
|
|
|
};
|
|
|
var sortOrderedTabbables = function sortOrderedTabbables2(a, b) {
|
|
|
return a.tabIndex === b.tabIndex ? a.documentOrder - b.documentOrder : a.tabIndex - b.tabIndex;
|
|
|
};
|
|
|
var isInput = function isInput2(node) {
|
|
|
return node.tagName === "INPUT";
|
|
|
};
|
|
|
var isHiddenInput = function isHiddenInput2(node) {
|
|
|
return isInput(node) && node.type === "hidden";
|
|
|
};
|
|
|
var isDetailsWithSummary = function isDetailsWithSummary2(node) {
|
|
|
var r2 = node.tagName === "DETAILS" && Array.prototype.slice.apply(node.children).some(function(child) {
|
|
|
return child.tagName === "SUMMARY";
|
|
|
});
|
|
|
return r2;
|
|
|
};
|
|
|
var getCheckedRadio = function getCheckedRadio2(nodes, form) {
|
|
|
for (var i = 0; i < nodes.length; i++) {
|
|
|
if (nodes[i].checked && nodes[i].form === form) {
|
|
|
return nodes[i];
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
var isTabbableRadio = function isTabbableRadio2(node) {
|
|
|
if (!node.name) {
|
|
|
return true;
|
|
|
}
|
|
|
var radioScope = node.form || node.ownerDocument;
|
|
|
var queryRadios = function queryRadios2(name) {
|
|
|
return radioScope.querySelectorAll('input[type="radio"][name="' + name + '"]');
|
|
|
};
|
|
|
var radioSet;
|
|
|
if (typeof window !== "undefined" && typeof window.CSS !== "undefined" && typeof window.CSS.escape === "function") {
|
|
|
radioSet = queryRadios(window.CSS.escape(node.name));
|
|
|
} else {
|
|
|
try {
|
|
|
radioSet = queryRadios(node.name);
|
|
|
} catch (err) {
|
|
|
console.error("Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s", err.message);
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
var checked = getCheckedRadio(radioSet, node.form);
|
|
|
return !checked || checked === node;
|
|
|
};
|
|
|
var isRadio = function isRadio2(node) {
|
|
|
return isInput(node) && node.type === "radio";
|
|
|
};
|
|
|
var isNonTabbableRadio = function isNonTabbableRadio2(node) {
|
|
|
return isRadio(node) && !isTabbableRadio(node);
|
|
|
};
|
|
|
var isHidden = function isHidden2(node, displayCheck) {
|
|
|
if (getComputedStyle(node).visibility === "hidden") {
|
|
|
return true;
|
|
|
}
|
|
|
var isDirectSummary = matches.call(node, "details>summary:first-of-type");
|
|
|
var nodeUnderDetails = isDirectSummary ? node.parentElement : node;
|
|
|
if (matches.call(nodeUnderDetails, "details:not([open]) *")) {
|
|
|
return true;
|
|
|
}
|
|
|
if (!displayCheck || displayCheck === "full") {
|
|
|
while (node) {
|
|
|
if (getComputedStyle(node).display === "none") {
|
|
|
return true;
|
|
|
}
|
|
|
node = node.parentElement;
|
|
|
}
|
|
|
} else if (displayCheck === "non-zero-area") {
|
|
|
var _node$getBoundingClie = node.getBoundingClientRect(), width = _node$getBoundingClie.width, height = _node$getBoundingClie.height;
|
|
|
return width === 0 && height === 0;
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
var isDisabledFromFieldset = function isDisabledFromFieldset2(node) {
|
|
|
if (isInput(node) || node.tagName === "SELECT" || node.tagName === "TEXTAREA" || node.tagName === "BUTTON") {
|
|
|
var parentNode = node.parentElement;
|
|
|
while (parentNode) {
|
|
|
if (parentNode.tagName === "FIELDSET" && parentNode.disabled) {
|
|
|
for (var i = 0; i < parentNode.children.length; i++) {
|
|
|
var child = parentNode.children.item(i);
|
|
|
if (child.tagName === "LEGEND") {
|
|
|
if (child.contains(node)) {
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
parentNode = parentNode.parentElement;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
var isNodeMatchingSelectorFocusable = function isNodeMatchingSelectorFocusable2(options, node) {
|
|
|
if (node.disabled || isHiddenInput(node) || isHidden(node, options.displayCheck) || isDetailsWithSummary(node) || isDisabledFromFieldset(node)) {
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
};
|
|
|
var isNodeMatchingSelectorTabbable = function isNodeMatchingSelectorTabbable2(options, node) {
|
|
|
if (!isNodeMatchingSelectorFocusable(options, node) || isNonTabbableRadio(node) || getTabindex(node) < 0) {
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
};
|
|
|
var tabbable = function tabbable2(el, options) {
|
|
|
options = options || {};
|
|
|
var regularTabbables = [];
|
|
|
var orderedTabbables = [];
|
|
|
var candidates = getCandidates(el, options.includeContainer, isNodeMatchingSelectorTabbable.bind(null, options));
|
|
|
candidates.forEach(function(candidate, i) {
|
|
|
var candidateTabindex = getTabindex(candidate);
|
|
|
if (candidateTabindex === 0) {
|
|
|
regularTabbables.push(candidate);
|
|
|
} else {
|
|
|
orderedTabbables.push({
|
|
|
documentOrder: i,
|
|
|
tabIndex: candidateTabindex,
|
|
|
node: candidate
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
var tabbableNodes = orderedTabbables.sort(sortOrderedTabbables).map(function(a) {
|
|
|
return a.node;
|
|
|
}).concat(regularTabbables);
|
|
|
return tabbableNodes;
|
|
|
};
|
|
|
var isTabbable = function isTabbable2(node, options) {
|
|
|
options = options || {};
|
|
|
if (!node) {
|
|
|
throw new Error("No node provided");
|
|
|
}
|
|
|
if (matches.call(node, candidateSelector) === false) {
|
|
|
return false;
|
|
|
}
|
|
|
return isNodeMatchingSelectorTabbable(options, node);
|
|
|
};
|
|
|
var focusableCandidateSelector = /* @__PURE__ */ candidateSelectors.concat("iframe").join(",");
|
|
|
var isFocusable = function isFocusable2(node, options) {
|
|
|
options = options || {};
|
|
|
if (!node) {
|
|
|
throw new Error("No node provided");
|
|
|
}
|
|
|
if (matches.call(node, focusableCandidateSelector) === false) {
|
|
|
return false;
|
|
|
}
|
|
|
return isNodeMatchingSelectorFocusable(options, node);
|
|
|
};
|
|
|
/*!
|
|
|
* focus-trap 6.7.2
|
|
|
* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE
|
|
|
*/
|
|
|
function ownKeys(object, enumerableOnly) {
|
|
|
var keys = Object.keys(object);
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
|
enumerableOnly && (symbols = symbols.filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
|
})), keys.push.apply(keys, symbols);
|
|
|
}
|
|
|
return keys;
|
|
|
}
|
|
|
function _objectSpread2(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
i % 2 ? ownKeys(Object(source), true).forEach(function(key) {
|
|
|
_defineProperty(target, key, source[key]);
|
|
|
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function(key) {
|
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
|
});
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function _defineProperty(obj, key, value) {
|
|
|
if (key in obj) {
|
|
|
Object.defineProperty(obj, key, {
|
|
|
value,
|
|
|
enumerable: true,
|
|
|
configurable: true,
|
|
|
writable: true
|
|
|
});
|
|
|
} else {
|
|
|
obj[key] = value;
|
|
|
}
|
|
|
return obj;
|
|
|
}
|
|
|
var activeFocusTraps = function() {
|
|
|
var trapQueue = [];
|
|
|
return {
|
|
|
activateTrap: function activateTrap(trap) {
|
|
|
if (trapQueue.length > 0) {
|
|
|
var activeTrap = trapQueue[trapQueue.length - 1];
|
|
|
if (activeTrap !== trap) {
|
|
|
activeTrap.pause();
|
|
|
}
|
|
|
}
|
|
|
var trapIndex = trapQueue.indexOf(trap);
|
|
|
if (trapIndex === -1) {
|
|
|
trapQueue.push(trap);
|
|
|
} else {
|
|
|
trapQueue.splice(trapIndex, 1);
|
|
|
trapQueue.push(trap);
|
|
|
}
|
|
|
},
|
|
|
deactivateTrap: function deactivateTrap(trap) {
|
|
|
var trapIndex = trapQueue.indexOf(trap);
|
|
|
if (trapIndex !== -1) {
|
|
|
trapQueue.splice(trapIndex, 1);
|
|
|
}
|
|
|
if (trapQueue.length > 0) {
|
|
|
trapQueue[trapQueue.length - 1].unpause();
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
}();
|
|
|
var isSelectableInput = function isSelectableInput2(node) {
|
|
|
return node.tagName && node.tagName.toLowerCase() === "input" && typeof node.select === "function";
|
|
|
};
|
|
|
var isEscapeEvent = function isEscapeEvent2(e) {
|
|
|
return e.key === "Escape" || e.key === "Esc" || e.keyCode === 27;
|
|
|
};
|
|
|
var isTabEvent = function isTabEvent2(e) {
|
|
|
return e.key === "Tab" || e.keyCode === 9;
|
|
|
};
|
|
|
var delay = function delay2(fn2) {
|
|
|
return setTimeout(fn2, 0);
|
|
|
};
|
|
|
var findIndex = function findIndex2(arr, fn2) {
|
|
|
var idx = -1;
|
|
|
arr.every(function(value, i) {
|
|
|
if (fn2(value)) {
|
|
|
idx = i;
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
});
|
|
|
return idx;
|
|
|
};
|
|
|
var valueOrHandler = function valueOrHandler2(value) {
|
|
|
for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
|
params[_key - 1] = arguments[_key];
|
|
|
}
|
|
|
return typeof value === "function" ? value.apply(void 0, params) : value;
|
|
|
};
|
|
|
var getActualTarget = function getActualTarget2(event) {
|
|
|
return event.target.shadowRoot && typeof event.composedPath === "function" ? event.composedPath()[0] : event.target;
|
|
|
};
|
|
|
var createFocusTrap$1 = function createFocusTrap2(elements, userOptions) {
|
|
|
var doc = (userOptions === null || userOptions === void 0 ? void 0 : userOptions.document) || document;
|
|
|
var config = _objectSpread2({
|
|
|
returnFocusOnDeactivate: true,
|
|
|
escapeDeactivates: true,
|
|
|
delayInitialFocus: true
|
|
|
}, userOptions);
|
|
|
var state = {
|
|
|
containers: [],
|
|
|
tabbableGroups: [],
|
|
|
nodeFocusedBeforeActivation: null,
|
|
|
mostRecentlyFocusedNode: null,
|
|
|
active: false,
|
|
|
paused: false,
|
|
|
delayInitialFocusTimer: void 0
|
|
|
};
|
|
|
var trap;
|
|
|
var getOption = function getOption2(configOverrideOptions, optionName, configOptionName) {
|
|
|
return configOverrideOptions && configOverrideOptions[optionName] !== void 0 ? configOverrideOptions[optionName] : config[configOptionName || optionName];
|
|
|
};
|
|
|
var containersContain = function containersContain2(element) {
|
|
|
return !!(element && state.containers.some(function(container) {
|
|
|
return container.contains(element);
|
|
|
}));
|
|
|
};
|
|
|
var getNodeForOption = function getNodeForOption2(optionName) {
|
|
|
var optionValue = config[optionName];
|
|
|
if (typeof optionValue === "function") {
|
|
|
for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
|
params[_key2 - 1] = arguments[_key2];
|
|
|
}
|
|
|
optionValue = optionValue.apply(void 0, params);
|
|
|
}
|
|
|
if (!optionValue) {
|
|
|
if (optionValue === void 0 || optionValue === false) {
|
|
|
return optionValue;
|
|
|
}
|
|
|
throw new Error("`".concat(optionName, "` was specified but was not a node, or did not return a node"));
|
|
|
}
|
|
|
var node = optionValue;
|
|
|
if (typeof optionValue === "string") {
|
|
|
node = doc.querySelector(optionValue);
|
|
|
if (!node) {
|
|
|
throw new Error("`".concat(optionName, "` as selector refers to no known node"));
|
|
|
}
|
|
|
}
|
|
|
return node;
|
|
|
};
|
|
|
var getInitialFocusNode = function getInitialFocusNode2() {
|
|
|
var node = getNodeForOption("initialFocus");
|
|
|
if (node === false) {
|
|
|
return false;
|
|
|
}
|
|
|
if (node === void 0) {
|
|
|
if (containersContain(doc.activeElement)) {
|
|
|
node = doc.activeElement;
|
|
|
} else {
|
|
|
var firstTabbableGroup = state.tabbableGroups[0];
|
|
|
var firstTabbableNode = firstTabbableGroup && firstTabbableGroup.firstTabbableNode;
|
|
|
node = firstTabbableNode || getNodeForOption("fallbackFocus");
|
|
|
}
|
|
|
}
|
|
|
if (!node) {
|
|
|
throw new Error("Your focus-trap needs to have at least one focusable element");
|
|
|
}
|
|
|
return node;
|
|
|
};
|
|
|
var updateTabbableNodes = function updateTabbableNodes2() {
|
|
|
state.tabbableGroups = state.containers.map(function(container) {
|
|
|
var tabbableNodes = tabbable(container);
|
|
|
if (tabbableNodes.length > 0) {
|
|
|
return {
|
|
|
container,
|
|
|
firstTabbableNode: tabbableNodes[0],
|
|
|
lastTabbableNode: tabbableNodes[tabbableNodes.length - 1]
|
|
|
};
|
|
|
}
|
|
|
return void 0;
|
|
|
}).filter(function(group) {
|
|
|
return !!group;
|
|
|
});
|
|
|
if (state.tabbableGroups.length <= 0 && !getNodeForOption("fallbackFocus")) {
|
|
|
throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");
|
|
|
}
|
|
|
};
|
|
|
var tryFocus = function tryFocus2(node) {
|
|
|
if (node === false) {
|
|
|
return;
|
|
|
}
|
|
|
if (node === doc.activeElement) {
|
|
|
return;
|
|
|
}
|
|
|
if (!node || !node.focus) {
|
|
|
tryFocus2(getInitialFocusNode());
|
|
|
return;
|
|
|
}
|
|
|
node.focus({
|
|
|
preventScroll: !!config.preventScroll
|
|
|
});
|
|
|
state.mostRecentlyFocusedNode = node;
|
|
|
if (isSelectableInput(node)) {
|
|
|
node.select();
|
|
|
}
|
|
|
};
|
|
|
var getReturnFocusNode = function getReturnFocusNode2(previousActiveElement) {
|
|
|
var node = getNodeForOption("setReturnFocus", previousActiveElement);
|
|
|
return node ? node : node === false ? false : previousActiveElement;
|
|
|
};
|
|
|
var checkPointerDown = function checkPointerDown2(e) {
|
|
|
var target = getActualTarget(e);
|
|
|
if (containersContain(target)) {
|
|
|
return;
|
|
|
}
|
|
|
if (valueOrHandler(config.clickOutsideDeactivates, e)) {
|
|
|
trap.deactivate({
|
|
|
returnFocus: config.returnFocusOnDeactivate && !isFocusable(target)
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
if (valueOrHandler(config.allowOutsideClick, e)) {
|
|
|
return;
|
|
|
}
|
|
|
e.preventDefault();
|
|
|
};
|
|
|
var checkFocusIn = function checkFocusIn2(e) {
|
|
|
var target = getActualTarget(e);
|
|
|
var targetContained = containersContain(target);
|
|
|
if (targetContained || target instanceof Document) {
|
|
|
if (targetContained) {
|
|
|
state.mostRecentlyFocusedNode = target;
|
|
|
}
|
|
|
} else {
|
|
|
e.stopImmediatePropagation();
|
|
|
tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());
|
|
|
}
|
|
|
};
|
|
|
var checkTab = function checkTab2(e) {
|
|
|
var target = getActualTarget(e);
|
|
|
updateTabbableNodes();
|
|
|
var destinationNode = null;
|
|
|
if (state.tabbableGroups.length > 0) {
|
|
|
var containerIndex = findIndex(state.tabbableGroups, function(_ref) {
|
|
|
var container = _ref.container;
|
|
|
return container.contains(target);
|
|
|
});
|
|
|
if (containerIndex < 0) {
|
|
|
if (e.shiftKey) {
|
|
|
destinationNode = state.tabbableGroups[state.tabbableGroups.length - 1].lastTabbableNode;
|
|
|
} else {
|
|
|
destinationNode = state.tabbableGroups[0].firstTabbableNode;
|
|
|
}
|
|
|
} else if (e.shiftKey) {
|
|
|
var startOfGroupIndex = findIndex(state.tabbableGroups, function(_ref2) {
|
|
|
var firstTabbableNode = _ref2.firstTabbableNode;
|
|
|
return target === firstTabbableNode;
|
|
|
});
|
|
|
if (startOfGroupIndex < 0 && (state.tabbableGroups[containerIndex].container === target || isFocusable(target) && !isTabbable(target))) {
|
|
|
startOfGroupIndex = containerIndex;
|
|
|
}
|
|
|
if (startOfGroupIndex >= 0) {
|
|
|
var destinationGroupIndex = startOfGroupIndex === 0 ? state.tabbableGroups.length - 1 : startOfGroupIndex - 1;
|
|
|
var destinationGroup = state.tabbableGroups[destinationGroupIndex];
|
|
|
destinationNode = destinationGroup.lastTabbableNode;
|
|
|
}
|
|
|
} else {
|
|
|
var lastOfGroupIndex = findIndex(state.tabbableGroups, function(_ref3) {
|
|
|
var lastTabbableNode = _ref3.lastTabbableNode;
|
|
|
return target === lastTabbableNode;
|
|
|
});
|
|
|
if (lastOfGroupIndex < 0 && (state.tabbableGroups[containerIndex].container === target || isFocusable(target) && !isTabbable(target))) {
|
|
|
lastOfGroupIndex = containerIndex;
|
|
|
}
|
|
|
if (lastOfGroupIndex >= 0) {
|
|
|
var _destinationGroupIndex = lastOfGroupIndex === state.tabbableGroups.length - 1 ? 0 : lastOfGroupIndex + 1;
|
|
|
var _destinationGroup = state.tabbableGroups[_destinationGroupIndex];
|
|
|
destinationNode = _destinationGroup.firstTabbableNode;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
destinationNode = getNodeForOption("fallbackFocus");
|
|
|
}
|
|
|
if (destinationNode) {
|
|
|
e.preventDefault();
|
|
|
tryFocus(destinationNode);
|
|
|
}
|
|
|
};
|
|
|
var checkKey = function checkKey2(e) {
|
|
|
if (isEscapeEvent(e) && valueOrHandler(config.escapeDeactivates, e) !== false) {
|
|
|
e.preventDefault();
|
|
|
trap.deactivate();
|
|
|
return;
|
|
|
}
|
|
|
if (isTabEvent(e)) {
|
|
|
checkTab(e);
|
|
|
return;
|
|
|
}
|
|
|
};
|
|
|
var checkClick = function checkClick2(e) {
|
|
|
if (valueOrHandler(config.clickOutsideDeactivates, e)) {
|
|
|
return;
|
|
|
}
|
|
|
var target = getActualTarget(e);
|
|
|
if (containersContain(target)) {
|
|
|
return;
|
|
|
}
|
|
|
if (valueOrHandler(config.allowOutsideClick, e)) {
|
|
|
return;
|
|
|
}
|
|
|
e.preventDefault();
|
|
|
e.stopImmediatePropagation();
|
|
|
};
|
|
|
var addListeners = function addListeners2() {
|
|
|
if (!state.active) {
|
|
|
return;
|
|
|
}
|
|
|
activeFocusTraps.activateTrap(trap);
|
|
|
state.delayInitialFocusTimer = config.delayInitialFocus ? delay(function() {
|
|
|
tryFocus(getInitialFocusNode());
|
|
|
}) : tryFocus(getInitialFocusNode());
|
|
|
doc.addEventListener("focusin", checkFocusIn, true);
|
|
|
doc.addEventListener("mousedown", checkPointerDown, {
|
|
|
capture: true,
|
|
|
passive: false
|
|
|
});
|
|
|
doc.addEventListener("touchstart", checkPointerDown, {
|
|
|
capture: true,
|
|
|
passive: false
|
|
|
});
|
|
|
doc.addEventListener("click", checkClick, {
|
|
|
capture: true,
|
|
|
passive: false
|
|
|
});
|
|
|
doc.addEventListener("keydown", checkKey, {
|
|
|
capture: true,
|
|
|
passive: false
|
|
|
});
|
|
|
return trap;
|
|
|
};
|
|
|
var removeListeners = function removeListeners2() {
|
|
|
if (!state.active) {
|
|
|
return;
|
|
|
}
|
|
|
doc.removeEventListener("focusin", checkFocusIn, true);
|
|
|
doc.removeEventListener("mousedown", checkPointerDown, true);
|
|
|
doc.removeEventListener("touchstart", checkPointerDown, true);
|
|
|
doc.removeEventListener("click", checkClick, true);
|
|
|
doc.removeEventListener("keydown", checkKey, true);
|
|
|
return trap;
|
|
|
};
|
|
|
trap = {
|
|
|
activate: function activate(activateOptions) {
|
|
|
if (state.active) {
|
|
|
return this;
|
|
|
}
|
|
|
var onActivate = getOption(activateOptions, "onActivate");
|
|
|
var onPostActivate = getOption(activateOptions, "onPostActivate");
|
|
|
var checkCanFocusTrap = getOption(activateOptions, "checkCanFocusTrap");
|
|
|
if (!checkCanFocusTrap) {
|
|
|
updateTabbableNodes();
|
|
|
}
|
|
|
state.active = true;
|
|
|
state.paused = false;
|
|
|
state.nodeFocusedBeforeActivation = doc.activeElement;
|
|
|
if (onActivate) {
|
|
|
onActivate();
|
|
|
}
|
|
|
var finishActivation = function finishActivation2() {
|
|
|
if (checkCanFocusTrap) {
|
|
|
updateTabbableNodes();
|
|
|
}
|
|
|
addListeners();
|
|
|
if (onPostActivate) {
|
|
|
onPostActivate();
|
|
|
}
|
|
|
};
|
|
|
if (checkCanFocusTrap) {
|
|
|
checkCanFocusTrap(state.containers.concat()).then(finishActivation, finishActivation);
|
|
|
return this;
|
|
|
}
|
|
|
finishActivation();
|
|
|
return this;
|
|
|
},
|
|
|
deactivate: function deactivate(deactivateOptions) {
|
|
|
if (!state.active) {
|
|
|
return this;
|
|
|
}
|
|
|
clearTimeout(state.delayInitialFocusTimer);
|
|
|
state.delayInitialFocusTimer = void 0;
|
|
|
removeListeners();
|
|
|
state.active = false;
|
|
|
state.paused = false;
|
|
|
activeFocusTraps.deactivateTrap(trap);
|
|
|
var onDeactivate = getOption(deactivateOptions, "onDeactivate");
|
|
|
var onPostDeactivate = getOption(deactivateOptions, "onPostDeactivate");
|
|
|
var checkCanReturnFocus = getOption(deactivateOptions, "checkCanReturnFocus");
|
|
|
if (onDeactivate) {
|
|
|
onDeactivate();
|
|
|
}
|
|
|
var returnFocus = getOption(deactivateOptions, "returnFocus", "returnFocusOnDeactivate");
|
|
|
var finishDeactivation = function finishDeactivation2() {
|
|
|
delay(function() {
|
|
|
if (returnFocus) {
|
|
|
tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));
|
|
|
}
|
|
|
if (onPostDeactivate) {
|
|
|
onPostDeactivate();
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
if (returnFocus && checkCanReturnFocus) {
|
|
|
checkCanReturnFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation)).then(finishDeactivation, finishDeactivation);
|
|
|
return this;
|
|
|
}
|
|
|
finishDeactivation();
|
|
|
return this;
|
|
|
},
|
|
|
pause: function pause() {
|
|
|
if (state.paused || !state.active) {
|
|
|
return this;
|
|
|
}
|
|
|
state.paused = true;
|
|
|
removeListeners();
|
|
|
return this;
|
|
|
},
|
|
|
unpause: function unpause() {
|
|
|
if (!state.paused || !state.active) {
|
|
|
return this;
|
|
|
}
|
|
|
state.paused = false;
|
|
|
updateTabbableNodes();
|
|
|
addListeners();
|
|
|
return this;
|
|
|
},
|
|
|
updateContainerElements: function updateContainerElements(containerElements) {
|
|
|
var elementsAsArray = [].concat(containerElements).filter(Boolean);
|
|
|
state.containers = elementsAsArray.map(function(element) {
|
|
|
return typeof element === "string" ? doc.querySelector(element) : element;
|
|
|
});
|
|
|
if (state.active) {
|
|
|
updateTabbableNodes();
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
};
|
|
|
trap.updateContainerElements(elements);
|
|
|
return trap;
|
|
|
};
|
|
|
var focusTrap_esm = /* @__PURE__ */ Object.freeze({
|
|
|
__proto__: null,
|
|
|
[Symbol.toStringTag]: "Module",
|
|
|
createFocusTrap: createFocusTrap$1
|
|
|
});
|
|
|
var require$$3 = /* @__PURE__ */ getAugmentedNamespace(focusTrap_esm);
|
|
|
function _typeof(obj) {
|
|
|
"@babel/helpers - typeof";
|
|
|
return _typeof = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(obj2) {
|
|
|
return typeof obj2;
|
|
|
} : function(obj2) {
|
|
|
return obj2 && typeof Symbol == "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
|
|
|
}, _typeof(obj);
|
|
|
}
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
|
if (!(instance instanceof Constructor)) {
|
|
|
throw new TypeError("Cannot call a class as a function");
|
|
|
}
|
|
|
}
|
|
|
function _defineProperties(target, props) {
|
|
|
for (var i = 0; i < props.length; i++) {
|
|
|
var descriptor = props[i];
|
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
|
descriptor.configurable = true;
|
|
|
if ("value" in descriptor)
|
|
|
descriptor.writable = true;
|
|
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
|
}
|
|
|
}
|
|
|
function _createClass(Constructor, protoProps, staticProps) {
|
|
|
if (protoProps)
|
|
|
_defineProperties(Constructor.prototype, protoProps);
|
|
|
if (staticProps)
|
|
|
_defineProperties(Constructor, staticProps);
|
|
|
Object.defineProperty(Constructor, "prototype", {
|
|
|
writable: false
|
|
|
});
|
|
|
return Constructor;
|
|
|
}
|
|
|
function _inherits(subClass, superClass) {
|
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
|
throw new TypeError("Super expression must either be null or a function");
|
|
|
}
|
|
|
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
|
constructor: {
|
|
|
value: subClass,
|
|
|
writable: true,
|
|
|
configurable: true
|
|
|
}
|
|
|
});
|
|
|
Object.defineProperty(subClass, "prototype", {
|
|
|
writable: false
|
|
|
});
|
|
|
if (superClass)
|
|
|
_setPrototypeOf(subClass, superClass);
|
|
|
}
|
|
|
function _setPrototypeOf(o, p2) {
|
|
|
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p3) {
|
|
|
o2.__proto__ = p3;
|
|
|
return o2;
|
|
|
};
|
|
|
return _setPrototypeOf(o, p2);
|
|
|
}
|
|
|
function _createSuper(Derived) {
|
|
|
var hasNativeReflectConstruct = _isNativeReflectConstruct();
|
|
|
return function _createSuperInternal() {
|
|
|
var Super = _getPrototypeOf(Derived), result;
|
|
|
if (hasNativeReflectConstruct) {
|
|
|
var NewTarget = _getPrototypeOf(this).constructor;
|
|
|
result = Reflect.construct(Super, arguments, NewTarget);
|
|
|
} else {
|
|
|
result = Super.apply(this, arguments);
|
|
|
}
|
|
|
return _possibleConstructorReturn(this, result);
|
|
|
};
|
|
|
}
|
|
|
function _possibleConstructorReturn(self2, call) {
|
|
|
if (call && (_typeof(call) === "object" || typeof call === "function")) {
|
|
|
return call;
|
|
|
} else if (call !== void 0) {
|
|
|
throw new TypeError("Derived constructors may only return object or undefined");
|
|
|
}
|
|
|
return _assertThisInitialized(self2);
|
|
|
}
|
|
|
function _assertThisInitialized(self2) {
|
|
|
if (self2 === void 0) {
|
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
|
}
|
|
|
return self2;
|
|
|
}
|
|
|
function _isNativeReflectConstruct() {
|
|
|
if (typeof Reflect === "undefined" || !Reflect.construct)
|
|
|
return false;
|
|
|
if (Reflect.construct.sham)
|
|
|
return false;
|
|
|
if (typeof Proxy === "function")
|
|
|
return true;
|
|
|
try {
|
|
|
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
|
|
|
}));
|
|
|
return true;
|
|
|
} catch (e) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function _getPrototypeOf(o) {
|
|
|
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) {
|
|
|
return o2.__proto__ || Object.getPrototypeOf(o2);
|
|
|
};
|
|
|
return _getPrototypeOf(o);
|
|
|
}
|
|
|
var React = _react_17_0_2_react.exports;
|
|
|
var ReactDOM = _reactDom_17_0_2_reactDom.exports;
|
|
|
var PropTypes = _propTypes_15_8_1_propTypes.exports;
|
|
|
var _require = require$$3, createFocusTrap = _require.createFocusTrap;
|
|
|
var FocusTrap = /* @__PURE__ */ function(_React$Component) {
|
|
|
_inherits(FocusTrap2, _React$Component);
|
|
|
var _super = _createSuper(FocusTrap2);
|
|
|
function FocusTrap2(props) {
|
|
|
var _this;
|
|
|
_classCallCheck(this, FocusTrap2);
|
|
|
_this = _super.call(this, props);
|
|
|
_this.tailoredFocusTrapOptions = {
|
|
|
returnFocusOnDeactivate: false
|
|
|
};
|
|
|
_this.returnFocusOnDeactivate = true;
|
|
|
var focusTrapOptions = props.focusTrapOptions;
|
|
|
for (var optionName in focusTrapOptions) {
|
|
|
if (!Object.prototype.hasOwnProperty.call(focusTrapOptions, optionName)) {
|
|
|
continue;
|
|
|
}
|
|
|
if (optionName === "returnFocusOnDeactivate") {
|
|
|
_this.returnFocusOnDeactivate = !!focusTrapOptions[optionName];
|
|
|
continue;
|
|
|
}
|
|
|
if (optionName === "onPostDeactivate") {
|
|
|
_this.onPostDeactivate = focusTrapOptions[optionName];
|
|
|
continue;
|
|
|
}
|
|
|
_this.tailoredFocusTrapOptions[optionName] = focusTrapOptions[optionName];
|
|
|
}
|
|
|
_this.focusTrapElements = props.containerElements || [];
|
|
|
_this.updatePreviousElement();
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass(FocusTrap2, [{
|
|
|
key: "getDocument",
|
|
|
value: function getDocument() {
|
|
|
return this.props.focusTrapOptions.document || (typeof document !== "undefined" ? document : void 0);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getNodeForOption",
|
|
|
value: function getNodeForOption(optionName) {
|
|
|
var optionValue = this.tailoredFocusTrapOptions[optionName];
|
|
|
if (!optionValue) {
|
|
|
return null;
|
|
|
}
|
|
|
var node = optionValue;
|
|
|
if (typeof optionValue === "string") {
|
|
|
var _this$getDocument;
|
|
|
node = (_this$getDocument = this.getDocument()) === null || _this$getDocument === void 0 ? void 0 : _this$getDocument.querySelector(optionValue);
|
|
|
if (!node) {
|
|
|
throw new Error("`".concat(optionName, "` refers to no known node"));
|
|
|
}
|
|
|
}
|
|
|
if (typeof optionValue === "function") {
|
|
|
node = optionValue();
|
|
|
if (!node) {
|
|
|
throw new Error("`".concat(optionName, "` did not return a node"));
|
|
|
}
|
|
|
}
|
|
|
return node;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getReturnFocusNode",
|
|
|
value: function getReturnFocusNode() {
|
|
|
var node = this.getNodeForOption("setReturnFocus");
|
|
|
return node ? node : this.previouslyFocusedElement;
|
|
|
}
|
|
|
}, {
|
|
|
key: "updatePreviousElement",
|
|
|
value: function updatePreviousElement() {
|
|
|
var currentDocument = this.getDocument();
|
|
|
if (currentDocument) {
|
|
|
this.previouslyFocusedElement = currentDocument.activeElement;
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "deactivateTrap",
|
|
|
value: function deactivateTrap() {
|
|
|
var _this2 = this;
|
|
|
var _this$tailoredFocusTr = this.tailoredFocusTrapOptions, checkCanReturnFocus = _this$tailoredFocusTr.checkCanReturnFocus, _this$tailoredFocusTr2 = _this$tailoredFocusTr.preventScroll, preventScroll = _this$tailoredFocusTr2 === void 0 ? false : _this$tailoredFocusTr2;
|
|
|
if (this.focusTrap) {
|
|
|
this.focusTrap.deactivate({
|
|
|
returnFocus: false
|
|
|
});
|
|
|
}
|
|
|
var finishDeactivation = function finishDeactivation2() {
|
|
|
var returnFocusNode = _this2.getReturnFocusNode();
|
|
|
var canReturnFocus = (returnFocusNode === null || returnFocusNode === void 0 ? void 0 : returnFocusNode.focus) && _this2.returnFocusOnDeactivate;
|
|
|
if (canReturnFocus) {
|
|
|
returnFocusNode.focus({
|
|
|
preventScroll
|
|
|
});
|
|
|
}
|
|
|
if (_this2.onPostDeactivate) {
|
|
|
_this2.onPostDeactivate.call(null);
|
|
|
}
|
|
|
};
|
|
|
if (checkCanReturnFocus) {
|
|
|
checkCanReturnFocus(this.getReturnFocusNode()).then(finishDeactivation, finishDeactivation);
|
|
|
} else {
|
|
|
finishDeactivation();
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "setupFocusTrap",
|
|
|
value: function setupFocusTrap() {
|
|
|
if (!this.focusTrap) {
|
|
|
var focusTrapElementDOMNodes = this.focusTrapElements.map(ReactDOM.findDOMNode);
|
|
|
var nodesExist = focusTrapElementDOMNodes.some(Boolean);
|
|
|
if (nodesExist) {
|
|
|
this.focusTrap = this.props._createFocusTrap(focusTrapElementDOMNodes, this.tailoredFocusTrapOptions);
|
|
|
if (this.props.active) {
|
|
|
this.focusTrap.activate();
|
|
|
}
|
|
|
if (this.props.paused) {
|
|
|
this.focusTrap.pause();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
if (this.props.active) {
|
|
|
this.setupFocusTrap();
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidUpdate",
|
|
|
value: function componentDidUpdate(prevProps) {
|
|
|
if (this.focusTrap) {
|
|
|
if (prevProps.containerElements !== this.props.containerElements) {
|
|
|
this.focusTrap.updateContainerElements(this.props.containerElements);
|
|
|
}
|
|
|
var hasActivated = !prevProps.active && this.props.active;
|
|
|
var hasDeactivated = prevProps.active && !this.props.active;
|
|
|
var hasPaused = !prevProps.paused && this.props.paused;
|
|
|
var hasUnpaused = prevProps.paused && !this.props.paused;
|
|
|
if (hasActivated) {
|
|
|
this.updatePreviousElement();
|
|
|
this.focusTrap.activate();
|
|
|
}
|
|
|
if (hasDeactivated) {
|
|
|
this.deactivateTrap();
|
|
|
return;
|
|
|
}
|
|
|
if (hasPaused) {
|
|
|
this.focusTrap.pause();
|
|
|
}
|
|
|
if (hasUnpaused) {
|
|
|
this.focusTrap.unpause();
|
|
|
}
|
|
|
} else {
|
|
|
if (prevProps.containerElements !== this.props.containerElements) {
|
|
|
this.focusTrapElements = this.props.containerElements;
|
|
|
}
|
|
|
if (this.props.active) {
|
|
|
this.updatePreviousElement();
|
|
|
this.setupFocusTrap();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentWillUnmount",
|
|
|
value: function componentWillUnmount() {
|
|
|
this.deactivateTrap();
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this3 = this;
|
|
|
var child = this.props.children ? React.Children.only(this.props.children) : void 0;
|
|
|
if (child) {
|
|
|
if (child.type && child.type === React.Fragment) {
|
|
|
throw new Error("A focus-trap cannot use a Fragment as its child container. Try replacing it with a <div> element.");
|
|
|
}
|
|
|
var composedRefCallback = function composedRefCallback2(element) {
|
|
|
var containerElements = _this3.props.containerElements;
|
|
|
if (child) {
|
|
|
if (typeof child.ref === "function") {
|
|
|
child.ref(element);
|
|
|
} else if (child.ref) {
|
|
|
child.ref.current = element;
|
|
|
}
|
|
|
}
|
|
|
_this3.focusTrapElements = containerElements ? containerElements : [element];
|
|
|
};
|
|
|
var childWithRef = React.cloneElement(child, {
|
|
|
ref: composedRefCallback
|
|
|
});
|
|
|
return childWithRef;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
}]);
|
|
|
return FocusTrap2;
|
|
|
}(React.Component);
|
|
|
var ElementType = typeof Element === "undefined" ? Function : Element;
|
|
|
FocusTrap.propTypes = {
|
|
|
active: PropTypes.bool,
|
|
|
paused: PropTypes.bool,
|
|
|
focusTrapOptions: PropTypes.shape({
|
|
|
document: PropTypes.object,
|
|
|
onActivate: PropTypes.func,
|
|
|
onPostActivate: PropTypes.func,
|
|
|
checkCanFocusTrap: PropTypes.func,
|
|
|
onDeactivate: PropTypes.func,
|
|
|
onPostDeactivate: PropTypes.func,
|
|
|
checkCanReturnFocus: PropTypes.func,
|
|
|
initialFocus: PropTypes.oneOfType([PropTypes.instanceOf(ElementType), PropTypes.string, PropTypes.func, PropTypes.bool]),
|
|
|
fallbackFocus: PropTypes.oneOfType([PropTypes.instanceOf(ElementType), PropTypes.string, PropTypes.func]),
|
|
|
escapeDeactivates: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
|
|
|
clickOutsideDeactivates: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
|
|
|
returnFocusOnDeactivate: PropTypes.bool,
|
|
|
setReturnFocus: PropTypes.oneOfType([PropTypes.instanceOf(ElementType), PropTypes.string, PropTypes.func]),
|
|
|
allowOutsideClick: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
|
|
|
preventScroll: PropTypes.bool
|
|
|
}),
|
|
|
containerElements: PropTypes.arrayOf(PropTypes.instanceOf(ElementType)),
|
|
|
children: PropTypes.oneOfType([
|
|
|
PropTypes.element,
|
|
|
PropTypes.instanceOf(ElementType)
|
|
|
])
|
|
|
};
|
|
|
FocusTrap.defaultProps = {
|
|
|
active: true,
|
|
|
paused: false,
|
|
|
focusTrapOptions: {},
|
|
|
_createFocusTrap: createFocusTrap
|
|
|
};
|
|
|
var focusTrapReact = FocusTrap;
|
|
|
function useToggle(initialState = false) {
|
|
|
const [state, setState] = _react_17_0_2_react.exports.useState(initialState);
|
|
|
const toggle = _react_17_0_2_react.exports.useCallback((nextState) => {
|
|
|
if (nextState !== void 0) {
|
|
|
setState(nextState);
|
|
|
} else {
|
|
|
setState((state2) => !state2);
|
|
|
}
|
|
|
}, []);
|
|
|
return [state, toggle];
|
|
|
}
|
|
|
const getCursorPostion = (input) => {
|
|
|
const {
|
|
|
offsetLeft: inputX,
|
|
|
offsetTop: inputY,
|
|
|
offsetHeight: inputH,
|
|
|
offsetWidth: inputW,
|
|
|
selectionEnd: selectionPoint
|
|
|
} = input;
|
|
|
const div = document.createElement("div");
|
|
|
const copyStyle = window.getComputedStyle(input);
|
|
|
for (const item of copyStyle) {
|
|
|
div.style.setProperty(item, copyStyle.getPropertyValue(item));
|
|
|
}
|
|
|
div.style.position = "fixed";
|
|
|
div.style.visibility = "hidden";
|
|
|
div.style.whiteSpace = "pre-wrap";
|
|
|
const swap = ".";
|
|
|
const inputValue = input.tagName === "INPUT" ? input.value.replace(/ /g, swap) : input.value;
|
|
|
const textContent = inputValue.substring(0, selectionPoint || 0);
|
|
|
div.textContent = textContent;
|
|
|
if (input.tagName === "TEXTAREA") {
|
|
|
div.style.height = "auto";
|
|
|
}
|
|
|
const span = document.createElement("span");
|
|
|
span.textContent = inputValue.substring(selectionPoint || 0) || ".";
|
|
|
div.appendChild(span);
|
|
|
document.body.appendChild(div);
|
|
|
const {
|
|
|
offsetLeft: spanX,
|
|
|
offsetTop: spanY,
|
|
|
offsetHeight: spanH,
|
|
|
offsetWidth: spanW
|
|
|
} = span;
|
|
|
document.body.removeChild(div);
|
|
|
return {
|
|
|
x: inputX + spanX,
|
|
|
y: inputY + spanY,
|
|
|
h: inputH + spanH,
|
|
|
w: inputW + spanW
|
|
|
};
|
|
|
};
|
|
|
let isList;
|
|
|
let isEditor = false;
|
|
|
let isEditorGo = false;
|
|
|
let positionX;
|
|
|
const MemoEditor = () => {
|
|
|
const {
|
|
|
globalState
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [isListShown, toggleList] = useToggle(false);
|
|
|
const [isEditorShown, toggleEditor] = useToggle(false);
|
|
|
const editorRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const prevGlobalStateRef = _react_17_0_2_react.exports.useRef(globalState);
|
|
|
const [selected, setSelected] = _react_17_0_2_react.exports.useState();
|
|
|
const [isPopperOpen, setIsPopperOpen] = _react_17_0_2_react.exports.useState(false);
|
|
|
const {
|
|
|
app: app2
|
|
|
} = dailyNotesService.getState();
|
|
|
const popperRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const [popperElement, setPopperElement] = _react_17_0_2_react.exports.useState(null);
|
|
|
let popper2;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (DefaultPrefix === "List") {
|
|
|
isList = false;
|
|
|
toggleList(false);
|
|
|
} else {
|
|
|
isList = true;
|
|
|
toggleList(true);
|
|
|
}
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a;
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if ((require$$0.Platform.isMobile === true || window.innerWidth < 875) && UseButtonToShowEditor) {
|
|
|
toggleEditor(true);
|
|
|
}
|
|
|
if (FocusOnEditor) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.focus();
|
|
|
}
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a, _b;
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (UseButtonToShowEditor === true && DefaultEditorLocation === "Bottom" && require$$0.Platform.isMobile === true && window.innerWidth < 875) {
|
|
|
const leaves = app2.workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
let memosHeight;
|
|
|
let leafView;
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
leafView = leaf.view.containerEl;
|
|
|
memosHeight = leafView.offsetHeight;
|
|
|
} else {
|
|
|
leafView = document;
|
|
|
memosHeight = window.innerHeight;
|
|
|
}
|
|
|
const divThis = document.createElement("img");
|
|
|
const memoEditorDiv = leafView.querySelector("div[data-type='memos_view'] .view-content .memo-editor-wrapper");
|
|
|
divThis.src = `${showEditorSvg}`;
|
|
|
if (isEditorShown) {
|
|
|
divThis.className = "memo-show-editor-button hidden";
|
|
|
} else {
|
|
|
divThis.className = "memo-show-editor-button";
|
|
|
}
|
|
|
const buttonTop = memosHeight - 200;
|
|
|
const buttonLeft = window.innerWidth / 2 - 25;
|
|
|
divThis.style.top = buttonTop + "px";
|
|
|
divThis.style.left = buttonLeft + "px";
|
|
|
divThis.onclick = function() {
|
|
|
let scaleElementAni = divThis.animate([
|
|
|
{
|
|
|
transform: "rotate(0deg) scale(1)"
|
|
|
},
|
|
|
{
|
|
|
transform: "rotate(60deg) scale(1.5)"
|
|
|
}
|
|
|
], {
|
|
|
duration: 300,
|
|
|
iterations: Infinity
|
|
|
});
|
|
|
setTimeout(() => {
|
|
|
var _a2;
|
|
|
divThis.className = "memo-show-editor-button hidden";
|
|
|
handleShowEditor();
|
|
|
(_a2 = editorRef.current) == null ? void 0 : _a2.focus();
|
|
|
scaleElementAni.reverse();
|
|
|
}, 300);
|
|
|
};
|
|
|
leafView.querySelector(".content-wrapper").prepend(divThis);
|
|
|
const memolistScroll = leafView.querySelector(".memolist-wrapper");
|
|
|
memolistScroll.onscroll = function() {
|
|
|
if (isEditor && !isEditorGo) {
|
|
|
isEditorGo = true;
|
|
|
let scaleEditorElementAni = memoEditorDiv.animate([
|
|
|
{
|
|
|
transform: "scale(1)",
|
|
|
opacity: 1
|
|
|
},
|
|
|
{
|
|
|
transform: "scale(0.4)",
|
|
|
opacity: 0
|
|
|
}
|
|
|
], {
|
|
|
duration: 300,
|
|
|
iterations: 1
|
|
|
});
|
|
|
let scaleOneElementAni;
|
|
|
setTimeout(() => {
|
|
|
scaleOneElementAni = divThis.animate([
|
|
|
{
|
|
|
transform: "rotate(20deg) scale(1.5)"
|
|
|
},
|
|
|
{
|
|
|
transform: "rotate(0deg) scale(1)"
|
|
|
}
|
|
|
], {
|
|
|
duration: 100,
|
|
|
iterations: 1
|
|
|
});
|
|
|
}, 300);
|
|
|
setTimeout(() => {
|
|
|
handleShowEditor(true);
|
|
|
divThis.className = "memo-show-editor-button";
|
|
|
}, 300);
|
|
|
setTimeout(() => {
|
|
|
scaleOneElementAni.cancel();
|
|
|
scaleEditorElementAni.reverse();
|
|
|
}, 700);
|
|
|
}
|
|
|
};
|
|
|
} else if (UseButtonToShowEditor === false && DefaultEditorLocation === "Bottom" && require$$0.Platform.isMobile === true && window.innerWidth < 875) {
|
|
|
handleShowEditor(false);
|
|
|
if (FocusOnEditor) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.focus();
|
|
|
}
|
|
|
} else {
|
|
|
if (!isEditor) {
|
|
|
handleShowEditor(false);
|
|
|
}
|
|
|
if (FocusOnEditor) {
|
|
|
(_b = editorRef.current) == null ? void 0 : _b.focus();
|
|
|
}
|
|
|
}
|
|
|
}, []);
|
|
|
if (!require$$0.Platform.isMobile) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "right-end",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["bottom"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else if (require$$0.Platform.isMobile && DefaultEditorLocation !== "Bottom") {
|
|
|
const seletorPopupWidth = 280;
|
|
|
if (window.innerWidth - positionX > seletorPopupWidth * 1.2) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "right-end",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["left-end"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else if (window.innerWidth - positionX < seletorPopupWidth && window.innerWidth > seletorPopupWidth * 1.5) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "left-end",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["right-end"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "bottom",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["bottom"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
}
|
|
|
} else if (require$$0.Platform.isMobile && DefaultEditorLocation === "Bottom") {
|
|
|
const seletorPopupWidth = 280;
|
|
|
if (window.innerWidth - positionX > seletorPopupWidth * 1.2) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "top-end",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["top-start"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else if (window.innerWidth - positionX < seletorPopupWidth && positionX > seletorPopupWidth) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "top-start",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["top-end"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "top",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["top"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
const closePopper = () => {
|
|
|
setIsPopperOpen(false);
|
|
|
};
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a, _b, _c, _d, _e;
|
|
|
if (globalState.markMemoId) {
|
|
|
const editorCurrentValue = (_a = editorRef.current) == null ? void 0 : _a.getContent();
|
|
|
const memoLinkText = `${editorCurrentValue ? "\n" : ""}${t("MARK")}: [@MEMO](${globalState.markMemoId})`;
|
|
|
(_b = editorRef.current) == null ? void 0 : _b.insertText(memoLinkText);
|
|
|
globalStateService.setMarkMemoId("");
|
|
|
}
|
|
|
if (globalState.editMemoId && globalState.editMemoId !== prevGlobalStateRef.current.editMemoId) {
|
|
|
const editMemo = memoService.getMemoById(globalState.editMemoId);
|
|
|
if (editMemo) {
|
|
|
(_d = editorRef.current) == null ? void 0 : _d.setContent((_c = editMemo.content.replace(/\<br\>/g, "\n")) != null ? _c : "");
|
|
|
(_e = editorRef.current) == null ? void 0 : _e.focus();
|
|
|
}
|
|
|
}
|
|
|
prevGlobalStateRef.current = globalState;
|
|
|
}, [globalState.markMemoId, globalState.editMemoId]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const handlePasteEvent = async (event) => {
|
|
|
var _a;
|
|
|
if (event.clipboardData && event.clipboardData.files.length > 0) {
|
|
|
event.preventDefault();
|
|
|
const file = event.clipboardData.files[0];
|
|
|
const url = await handleUploadFile(file);
|
|
|
if (url) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.insertText(url);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const handleDropEvent = async (event) => {
|
|
|
var _a;
|
|
|
if (event.dataTransfer && event.dataTransfer.files.length > 0) {
|
|
|
event.preventDefault();
|
|
|
const file = event.dataTransfer.files[0];
|
|
|
const url = await handleUploadFile(file);
|
|
|
if (url) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.insertText(url);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const handleClickEvent = () => {
|
|
|
var _a, _b;
|
|
|
handleContentChange((_b = (_a = editorRef.current) == null ? void 0 : _a.element.value) != null ? _b : "");
|
|
|
};
|
|
|
const handleKeyDownEvent = () => {
|
|
|
setTimeout(() => {
|
|
|
var _a, _b;
|
|
|
handleContentChange((_b = (_a = editorRef.current) == null ? void 0 : _a.element.value) != null ? _b : "");
|
|
|
});
|
|
|
};
|
|
|
editorRef.current.element.addEventListener("paste", handlePasteEvent);
|
|
|
editorRef.current.element.addEventListener("drop", handleDropEvent);
|
|
|
editorRef.current.element.addEventListener("click", handleClickEvent);
|
|
|
editorRef.current.element.addEventListener("keydown", handleKeyDownEvent);
|
|
|
return () => {
|
|
|
var _a, _b;
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.element.removeEventListener("paste", handlePasteEvent);
|
|
|
(_b = editorRef.current) == null ? void 0 : _b.element.removeEventListener("drop", handleDropEvent);
|
|
|
};
|
|
|
}, []);
|
|
|
const handleUploadFile = _react_17_0_2_react.exports.useCallback(async (file) => {
|
|
|
const {
|
|
|
type
|
|
|
} = file;
|
|
|
if (!type.startsWith("image")) {
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
const image2 = await resourceService.upload(file);
|
|
|
const url = `${image2}`;
|
|
|
return url;
|
|
|
} catch (error) {
|
|
|
new require$$0.Notice(error);
|
|
|
}
|
|
|
}, []);
|
|
|
const handleSaveBtnClick = _react_17_0_2_react.exports.useCallback(async (content) => {
|
|
|
if (content === "") {
|
|
|
new require$$0.Notice("\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A\u5440");
|
|
|
return;
|
|
|
}
|
|
|
const {
|
|
|
editMemoId
|
|
|
} = globalStateService.getState();
|
|
|
content = content.replaceAll(" ", " ");
|
|
|
setEditorContentCache("");
|
|
|
try {
|
|
|
if (editMemoId) {
|
|
|
const prevMemo = memoService.getMemoById(editMemoId);
|
|
|
if (prevMemo && prevMemo.content !== content) {
|
|
|
const editedMemo = await memoService.updateMemo(prevMemo.id, prevMemo.content, content, prevMemo.memoType);
|
|
|
editedMemo.updatedAt = utils$1.getDateTimeString(Date.now());
|
|
|
memoService.editMemo(editedMemo);
|
|
|
}
|
|
|
globalStateService.setEditMemoId("");
|
|
|
} else {
|
|
|
const newMemo = await memoService.createMemo(content, isList);
|
|
|
memoService.pushMemo(newMemo);
|
|
|
locationService.clearQuery();
|
|
|
}
|
|
|
} catch (error) {
|
|
|
new require$$0.Notice(error.message);
|
|
|
}
|
|
|
setEditorContentCache("");
|
|
|
}, []);
|
|
|
const handleCancelBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
var _a;
|
|
|
globalStateService.setEditMemoId("");
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.setContent("");
|
|
|
setEditorContentCache("");
|
|
|
}, []);
|
|
|
const handleContentChange = _react_17_0_2_react.exports.useCallback((content) => {
|
|
|
const tempDiv = document.createElement("div");
|
|
|
tempDiv.innerHTML = content;
|
|
|
if (tempDiv.innerText.trim() === "") {
|
|
|
content = "";
|
|
|
}
|
|
|
setEditorContentCache(content);
|
|
|
if (editorRef.current) {
|
|
|
const currentValue = editorRef.current.getContent();
|
|
|
const selectionStart = editorRef.current.element.selectionStart;
|
|
|
const prevString = currentValue.slice(0, selectionStart);
|
|
|
const nextString = currentValue.slice(selectionStart);
|
|
|
if ((prevString.endsWith("@") || prevString.endsWith("\u{1F4C6}")) && nextString.startsWith(" ")) {
|
|
|
updateDateSelectorPopupPosition();
|
|
|
setIsPopperOpen(true);
|
|
|
} else if ((prevString.endsWith("@") || prevString.endsWith("\u{1F4C6}")) && nextString === "") {
|
|
|
updateDateSelectorPopupPosition();
|
|
|
setIsPopperOpen(true);
|
|
|
} else {
|
|
|
setIsPopperOpen(false);
|
|
|
}
|
|
|
setTimeout(() => {
|
|
|
var _a;
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.focus();
|
|
|
});
|
|
|
}
|
|
|
}, []);
|
|
|
const handleDateInsertTrigger = (date) => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (date) {
|
|
|
closePopper();
|
|
|
isList = true;
|
|
|
toggleList(true);
|
|
|
}
|
|
|
const currentValue = editorRef.current.getContent();
|
|
|
const selectionStart = editorRef.current.element.selectionStart;
|
|
|
const prevString = currentValue.slice(0, selectionStart);
|
|
|
const nextString = currentValue.slice(selectionStart);
|
|
|
const todayMoment = require$$0.moment(date);
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (prevString.endsWith("@")) {
|
|
|
if (InsertDateFormat === "Dataview") {
|
|
|
editorRef.current.element.value = currentValue.slice(0, editorRef.current.element.selectionStart - 1) + "[due::" + todayMoment.format("YYYY-MM-DD") + "]" + nextString;
|
|
|
editorRef.current.element.setSelectionRange(selectionStart + 17, selectionStart + 17);
|
|
|
editorRef.current.focus();
|
|
|
handleContentChange(editorRef.current.element.value);
|
|
|
} else if (InsertDateFormat === "Tasks") {
|
|
|
editorRef.current.element.value = currentValue.slice(0, editorRef.current.element.selectionStart - 1) + "\u{1F4C6}" + todayMoment.format("YYYY-MM-DD") + nextString;
|
|
|
editorRef.current.element.setSelectionRange(selectionStart + 11, selectionStart + 11);
|
|
|
editorRef.current.focus();
|
|
|
handleContentChange(editorRef.current.element.value);
|
|
|
}
|
|
|
} else {
|
|
|
editorRef.current.element.value = prevString + todayMoment.format("YYYY-MM-DD") + nextString;
|
|
|
editorRef.current.element.setSelectionRange(selectionStart + 10, selectionStart + 10);
|
|
|
editorRef.current.focus();
|
|
|
handleContentChange(editorRef.current.element.value);
|
|
|
}
|
|
|
};
|
|
|
const handleChangeStatus = () => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (isList) {
|
|
|
isList = false;
|
|
|
toggleList(false);
|
|
|
} else {
|
|
|
isList = true;
|
|
|
toggleList(true);
|
|
|
}
|
|
|
};
|
|
|
const handleShowEditor = (flag) => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (isEditor || flag === true) {
|
|
|
isEditor = false;
|
|
|
toggleEditor(true);
|
|
|
} else {
|
|
|
isEditor = true;
|
|
|
isEditorGo = false;
|
|
|
toggleEditor(false);
|
|
|
}
|
|
|
};
|
|
|
const handleTagTextBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const currentValue = editorRef.current.getContent();
|
|
|
const selectionStart = editorRef.current.element.selectionStart;
|
|
|
const prevString = currentValue.slice(0, selectionStart);
|
|
|
const nextString = currentValue.slice(selectionStart);
|
|
|
let nextValue = prevString + "# " + nextString;
|
|
|
let cursorIndex = prevString.length + 1;
|
|
|
if (prevString.endsWith("#") && nextString.startsWith(" ")) {
|
|
|
nextValue = prevString.slice(0, prevString.length - 1) + nextString.slice(1);
|
|
|
cursorIndex = prevString.length - 1;
|
|
|
}
|
|
|
editorRef.current.element.value = nextValue;
|
|
|
editorRef.current.element.setSelectionRange(cursorIndex, cursorIndex);
|
|
|
editorRef.current.focus();
|
|
|
handleContentChange(editorRef.current.element.value);
|
|
|
}, []);
|
|
|
const updateDateSelectorPopupPosition = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
if (!editorRef.current || !popperRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const seletorPopupWidth = 280;
|
|
|
const editorWidth = editorRef.current.element.clientWidth;
|
|
|
const {
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
} = getCursorPostion(editorRef.current.element);
|
|
|
let left2;
|
|
|
let top2;
|
|
|
if (!require$$0.Platform.isMobile) {
|
|
|
left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 2 : x2 + 2;
|
|
|
top2 = y2 + 20;
|
|
|
} else {
|
|
|
if (window.innerWidth - x2 > seletorPopupWidth) {
|
|
|
left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 2 : x2 + 2;
|
|
|
} else if (window.innerWidth - x2 < seletorPopupWidth) {
|
|
|
left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 18 : x2 + 18;
|
|
|
} else {
|
|
|
left2 = editorRef.current.element.clientWidth / 2;
|
|
|
}
|
|
|
if (DefaultEditorLocation === "Bottom" && window.innerWidth > 875) {
|
|
|
top2 = y2 + 20;
|
|
|
} else if (DefaultEditorLocation === "Bottom" && window.innerWidth <= 875) {
|
|
|
top2 = y2 + 35;
|
|
|
} else if (DefaultEditorLocation === "Top" && window.innerWidth <= 875) {
|
|
|
top2 = y2 + 20;
|
|
|
}
|
|
|
}
|
|
|
positionX = x2;
|
|
|
popperRef.current.style.left = `${left2}px`;
|
|
|
popperRef.current.style.top = `${top2}px`;
|
|
|
}, []);
|
|
|
const handleUploadFileBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
const inputEl = document.createElement("input");
|
|
|
document.body.appendChild(inputEl);
|
|
|
inputEl.type = "file";
|
|
|
inputEl.multiple = false;
|
|
|
inputEl.accept = "image/png, image/gif, image/jpeg";
|
|
|
inputEl.onchange = async () => {
|
|
|
var _a;
|
|
|
if (!inputEl.files || inputEl.files.length === 0) {
|
|
|
return;
|
|
|
}
|
|
|
const file = inputEl.files[0];
|
|
|
const url = await handleUploadFile(file);
|
|
|
if (url) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.insertText(url);
|
|
|
}
|
|
|
document.body.removeChild(inputEl);
|
|
|
};
|
|
|
inputEl.click();
|
|
|
}, []);
|
|
|
const showEditStatus = Boolean(globalState.editMemoId);
|
|
|
const editorConfig = _react_17_0_2_react.exports.useMemo(() => ({
|
|
|
className: "memo-editor",
|
|
|
initialContent: getEditorContentCache(),
|
|
|
placeholder: t("What do you think now..."),
|
|
|
showConfirmBtn: true,
|
|
|
showCancelBtn: showEditStatus,
|
|
|
showTools: true,
|
|
|
onConfirmBtnClick: handleSaveBtnClick,
|
|
|
onCancelBtnClick: handleCancelBtnClick,
|
|
|
onContentChange: handleContentChange
|
|
|
}), [showEditStatus]);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `memo-editor-wrapper ${showEditStatus ? "edit-ing" : ""} ${isEditorShown ? "hidden" : ""}`,
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: `tip-text ${showEditStatus ? "" : "hidden"}`,
|
|
|
children: "Modifying..."
|
|
|
}), /* @__PURE__ */ jsx(Editor, __spreadProps(__spreadValues({
|
|
|
ref: editorRef
|
|
|
}, editorConfig), {
|
|
|
tools: /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx("img", {
|
|
|
className: "action-btn add-tag",
|
|
|
src: tag,
|
|
|
onClick: handleTagTextBtnClick
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "action-btn file-upload",
|
|
|
src: imageSvg,
|
|
|
onClick: handleUploadFileBtnClick
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "action-btn list-or-task",
|
|
|
src: `${!isListShown ? journalSvg : task}`,
|
|
|
onClick: handleChangeStatus
|
|
|
})]
|
|
|
})
|
|
|
})), /* @__PURE__ */ jsx("div", {
|
|
|
ref: popperRef,
|
|
|
className: "date-picker",
|
|
|
children: isPopperOpen && /* @__PURE__ */ jsx(focusTrapReact, {
|
|
|
active: true,
|
|
|
focusTrapOptions: {
|
|
|
initialFocus: false,
|
|
|
allowOutsideClick: true,
|
|
|
clickOutsideDeactivates: true,
|
|
|
onDeactivate: closePopper
|
|
|
},
|
|
|
children: /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({
|
|
|
tabIndex: -1,
|
|
|
style: popper2.styles.popper
|
|
|
}, popper2.attributes.popper), {
|
|
|
ref: setPopperElement,
|
|
|
role: "dialog",
|
|
|
children: /* @__PURE__ */ jsx(DayPicker, {
|
|
|
initialFocus: isPopperOpen,
|
|
|
mode: "single",
|
|
|
defaultMonth: selected,
|
|
|
selected,
|
|
|
onSelect: handleDateInsertTrigger
|
|
|
})
|
|
|
}))
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function getEditorContentCache() {
|
|
|
var _a;
|
|
|
return (_a = storage.get(["editorContentCache"]).editorContentCache) != null ? _a : "";
|
|
|
}
|
|
|
function setEditorContentCache(content) {
|
|
|
storage.set({
|
|
|
editorContentCache: content
|
|
|
});
|
|
|
}
|
|
|
const relationConsts = [
|
|
|
{ text: "AND", value: "AND" },
|
|
|
{ text: "OR", value: "OR" }
|
|
|
];
|
|
|
const filterConsts = {
|
|
|
TAG: {
|
|
|
value: "TAG",
|
|
|
text: t("TAG"),
|
|
|
operators: [
|
|
|
{
|
|
|
text: t("INCLUDE"),
|
|
|
value: "CONTAIN"
|
|
|
},
|
|
|
{
|
|
|
text: t("EXCLUDE"),
|
|
|
value: "NOT_CONTAIN"
|
|
|
}
|
|
|
]
|
|
|
},
|
|
|
TYPE: {
|
|
|
value: "TYPE",
|
|
|
text: t("TYPE"),
|
|
|
operators: [
|
|
|
{
|
|
|
value: "IS",
|
|
|
text: t("IS")
|
|
|
},
|
|
|
{
|
|
|
value: "IS_NOT",
|
|
|
text: t("ISNOT")
|
|
|
}
|
|
|
],
|
|
|
values: [
|
|
|
{
|
|
|
value: "CONNECTED",
|
|
|
text: t("LINKED")
|
|
|
},
|
|
|
{
|
|
|
value: "NOT_TAGGED",
|
|
|
text: t("NO TAGS")
|
|
|
},
|
|
|
{
|
|
|
value: "LINKED",
|
|
|
text: t("HAS LINKS")
|
|
|
},
|
|
|
{
|
|
|
value: "IMAGED",
|
|
|
text: t("HAS IMAGES")
|
|
|
}
|
|
|
]
|
|
|
},
|
|
|
TEXT: {
|
|
|
value: "TEXT",
|
|
|
text: t("TEXT"),
|
|
|
operators: [
|
|
|
{
|
|
|
value: "CONTAIN",
|
|
|
text: t("INCLUDE")
|
|
|
},
|
|
|
{
|
|
|
value: "NOT_CONTAIN",
|
|
|
text: t("EXCLUDE")
|
|
|
}
|
|
|
]
|
|
|
}
|
|
|
};
|
|
|
const memoSpecialTypes = filterConsts["TYPE"].values;
|
|
|
const getTextWithMemoType = (type) => {
|
|
|
for (const t2 of memoSpecialTypes) {
|
|
|
if (t2.value === type) {
|
|
|
return t2.text;
|
|
|
}
|
|
|
}
|
|
|
return "";
|
|
|
};
|
|
|
const getDefaultFilter = () => {
|
|
|
return {
|
|
|
type: "TAG",
|
|
|
value: {
|
|
|
operator: "CONTAIN",
|
|
|
value: ""
|
|
|
},
|
|
|
relation: "AND"
|
|
|
};
|
|
|
};
|
|
|
const checkShouldShowMemoWithFilters = (memo2, filters) => {
|
|
|
let shouldShow = true;
|
|
|
for (const f2 of filters) {
|
|
|
const { relation } = f2;
|
|
|
const r2 = checkShouldShowMemo(memo2, f2);
|
|
|
if (relation === "OR") {
|
|
|
shouldShow = shouldShow || r2;
|
|
|
} else {
|
|
|
shouldShow = shouldShow && r2;
|
|
|
}
|
|
|
}
|
|
|
return shouldShow;
|
|
|
};
|
|
|
const checkShouldShowMemo = (memo2, filter) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
type,
|
|
|
value: { operator, value }
|
|
|
} = filter;
|
|
|
if (value === "") {
|
|
|
return true;
|
|
|
}
|
|
|
let shouldShow = true;
|
|
|
if (type === "TAG") {
|
|
|
let contained = true;
|
|
|
const tagsSet = new Set();
|
|
|
for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) {
|
|
|
const tag2 = t2.replace(TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) {
|
|
|
const tag2 = t2.replace(NOP_FIRST_TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
if (!tagsSet.has(value)) {
|
|
|
contained = false;
|
|
|
}
|
|
|
if (operator === "NOT_CONTAIN") {
|
|
|
contained = !contained;
|
|
|
}
|
|
|
shouldShow = contained;
|
|
|
} else if (type === "TYPE") {
|
|
|
let matched = false;
|
|
|
if (value === "NOT_TAGGED" && memo2.content.match(TAG_REG) === null) {
|
|
|
matched = true;
|
|
|
} else if (value === "LINKED" && memo2.content.match(LINK_REG) !== null) {
|
|
|
matched = true;
|
|
|
} else if (value === "IMAGED" && memo2.content.match(IMAGE_URL_REG) !== null) {
|
|
|
matched = true;
|
|
|
} else if (value === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) !== null) {
|
|
|
matched = true;
|
|
|
}
|
|
|
if (operator === "IS_NOT") {
|
|
|
matched = !matched;
|
|
|
}
|
|
|
shouldShow = matched;
|
|
|
} else if (type === "TEXT") {
|
|
|
let contained = memo2.content.includes(value);
|
|
|
if (operator === "NOT_CONTAIN") {
|
|
|
contained = !contained;
|
|
|
}
|
|
|
shouldShow = contained;
|
|
|
}
|
|
|
return shouldShow;
|
|
|
};
|
|
|
var searchBar = "";
|
|
|
var search = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Ii8+PC9zdmc+";
|
|
|
const SearchBar = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query: {
|
|
|
type: memoType
|
|
|
}
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [isSearchBarShow, toggleSearchbar] = useToggle(false);
|
|
|
const handleMemoTypeItemClick = (type) => {
|
|
|
const {
|
|
|
type: prevType
|
|
|
} = locationService.getState().query;
|
|
|
if (type === prevType) {
|
|
|
type = "";
|
|
|
}
|
|
|
locationService.setMemoTypeQuery(type);
|
|
|
};
|
|
|
const handleTextQueryInput = (event) => {
|
|
|
const text = event.currentTarget.value;
|
|
|
locationService.setTextQuery(text);
|
|
|
};
|
|
|
const mouseIn = () => {
|
|
|
toggleSearchbar(true);
|
|
|
};
|
|
|
const mouseOut = () => {
|
|
|
toggleSearchbar(false);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "search-bar-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "search-bar-inputer",
|
|
|
children: [/* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: search
|
|
|
}), /* @__PURE__ */ jsx("input", {
|
|
|
className: "text-input",
|
|
|
type: "text",
|
|
|
onMouseOver: mouseIn,
|
|
|
onMouseOut: mouseOut,
|
|
|
placeholder: isSearchBarShow ? "Type Here" : "",
|
|
|
onChange: handleTextQueryInput
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "quickly-action-wrapper",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "quickly-action-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: t("Quick filter")
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-container types-container",
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "section-text",
|
|
|
children: [t("TYPE"), ":"]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "values-container",
|
|
|
children: memoSpecialTypes.map((t2, idx) => {
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: `type-item ${memoType === t2.value ? "selected" : ""}`,
|
|
|
onClick: () => {
|
|
|
handleMemoTypeItemClick(t2.value);
|
|
|
},
|
|
|
children: t2.text
|
|
|
}), idx + 1 < memoSpecialTypes.length ? /* @__PURE__ */ jsx("span", {
|
|
|
className: "split-text",
|
|
|
children: "/"
|
|
|
}) : null]
|
|
|
}, t2.value);
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var memosHeader = "";
|
|
|
var menuSvg = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTMgMThoMTh2LTJIM3Yyem0wLTVoMTh2LTJIM3Yyem0wLTd2MmgxOFY2SDN6Ii8+PC9zdmc+";
|
|
|
let prevRequestTimestamp = Date.now();
|
|
|
const MemosHeader = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query: {
|
|
|
filter
|
|
|
}
|
|
|
},
|
|
|
globalState: {
|
|
|
isMobileView
|
|
|
},
|
|
|
queryState: {
|
|
|
queries
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [titleText, setTitleText] = _react_17_0_2_react.exports.useState("MEMOS");
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const query = queryService.getQueryById(filter);
|
|
|
if (query) {
|
|
|
setTitleText(query.title);
|
|
|
} else {
|
|
|
setTitleText("MEMOS");
|
|
|
}
|
|
|
}, [filter, queries]);
|
|
|
const handleMemoTextClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
const now = Date.now();
|
|
|
if (now - prevRequestTimestamp > 10 * 1e3) {
|
|
|
prevRequestTimestamp = now;
|
|
|
memoService.fetchAllMemos().catch(() => {
|
|
|
});
|
|
|
}
|
|
|
}, []);
|
|
|
const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
globalStateService.setShowSiderbarInMobileView(true);
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-header-container memos-header-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "title-text",
|
|
|
onClick: handleMemoTextClick,
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: isMobileView,
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "action-btn",
|
|
|
onClick: handleShowSidebarBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: menuSvg,
|
|
|
alt: "menu"
|
|
|
})
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: titleText
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx(SearchBar, {})]
|
|
|
});
|
|
|
};
|
|
|
var memoFilter = "";
|
|
|
var copy = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMyAxMi40MzE2VjcuODEyNUMxMyA2LjI1OTIgMTQuMjU5MiA1IDE1LjgxMjUgNUg0MC4xODc1QzQxLjc0MDggNSA0MyA2LjI1OTIgNDMgNy44MTI1VjMyLjE4NzVDNDMgMzMuNzQwOCA0MS43NDA4IDM1IDQwLjE4NzUgMzVIMzUuNTE2MyIgc3Ryb2tlPSIjMzMzIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0zMi4xODc1IDEzSDcuODEyNUM2LjI1OTIgMTMgNSAxNC4yNTkyIDUgMTUuODEyNVY0MC4xODc1QzUgNDEuNzQwOCA2LjI1OTIgNDMgNy44MTI1IDQzSDMyLjE4NzVDMzMuNzQwOCA0MyAzNSA0MS43NDA4IDM1IDQwLjE4NzVWMTUuODEyNUMzNSAxNC4yNTkyIDMzLjc0MDggMTMgMzIuMTg3NSAxM1oiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+";
|
|
|
const CODE_BLOCK_REG = /```([\s\S]*?)```/g;
|
|
|
const BOLD_TEXT_REG = /\*\*(.+?)\*\*/g;
|
|
|
const EM_TEXT_REG = /\*(.+?)\*/g;
|
|
|
const TODO_BLOCK_REG = /\[ \] /g;
|
|
|
const DONE_BLOCK_REG = /\[x\] /g;
|
|
|
const DOT_LI_REG = /[*] /g;
|
|
|
const NUM_LI_REG = /(\d+)\. /g;
|
|
|
const INTERNAL_MD_REG = /\[\[([^\]]+)\]\]/g;
|
|
|
const EXRERNAL_MD_REG = /\[([^\]]+)\]\((([^\]]+).md)\)/g;
|
|
|
const parseMarkedToHtml = (markedStr, memoid) => {
|
|
|
const htmlText = markedStr.replace(CODE_BLOCK_REG, "<pre lang=''>$1</pre>").replace(DOT_LI_REG, "<span class='counter-block'>\u2022</span>").replace(NUM_LI_REG, "<span class='counter-block'>$1.</span>").replace(TODO_BLOCK_REG, "<span class='todo-block' data-type='todo'>\u2B1C</span>").replace(DONE_BLOCK_REG, "<span class='todo-block' data-type='done'>\u2705</span>").replace(BOLD_TEXT_REG, "<strong>$1</strong>").replace(EM_TEXT_REG, "<em>$1</em>").replace(/<br>/g, "</p><p>").replace(/&/g, "&");
|
|
|
let newHtmlText = htmlText;
|
|
|
if (memoid) {
|
|
|
if (INTERNAL_MD_REG.test(htmlText)) {
|
|
|
const internalMD = htmlText.match(INTERNAL_MD_REG);
|
|
|
for (let i = 0; i < internalMD.length; i++) {
|
|
|
if (!/(jpeg|jpg|gif|png|svg|bmp|wepg)/g.test(internalMD[i])) {
|
|
|
const internalContent = getContentFromInternalLink(internalMD[i]);
|
|
|
if (/\|/g.test(internalContent)) {
|
|
|
const [link, label] = internalContent.split("|");
|
|
|
const replaceMent = replaceMd(link, label);
|
|
|
newHtmlText = htmlText.replace(internalMD[i], replaceMent);
|
|
|
} else {
|
|
|
const link = internalContent;
|
|
|
const label = "";
|
|
|
const replaceMent = replaceMd(link, label);
|
|
|
newHtmlText = newHtmlText.replace(internalMD[i], replaceMent);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (EXRERNAL_MD_REG.test(htmlText)) {
|
|
|
const externalMD = htmlText.match(EXRERNAL_MD_REG);
|
|
|
for (let i = 0; i < externalMD.length; i++) {
|
|
|
if (!/(jpeg|jpg|gif|png|svg|bmp|wepg)/g.test(externalMD[i])) {
|
|
|
const link = getContentFromExternalLink(externalMD[i]);
|
|
|
const label = getLabelFromExternalLink(externalMD[i]);
|
|
|
const replaceMent = replaceMd(link, label);
|
|
|
newHtmlText = htmlText.replace(externalMD[i], replaceMent);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return newHtmlText;
|
|
|
};
|
|
|
const replaceMd = (internalLink, label) => {
|
|
|
const { metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalLink), "");
|
|
|
if (file instanceof require$$0.TFile) {
|
|
|
if (label) {
|
|
|
return `<a data-href="${internalLink}" data-type="link" data-filepath="${internalLink}" class="internal-link">${label}</a>`;
|
|
|
} else {
|
|
|
return `<a data-href="${internalLink}" data-type="link" data-filepath="${internalLink}" class="internal-link">${internalLink}</a>`;
|
|
|
}
|
|
|
} else if (label) {
|
|
|
return `<a data-href="${internalLink}" data-type="link" data-filepath="${internalLink}" class="internal-link is-unresolved">${label}</a>`;
|
|
|
} else {
|
|
|
return `<a data-href="${internalLink}" data-type="link" data-filepath="${internalLink}" class="internal-link is-unresolved">${internalLink}</a>`;
|
|
|
}
|
|
|
};
|
|
|
const getContentFromInternalLink = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /\[\[([^\]]+)\]\]/g.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const getLabelFromExternalLink = (line) => {
|
|
|
var _a;
|
|
|
return (_a = EXRERNAL_MD_REG.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const getContentFromExternalLink = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /\[([^\]]+)\]\((([^\]]+).md)\)/g.exec(line)) == null ? void 0 : _a[3];
|
|
|
};
|
|
|
const parseHtmlToRawText = (htmlStr) => {
|
|
|
const tempEl = document.createElement("div");
|
|
|
tempEl.className = "memo-content-text";
|
|
|
tempEl.innerHTML = htmlStr;
|
|
|
const text = tempEl.innerText;
|
|
|
return text;
|
|
|
};
|
|
|
const parseRawTextToHtml = (rawTextStr) => {
|
|
|
const htmlText = rawTextStr.replace(/\n/g, "<br>");
|
|
|
return htmlText;
|
|
|
};
|
|
|
const encodeHtml = (htmlStr) => {
|
|
|
const t2 = document.createElement("div");
|
|
|
t2.textContent = htmlStr;
|
|
|
return t2.innerHTML;
|
|
|
};
|
|
|
const Provider = (props) => {
|
|
|
const {
|
|
|
children,
|
|
|
store,
|
|
|
context: Context
|
|
|
} = props;
|
|
|
const [appState, setAppState] = _react_17_0_2_react.exports.useState(store.getState());
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const unsubscribe = store.subscribe((ns) => {
|
|
|
setAppState(ns);
|
|
|
});
|
|
|
return () => {
|
|
|
unsubscribe();
|
|
|
};
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsx(Context.Provider, {
|
|
|
value: appState,
|
|
|
children
|
|
|
});
|
|
|
};
|
|
|
var dialog = "";
|
|
|
const BaseDialog = (props) => {
|
|
|
const {
|
|
|
children,
|
|
|
className,
|
|
|
clickSpaceDestroy,
|
|
|
destroy
|
|
|
} = props;
|
|
|
const handleSpaceClicked = () => {
|
|
|
if (clickSpaceDestroy) {
|
|
|
destroy();
|
|
|
}
|
|
|
};
|
|
|
const handleEscClicked = (e) => {
|
|
|
const {
|
|
|
key
|
|
|
} = e;
|
|
|
if (key === "Escape") {
|
|
|
destroy();
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
className: `dialog-wrapper ${className}`,
|
|
|
onClick: handleSpaceClicked,
|
|
|
onKeyPress: handleEscClicked,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "dialog-container",
|
|
|
onClick: (e) => e.stopPropagation(),
|
|
|
children
|
|
|
})
|
|
|
});
|
|
|
};
|
|
|
function showDialog(config, DialogComponent, props) {
|
|
|
const tempDiv = document.createElement("div");
|
|
|
document.body.append(tempDiv);
|
|
|
setTimeout(() => {
|
|
|
var _a;
|
|
|
(_a = tempDiv.firstElementChild) == null ? void 0 : _a.classList.add("showup");
|
|
|
}, 0);
|
|
|
const cbs = {
|
|
|
destroy: () => {
|
|
|
var _a, _b;
|
|
|
(_a = tempDiv.firstElementChild) == null ? void 0 : _a.classList.remove("showup");
|
|
|
(_b = tempDiv.firstElementChild) == null ? void 0 : _b.classList.add("showoff");
|
|
|
setTimeout(() => {
|
|
|
tempDiv.remove();
|
|
|
ReactDOM$1.unmountComponentAtNode(tempDiv);
|
|
|
}, ANIMATION_DURATION);
|
|
|
}
|
|
|
};
|
|
|
const dialogProps = __spreadProps(__spreadValues({}, props), {
|
|
|
destroy: cbs.destroy
|
|
|
});
|
|
|
let Fragment2 = /* @__PURE__ */ jsx(BaseDialog, __spreadProps(__spreadValues({
|
|
|
destroy: cbs.destroy,
|
|
|
clickSpaceDestroy: true
|
|
|
}, config), {
|
|
|
children: /* @__PURE__ */ jsx(DialogComponent, __spreadValues({}, dialogProps))
|
|
|
}));
|
|
|
if (config.useAppContext) {
|
|
|
Fragment2 = /* @__PURE__ */ jsx(Provider, {
|
|
|
store: appStore,
|
|
|
context: appContext,
|
|
|
children: Fragment2
|
|
|
});
|
|
|
}
|
|
|
ReactDOM$1.render(Fragment2, tempDiv);
|
|
|
return cbs;
|
|
|
}
|
|
|
var previewImageDialog = "";
|
|
|
var close = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMiAxOSA2LjQxeiIvPjwvc3ZnPg==";
|
|
|
const PreviewImageDialog = ({
|
|
|
destroy,
|
|
|
imgUrl,
|
|
|
filepath
|
|
|
}) => {
|
|
|
const imgRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const [imgWidth, setImgWidth] = _react_17_0_2_react.exports.useState(-1);
|
|
|
const {
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
utils$1.getImageSize(imgUrl).then(({
|
|
|
width
|
|
|
}) => {
|
|
|
if (width !== 0) {
|
|
|
setImgWidth(80);
|
|
|
} else {
|
|
|
setImgWidth(0);
|
|
|
}
|
|
|
});
|
|
|
}, []);
|
|
|
const handleCloseBtnClick = () => {
|
|
|
destroy();
|
|
|
};
|
|
|
const handleDecreaseImageSize = () => {
|
|
|
if (imgWidth > 30) {
|
|
|
setImgWidth(imgWidth - 10);
|
|
|
}
|
|
|
};
|
|
|
const handleIncreaseImageSize = () => {
|
|
|
setImgWidth(imgWidth + 10);
|
|
|
};
|
|
|
const convertBase64ToBlob = (base64, type) => {
|
|
|
var bytes = window.atob(base64);
|
|
|
var ab2 = new ArrayBuffer(bytes.length);
|
|
|
var ia2 = new Uint8Array(ab2);
|
|
|
for (var i = 0; i < bytes.length; i++) {
|
|
|
ia2[i] = bytes.charCodeAt(i);
|
|
|
}
|
|
|
return new Blob([ab2], {
|
|
|
type
|
|
|
});
|
|
|
};
|
|
|
const copyImageToClipboard = async () => {
|
|
|
if ((filepath === null || filepath === void 0) && imgUrl !== null) {
|
|
|
const myBase64 = imgUrl.split("base64,")[1];
|
|
|
const blobInput = convertBase64ToBlob(myBase64, "image/png");
|
|
|
const clipboardItemInput = new ClipboardItem({
|
|
|
"image/png": blobInput
|
|
|
});
|
|
|
window.navigator["clipboard"].write([clipboardItemInput]);
|
|
|
new require$$0.Notice("Send to clipboard successfully");
|
|
|
} else {
|
|
|
var buffer = await vault.adapter.readBinary(filepath);
|
|
|
var arr = new Uint8Array(buffer);
|
|
|
var blob = new Blob([arr], {
|
|
|
type: "image/png"
|
|
|
});
|
|
|
const item = new ClipboardItem({
|
|
|
"image/png": blob
|
|
|
});
|
|
|
window.navigator["clipboard"].write([item]);
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: handleCloseBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "img-container internal-embed image-embed is-loaded",
|
|
|
children: [/* @__PURE__ */ jsx("img", {
|
|
|
className: imgWidth <= 0 ? "hidden" : "",
|
|
|
ref: imgRef,
|
|
|
width: imgWidth + "%",
|
|
|
src: imgUrl
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "loading-text " + (imgWidth === -1 ? "" : "hidden"),
|
|
|
children: t("Image is loading...")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "loading-text " + (imgWidth === 0 ? "" : "hidden"),
|
|
|
children: t("\u{1F61F} Cannot load image, image link maybe broken")
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "action-btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("button", {
|
|
|
className: "btn",
|
|
|
onClick: handleDecreaseImageSize,
|
|
|
children: "\u2796"
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn",
|
|
|
onClick: handleIncreaseImageSize,
|
|
|
children: "\u2795"
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn",
|
|
|
onClick: () => setImgWidth(80),
|
|
|
children: "\u2B55"
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn",
|
|
|
onClick: copyImageToClipboard,
|
|
|
children: "\u{1F4C4}"
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function showPreviewImageDialog(imgUrl, filepath) {
|
|
|
if (filepath) {
|
|
|
showDialog({
|
|
|
className: "preview-image-dialog"
|
|
|
}, PreviewImageDialog, {
|
|
|
imgUrl,
|
|
|
filepath
|
|
|
});
|
|
|
} else {
|
|
|
showDialog({
|
|
|
className: "preview-image-dialog"
|
|
|
}, PreviewImageDialog, {
|
|
|
imgUrl
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
var image = "";
|
|
|
const Image$1 = (props) => {
|
|
|
const {
|
|
|
className,
|
|
|
imgUrl,
|
|
|
alt,
|
|
|
referrerPolicy,
|
|
|
filepath
|
|
|
} = props;
|
|
|
const handleImageClick = () => {
|
|
|
if (filepath) {
|
|
|
showPreviewImageDialog(imgUrl, filepath);
|
|
|
} else {
|
|
|
showPreviewImageDialog(imgUrl);
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
className: "image-container " + className,
|
|
|
onClick: handleImageClick,
|
|
|
referrerPolicy,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
src: imgUrl,
|
|
|
alt,
|
|
|
decoding: "async",
|
|
|
loading: "lazy"
|
|
|
})
|
|
|
});
|
|
|
};
|
|
|
var memoCardDialog = "";
|
|
|
var edit = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE0LjA2IDkuMDJsLjkyLjkyTDUuOTIgMTlINXYtLjkybDkuMDYtOS4wNk0xNy42NiAzYy0uMjUgMC0uNTEuMS0uNy4yOWwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODNjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMi0uMi0uNDUtLjI5LS43MS0uMjl6bS0zLjYgMy4xOUwzIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1eiIvPjwvc3ZnPg==";
|
|
|
const getPathOfImage$4 = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink$4 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$4(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink$4 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$4(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const MemoCardDialog = (props) => {
|
|
|
var _a;
|
|
|
const [memo2, setMemo] = _react_17_0_2_react.exports.useState(__spreadProps(__spreadValues({}, props.memo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(props.memo.createdAt)
|
|
|
}));
|
|
|
const [linkMemos, setLinkMemos] = _react_17_0_2_react.exports.useState([]);
|
|
|
const [linkedMemos, setLinkedMemos] = _react_17_0_2_react.exports.useState([]);
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink$4(one));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink$4(two));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const fetchLinkedMemos = async () => {
|
|
|
try {
|
|
|
const linkMemos2 = [];
|
|
|
const matchedArr = [...memo2.content.matchAll(MEMO_LINK_REG)];
|
|
|
for (const matchRes of matchedArr) {
|
|
|
if (matchRes && matchRes.length === 3) {
|
|
|
const id2 = matchRes[2];
|
|
|
const memoTemp = memoService.getMemoById(id2);
|
|
|
if (memoTemp) {
|
|
|
linkMemos2.push(__spreadProps(__spreadValues({}, memoTemp), {
|
|
|
createdAtStr: utils$1.getDateTimeString(memoTemp.createdAt),
|
|
|
dateStr: utils$1.getDateString(memoTemp.createdAt)
|
|
|
}));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
setLinkMemos([...linkMemos2]);
|
|
|
const linkedMemos2 = await memoService.getLinkedMemos(memo2.id);
|
|
|
setLinkedMemos(linkedMemos2.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).map((m2) => __spreadProps(__spreadValues({}, m2), {
|
|
|
createdAtStr: utils$1.getDateTimeString(m2.createdAt),
|
|
|
dateStr: utils$1.getDateString(m2.createdAt)
|
|
|
})));
|
|
|
} catch (error) {
|
|
|
}
|
|
|
};
|
|
|
fetchLinkedMemos();
|
|
|
}, [memo2.id]);
|
|
|
const handleMemoContentClick = _react_17_0_2_react.exports.useCallback(async (e) => {
|
|
|
var _a2;
|
|
|
const targetEl = e.target;
|
|
|
if (targetEl.className === "memo-link-text") {
|
|
|
const nextMemoId = (_a2 = targetEl.dataset) == null ? void 0 : _a2.value;
|
|
|
const memoTemp = memoService.getMemoById(nextMemoId != null ? nextMemoId : "");
|
|
|
if (memoTemp) {
|
|
|
const nextMemo = __spreadProps(__spreadValues({}, memoTemp), {
|
|
|
createdAtStr: utils$1.getDateTimeString(memoTemp.createdAt)
|
|
|
});
|
|
|
setLinkMemos([]);
|
|
|
setLinkedMemos([]);
|
|
|
setMemo(nextMemo);
|
|
|
} else {
|
|
|
new require$$0.Notice("MEMO Not Found");
|
|
|
targetEl.classList.remove("memo-link-text");
|
|
|
}
|
|
|
}
|
|
|
}, []);
|
|
|
const handleLinkedMemoClick = _react_17_0_2_react.exports.useCallback((memo22) => {
|
|
|
setLinkMemos([]);
|
|
|
setLinkedMemos([]);
|
|
|
setMemo(memo22);
|
|
|
}, []);
|
|
|
const handleEditMemoBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
props.destroy();
|
|
|
globalStateService.setEditMemoId(memo2.id);
|
|
|
}, [memo2.id]);
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-card-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "header-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "time-text",
|
|
|
children: memo2.createdAtStr
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("button", {
|
|
|
className: "btn edit-btn",
|
|
|
onClick: handleEditMemoBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: edit
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: props.destroy,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
onClick: handleMemoContentClick,
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
className: "memo-img",
|
|
|
imgUrl,
|
|
|
alt: "",
|
|
|
referrerPolicy: "no-referrer"
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
className: "memo-img",
|
|
|
imgUrl: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
filepath: imgUrl.filepath
|
|
|
}, idx))
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "layer-container"
|
|
|
}), linkMemos.map((_, idx) => {
|
|
|
if (idx < 4) {
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
className: "background-layer-container",
|
|
|
style: {
|
|
|
bottom: (idx + 1) * -3 + "px",
|
|
|
left: (idx + 1) * 5 + "px",
|
|
|
width: `calc(100% - ${(idx + 1) * 10}px)`,
|
|
|
zIndex: -idx - 1
|
|
|
}
|
|
|
}, idx);
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
})]
|
|
|
}), linkMemos.length > 0 ? /* @__PURE__ */ jsxs("div", {
|
|
|
className: "linked-memos-wrapper",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "normal-text",
|
|
|
children: [t("LINKED"), " ", linkMemos.length, " MEMO "]
|
|
|
}), linkMemos.map((m2) => {
|
|
|
const rawtext = parseHtmlToRawText(formatMemoContent(m2.content)).replaceAll("\n", " ");
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "linked-memo-container",
|
|
|
onClick: () => handleLinkedMemoClick(m2),
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "time-text",
|
|
|
children: [m2.dateStr, " "]
|
|
|
}), rawtext]
|
|
|
}, m2.id);
|
|
|
})]
|
|
|
}) : null, linkedMemos.length > 0 ? /* @__PURE__ */ jsxs("div", {
|
|
|
className: "linked-memos-wrapper",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "normal-text",
|
|
|
children: [linkedMemos.length, " MEMO ", t("LINK TO THE"), " MEMO"]
|
|
|
}), linkedMemos.map((m2) => {
|
|
|
const rawtext = parseHtmlToRawText(formatMemoContent(m2.content)).replaceAll("\n", " ");
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "linked-memo-container",
|
|
|
onClick: () => handleLinkedMemoClick(m2),
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "time-text",
|
|
|
children: [m2.dateStr, " "]
|
|
|
}), rawtext]
|
|
|
}, m2.id);
|
|
|
})]
|
|
|
}) : null]
|
|
|
});
|
|
|
};
|
|
|
function showMemoCardDialog(memo2) {
|
|
|
showDialog({
|
|
|
className: "memo-card-dialog"
|
|
|
}, MemoCardDialog, {
|
|
|
memo: memo2
|
|
|
});
|
|
|
}
|
|
|
const cachedResourceMap = new Map();
|
|
|
const convertResourceToDataURL = async (url, useCache = true) => {
|
|
|
const { vault } = dailyNotesService.getState().app;
|
|
|
if (useCache && cachedResourceMap.has(url)) {
|
|
|
return Promise.resolve(cachedResourceMap.get(url));
|
|
|
}
|
|
|
if (!/(http|https)/g.test(url)) {
|
|
|
if (await vault.adapter.exists(url)) {
|
|
|
const buffer = await vault.adapter.readBinary(url);
|
|
|
const arr = new Uint8Array(buffer);
|
|
|
const blob = new Blob([arr], { type: "image/png" });
|
|
|
return new Promise((resolve) => {
|
|
|
const reader = new FileReader();
|
|
|
reader.onloadend = () => {
|
|
|
const base64Url = reader.result;
|
|
|
cachedResourceMap.set(url, base64Url);
|
|
|
resolve(base64Url);
|
|
|
};
|
|
|
reader.readAsDataURL(blob);
|
|
|
});
|
|
|
}
|
|
|
} else {
|
|
|
try {
|
|
|
const buffer = (await downloadFile(url)).buffer;
|
|
|
const blob = new Blob([buffer], { type: "image/png" });
|
|
|
return new Promise((resolve) => {
|
|
|
const reader = new FileReader();
|
|
|
reader.onloadend = () => {
|
|
|
const base64Url = reader.result;
|
|
|
cachedResourceMap.set(url, base64Url);
|
|
|
resolve(base64Url);
|
|
|
};
|
|
|
reader.readAsDataURL(blob);
|
|
|
});
|
|
|
} catch (error) {
|
|
|
console.log("error in grabReleaseFileFromRepository", URL, error);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const downloadFile = async (url) => {
|
|
|
const response = await fetch(url, {
|
|
|
mode: "no-cors"
|
|
|
});
|
|
|
if (response.status !== 200) {
|
|
|
return {
|
|
|
ok: false,
|
|
|
msg: response.statusText
|
|
|
};
|
|
|
}
|
|
|
const buffer = await response.arrayBuffer();
|
|
|
try {
|
|
|
return {
|
|
|
ok: true,
|
|
|
msg: "ok",
|
|
|
buffer
|
|
|
};
|
|
|
} catch (err) {
|
|
|
return {
|
|
|
ok: false,
|
|
|
msg: err
|
|
|
};
|
|
|
}
|
|
|
};
|
|
|
const getCloneStyledElement = async (element) => {
|
|
|
const clonedElementContainer = document.createElement(element.tagName);
|
|
|
clonedElementContainer.innerHTML = element.innerHTML;
|
|
|
const applyStyles2 = async (sourceElement, clonedElement) => {
|
|
|
var _a;
|
|
|
if (!sourceElement || !clonedElement) {
|
|
|
return;
|
|
|
}
|
|
|
const sourceStyles = window.getComputedStyle(sourceElement);
|
|
|
if (sourceElement.tagName === "IMG") {
|
|
|
try {
|
|
|
const url = await convertResourceToDataURL((_a = sourceElement.getAttribute("path")) != null ? _a : sourceElement.getAttribute("src"));
|
|
|
clonedElement.src = url;
|
|
|
} catch (error) {
|
|
|
}
|
|
|
} else if (sourceElement.className === "property-image") {
|
|
|
try {
|
|
|
const imageUrl = sourceElement.style.backgroundImage;
|
|
|
const url = await convertResourceToDataURL(imageUrl);
|
|
|
clonedElement.style.backgroundImage = url;
|
|
|
} catch (error) {
|
|
|
}
|
|
|
}
|
|
|
for (const item of sourceStyles) {
|
|
|
clonedElement.style.setProperty(item, sourceStyles.getPropertyValue(item), sourceStyles.getPropertyPriority(item));
|
|
|
}
|
|
|
for (let i = 0; i < clonedElement.childElementCount; i++) {
|
|
|
await applyStyles2(sourceElement.children[i], clonedElement.children[i]);
|
|
|
}
|
|
|
};
|
|
|
await applyStyles2(element, clonedElementContainer);
|
|
|
return clonedElementContainer;
|
|
|
};
|
|
|
const getFontsStyleElement = async (element) => {
|
|
|
const styleSheets = element.ownerDocument.styleSheets;
|
|
|
const fontFamilyStyles = [];
|
|
|
for (const sheet of styleSheets) {
|
|
|
for (const rule of sheet.cssRules) {
|
|
|
if (rule.constructor.name === "CSSFontFaceRule") {
|
|
|
fontFamilyStyles.push(rule.style);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const styleElement = document.createElement("style");
|
|
|
return styleElement;
|
|
|
};
|
|
|
const getElementSize = (element) => {
|
|
|
const { width, height } = window.getComputedStyle(element);
|
|
|
return {
|
|
|
width: parseInt(width.replace("px", "")),
|
|
|
height: parseInt(height.replace("px", ""))
|
|
|
};
|
|
|
};
|
|
|
const convertSVGToDataURL = (svg) => {
|
|
|
const xml = new XMLSerializer().serializeToString(svg);
|
|
|
const url = encodeURIComponent(xml);
|
|
|
return `data:image/svg+xml;charset=utf-8,${url}`;
|
|
|
};
|
|
|
const generateSVGElement = (width, height, element) => {
|
|
|
const xmlNS = "http://www.w3.org/2000/svg";
|
|
|
const svgElement = document.createElementNS(xmlNS, "svg");
|
|
|
svgElement.setAttribute("width", `${width}`);
|
|
|
svgElement.setAttribute("height", `${height}`);
|
|
|
svgElement.setAttribute("viewBox", `0 0 ${width} ${height}`);
|
|
|
const foreignObject = document.createElementNS(xmlNS, "foreignObject");
|
|
|
foreignObject.setAttribute("width", "100%");
|
|
|
foreignObject.setAttribute("height", "100%");
|
|
|
foreignObject.setAttribute("x", "0");
|
|
|
foreignObject.setAttribute("y", "0");
|
|
|
foreignObject.setAttribute("externalResourcesRequired", "true");
|
|
|
foreignObject.appendChild(element);
|
|
|
svgElement.appendChild(foreignObject);
|
|
|
return svgElement;
|
|
|
};
|
|
|
const toSVG = async (element, options) => {
|
|
|
const { width, height } = getElementSize(element);
|
|
|
const clonedElement = await getCloneStyledElement(element);
|
|
|
if (options == null ? void 0 : options.backgroundColor) {
|
|
|
clonedElement.style.backgroundColor = options.backgroundColor;
|
|
|
}
|
|
|
const svg = generateSVGElement(width, height, clonedElement);
|
|
|
svg.prepend(await getFontsStyleElement(element));
|
|
|
const url = convertSVGToDataURL(svg);
|
|
|
return url;
|
|
|
};
|
|
|
const toCanvas = async (element, options) => {
|
|
|
const url = await toSVG(element, options);
|
|
|
const imageEl = new Image();
|
|
|
imageEl.src = url;
|
|
|
const ratio = (options == null ? void 0 : options.pixelRatio) || 1;
|
|
|
const { width, height } = getElementSize(element);
|
|
|
const canvas = document.createElement("canvas");
|
|
|
const context = canvas.getContext("2d");
|
|
|
if (!context) {
|
|
|
return Promise.reject("Canvas error");
|
|
|
}
|
|
|
canvas.width = width * ratio;
|
|
|
canvas.height = height * ratio;
|
|
|
canvas.style.width = `${width}`;
|
|
|
canvas.style.height = `${height}`;
|
|
|
if ((options == null ? void 0 : options.backgroundColor) || document.body.className.contains("theme-dark")) {
|
|
|
context.fillStyle = options.backgroundColor || "#1f1f1f";
|
|
|
context.fillRect(0, 0, canvas.width, canvas.height);
|
|
|
}
|
|
|
return new Promise((resolve) => {
|
|
|
imageEl.onload = () => {
|
|
|
context.drawImage(imageEl, 0, 0, canvas.width, canvas.height);
|
|
|
resolve(canvas);
|
|
|
};
|
|
|
});
|
|
|
};
|
|
|
const toImage = async (element, options) => {
|
|
|
const canvas = await toCanvas(element, options);
|
|
|
return canvas.toDataURL();
|
|
|
};
|
|
|
var shareMemoImageDialog = "";
|
|
|
var share = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0cHgiIGZpbGw9IiMzNzM1MmYiPjxnPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjwvZz48Zz48cGF0aCBkPSJNMTYsNWwtMS40MiwxLjQybC0xLjU5LTEuNTlWMTZoLTEuOThWNC44M0w5LjQyLDYuNDJMOCw1bDQtNEwxNiw1eiBNMjAsMTB2MTFjMCwxLjEtMC45LDItMiwySDZjLTEuMTEsMC0yLTAuOS0yLTJWMTAgYzAtMS4xMSwwLjg5LTIsMi0yaDN2Mkg2djExaDEyVjEwaC0zVjhoM0MxOS4xLDgsMjAsOC44OSwyMCwxMHoiLz48L2c+PC9zdmc+";
|
|
|
var lightBackground = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGRhdGEtbmFtZT0iTGF5ZXIgMSIgd2lkdGg9IjExNDYuMzE4MjgiIGhlaWdodD0iODAxLjAwMzYxIiB2aWV3Qm94PSIwIDAgMTE0Ni4zMTgyOCA4MDEuMDAzNjEiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNMTA1MC42OTkxOCw1MTQuNTA4MmE0NTYuMjQ5MTMsNDU2LjI0OTEzLDAsMCwxLTM3LjM4MDEzLTI2MS44N2MzLjYwMDEtMjMuMSw5LjQ0MDA2LTQ2Ljg1LDI0LjQzMDE4LTY0Ljc5LDE0LjM4OTg5LTE3LjIzLDM5LjM0OTg1LTI3LjM3LDYwLjAyOTktMTkuMjktMTMuNTY5OTQtMjkuNjEtNDcuNzYtNDYuNS04MC41OS00Ny4zMy0zNC4wOS0uODYtNjYuOTIsMTIuNS05Ny4yNSwyOC4xLTMwLjMzLDE1LjYtNTkuNjUsMzMuODEwMDYtOTIuMjEsNDMuOTktNTMuNSwxNi43Mi0xMTEuOTEsMTAuMzQtMTY1LjUtNi4wOS01My41OC0xNi40NC0xMDMuNjItNDIuNDctMTU0LjYyLTY1LjcxLTUxLjAxLTIzLjI0LTEwNC4xNy00NC4wMy0xNjAuMDEtNDguOTEtNTUuODQtNC44Ny0xMTUuMjUsNy44OS0xNTcuMjQsNDUuMDFzLTYxLjg3LDEwMS4yOC0zOC4yNywxNTIuMTFjMTQuMjUsMzAuNyw0Mi4yMiw1NC4zMiw1Mi4wNCw4Ni43LDEyLjMyLDQwLjY1LTcuMDgsODMuOTYtMzAuNDEsMTE5LjQ1LTIzLjM0LDM1LjQ5LTUxLjgsNjkuNTgtNjAuNDcsMTExLjE2LTguMDEsMzguMzgsMi43Miw3OC4wMiwyNC4wNSwxMTEuMzhhMTk3LjM0NDY4LDE5Ny4zNDQ2OCwwLDAsMCwzNS43NCw0MS42MWM0My4wOSwzNy45MSw5OC43Nyw1OC4xNSwxNTQuMTcsNzMuMTMsMjAwLjI3LDU0LjE3LDQxNi4xMyw0OS4yOSw2MTMuNzUtMTMuODgsMzQuOTktMTEuMTgsNjkuOTUtMjQuNDMsOTkuMzItNDYuNDgsMTkuMTYtMTQuMzgsMzUuODMtMzMuMDIsNDYuMzktNTQuMzVhMTE0LjEwNTc0LDExNC4xMDU3NCwwLDAsMCwxMS4xMy0zNi4xODAwNUMxMTA0LjQzOTE3LDYxMC4xNzgxOSwxMDcyLjk2OTIsNTYyLjA1ODE5LDEwNTAuNjk5MTgsNTE0LjUwODJaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzZjNjNmZiIvPjxnIG9wYWNpdHk9IjAuMTciPjxwYXRoIGQ9Ik04OTAuNzUwMzIsMjQ2LjQ1MTQ1YzkuNjQxNzEtNC4yMDM5NC05LjkxMTYzLTYuNjUxMTktMzIuMDk1ODUtNy40NTU4MnMtNDkuMDIwNjEtLjc2MDExLTYzLjE5NzU2LTMuMDQ4NzVjLTEzLjcxMTE0LTIuMjEzNDMtMTIuNzAwOS02LjE0OTA3LTEzLjg1NDI3LTkuNzE0ODlzLTYuNDI0NDYtNy4yMjItMjcuODE5MjgtOC4wMTQ3Yy0yNi42NjA3LS45ODc3NC03MC42MjU4MSwyLjgxNDM0LTkwLjc1MTcxLjUzMTczLTE4Ljc4MTIxLTIuMTMwMTEtNy42MTcyMy04LjgxMTgyLTM1LjAwMzQ0LTkuMDY3NTUtMTUuNjM4MzctLjE0Ni0zNS43ODQ5LDIuMDU2ODItNTMuMTg1NzcsMi41ODg0NC0xNi4zMzY0Ny40OTkwOS0yOC40MjIxNi0uNTM0NDEtMzYuOTAzNTctMS45MjRzLTE0LjM4ODc1LTMuMTUxMjYtMjMuOTM0MTMtNC4zNzg2NGMtMjUuMDYwNjgtMy4yMjI0LTc0LjA5MTMzLTIuMTM5MjUtMTE3Ljg1MywxLjk5MDcxcy04MS4yNzM0NCwxMC44OTgxNi0xMDIuNDI4ODksMTcuNjAxNzUtMjcuMDAwMjksMTMuMzAzNzYtMjIuMDcyMzksMTguOTAwNzFjMy4xNDY3NCwzLjU3NCwxMS4xOTkxNSw2LjkxNTg1LDMwLjczMjM1LDguMzUyLDM2LjUzNTU1LDIuNjg2MjEsMTAxLjU4Mzg3LTEuOTM3NSwxMzkuMzM3MTMuNTA2NDUsMjEuMDQxNSwxLjM2MjEzLDMwLjM3NjQsNC43MzkyNCw0OC44MzgxMiw2LjU4NzE2LDE5LjgzNDA3LDEuOTg1MjgsNDguODY5MzUsMi4wOTA1MSw3Ny4zOTY1NiwyLjA0MzQxLDU5LjM5NzIxLS4wOTgwNywxMjAuMzEzNy0uNzA4MjksMTgyLjQyOTk0LTEuODI3NDcsMjUuOTQ0ODYtLjQ2NzQ1LDUzLjEzLTEuMDc1Miw4MC43Mzc2MS0zLjMwMjg5czU1Ljc2NjIzLTYuNTI1OTEsNjEuNTkwNzYtMTAuNTU1MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiNmZmYiLz48L2c+PHBhdGggZD0iTTEwOTkuMjU5MTEsMTcyLjA0ODE4Yy0uNDYtMS4xOC0uOTYtMi4zNS0xLjQ4LTMuNDkuODQuMzMsMS42ODAwNi42OSwyLjUxLDEuMDhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzZjNjNmZiIvPjxwYXRoIGQ9Ik02NDguNzQ0ODIsMzE0LjU4NDNjLTcuNjY5MzUtMTIuNjg0NDUtMTYuNzU3MjEtMjYuMjI3NjctMzAuOTg5NTUtMzAuMzY5NTMtMTYuNDgyLTQuNzk2NS0zMy40MTMxOSw0LjczMTkzLTQ3Ljc3NDczLDE0LjEzNDUzYTEzOTIuMTU2OTIsMTM5Mi4xNTY5MiwwLDAsMC0xMjMuODkzMzgsOTEuMjgzMTFsLjA0MzMxLjQ5MjM5cTQ2LjIyNTU2LTMuMTg3ODEsOTIuNDUxLTYuMzc1NTVjMjIuMjY1MzItMS41MzU0Niw0NS4yOTU1Ny0zLjI4MjcsNjQuOTcxOTUtMTMuODE1Niw3LjQ2NjUyLTMuOTk2ODMsMTQuNzQ0NzUtOS4zMzU3OSwyMy4yMDU1NS05LjcwNzgyLDEwLjUxMTc1LS40NjIxNywxOS42NzczMyw2Ljg3OTIzLDI2Ljg4MDIsMTQuNTQ5MzEsNDIuNjA3MzIsNDUuMzcxLDU0LjkzNywxMTQuNzU0MSwxMDIuNzM4MTcsMTU0LjYxNTkyQTE1MTYuOTk0NTgsMTUxNi45OTQ1OCwwLDAsMCw2NDguNzQ0ODIsMzE0LjU4NDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YyZjJmMiIvPjxwYXRoIGQ9Ik05MTAuNjQ1NzYsNjk5LjQxMjdjLTQuNzExNjgtNS45NDk1OC02LjYzNjkxLTcuMzQzLTExLjI4NDU3LTEzLjM0NzYxUTg0Mi41OTY4LDYxMi42NDg3Miw3OTIuNjUzMjcsNTM0LjI3MjcycS0zMy45MjM1My01My4yMzAwNS02NC40ODI3NS0xMDguNTA0MzktMTQuNTQ4NjMtMjYuMjc4MDgtMjguMjk5NjEtNTIuOTY4NzItMTAuNjcwNDMtMjAuNjk1Mi0yMC44NjQ2LTQxLjYzNzkzYy0xLjk0MzU3LTMuOTg3ODEtMy44MzIwOS03Ljk5MzkzLTUuNzExMjItMTIuMDA5MjItNC40Mjc4OC05LjQ0MjMyLTguNzczNC0xOC45MzA0Ny0xMy40Mzk0Mi0yOC4yNDQ0OS01LjMxNjg3LTEwLjYxNTcxLTExLjc4OTA1LTIxLjc0NDg1LTIxLjU1MjU5LTI4Ljg3N2EyOS40MDQ5LDI5LjQwNDksMCwwLDAtMTUuMzE4NTUtNS44OTQ1N2MtNy45NDgtLjUxMzM3LTE1LjI4MTg1LDIuNzY4NTQtMjIuMTc1NjksNi4zNTI5NC01MC40Mzg1OCwyNi4zMDEtOTcuNjU5MjEsNTkuMjc1ODktMTQwLjM2OTU5LDk2Ljc5NzcxQTczMC43Nzc4MSw3MzAuNzc3ODEsMCwwLDAsMzQ2LjM5NzQ4LDQ4NS44Nzg0M2MtMS4wMDgsMS40MzkyNy0zLjM5MTYzLjA2NDE4LTIuMzc0MTktMS4zODQyMnE2LjAwOTM1LTguNDk4MTgsMTIuMjU2ODEtMTYuODEyODhBNzM0LjgxNzQyLDczNC44MTc0MiwwLDAsMSw1NDMuODc5NzIsMjkyLjY5NTZxMTguMjQ4MjUtMTEuODI1NzksMzcuMTgyNjktMjIuNTQyNDVjNi4zNjIwNi0zLjYwMjc1LDEyLjc1MTg4LTcuMTU5NjcsMTkuMjUxMzYtMTAuNDk2NTMsNi4zNzE0Ny0zLjI3Mjc0LDEzLjEzNjg0LTYuMjE1NDcsMjAuNDE1NjMtNi4zMjU0NywyNC43NzAxMS0uMzg1LDM3LjU5NTQsMjcuNjY3LDQ2LjQwNTA2LDQ2LjU0MjQ4cTQuMTUyODMsOC45MTA2LDguNDA2MzYsMTcuNzY2MjYsMTYuMDc0ODEsMzMuNjIxMDYsMzMuMzg3MjksNjYuNjI4LDEwLjY4NDUzLDIwLjM3OSwyMS44MzY4Myw0MC41MTk1NSwzNC43MDcxLDYyLjcxODE2LDczLjc3ODU0LDEyMi44OTdjMzQuNTA1OSw1My4xNDI5LDY4LjczNjUxLDEwMC4wODg3NCwxMDguMDQ1ODYsMTQ5Ljc4NDczQzkxMy42NzEyNCw2OTguODQ0MzMsOTExLjczNzA2LDcwMC44MDYxNSw5MTAuNjQ1NzYsNjk5LjQxMjdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2U0ZTRlNCIvPjxwYXRoIGQ9Ik00NTcuOTkxMiwzNDUuNDM1MmMtMS40MzkxMS0xLjYwNDI4LTIuODY5MjYtMy4yMDg1Ni00LjMxNzc3LTQuODEyODQtMTEuNDIyNDQtMTIuNjMyNTktMjMuNjc4OC0yNS4xMTg0Ny0zOS4zNjQ0LTMyLjM2MDY3YTU3LjExMDIxLDU3LjExMDIxLDAsMCwwLTIzLjkyNjc4LTUuNTQ2MjJjLTguNTYyMTMuMDI3NTMtMTYuOTMxNzgsMi4yNzM0OC0yNC44NDMwNyw1LjQxNzkyLTMuNzQwMzQsMS40OTQyOC03LjM5ODMxLDMuMTkwMjEtMTEuMDAwNzgsNC45OTYxNC00LjExNjM0LDIuMDcxODItOC4xNTkyNyw0LjI4MTE4LTEyLjE4MzQsNi41MDg4M3EtMTEuMzMxMTIsNi4yNzA0NC0yMi4zNjgxNiwxMy4wOTA5LTIxLjk2MDYsMTMuNTcyMi00Mi41NDU2NSwyOS4yMTYyMy0xMC42NzExMSw4LjExMzExLTIwLjkwMTc1LDE2Ljc1Nzg4LTkuNTE1NTcsOC4wMzA1Mi0xOC42NDYxOCwxNi40OTJjLTEuMzAxNjgsMS4yMDA5MS0zLjI0NTI2LS43NDI1NS0xLjk0MzU4LTEuOTQzNDcsMS42MDQyOC0xLjQ5NDI4LDMuMjI2OTItMi45NzkzOCw0Ljg0OTU1LTQuNDQ2MTJxNi44NzU0OS02LjIxNTQ3LDEzLjk3MTItMTIuMTkyNTgsMTIuOTM5MjEtMTAuOTE4MjcsMjYuNTQ4NTEtMjAuOTkzMTIsMjEuMTYyOTUtMTUuNjc2MTQsNDMuNzgyODktMjkuMjI1NCwxMS4zMDM2LTYuNzY1NDcsMjIuOTE4MjktMTIuOTYyNmMyLjMzNzkzLTEuMjQ2NzQsNC43MDMxNy0yLjQ2Niw3LjA5NTcxLTMuNjIxMWExMTMuMTE0MzUsMTEzLjExNDM1LDAsMCwxLDE2Ljg2Nzc4LTYuODY2MzEsNjAuMDA2MjYsNjAuMDA2MjYsMCwwLDEsMjUuNDc2LTIuNTAyNjYsNjYuMzI3MjUsNjYuMzI3MjUsMCwwLDEsMjMuNTA1MTIsOC4xMzE0YzE1LjQwMDkxLDguNjA4MTIsMjcuMzQ1NzMsMjEuOTE5LDM4Ljk3MDA1LDM0LjkwOTE2QzQ2MS4xMDg0NCwzNDQuODAyNjUsNDU5LjE3MzgyLDM0Ni43NTUyOSw0NTcuOTkxMiwzNDUuNDM1MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZTRlNGU0Ii8+PHBhdGggZD0iTTc3My41NTE2Niw0NzYuMzQyMTZsMzYuOTA0NjItMTMuNDk4LDE4LjMyMzI3LTYuNzAxODJjNS45Njc1OC0yLjE4MjY3LDExLjkyMDgyLTQuNjY3NDcsMTguMDg5ODktNi4yMzAzN2EyOC41Mzg2OCwyOC41Mzg2OCwwLDAsMSwxNi4zNzM1NS4yMDg2MiwzNy43MzczMSwzNy43MzczMSwwLDAsMSwxMi43NzEsNy45MTY2NywxMDMuNjM4NzEsMTAzLjYzODcxLDAsMCwxLDEwLjQ3NDg4LDExLjE4NjQyYzMuOTg5MzIsNC43OTQyNiw3LjkxOTcsOS42Mzg3OCwxMS44Njc3MiwxNC40NjcwNnEyNC40NDEzNSwyOS44OTA5Myw0OC41NjMwNiw2MC4wNDEzNCwyNC4xMjExOCwzMC4xNDk5MSw0Ny45MTk4MSw2MC41NTYsMjMuODU2ODEsMzAuNDgwNDIsNDcuMzg1NDgsNjEuMjE1NzMsMi44ODIzLDMuNzY1MTksNS43NTk2Nyw3LjUzNDE1YzEuMDU5OCwxLjM4ODA5LDMuNDQ5NDguMDE5NjIsMi4zNzQ3MS0xLjM4ODA3cS0yMy43MDIyNS0zMS4wNDQ0MS00Ny43MzQ5MS02MS44MzQ2NC0yNC4wOTE3Ny0zMC44NjM4My00OC41MTY0Ni02MS40NjU4Ni0yNC40MjQyMy0zMC42MDE0Mi00OS4xNzg1NC02MC45Mzc0NC02LjE2Ny03LjU1NzYtMTIuMzU0NDQtMTUuMDk4NThjLTMuNDc5NTQtNC4yNDA3Mi02LjkxOTg0LTguNTI3MTgtMTAuNzM2MjktMTIuNDc0MjYtNy4wMDUzOC03LjI0NTE2LTE1Ljc1NzcyLTEzLjY0Nzk0LTI2LjIzNDM3LTEzLjgyMTY3LTYuMTU5NzItLjEwMjE0LTEyLjEyMSwxLjg1MjQ4LTE3Ljg0NCwzLjkyMjg4LTYuMTY5NjcsMi4yMzItMTIuMzI0NTUsNC41MDU3MS0xOC40ODYzMiw2Ljc1OTRMNzgyLjExMTIzLDQ3MC4yOTIxbC05LjI5MDY4LDMuMzk4MTFjLTEuNjQ4NzQuNjAzLS45MzY1LDMuMjYxODkuNzMxMTEsMi42NTE5NVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZTRlNGU0Ii8+PHBhdGggZD0iTTQwOS40NTI0OCwzMjQuMTU3MzNjLTE4Ljc1NDExLTkuNjM4NjYtNDIuNzcxMzctNy43NTA4Ny02MC4wMDUwNyw0LjI5MTE5QTg1NS44NDUzMiw4NTUuODQ1MzIsMCwwLDEsNDQ2LjgxOCwzNTEuMTc0MzRDNDMzLjUzNTM3LDM0My4zOTA0LDQyMy4xNDUyMSwzMzEuMTk0NzUsNDA5LjQ1MjQ4LDMyNC4xNTczM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZjJmMmYyIi8+PHBhdGggZD0iTTM0OS4yNjI4MiwzMjguNDE1MzQsMzQ1LjY1MjQsMzMxLjM1YzEuMjIxMjMtMS4wMjcxMywyLjQ5MDgtMS45OTAxMywzLjc5NS0yLjkwMTQ0QzM0OS4zODU4LDMyOC40Mzc4OSwzNDkuMzI0NDIsMzI4LjQyNiwzNDkuMjYyODIsMzI4LjQxNTM0WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiNmMmYyZjIiLz48cGF0aCBkPSJNODc0LjYyNDM2LDQ3Ni40NzdjLTMuNjMyNzktNC40MjIwNi03LjU2MDQ2LTkuMDUyMjItMTIuOTk0MjEtMTAuODQ4MzZsLTUuMDczMDguMjAwMDlhNTc1LjQzNjI5LDU3NS40MzYyOSwwLDAsMCwxNTMuMjY3MjksMTc1LjIyMDU2UTk0Mi4yMjQzNyw1NTguNzYzMTcsODc0LjYyNDM2LDQ3Ni40NzdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YyZjJmMiIvPjxwYXRoIGQ9Ik0xMDg2LjY2OTE1LDY5OC40NDgyYy0xMC41NjAwNiwyMS4zMy0yNy4yMywzOS45Ny00Ni4zOSw1NC4zNS0yOS4zNywyMi4wNS02NC4zMywzNS4zLTk5LjMyLDQ2LjQ4LTE5Ny42Miw2My4xNy00MTMuNDgsNjguMDUtNjEzLjc1LDEzLjg4LTU1LjQtMTQuOTgtMTExLjA4LTM1LjIyLTE1NC4xNy03My4xM2ExOTcuMzQ0NjgsMTk3LjM0NDY4LDAsMCwxLTM1Ljc0LTQxLjYxYzU3LjM1LTMxLjUyLDEyNi44Ni00My40LDE5My4xOS00MS45NSw5NS4wOSwyLjA4LDE4Ny45NiwyNy40NiwyODIuMTYsNDAuNTlhMTEwMi42NjksMTEwMi42NjksMCwwLDAsMzM0LjA0LTQuNmMzOC4zMTk5NC02LjQzLDc3Ljk4LTE0Ljg0LDExNS40OS00LjY2QTk1LjE0OTU0LDk1LjE0OTU0LDAsMCwxLDEwODYuNjY5MTUsNjk4LjQ0ODJaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzNmM2Q1NiIvPjxjaXJjbGUgY3g9IjE3OS4zMTgyOCIgY3k9IjUxIiByPSI1MSIgZmlsbD0iI2NjYyIvPjxwYXRoIGQ9Ik0zNjIuMzA4OTIsOTcuODQwNDJDMzQ4LjgxMTg1LDgzLjY4MTYsMzMzLjEzNjQzLDcwLjc2NSwzMTQuNTc5NjEsNjMuOTM5NDhhNzYuNzE1MjEsNzYuNzE1MjEsMCwwLDAtMTUuOTg2MzMtNC4wMTczNGMtLjA0Mzg4LS4wMDYtLjA4NTQ1LjAwMjg3LS4xMjkwOS0uMDAwNjdhMi4zNTU3NiwyLjM1NTc2LDAsMCwwLS4yNjk2NS0uMDUyOTIsNjEuNTM4OCw2MS41Mzg4LDAsMCwwLTIyLjg0MTMxLDEuMzc5LDYzLjEwNzM1LDYzLjEwNzM1LDAsMCwwLTEwLjYzNTE5LDMuNzA0OSw5My4wMDQ2Nyw5My4wMDQ2NywwLDAsMC05Ljk3OTQzLDUuNjU1NTdBNjQuOTA4MzIsNjQuOTA4MzIsMCwwLDEsMjMyLjY4NjMsNzguODM0OGE3NC4xODc3LDc0LjE4NzcsMCwwLDEtMTEuODQ0MDYsMS4xNjI0OGMtMy40NDcxNC4wNjkxNS02LjY5OC4xODg5LTkuOTY0LDEuNDM0MjZhMjMuOTE1NzMsMjMuOTE1NzMsMCwwLDAtMTQuNTY0OTQsMTUuNzcwNTEsMS41NTA3OCwxLjU1MDc4LDAsMCwwLC42ODkzMywxLjY5NGMuODgzNDkuNjMyNzUsMS43NDQ3NiwxLjM1MDY1LDIuNjczLDEuOTE0MzdhOC4zMzkyMiw4LjMzOTIyLDAsMCwwLDIuNjExLjcxMjA5cTIuMjEzNjYuNDY3MTEsNC40MzI5Mi45MDY5Myw4LjE3NTg0LDEuNjE5OTIsMTYuNDE5NjIsMi44Njc5MiwxNi42ODEsMi41MjUyLDMzLjU0MjE3LDMuNTU3NTVhMzczLjQ4MTMyLDM3My40ODEzMiwwLDAsMCw2Ny41MTAyNi0yLjAyOUEzNzQuNzcxNDQsMzc0Ljc3MTQ0LDAsMCwwLDM2MS42NDcsMTAwLjM0NzUsMS41MTM5LDEuNTEzOSwwLDAsMCwzNjIuMzA4OTIsOTcuODQwNDJaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YwZjBmMCIvPjxwYXRoIGQ9Ik0yMDguNTc5NjEsMTMxLjkzOTQ4YTc2LjcxNTIxLDc2LjcxNTIxLDAsMCwwLTE1Ljk4NjMzLTQuMDE3MzRjLS4wNDM4OC0uMDA2LS4wODU0NS4wMDI4Ny0uMTI5MDktLjAwMDY3YTIuMzU1NzYsMi4zNTU3NiwwLDAsMC0uMjY5NjUtLjA1MjkyLDYxLjUzODgsNjEuNTM4OCwwLDAsMC0yMi44NDEzMSwxLjM3OSw2My4xMDczNSw2My4xMDczNSwwLDAsMC0xMC42MzUxOSwzLjcwNDksOTMuMDA0NjcsOTMuMDA0NjcsMCwwLDAtOS45Nzk0Myw1LjY1NTU3LDY0LjkwODMyLDY0LjkwODMyLDAsMCwxLTIyLjA1MjMxLDguMjI2ODEsNzQuMTg3Nyw3NC4xODc3LDAsMCwxLTExLjg0NDA2LDEuMTYyNDhjLTMuNDQ3MTQuMDY5MTUtNi42OTguMTg4OS05Ljk2NCwxLjQzNDI2YTIzLjkxNTczLDIzLjkxNTczLDAsMCwwLTE0LjU2NDk0LDE1Ljc3MDUxLDEuNTUwNzgsMS41NTA3OCwwLDAsMCwuNjg5MzMsMS42OTRjLjg4MzQ5LjYzMjc1LDEuNzQ0NzYsMS4zNTA2NSwyLjY3MywxLjkxNDM3YTguMzM5MjIsOC4zMzkyMiwwLDAsMCwyLjYxMS43MTIwOXEyLjIxMzY2LjQ2NzEyLDQuNDMyOTIuOTA2OTMsOC4xNzU4NCwxLjYxOTkyLDE2LjQxOTYyLDIuODY3OTIsMTYuNjgxLDIuNTI1MiwzMy41NDIxNywzLjU1NzU1YTM3My40ODEzMiwzNzMuNDgxMzIsMCwwLDAsNjcuNTEwMjYtMi4wMjlBMzc0Ljc3MTQ0LDM3NC43NzE0NCwwLDAsMCwyNTUuNjQ3LDE2OC4zNDc1YTEuNTEzOSwxLjUxMzksMCwwLDAsLjY2MTkzLTIuNTA3MDhDMjQyLjgxMTg1LDE1MS42ODE2LDIyNy4xMzY0MywxMzguNzY1LDIwOC41Nzk2MSwxMzEuOTM5NDhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YwZjBmMCIvPjxwb2x5Z29uIHBvaW50cz0iMTA0Ny40MTEgNTg4LjE0MiAxMDc0LjU3NiA1NjcuNTE4IDEwODcuODE2IDU4MC43NTkgMTA0My41NjMgNjExLjA0MiAxMDQ3LjQxMSA1ODguMTQyIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTEwNDguOTE2MzUsNjk0LjQyNzgxSDk1NS45OTI2OWwzLjI1OTA3LTEwLjU1OTg3LDAsMGMyMC4xOTkzLTcuMzEyMjcsOC44NTMzMy0yMy4wMjk1NywyOC4wNjc1MS0zMi42MzY2Niw0Ni45OTY4LTIzLjQ5ODQsNjUuMTkxMTgtOTMuNjIwMDYsNTguMzA5MzItMTIxLjMzOTM1bDMwLjc5OC0xLjMwMjIxUzExMTguOTU4NzcsNjQ5LjM3NDc2LDEwNDguOTE2MzUsNjk0LjQyNzgxWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNMTEyOC4yNDY1Myw2NDQuNzg4ODhhMTUuNjE4OTMsMTUuNjE4OTMsMCwwLDEtMjAuMTgyNzIuMzc3NTlsLS4wNjA0LS4wNDk2MS0uMDAyMDctLjA3NzY3YTE0Ljk2NDgzLDE0Ljk2NDgzLDAsMCwwLS42LTMuODE5MzYsMTAuNjkwNzcsMTAuNjkwNzcsMCwwLDEtLjM4ODE4LDIuNjQzNjZsLS4wNzc4NC4yODk5MS0uMjA4NzMtLjIxNTQ5Yy0uMTgwMjctLjE4NTg5LS4zNTQ3NC0uMzc0NzItLjUxODU5LS41NjFhMTUuNzUwODgsMTUuNzUwODgsMCwwLDEtMi4zOTktMy42MzI2OSw0NS45MTYyMyw0NS45MTYyMywwLDAsMC0xMi43NC0xNS44Nzk3MiwyMi4yOTIzNywyMi4yOTIzNywwLDAsMS0yLjY3MjctMi41NzE3MiwyMi4wMzQxNSwyMi4wMzQxNSwwLDAsMSwyNy42Njk1NS0zMy41NjkxMWwuMTM3NjcuMDgwNi0uMDcxNDguMTQyNWExMS40Nzc1NiwxMS40Nzc1NiwwLDAsMS0yLjA0Nzg4LDIuOTU0LDE0Ljk2ODI5LDE0Ljk2ODI5LDAsMCwwLDMuMTUzOTUtMi4yNzg2NWwuMTAwMDYtLjA5NDM2LjExMzM3LjA3ODE4YTIyLjEyNzkzLDIyLjEyNzkzLDAsMCwxLDQuMDI5NCwzLjU4NjdsLjEyODQ0LjE0NzI2YTkuODM2NDMsOS44MzY0MywwLDAsMCw3LjI4Mzc1LDMuMzYxMjMsMTUuNjE0LDE1LjYxNCwwLDAsMSwxNS4xMTk0NywxOC4yOTI5MWwtLjAxNzY5LjEwMzE1LS4xMDAzNC4wMzA0YTEzLjM5ODY2LDEzLjM5ODY2LDAsMCwxLTUuNDU2OTQuNjgwODgsMTUuMjIyMDgsMTUuMjIyMDgsMCwwLDAsNC44NjA2MSwxLjIxNzRsLjIxNjU0LjAxNzE4LS4wNjg3NC4yMDYxOWExNS42MDM1LDE1LjYwMzUsMCwwLDEtNC41MDMzOSw2Ljc5bC0uMDU5MjguMDUxODctLjA2Mjk0LjA1NTA5YTE1LjMzMjksMTUuMzMyOSwwLDAsMC01LjI5NywxMC42NDI3MkExNS43MzM0NSwxNS43MzM0NSwwLDAsMSwxMTI4LjI0NjUzLDY0NC43ODg4OFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PHBhdGggZD0iTTExMzEuMDg5LDYzOS43NjkzNGExNS41NzQxOCwxNS41NzQxOCwwLDAsMS0uMTc1NiwxLjY3ODk0LDE1Ljc4NTIxLDE1Ljc4NTIxLDAsMCwwLDIuNTM3NzItNy44MjA0N2MuMDIwNzEtLjQyNjM3LjA2NTQ2LS44NTExLjEyNTQ5LTEuMjczOTNBMTQuODE0MSwxNC44MTQxLDAsMCwwLDExMzEuMDg5LDYzOS43NjkzNFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExMzYuMDAzMzEsNjIwLjc4OWExNS4xOTgxNSwxNS4xOTgxNSwwLDAsMCwzLjg4NDE4LDEuMDk4MjIsMTUuNjMsMTUuNjMsMCwwLDAsMS40MjMyMi0xLjczNjQ3QTEzLjI0MzYzLDEzLjI0MzYzLDAsMCwxLDExMzYuMDAzMzEsNjIwLjc4OVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExNDEuNzI3MzYsNjE1LjY2MDgyYTE1LjcwOTA3LDE1LjcwOTA3LDAsMCwxLS4xMTExMiw0LjA1MTk0LDE1LjUyOTA4LDE1LjUyOTA4LDAsMCwwLDEuNzU3NTgtMy42MjQ1NWwuMDY4NzQtLjIwNjItLjIxNjU1LS4wMTcxOEExNS4wOTQ3MiwxNS4wOTQ3MiwwLDAsMSwxMTQxLjcyNzM2LDYxNS42NjA4MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExNDAuMjgyNDEsNjAwLjgzOTY3YTE1LjY1MDc5LDE1LjY1MDc5LDAsMCwwLTExLjQ2MTQ5LTUuMjk5NTgsOS44MzY0OSw5LjgzNjQ5LDAsMCwxLTcuMjgzNzgtMy4zNjEyNGwtLjEyODQzLS4xNDcyNmEyMi4xMjc4NSwyMi4xMjc4NSwwLDAsMC00LjAyOTM5LTMuNTg2NjlsLS4xMTMzOC0uMDc4MTctLjEwMDA1LjA5NDM0YTE0Ljk2NzYsMTQuOTY3NiwwLDAsMS0zLjE1NCwyLjI3ODY1LDExLjQ3ODMyLDExLjQ3ODMyLDAsMCwwLDIuMDQ3OTQtMi45NTRsLjA3MTQ2LS4xNDI1LS4xMzc2Ni0uMDgwNTlhMjIuMDE3NzcsMjIuMDE3NzcsMCwwLDAtMzIuNjIxMTMsMTQuMjU0MiwyMi4wMjE4MiwyMi4wMjE4MiwwLDAsMSwzMC4yNTktOC4xMTI2OGwuMTM3NjUuMDgwNTktLjA3MTQ1LjE0MjVhMTEuNDc4MTQsMTEuNDc4MTQsMCwwLDEtMi4wNDc5NCwyLjk1NCwxNC45Njc1NCwxNC45Njc1NCwwLDAsMCwzLjE1NC0yLjI3ODY1bC4xMDAwNi0uMDk0MzQuMTEzMzguMDc4MTdhMjIuMTI4NTcsMjIuMTI4NTcsMCwwLDEsNC4wMjkzOSwzLjU4NjdsLjEyODQzLjE0NzI1YTkuODM2NDMsOS44MzY0MywwLDAsMCw3LjI4Mzc3LDMuMzYxMjQsMTUuNjE2NzUsMTUuNjE2NzUsMCwwLDEsMTUuMTAzNDcsMTIuODM0ODgsMTguOTI3MTQsMTguOTI3MTQsMCwwLDAsMi4yNjAwNS0uNTVsLjEwMDM0LS4wMzAzOS4wMTc3Ni0uMTAzMTRBMTUuNTU0LDE1LjU1NCwwLDAsMCwxMTQwLjI4MjQxLDYwMC44Mzk2N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExNzMuMTU5MTMsNTM2LjU0MDY1YTUwLjI5MTQxLDUwLjI5MTQxLDAsMCwxLTQyLjAwNyw0OS41OTk2NWwtLjI0ODQuMDQwNTMtLjE5MjE5LS4xNjAxNmE0OC4xODU2NSw0OC4xODU2NSwwLDAsMC0xMC41MTAwOC02LjY3MTU5LDM0LjQyMzE2LDM0LjQyMzE2LDAsMCwxLDUuNTY2Miw2LjU2MDQ3bC41MzUzNy44MDQ2OS0uOTY0ODUuMDQ2NDFjLS44MzI4LjA0MDUzLTEuNjYwMzguMDYwOC0yLjQ1OTE5LjA2MDhhNTAuNzE1NTQsNTAuNzE1NTQsMCwwLDEtMTMuODg0NDUtMS45MjUxM2MtMjAuNTE3NDgtNS44Mzc0OC00Mi41NTAyMi02LjgzNTY3LTY1LjQ4NTcxLTIuOTY3MTFhNzEuNzc4NTYsNzEuNzc4NTYsMCwwLDEtMTEuOTAxNDcuOTkzQTcwLjk0Nzg3LDcwLjk0Nzg3LDAsMCwxLDEwMDkuMjg3LDQ0NC42MzcyM2wuNDg3NjUtLjE2MTQ2LjE5MjUxLjQ3NTg5YTM2Ljk1NjU5LDM2Ljk1NjU5LDAsMCwxLDIuNzg3LDExLjIzMzA2LDQ4LjE5NjM1LDQ4LjE5NjM1LDAsMCwwLDEuMTk3ODktMTIuNDcxMTZsLS4wMTUzNi0uNDQyNTUuNDMwMTMtLjEwNzg2YTcxLjI0OTM5LDcxLjI0OTM5LDAsMCwxLDE3LjI0MDUxLTIuMTE0N2wuNjI5MTguMDAyNjJhMzEuNjcyMjgsMzEuNjcyMjgsMCwwLDAsMjMuNjE2LTEwLjQ2MjM3LDUwLjI3NTY4LDUwLjI3NTY4LDAsMCwxLDc2LjM4MDE2LDIuMzQ2MTFsLjIxMTguMjYyMTMtLjEzOTkuMzA3MjNjLTIuOTM3NjksNi40NzQ4NC02LjEzODE4LDExLjE5MTg5LTkuOTU4MzYsMTQuNjQxNDNhNDkuMDEzNDMsNDkuMDEzNDMsMCwwLDAsMTMuMjc5NzgtOS4xNjI4MmwuNTAyLS40ODcuMzUyMzQuNjA0NjZBNTAuMjQyMTQsNTAuMjQyMTQsMCwwLDEsMTE0My4zMiw0NjQuNDI3OGwtLjAwMDY1LjI1MzYzYy0uMDAwNjUuMDg5NTYtLjAwMDY1LjE3OTc3LS4wMDA2NS4yNjkzMiwwLDEzLjYxMzE3LDUuMjY0MTksMjYuNTE1NzcsMTQuNDY2ODksMzUuNDM5MzRBNTAuNjYwMjEsNTAuNjYwMjEsMCwwLDEsMTE3My4xNTkxMyw1MzYuNTQwNjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzNmM2Q1NiIvPjxnIG9wYWNpdHk9IjAuMTUiPjxwYXRoIGQ9Ik0xMTExLjY4ODY4LDQxNy43MTcxM2EzNS41MTksMzUuNTE5LDAsMCwxLTYuMzM1MDksNy43NzE1OSw0OC44ODkyOSw0OC44ODkyOSwwLDAsMCw5Ljg5ODIzLTYuMTg2NVExMTEzLjUwMjI4LDQxOC40NDAzOCwxMTExLjY4ODY4LDQxNy43MTcxM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PHBhdGggZD0iTTExNDAuNzkyOTMsNDc3LjczMzIzYTUwLjQ4MTkxLDUwLjQ4MTkxLDAsMCwxLDcuMjI5ODEsOC44MDc3NSw1MS4zOTI4OCw1MS4zOTI4OCwwLDAsMS00LjcwNDA1LTIxLjU5MDIyYzAtLjA4OTU3LDAtLjE3OTc4LjAwMDY1LS4yNjkzMmwuMDAwNjQtLjI1MzY0YTUwLjI0MjQ1LDUwLjI0MjQ1LDAsMCwwLTYuODM5NTYtMjUuMzI3MzVsLS4zNTIzNS0uNjA0NjgtLjUwMjA3LjQ4N2E0OS4xMjYxNiw0OS4xMjYxNiwwLDAsMS05LjE3MDQzLDYuOTgzQTQ4Ljk3MTg1LDQ4Ljk3MTg1LDAsMCwwLDExNDAuNzkyOTMsNDc3LjczMzIzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiLz48cGF0aCBkPSJNMTEyNi4zMjczMyw0NDEuNzcwOTNsLS4wMDA2NS4yNTM2NGMtLjAwMDY0LjA4OTU0LS4wMDA2NC4xNzk3NS0uMDAwNjQuMjY5MzEsMCwuNDkzNTUuMDA4OTQuOTg1ODUuMDIyNzIsMS40NzczOWE1Mi4zNjQ4LDUyLjM2NDgsMCwwLDAsNS45NTU4Ny0xMC4yNjcwOWwuMTM5ODUtLjMwNzI1LS4yMTE3Ni0uMjYyMTJhNTAuNjg4MTEsNTAuNjg4MTEsMCwwLDAtOS4wOTYtOC43OTczM0E1MC4zNTYyMSw1MC4zNTYyMSwwLDAsMSwxMTI2LjMyNzMzLDQ0MS43NzA5M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PHBhdGggZD0iTTExNTcuNzg1NTksNTAwLjM5MDFhNDUuNDU5MzQsNDUuNDU5MzQsMCwwLDEtNi40MDgzOC03Ljc5NjY2LDUwLjIyOTcsNTAuMjI5NywwLDAsMS0zNy4yMTc3Miw3MC44OWwtLjI0ODQxLjA0MDU0LS4xOTIxNy0uMTYwMTZhNDguMTg4LDQ4LjE4OCwwLDAsMC0xMC41MTAxLTYuNjcxNTksMzQuNDIyNjIsMzQuNDIyNjIsMCwwLDEsNS41NjYxNyw2LjU2MDQ2bC41MzU0LjgwNDcxLS45NjQ4Mi4wNDY0Yy0uODMyODYuMDQwNTQtMS42NjA0MS4wNjA4LTIuNDU5Mi4wNjA4YTUwLjcxNTQ5LDUwLjcxNTQ5LDAsMCwxLTEzLjg4NDQ4LTEuOTI1MTRjLTIwLjUxNzQ5LTUuODM3NDctNDIuNTUwMjItNi44MzU2Ni02NS40ODU3LTIuOTY3MWE3MS43NzkzLDcxLjc3OTMsMCwwLDEtMTEuOTAxNDUuOTkzLDcwLjYyMzg5LDcwLjYyMzg5LDAsMCwxLTQ3LjEyLTE3Ljk2OSw3MS4wMTExOCw3MS4wMTExOCwwLDAsMCw2NC4xMTI3LDQwLjYyNTksNzEuNzc5NDcsNzEuNzc5NDcsMCwwLDAsMTEuOTAxNDUtLjk5Mjk0YzIyLjkzNTQ3LTMuODY4NTcsNDQuOTY4MjEtMi44NzAzNyw2NS40ODU3LDIuOTY3MDlhNTAuNzE1NDMsNTAuNzE1NDMsMCwwLDAsMTMuODg0NDgsMS45MjUxNGMuNzk4NzgsMCwxLjYyNjM0LS4wMjAyNiwyLjQ1OTE5LS4wNjA4bC45NjQ4My0uMDQ2NC0uNTM1NC0uODA0NzFhMzQuNDIyNjMsMzQuNDIyNjMsMCwwLDAtNS41NjYxOC02LjU2MDQ1LDQ4LjE4Nzc0LDQ4LjE4Nzc0LDAsMCwxLDEwLjUxMDExLDYuNjcxNTlsLjE5MjE3LjE2MDE2LjI0ODQxLS4wNDA1NWE1MC4yNTM5Miw1MC4yNTM5MiwwLDAsMCwyNi42MzM0NC04NS43NTAxOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PC9nPjxwb2x5Z29uIHBvaW50cz0iMTM0LjAzNSA1NjAuOTczIDk3LjIyMyA1MzMuMDI1IDc5LjI4IDU1MC45NjggMTM5LjI1IDU5Mi4wMDcgMTM0LjAzNSA1NjAuOTczIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTE5NS4yMSw2ODcuNDI3ODFoMTI1LjkyNjZMMzE2LjcyLDY3My4xMTc0N2wwLDBjLTI3LjM3MzMyLTkuOTA5My0xMS45OTc2OS0zMS4yMDg3OS0zOC4wMzYtNDQuMjI4LTYzLjY4ODI3LTMxLjg0NDE0LTg4LjM0NDYtMTI2Ljg3MDM1LTc5LjAxODU2LTE2NC40MzQ0N2wtNDEuNzM2MjUtMS43NjQ3MVMxMDAuMjkxMTMsNjI2LjM3MzY0LDE5NS4yMSw2ODcuNDI3ODFaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik04MC41NTM2NSw2MDUuMjUyMTlhMjAuNzc4NiwyMC43Nzg2LDAsMCwwLTcuMTc4MzMtMTQuNDIyNjFjLS4wMjgzLS4wMjQ4OS0uMDU2ODEtLjA1LS4wODUyOS0uMDc0NjVsLS4wODAzNC0uMDcwM2EyMS4xNDUzOSwyMS4xNDUzOSwwLDAsMS02LjEwMjgzLTkuMjAxNDhsLS4wOTMxNS0uMjc5NDIuMjkzNDUtLjAyMzI5YTIwLjYyODMsMjAuNjI4MywwLDAsMCw2LjU4NjkxLTEuNjQ5NzcsMTguMTU3MjYsMTguMTU3MjYsMCwwLDEtNy4zOTUtLjkyMjdsLS4xMzYtLjA0MTItLjAyNC0uMTM5NzlhMjEuMTU5NTMsMjEuMTU5NTMsMCwwLDEsMjAuNDg5MzItMjQuNzg5ODUsMTMuMzI5ODcsMTMuMzI5ODcsMCwwLDAsOS44NzA2Ni00LjU1NWwuMTc0MDYtLjE5OTU2YTI5Ljk4NjgsMjkuOTg2OCwwLDAsMSw1LjQ2MDQ5LTQuODYwNTVsLjE1MzY0LS4xMDYuMTM1NTkuMTI3ODZhMjAuMjg0NSwyMC4yODQ1LDAsMCwwLDQuMjc0MTEsMy4wODgsMTUuNTU0LDE1LjU1NCwwLDAsMS0yLjc3NTE5LTQuMDAzMTJsLS4wOTY4OC0uMTkzMTIuMTg2NTctLjEwOTIzQTI5Ljg1OTg0LDI5Ljg1OTg0LDAsMCwxLDE0MS43MDgxOCw1ODguMzE4YTMwLjIwOSwzMC4yMDksMCwwLDEtMy42MjE5NSwzLjQ4NTExLDYyLjIyNCw2Mi4yMjQsMCwwLDAtMTcuMjY0ODMsMjEuNTE5NTksMjEuMzQ0NDcsMjEuMzQ0NDcsMCwwLDEtMy4yNTEsNC45MjI4OWMtLjIyMi4yNTI0NC0uNDU4NDguNTA4MzQtLjcwMjc3Ljc2MDI2bC0uMjgyODYuMjkyLS4xMDU0OS0uMzkyODdhMTQuNDg3NDIsMTQuNDg3NDIsMCwwLDEtLjUyNi0zLjU4MjU5LDIwLjI3OTYxLDIwLjI3OTYxLDAsMCwwLS44MTMsNS4xNzU4NWwtLjAwMjgxLjEwNTI1LS4wODE4NS4wNjcyNGEyMS4xNTAzNywyMS4xNTAzNywwLDAsMS0zNC41MDE5Mi0xNS40MTg1M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PHBhdGggZD0iTTgzLjg1MjY2LDYxMy4zNTY3M2EyMS4xMDM3NCwyMS4xMDM3NCwwLDAsMCwuMjM4LDIuMjc1MjQsMjEuMzkxNTYsMjEuMzkxNTYsMCwwLDEtMy40MzktMTAuNTk4Yy0uMDI4MDYtLjU3NzgxLS4wODg3MS0xLjE1MzM5LS4xNzAwNi0xLjcyNjM5QTIwLjA3NTYyLDIwLjA3NTYyLDAsMCwxLDgzLjg1MjY2LDYxMy4zNTY3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTc3LjE5Myw1ODcuNjM1MjRhMjAuNTk2ODEsMjAuNTk2ODEsMCwwLDEtNS4yNjM3LDEuNDg4MjYsMjEuMTgwMjksMjEuMTgwMjksMCwwLDEtMS45Mjg2OC0yLjM1MzJBMTcuOTQ3MzEsMTcuOTQ3MzEsMCwwLDAsNzcuMTkzLDU4Ny42MzUyNFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTY5LjQzNiw1ODAuNjg1NzlhMjEuMjg4OTMsMjEuMjg4OTMsMCwwLDAsLjE1MDYsNS40OTEsMjEuMDQzODksMjEuMDQzODksMCwwLDEtMi4zODE4LTQuOTExODZsLS4wOTMxNi0uMjc5NDMuMjkzNDYtLjAyMzI5QTIwLjQ1MTcsMjAuNDUxNywwLDAsMCw2OS40MzYsNTgwLjY4NTc5WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIG9wYWNpdHk9IjAuMTUiLz48cGF0aCBkPSJNNzEuMzk0MTUsNTYwLjYwMDczYTIxLjIwOTMxLDIxLjIwOTMxLDAsMCwxLDE1LjUzMjE4LTcuMTgxNzksMTMuMzMsMTMuMzMsMCwwLDAsOS44NzA2OS00LjU1NWwuMTc0LS4xOTk1NWEyOS45ODcxNywyOS45ODcxNywwLDAsMSw1LjQ2MDQ4LTQuODYwNTZsLjE1MzY0LS4xMDU5My4xMzU1OS4xMjc4NWEyMC4yODM3NywyMC4yODM3NywwLDAsMCw0LjI3NDE1LDMuMDg3OTQsMTUuNTU0NzQsMTUuNTU0NzQsMCwwLDEtMi43NzUyOS00LjAwMzEybC0uMDk2ODMtLjE5MzEyLjE4NjU1LS4xMDkyMUEyOS44Mzc2NCwyOS44Mzc2NCwwLDAsMSwxNDguNTE2MjcsNTYxLjkyNWEyOS44NDMxNSwyOS44NDMxNSwwLDAsMC00MS4wMDU4NS0xMC45OTRsLS4xODY1NS4xMDkyMS4wOTY4My4xOTMxMWExNS41NTQ4LDE1LjU1NDgsMCwwLDAsMi43NzUyOSw0LjAwMzEzLDIwLjI4NDEyLDIwLjI4NDEyLDAsMCwxLTQuMjc0MTUtMy4wODc5NGwtLjEzNTU5LS4xMjc4Ni0uMTUzNjQuMTA1OTRhMjkuOTg3MTEsMjkuOTg3MTEsMCwwLDAtNS40NjA0OCw0Ljg2MDU1bC0uMTc0LjE5OTU2YTEzLjMzLDEzLjMzLDAsMCwxLTkuODcwNjksNC41NTVBMjEuMTYzMTYsMjEuMTYzMTYsMCwwLDAsNjkuNjU5NzUsNTc5LjEzNWEyNS42NDg0NSwyNS42NDg0NSwwLDAsMS0zLjA2MjczLS43NDUyOWwtLjEzNi0uMDQxMTgtLjAyNDA3LS4xMzk3OEEyMS4wNzgyNCwyMS4wNzgyNCwwLDAsMSw3MS4zOTQxNSw1NjAuNjAwNzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgb3BhY2l0eT0iMC4xNSIvPjxwYXRoIGQ9Ik00Ny42NzQ1NCw0MjQuNDc1MjljMTIuNDcxMTQtMTIuMDkyODksMTkuNjA1LTI5LjU3OCwxOS42MDUtNDguMDI2LDAtLjEyMTM2LDAtLjI0MzYxLS4wMDA4OS0uMzY1bC0uMDAwODgtLjM0MzcyYTY4LjA4NjExLDY4LjA4NjExLDAsMCwxLDkuMjY4NzYtMzQuMzIyNjZsLjQ3NzQ4LS44MTk0Mi42ODAzNC42NmE2Ni40MjEyMiw2Ni40MjEyMiwwLDAsMCwxNy45OTYyNSwxMi40MTcxMWMtNS4xNzctNC42NzQ2OS05LjUxNDE0LTExLjA2NzA2LTEzLjQ5NTItMTkuODQxNWwtLjE4OTU3LS40MTYzNi4yODctLjM1NTIzYTY4LjEzMTY4LDY4LjEzMTY4LDAsMCwxLDEwMy41MDc0OS0zLjE3OTM1LDQyLjkyMTEsNDIuOTIxMSwwLDAsMCwzMi4wMDM0OCwxNC4xNzgybC44NTI2NC0uMDAzNTVhOTYuNTU0NjcsOTYuNTU0NjcsMCwwLDEsMjMuMzYzNjksMi44NjU3NmwuNTgyODkuMTQ2MTctLjAyMDgxLjU5OTczYTY1LjMxMzA3LDY1LjMxMzA3LDAsMCwwLDEuNjIzMzQsMTYuOTAwNDQsNTAuMDgyMjcsNTAuMDgyMjcsMCwwLDEsMy43NzY4Ni0xNS4yMjI2MmwuMjYwODktLjY0NDkxLjY2MDg1LjIxODgxYTk2LjE0NTg1LDk2LjE0NTg1LDAsMCwxLTMwLjI0NzcxLDE4Ny4zOTg0OEE5Ny4yNzE5Miw5Ny4yNzE5MiwwLDAsMSwyMDIuNTM4LDUzNC45NzRjLTMxLjA4MTMtNS4yNDI1My02MC45MzkyMy0zLjg4OTgyLTg4Ljc0Mzc0LDQuMDIwOTJhNjguNzI3ODcsNjguNzI3ODcsMCwwLDEtMTguODE1NjcsMi42MDg4NmMtMS4wODI1MiwwLTIuMjA0LS4wMjc0Ny0zLjMzMjYxLS4wODIzOWwtMS4zMDc1My0uMDYyOUw5MS4wNjQsNTQwLjM2OGE0Ni42NDk2OCw0Ni42NDk2OCwwLDAsMSw3LjU0MzEtOC44OTA1LDY1LjI5OTgxLDY1LjI5OTgxLDAsMCwwLTE0LjI0Mjg2LDkuMDQxMWwtLjI2MDQ1LjIxNy0uMzM2NjItLjA1NDkyQTY4LjEwMjE5LDY4LjEwMjE5LDAsMCwxLDQ3LjY3NDU0LDQyNC40NzUyOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PGcgb3BhY2l0eT0iMC4xNSI+PHBhdGggZD0iTTExMC4xNDMyOCwzMTIuNDRhNDguMTM0MzgsNDguMTM0MzgsMCwwLDAsOC41ODUwOCwxMC41MzE3Niw2Ni4yNTI4Myw2Ni4yNTI4MywwLDAsMS0xMy40MTM3LTguMzgzNzFRMTA3LjY4NTU2LDMxMy40MjAxNiwxMTAuMTQzMjgsMzEyLjQ0WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiLz48cGF0aCBkPSJNNzAuNzAyMzEsMzkzLjc3MTU3YTY4LjQxMSw2OC40MTEsMCwwLDAtOS43OTc1NiwxMS45MzU5Miw2OS42NDU3Nyw2OS42NDU3NywwLDAsMCw2LjM3NDc1LTI5LjI1ODI1YzAtLjEyMTM3LDAtLjI0MzYyLS4wMDA4OC0uMzY1bC0uMDAwODctLjM0MzcyYTY4LjA4NjYxLDY4LjA4NjYxLDAsMCwxLDkuMjY4NzEtMzQuMzIyNjZsLjQ3NzUtLjgxOTQ0LjY4MDM5LjY2YTY2LjU3MzgsNjYuNTczOCwwLDAsMCwxMi40Mjc0MSw5LjQ2MzA1Qzg4Ljk3MTk0LDM2Ny4zMTA0OSw4Mi4wNDYsMzgyLjc3MTg5LDcwLjcwMjMxLDM5My43NzE1N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PHBhdGggZD0iTTkwLjMwNTU1LDM0NS4wMzY4M2wuMDAwODcuMzQzNzJjLjAwMDg4LjEyMTM0LjAwMDg4LjI0MzU5LjAwMDg4LjM2NSwwLC42Njg4NC0uMDEyMTIsMS4zMzYtLjAzMDgsMi4wMDIxQTcwLjk2MjQsNzAuOTYyNCwwLDAsMSw4Mi4yMDUzNCwzMzMuODM0bC0uMTg5NTMtLjQxNjM3LjI4Ny0uMzU1MjJhNjguNjkwNDQsNjguNjkwNDQsMCwwLDEsMTIuMzI2NTktMTEuOTIxODFBNjguMjQwODYsNjguMjQwODYsMCwwLDAsOTAuMzA1NTUsMzQ1LjAzNjgzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiLz48cGF0aCBkPSJNNDcuNjc0NTEsNDI0LjQ3NTNhNjEuNjA1MjUsNjEuNjA1MjUsMCwwLDAsOC42ODQ0LTEwLjU2NTc1LDY4LjA2OTM4LDY4LjA2OTM4LDAsMCwwLDUwLjQzNiw5Ni4wNjc0MWwuMzM2NjQuMDU0OTQuMjYwNDItLjIxN2E2NS4zMDI1Myw2NS4zMDI1MywwLDAsMSwxNC4yNDI4OS05LjA0MTA4LDQ2LjY0NzY3LDQ2LjY0NzY3LDAsMCwwLTcuNTQzMDYsOC44OTA0N2wtLjcyNTU2LDEuMDkwNTIsMS4zMDc1LjA2Mjg3YzEuMTI4NjUuMDU0OTQsMi4yNTAxMi4wODIzOSwzLjMzMjYxLjA4MjM5YTY4LjcyNzYyLDY4LjcyNzYyLDAsMCwwLDE4LjgxNTcyLTIuNjA4ODZjMjcuODA0NTEtNy45MTA3Miw1Ny42NjI0NC05LjI2MzQ0LDg4Ljc0MzcyLTQuMDIwOWE5Ny4yNzI2Miw5Ny4yNzI2MiwwLDAsMCwxNi4xMjgzOSwxLjM0NTYsOTUuNzA2OSw5NS43MDY5LDAsMCwwLDYzLjg1NTMtMjQuMzUwOTQsOTYuMjMxNjUsOTYuMjMxNjUsMCwwLDEtODYuODgzMDksNTUuMDU0NjdBOTcuMjcyNDUsOTcuMjcyNDUsMCwwLDEsMjAyLjUzOCw1MzQuOTc0Yy0zMS4wODEyOS01LjI0MjU0LTYwLjkzOTIyLTMuODg5ODItODguNzQzNzMsNC4wMjA5YTY4LjcyNzYzLDY4LjcyNzYzLDAsMCwxLTE4LjgxNTcyLDIuNjA4ODdjLTEuMDgyNDksMC0yLjIwNC0uMDI3NDYtMy4zMzI2MS0uMDgyNGwtMS4zMDc0OS0uMDYyODdMOTEuMDY0LDU0MC4zNjhhNDYuNjQ4MzQsNDYuNjQ4MzQsMCwwLDEsNy41NDMwNi04Ljg5MDQ3LDY1LjMwMjUzLDY1LjMwMjUzLDAsMCwwLTE0LjI0Mjg5LDkuMDQxMDhsLS4yNjA0Mi4yMTctLjMzNjYzLS4wNTQ5NEE2OC4xMDIxOSw2OC4xMDIxOSwwLDAsMSw0Ny42NzQ1MSw0MjQuNDc1M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PC9nPjxjaXJjbGUgY3g9IjQ2MC4zMTgyOCIgY3k9IjE4NSIgcj0iNSIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgY3g9IjgzNC4zMTgyOCIgY3k9IjMwNSIgcj0iMyIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgY3g9Ijg5Mi4zMTgyOCIgY3k9IjE3MCIgcj0iMyIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgY3g9IjM1NS4zMTgyOCIgY3k9IjgwIiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMzI1LjMxODI4IiBjeT0iMjAxIiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMTc5LjMxODI4IiBjeT0iMTcwIiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iNjk2LjMxODI4IiBjeT0iMTk1IiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMTAwMy4zMTgyOCIgY3k9Ijk4IiByPSIzIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTMyOC45NTkyOSw0MTMuNTYzMjdjLTMuNzk5NTgtNy4wMzUtNC4zMy0xNi4yNTUzNy4zMzUzMS0yMi43NDg1OWEzNi44Mzg0MywzNi44Mzg0MywwLDAsMCwxNC42NzUwNywyMC41OTkzYzIuNzcxODEsMS44ODcxOSw2LjA1MTI0LDMuNjk3NTgsNi45OTk0Nyw2LjkxNGE4LjIzNDg4LDguMjM0ODgsMCwwLDEtLjg1ODY0LDYuMDQ0NDUsMjQuNDU3MSwyNC40NTcxLDAsMCwxLTMuNzk1MDUsNC45NTQ5NGwtLjEzNDMzLjUwMzI1QzMzOS4zMDI2OCw0MjUuNzU0NDMsMzMyLjc1ODg2LDQyMC41OTgyOSwzMjguOTU5MjksNDEzLjU2MzI3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNOTEwLjk1OTI5LDYxMi41NjMyN2MtMy43OTk1OC03LjAzNS00LjMzLTE2LjI1NTM3LjMzNTMxLTIyLjc0ODU5YTM2LjgzODQzLDM2LjgzODQzLDAsMCwwLDE0LjY3NTA3LDIwLjU5OTNjMi43NzE4MSwxLjg4NzE5LDYuMDUxMjQsMy42OTc1OCw2Ljk5OTQ3LDYuOTE0YTguMjM0ODgsOC4yMzQ4OCwwLDAsMS0uODU4NjQsNi4wNDQ0NSwyNC40NTcxLDI0LjQ1NzEsMCwwLDEtMy43OTUsNC45NTQ5NGwtLjEzNDMzLjUwMzI1QzkyMS4zMDI2OCw2MjQuNzU0NDMsOTE0Ljc1ODg2LDYxOS41OTgyOSw5MTAuOTU5MjksNjEyLjU2MzI3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNNTkxLjk1OTI5LDQ0OS41NjMyN2MtMy43OTk1OC03LjAzNS00LjMzLTE2LjI1NTM3LjMzNTMxLTIyLjc0ODU5YTM2LjgzODQzLDM2LjgzODQzLDAsMCwwLDE0LjY3NTA3LDIwLjU5OTNjMi43NzE4MSwxLjg4NzE5LDYuMDUxMjQsMy42OTc1OCw2Ljk5OTQ3LDYuOTE0YTguMjM0ODgsOC4yMzQ4OCwwLDAsMS0uODU4NjQsNi4wNDQ0NSwyNC40NTcxLDI0LjQ1NzEsMCwwLDEtMy43OTUsNC45NTQ5NGwtLjEzNDMzLjUwMzI1QzYwMi4zMDI2OCw0NjEuNzU0NDMsNTk1Ljc1ODg2LDQ1Ni41OTgyOSw1OTEuOTU5MjksNDQ5LjU2MzI3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNMjg3Ljk1OTI5LDU2NS41NjMyN2MtMy43OTk1OC03LjAzNS00LjMzLTE2LjI1NTM3LjMzNTMxLTIyLjc0ODU5YTM2LjgzODQzLDM2LjgzODQzLDAsMCwwLDE0LjY3NTA3LDIwLjU5OTNjMi43NzE4MSwxLjg4NzE5LDYuMDUxMjQsMy42OTc1OCw2Ljk5OTQ3LDYuOTE0YTguMjM0ODgsOC4yMzQ4OCwwLDAsMS0uODU4NjQsNi4wNDQ0NSwyNC40NTcxLDI0LjQ1NzEsMCwwLDEtMy43OTUwNSw0Ljk1NDk0bC0uMTM0MzMuNTAzMjVDMjk4LjMwMjY4LDU3Ny43NTQ0MywyOTEuNzU4ODYsNTcyLjU5ODI5LDI4Ny45NTkyOSw1NjUuNTYzMjdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzNmM2Q1NiIvPjxwYXRoIGQ9Ik0yNDkuOTU5MjksNjUxLjU2MzI3Yy0zLjc5OTU4LTcuMDM1LTQuMzMtMTYuMjU1MzcuMzM1MzEtMjIuNzQ4NTlhMzYuODM4NDMsMzYuODM4NDMsMCwwLDAsMTQuNjc1MDcsMjAuNTk5M2MyLjc3MTgxLDEuODg3MTksNi4wNTEyNCwzLjY5NzU4LDYuOTk5NDcsNi45MTRhOC4yMzQ4OCw4LjIzNDg4LDAsMCwxLS44NTg2NCw2LjA0NDQ1LDI0LjQ1NzEsMjQuNDU3MSwwLDAsMS0zLjc5NTA1LDQuOTU0OTRsLS4xMzQzMy41MDMyNUMyNjAuMzAyNjgsNjYzLjc1NDQzLDI1My43NTg4Niw2NTguNTk4MjksMjQ5Ljk1OTI5LDY1MS41NjMyN1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PHJlY3QgeD0iODQzLjMxODI4IiB5PSI2OCIgd2lkdGg9IjExIiBoZWlnaHQ9IjU4OSIgZmlsbD0iIzNmM2Q1NiIvPjxyZWN0IHg9IjgxMy4zMTgyOCIgeT0iMjAiIHdpZHRoPSI3MiIgaGVpZ2h0PSI3MiIgcng9IjM1Ljk5OTk2IiBmaWxsPSIjZmY2NTgyIi8+PHBhdGggZD0iTTQxOC42NDI2Myw0MjQuMTM4NWMwLDExLjQ3NzcxLDEyLjUxNTcyLDIxLjY3ODIzLDIzLjk5MzQ0LDIxLjY3ODIzczE3LjU3MS0xMC4yMDA1MiwxNy41NzEtMjEuNjc4MjNhMjAuNzgyMjQsMjAuNzgyMjQsMCwwLDAtNDEuNTY0NDgsMFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBvbHlnb24gcG9pbnRzPSIzOTguNDcxIDQ4NC40ODkgNDM3LjA2NyA0ODMuMDA1IDQzOS4yOTQgNDQyLjkyNSAzOTQuNzYgNDQyLjkyNSAzOTguNDcxIDQ4NC40ODkiIGZpbGw9IiNmZmI4YjgiLz48cGF0aCBkPSJNNDAwLjgxMzY0LDU2MS40OTI4YTYuMTgyMzEsNi4xODIzMSwwLDAsMC0uMzY0OTQtOS40NzI4bDcuMDA3MzktMjAuODIyMzUtMTEuMDM3NzUsMi45MTctNC45NjIxMywxOS4zMjYwNWE2LjIxNTgxLDYuMjE1ODEsMCwwLDAsOS4zNTc0Myw4LjA1MjE1WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiNmZmI2YjYiLz48Y2lyY2xlIGN4PSI0MTUuNzU4MzUiIGN5PSIzODEuNjI0NzgiIHI9IjE0LjY5ODA0IiBmaWxsPSIjZmZiOGI4Ii8+PHBhdGggZD0iTTQ0Mi45NjA0Nyw0MjkuNjQzNzlsLTEwLjczMjUzLS4yODQyNmExLjUwNCwxLjUwNCwwLDAsMS0xLjI4MDE0LS43ODczOGwtMy41ODc4Ny02LjY1NTE0YTEuNDk3ODMsMS40OTc4MywwLDAsMSwuMzk1NjMtMS44OTEzOEw0NDEuNzk4MTgsNDA5LjA0N2ExLjQ5Njc5LDEuNDk2NzksMCwwLDEsMS4yNTYxOC0uMjgwMzdsMTEuMzQxODQsMi41ODQyMmExLjQ5OSwxLjQ5OSwwLDAsMSwxLjEwNjYsMS4wNDMxNGw0LjQ0MTMsMTUuMjk0OTJhMS40OTkzNSwxLjQ5OTM1LDAsMCwxLTEuNTEzODksMS45MTZsLTUuNTYwMi0uMjc3NzlhMS41MDcyNCwxLjUwNzI0LDAsMCwxLTEuMzQ3NDctMS4wMjc2bC0uMjMwNTItLjY5ODY3YS4xNzM0Mi4xNzM0MiwwLDAsMC0uMzM4LjA1NDM5LDEuNDk5NzQsMS40OTk3NCwwLDAsMS0xLjU3MzQ2LDEuNDk3N2wtMS44NDA4OC0uMDkxOTRhMS40OTU0LDEuNDk1NCwwLDAsMS0xLjM5Ni0xLjIwNWwtLjc5Mzg1LTMuOTkyNTZhLjE3MzIuMTczMiwwLDAsMC0uMzQxODguMDEzNTlsLS41MTg2Niw0LjQ0MmExLjQ5MiwxLjQ5MiwwLDAsMS0xLjQ4NzM0LDEuMzI1NDZaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik00MzIuMjUxNSw0NDkuNTgwNzlsMTkuMDAzMjMuMjUzMzEsNi4xODQ4MSw3Ljg1MzQ2LDkuOTU2ODQsMi4zNDgxLDIuNTg3OCwxNC45NTQyN2MxLjI5Mzc1LDcuNDc2MjQtLjA3OTc5LDEyLjIxMDg5LTMuODgwNzYsMTguNzc3NTFsMCwwLS40NTUyMiwxMi45MTc3MS41MDMuOTE0MjZhMi4wOTM2NCwyLjA5MzY0LDAsMCwxLS42MzExOSwyLjcyMjY3aDBhNC4yNzcyNiw0LjI3NzI2LDAsMCwxLC4xMTc1MiwyLjgxNDkxbC0uMjQ1MjguODEwNDZzLS43MDc4Myw1LjY2MjYxLTQwLjgzMjM5LS4yOTI5M2EzLjk1NjMyLDMuOTU2MzIsMCwwLDEtMy4zNDM0NS0zLjM5ODZoMGEyLjk1NDA2LDIuOTU0MDYsMCwwLDEtLjU0Ny0zLjQwMzhsLjA4MTc1LS4xNjM0OC0uNDEyLS40ODUyOWEzLjE3NywzLjE3NywwLDAsMS0uMTYwOC0zLjkwNjU5aDBsLTUuNzY2NTItNDEuMjUyMTcsMTEuOTExOTItMy43MVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTQxOS4xNjg2Miw0NjQuOTkyODhsLTQuNzU2ODQtMy45NDgyOHMtNC4yMjk1MiwxLjI1MDEzLTcuMTgzMzQsOS41ODA3Ny0xMy4wODk1Nyw3MS41MjY1Ni0xMy4wODk1Nyw3MS41MjY1NmwxMS44NzU1Ny01LjkzNzc4LDE2LjgzOTItNDYuNDMwODVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik01MjQuODE5NDYsNTMyLjI3NGE2LjE4MjI4LDYuMTgyMjgsMCwwLDEtNy4wOTExNi02LjI5MTQ3bC0yMC41NDE0Ny03Ljc5MjQyLDkuMjU3LTYuNjgyLDE4LjA4NzMzLDguNDI0MjRhNi4yMTU4MSw2LjIxNTgxLDAsMCwxLC4yODgzMSwxMi4zNDE2MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZmZiNmI2Ii8+PHBhdGggZD0iTTQ2MS44ODA2MSw0NjQuNjMyNTNsMy4yMjQ3MS01LjI3NDI1czQuNDA2NTUtLjE4NDU2LDkuODk1MjgsNi43NDM1M2MyLjgxMzczLDMuNTUxNjEsMjEuMDQ4NzQsMzQuMDE3MTksMjEuMDQ4NzQsMzQuMDE3MTlsMTYuODYzMTEsMTQuMDU1NDYtMTMuODA2MjgsNC45MzA4MS0xNi4yNzE2OS02LjkwMzE0LTE4LjI0NC0zMC4wNzhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwb2x5Z29uIHBvaW50cz0iNDM1LjU1NSA2NjYuODEgNDQ0LjczOSA2NjYuODEgNDQ5LjEwOCA2MzEuMzg1IDQzNS41NTMgNjMxLjM4NiA0MzUuNTU1IDY2Ni44MSIgZmlsbD0iI2ZmYjZiNiIvPjxwb2x5Z29uIHBvaW50cz0iMzU1LjE1NyA2NjEuMDk5IDM2NC4wNDQgNjYzLjQxNSAzNzcuMjA4IDYzMC4yMzggMzY0LjA5MSA2MjYuODE5IDM1NS4xNTcgNjYxLjA5OSIgZmlsbD0iI2ZmYjZiNiIvPjxwYXRoIGQ9Ik00NjAuMTE3ODcsNzExLjc3NzYzbDE0LjUxODI2LS44NjY1NXY2LjIyMDI2bDEzLjgwMjkzLDkuNTMyNzlhMy44ODU0MSwzLjg4NTQxLDAsMCwxLTIuMjA3ODIsNy4wODI3NEg0NjguOTQ2N2wtMi45NzkyNS02LjE1Mjc5LTEuMTYzMjUsNi4xNTI3OWgtNi41MTdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik0zODAuMTMxMTEsNzA1LjQyODU4bDE0LjI2NzQsMi44MjM1LTEuNTY5LDYuMDE5MTMsMTAuOTUyMTEsMTIuNzA2MTVhMy44ODU0MSwzLjg4NTQxLDAsMCwxLTMuOTIzLDYuMjk2ODNMMzgzLjEzMyw3MjguOTE0NDFsLTEuMzMxLTYuNzA1MzEtMi42Nzc1OSw1LjY2MDQzLTYuMzA2MjQtMS42NDM4MVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTM4My4xMjQ4LDY4OC4zMTkzMWwyNi45MjA4MS01NS4zMzAyMSwyLjExMzUzLTY1LjQ5MDkxQzQwNi4zMzIzMyw1NTYuNjc3LDQyMy40OTEsNTMyLjgwNSw0MjMuNDkxLDUzMi44MDV2LTkuMjQ0OTFsNDEuOTE4NTIsNy45MDgxMnYwYTIwMS4yMTQ4OSwyMDEuMjE0ODksMCwwLDEsMTIuMjYxNTEsNzMuMDYwMjZMNDc1Ljk4Miw2OTQuMDQ3MzRoLjUyOTg3YTMuMzE1MjcsMy4zMTUyNywwLDEsMSwwLDYuNjMwNTNINDU5LjkzNTVhMy4zMTUyNywzLjMxNTI3LDAsMSwxLDAtNi42MzA1M2guNDI3NEw0NDguNDYzMSw1ODAuMTYzNTFsLTEzLjgzNjU0LDU2LjE5ODgxTDQwMS4xODksNjg4LjEwNjZhMy4zMDY5LDMuMzA2OSwwLDAsMS0uMjY1MjQsNi42MDM3OUgzODQuMzQ3MzlhMy4zMTE4MiwzLjMxMTgyLDAsMCwxLTEuMjIyNTktNi4zOTEwOFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTM4Mi43NTg0MSw0MjYuMjk2NDdjNi4xOTM5NS02LjA1OTM1LDEwLjA5Mjc5LTE0LjAyNzczLDE1LjIyMjU1LTIxLjAxMTA4LDUuMTI5Ni02Ljk4MzI3LDEyLjM1NDcyLTEzLjM4MjQsMjEuMDEwODMtMTMuNzcwMjZhMTMuMDM3ODYsMTMuMDM3ODYsMCwwLDEsOC4xNjU3OSwyLjEyOSw4LjMwNTQxLDguMzA1NDEsMCwwLDEsMy42MDQ1NSw3LjM2NzQxYy45MTM4LTIuNTY2NzQsNC45OTcxOC0zLjE0NTMsNi41ODgtLjkzMzMxLDEuNTkwNjIsMi4yMTE5MS0uMjU3MjIsNS44OTg5My0yLjk4MTE1LDUuOTQ4MzhsLS4yNjcxLTEuMDU2NjZhMTguMjQ4NzcsMTguMjQ4NzcsMCwwLDEtMTEuODAxNDEsNy44MzYxMywyLjk3ODMsMi45NzgzLDAsMCwxLTMuMzU1MjYtMy44NTQyNUM0MDkuNTkwODcsNDEwLjgwNjY2LDQxMi41NjA1Miw0MjguMjUyMzQsNDA3LDQzNnMtMjEuNDUyNTksNi45OTU1MS0zMC44MjkwNyw4LjczNTNjLTkuMDU0NjYsMS42OC0xNy44NTg1Ny0zLjM0NzU2LTI1LjY5OTMxLTguMTc4QTM4LjI3MTUsMzguMjcxNSwwLDAsMCwzODIuNzU4NDEsNDI2LjI5NjQ3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNNzMyLjY4OTg5LDYzNi45MDM3Myw3MDQuNDcyNzUsNjI0LjQ1NVY2MTMuNzUyNjVsMTAuMDU2MS0uMDU2NTFhNy40NjkxOCw3LjQ2OTE4LDAsMCwwLDcuMDQ0LTUuMTA3MTRsNy4wNjQzNy0yMS4xOTMwNWE3LjQ2OTI0LDcuNDY5MjQsMCwwLDAtNy4wODYtOS44MzEyMkg3MDQuNDcyNzV2LTkuOTU5SDcyNS45MTNhNy40NjkyNSw3LjQ2OTI1LDAsMCwwLDcuMjc5MzctNS43OTU4NGw0Ljg2NS0yMS4xNjI4NmE3LjQ2OTIzLDcuNDY5MjMsMCwwLDAtNy4yNzkzNy05LjE0MjY1SDcwNC40NzI3NXYtMi40ODk3NWE0Ljk3OTQ5LDQuOTc5NDksMCwwLDAtOS45NTksMHYyLjQ4OTc1SDUxOC4xNTY2di0yLjQ4OTc1YTQuOTc5NSw0Ljk3OTUsMCwwLDAtOS45NTksMHYyLjQ4OTc1SDQ4Ny4yODY4YTcuNDY5MjMsNy40NjkyMywwLDAsMC03LjI3OTM3LDkuMTQyNjVsNC44NjUsMjEuMTYyODZhNy40NjkyNSw3LjQ2OTI1LDAsMCwwLDcuMjc5MzcsNS43OTU4NEg1MDguMTk3NnY5Ljk1OUg0OTYuNTEzMjhhNy40NjkyMyw3LjQ2OTIzLDAsMCwwLTcuMTA5MjcsOS43Nmw3LjIxMDQxLDIyLjM3NzExYTcuNDY5MjUsNy40NjkyNSwwLDAsMCw3LjE1MTIzLDUuMTc4MzdsNC40MzItLjAyNDlWNjI0LjQ1NWwtMjIuODIyNjksMTIuNDQ4NzRhNy40NjkyMiw3LjQ2OTIyLDAsMCwwLTcuNDY5MjQsNy40NjkyMnYwYTcuNDY5MjUsNy40NjkyNSwwLDAsMCw3LjQ2OTI0LDcuNDY5MjVINTA4LjE5NzZ2NTQuNzc0NDZhNC45Nzk1LDQuOTc5NSwwLDAsMCw5Ljk1OSwwVjY1MS44NDIyMkg2OTQuNTEzNzZ2NTQuNzc0NDZhNC45Nzk0OSw0Ljk3OTQ5LDAsMCwwLDkuOTU5LDBWNjUxLjg0MjIyaDI4LjIxNzE0YTcuNDY5MjUsNy40NjkyNSwwLDAsMCw3LjQ2OTI1LTcuNDY5MjV2MEE3LjQ2OTIyLDcuNDY5MjIsMCwwLDAsNzMyLjY4OTg5LDYzNi45MDM3M1ptLTIxNC41MzMyOS02OS4yOThINjk0LjUxMzc2djkuOTU5SDUxOC4xNTY2Wm0wLDU2Ljg0OTI1di05LjY1NTYzbDE3Ni4zNTcxNi0uOTkwNzZWNjI0LjQ1NVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PC9zdmc+";
|
|
|
var darkBackground = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGRhdGEtbmFtZT0iTGF5ZXIgMSIgd2lkdGg9Ijg1NS45Mzk1OCIgaGVpZ2h0PSI2MzAuMDY2MDgiIHZpZXdCb3g9IjAgMCA4NTUuOTM5NTggNjMwLjA2NjA4IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PHBhdGggZD0iTTkzNS40MzIzNCw0NzIuNTU3NjdjLTMuNzMsNDMuMDgtMjIuNTEsODQuNzEtNDkuMywxMTkuMTRxLTEuNjgsMi4xNi0zLjQsNC4yOC0zLjg3LDQuNzctNy45NCw5LjM2LTQuOTgsNS42NTUtMTAuMjUsMTEuMDUwMDUtNC4yOSw0LjQzOTk0LTguNzgsOC42ODk5NC0zLjQ2NSwzLjMxNS03LjAxLDYuNWMtMjguNDMsMjUuNjktNjEuMDksNDYuODktOTQuNzQsNjUuNDMwMDUtNjUuNjcsMzYuMTctMTM3LjY1LDYzLjU2OTk1LTIxMi41Miw2Ny41Ni03NC44NiwzLjk4LTE1My4wMS0xNy40Ni0yMDcuOTEtNjguNTItNzMuOTktNjguODEtOTQuNjM5OTUtMTgzLjU4LTY0LjYtMjgwLjA1LDE5Ljk4LTY0LjE4LDYwLjc2LTEyMi4yNCwxMTYuMjYtMTYwLjE2LDU1LjAyLTM3LjU5LDEyNC40My01NC41MSwxOTAuMTItNDMuNDQ5OTUsNTIuNDQtMzEuODcwMDYsMTIxLjA5LTMyLjQ4LDE3OC4xLTguODksMzAuNDIsMTIuNTksNTcuNzIsMzEuMzEsODEuNjcsNTMuOTNhMzM5LjM0MzM3LDMzOS4zNDMzNywwLDAsMSwzMC43MiwzMy4yM3ExLjQ1NSwxLjc4NSwyLjg4LDMuNiw1Ljk3LDcuNTQ1LDExLjU1LDE1LjQsOC4wMSwxMS4yNjUsMTUuMjEsMjMuMDNjMS4zMiwyLjE2LDIuNjMsNC4zMywzLjkxLDYuNTIuODYsMS40NywxLjczLDIuOTUsMi41OCw0LjQ0YS4yOTc3Ni4yOTc3NiwwLDAsMSwuMDQuMWMxMy4zMSwyMy40MSwyNC4xOSw0OC4zOSwyOS44NjAwNSw3NC41LDEsNC42MiwxLjg0LDkuMjYsMi40OSwxMy45NHYuMDFxLjg1NSw1Ljk1NSwxLjI5LDExLjk3QTE3Ni45NzcxMSwxNzYuOTc3MTEsMCwwLDEsOTM1LjQzMjM0LDQ3Mi41NTc2N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNNzQwLjA3Mzg2LDUzNy42ODQxMiw1OTEuNjEyMzMsNDE0LjAwNjI3LDczNS44NDAyNyw1NDIuNjM4YTMuNDQxNjEsMy40NDE2MSwwLDEsMCw0LjIzMzU5LTQuOTUzODZaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjZjBmMGYwIiBvcGFjaXR5PSIwLjMiLz48Y2lyY2xlIGN4PSIyMjcuNTgyMTIiIGN5PSIyNTAuNzgwNzEiIHI9Ijg5IiBmaWxsPSIjZjJmMmYyIi8+PHBhdGggZD0iTTQ3OC42MTIzMywzNzkuNzQ3NjdhODAuOTkzNjksODAuOTkzNjksMCwwLDEtODEsODEsODEuNTcxNjEsODEuNTcxNjEsMCwwLDEtMjcuOC00LjksODEuMDU0ODksODEuMDU0ODksMCwxLDEsMTA4LjgtNzYuMVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiNmZmYiLz48Y2lyY2xlIGN4PSIyMTEuNTgyMTIiIGN5PSIyMTcuNzgwNzEiIHI9IjI1IiBmaWxsPSIjZTRlNGU0Ii8+PHBhdGggZD0iTTQ3NS40NTIzNiwzNTcuMjc3NjRhMjUuMDAxMTUsMjUuMDAxMTUsMCwwLDEtMjcuNi00MS4wOEE4MS4wNTI3OSw4MS4wNTI3OSwwLDAsMSw0NzUuNDUyMzYsMzU3LjI3NzY0WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iI2YyZjJmMiIvPjxjaXJjbGUgY3g9IjI1Mi41ODIxMiIgY3k9IjI3MS43ODA3MSIgcj0iOSIgZmlsbD0iI2U0ZTRlNCIvPjxwYXRoIGQ9Ik0zODcuNjEyMzMsNDU3Ljc0NzY3YTkuMDQ1ODEsOS4wNDU4MSwwLDAsMS0uMzEsMi4zNCw3OS41Mjc3NCw3OS41Mjc3NCwwLDAsMS0xNy40OS00LjI0LDkuMDAxNTcsOS4wMDE1NywwLDAsMSwxNy44LDEuOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiNmMmYyZjIiLz48cGF0aCBkPSJNMzM0LjYxMjMzLDM3NS43NDc2N2ExOC4wMDIsMTguMDAyLDAsMCwxLTE2LjgsMTcuOTYsODEuNTQ3NzMsODEuNTQ3NzMsMCwwLDEsMS43Ni0zNS43MUExOC4wMDAyNiwxOC4wMDAyNiwwLDAsMSwzMzQuNjEyMzMsMzc1Ljc0NzY3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iI2YyZjJmMiIvPjxjaXJjbGUgY3g9IjYwNi40NTY1MyIgY3k9IjIwOC40ODMwNSIgcj0iMy43MDIzNCIgZmlsbD0iIzZjNjNmZiIvPjxjaXJjbGUgY3g9IjU3Mi4zMDIzMSIgY3k9IjExOS45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjIyNS4zMDIzMSIgY3k9IjU0My45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjU4NC41ODE0NCIgY3k9IjMzMS41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjMwNS40NTY1MyIgY3k9IjM1MC40ODMwNSIgcj0iMy43MDIzNCIgZmlsbD0iIzZjNjNmZiIvPjxjaXJjbGUgY3g9IjE3MS40NTY1MyIgY3k9IjQxNi40ODMwNSIgcj0iMTcuNDgzMDUiIGZpbGw9IiM2YzYzZmYiLz48Y2lyY2xlIGN4PSIyNjcuMzAyMzEiIGN5PSI0MzUuOTQ4NTEiIHI9IjIuMTYzMDciIGZpbGw9IiNmMGYwZjAiLz48Y2lyY2xlIGN4PSI0ODcuMzAyMzEiIGN5PSI5Ny45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjM1OC4zMDIzMSIgY3k9IjU1OC45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjMyNi4zMDIzMSIgY3k9IjExNy45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjM4Mi4zMDIzMSIgY3k9IjIyMi45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjI5Ni41ODE0NCIgY3k9IjQ4MC41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjU0OS41ODE0NCIgY3k9IjQ5NC41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjQzNy41ODE0NCIgY3k9IjM2OC41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjQ5NC41ODE0NCIgY3k9IjIyMi41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjU5OC4yMTIwNCIgY3k9IjI5Mi42NTQ3MyIgcj0iNC4yODg4OSIgZmlsbD0iI2ZmNjU4NCIvPjxjaXJjbGUgY3g9IjQyNC4yMTIwNCIgY3k9IjE1MC42NTQ3MyIgcj0iNC4yODg4OSIgZmlsbD0iI2ZmNjU4NCIvPjxjaXJjbGUgY3g9IjQyNC4yMTIwNCIgY3k9IjQ0NS42NTQ3MyIgcj0iNC4yODg4OSIgZmlsbD0iI2ZmNjU4NCIvPjxwYXRoIGQ9Ik04NjMuNDUyMzYsNjA1LjMzNzY0YTcuNjk0LDcuNjk0LDAsMCwwLTcuMzksNS41OCw3LjM4OTYsNy4zODk2LDAsMCwwLS4zLDIuMTJ2MTIuMDRxNC40ODUtNC4yNDQ5NCw4Ljc4LTguNjg5OTQsNS4yNjUtNS40MDAwNiwxMC4yNS0xMS4wNTAwNVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiM2YzYzZmYiLz48cGF0aCBkPSJNODkwLjY4MTE4LDY2Ny44OTgwNnEtMTkuMzY4MTYsMC00Mi40NTY1NC0xLjQ2Mzg2Yy03OS42MTM3Ny01LjA1NTY3LTE4Mi43Mzc4LTIyLjYzMjgyLTI5MC4zNzYtNDkuNDkyMTktMTA3LjYzNzctMjYuODU5MzgtMjA2LjkzMDE4LTU5Ljc5Mzk1LTI3OS41ODU0NS05Mi43MzQzOC0zNS4zOTI1OC0xNi4wNDY4Ny02Mi41NTYxNS0zMS4yMzYzMi04MC43MzUzNS00NS4xNDc0Ni0xOS4yNDcwNy0xNC43MjcwNS0yNy42NjYtMjcuNTY0LTI1LjAyMzkzLTM4LjE1MjgzLDUuMTQ4LTIwLjYyODkxLDUwLjczMS0yNS4xNDIwOSw4OC4wNjQtMjUuMjk1NDFsLjAxMjY5LDNjLTUxLjI2ODA2LjIxMDQ1LTgxLjUxMzY3LDguMzg2NzItODUuMTY1NTIsMjMuMDIyLTQuNjUxODYsMTguNjQwMTQsMzMuMjg2NjIsNDcuNzQwNzMsMTA0LjA4NjkxLDc5Ljg0MTMxLDcyLjQ5NTYxLDMyLjg2ODE3LDE3MS42MDU0Nyw2NS43MzkyNiwyNzkuMDczMjQsOTIuNTU2NjQsMTA3LjQ2NzI5LDI2LjgxNjQxLDIxMC40MDEzNyw0NC4zNjMyOCwyODkuODM5ODUsNDkuNDA4MjEsNzcuNTc4NjEsNC45Mjc3MywxMjQuNzQzMTYtMi45Mzc1LDEyOS4zOTQ1My0yMS41NzgxMywzLjg2MTgxLTE1LjQ3NjU2LTIxLjU5ODE1LTM4LjI3NTM5LTcxLjY4OTQ2LTY0LjE5ODI0bDEuMzc4OTEtMi42NjQwNmMzNi4zOTcsMTguODM1OTMsNzguNjQ1NTEsNDUuODUxNTYsNzMuMjIxNjgsNjcuNTg4ODYtMi42NDI1OCwxMC41ODg4Ny0xNi4xMDU0NywxNy45NjQ4NS00MC4wMTUxNCwyMS45MjI4NUM5MjcuMDc2Miw2NjYuNzY3Miw5MTAuMzM1NDgsNjY3Ljg5ODA2LDg5MC42ODExOCw2NjcuODk4MDZaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjNmM2M2ZmIi8+PGNpcmNsZSBjeD0iNzE0LjU4MjEyIiBjeT0iMjA4Ljc4MDcxIiByPSIxMDAuNSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik04ODYuNjEyMzMsMjQxLjc0NzY3YTEwMiwxMDIsMCwxLDAsMTAyLDEwMkExMDEuNjM1LDEwMS42MzUsMCwwLDAsODg2LjYxMjMzLDI0MS43NDc2N1ptMCwyMDFhOTksOTksMCwxLDEsOTktOTlBOTguNjE3NjcsOTguNjE3NjcsMCwwLDEsODg2LjYxMjMzLDQ0Mi43NDc2N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNNzk4LjQxNywzNjcuODE4NDdhMi4wMDA3OCwyLjAwMDc4LDAsMCwxLTEuOTU3LTEuNTk3NjUsOTcuNjY5MjQsOTcuNjY5MjQsMCwwLDEsMjIuMzQwODItODMuMTM1MjYsMiwyLDAsMCwxLDIuOTg2MzMsMi42NjExNEE5My41OTY4Miw5My41OTY4MiwwLDAsMCw4MDAuMzc4LDM2NS40MTUxNWEyLjAwMjI4LDIuMDAyMjgsMCwwLDEtMS45NjA5NCwyLjQwMzMyWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iIzJmMmU0MSIvPjxjaXJjbGUgY3g9IjcxNC41MTkyNCIgY3k9IjIzOC4yNzM3MyIgcj0iNjMuODc3MDIiIGZpbGw9IiM2YzYzZmYiLz48cGF0aCBkPSJNODY2LjI0ODA1LDM5Ny4zNTY2NmMtNC4xNDA2Mi0uMTE1LTkuMjkzODUtLjI1ODY5LTEzLjI2Mzg0LTMuMTU4NzRhMTAuMTg2MTgsMTAuMTg2MTgsMCwwLDEtNC4wMDgwNi03LjYwNjA3LDYuODUyMTMsNi44NTIxMywwLDAsMSwyLjMzMDA3LTUuNjI3NjNjMi4wNzM1Mi0xLjc1MjE2LDUuMTAxMzktMi4xNjMxMyw4LjM2NDQxLTEuMjA0MmwtMy4zODA3Ni0yNC43MDYxLDIuNDgxNzQtLjM0LDMuOTc0NDQsMjkuMDQ1MTgtMi4wNzI0NS0uOTUxYy0yLjQwMjctMS4xMDIwNS01LjcwMDg4LTEuNjYyODUtNy43NTA0LjA2OTExYTQuNDAyNjMsNC40MDI2MywwLDAsMC0xLjQ0Mzc1LDMuNjI2NTksNy42OTg4Nyw3LjY5ODg3LDAsMCwwLDIuOTgyNDYsNS42NzEwN2MzLjA4OTQ5LDIuMjU2NjgsNy4xOTcwOCwyLjU0Nzc5LDExLjg1NTg1LDIuNjc4WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iIzJmMmU0MSIvPjxyZWN0IHg9IjY1OC40OTQ5MyIgeT0iMjIyLjIxNzY3IiB3aWR0aD0iMTMuNDkxMzMiIGhlaWdodD0iMi41MDQ5OCIgZmlsbD0iIzJmMmU0MSIvPjxyZWN0IHg9IjcwMS4wNzk2MSIgeT0iMjIyLjIxNzY1IiB3aWR0aD0iMTMuNDkxMzMiIGhlaWdodD0iMi41MDQ5OCIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik04ODkuMjMyMzMsNDUyLjkwNzY1aC01Ny45YTguMTQ3MTYsOC4xNDcxNiwwLDAsMC04LjEzOTk1LDguMTR2MTI4LjMzYTQ3LjY2OTU1LDQ3LjY2OTU1LDAsMCwwLDI1LjU2LDQyLjE5OTk1cTMuNTU1LTMuMTgsNy4wMS02LjUsNC40ODUtNC4yNDQ5NCw4Ljc4LTguNjg5OTQsNS4yNjUtNS40MDAwNiwxMC4yNS0xMS4wNTAwNSw0LjA4MDA2LTQuNTksNy45NC05LjM2LDEuNzI1LTIuMTE1LDMuNC00LjI4YzI2Ljc5LTM0LjQzLDQ1LjU3LTc2LjA2LDQ5LjMtMTE5LjE0QTY0LjA0ODU0LDY0LjA0ODU0LDAsMCwwLDg4OS4yMzIzMyw0NTIuOTA3NjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTg5MS4zNDIzMSw0NzkuNjg3NjdhMTQuNjExMzYsMTQuNjExMzYsMCwwLDAtMTAuNDMtNC4xNywxNC40NjUsMTQuNDY1LDAsMCwwLTkuMTYsMy4zNjAwNSwxMy4xMjI2MywxMy4xMjI2MywwLDAsMC0xLjE3LDEuMDdsLTQ3LjM4OTk1LDQ4LjYtMzQuMzcsMzUuMjVhNi44MDA2MSw2LjgwMDYxLDAsMCwwLTEuMjgsMS44LDcuMjk1NzMsNy4yOTU3MywwLDAsMC0uNzcsMy4zMiw3LjE2NzUxLDcuMTY3NTEsMCwwLDAsMi4xODAwNiw1LjA3bDEuMzUsMS4zMiw5LjgsOS41NS4wMS0uMDFhNy4yOTA3Myw3LjI5MDczLDAsMCwwLDQuNjYsMS42Myw3LjE2Nyw3LjE2NywwLDAsMCw1LjA3LTIuMThsMS41OS0xLjYyLDExLjM4LTExLjY3LjM4LS4zOSw2OC40MS03MC4xNmExNC42OTEyOCwxNC42OTEyOCwwLDAsMC0uMjYtMjAuNzdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjNmM2M2ZmIi8+PHBhdGggZD0iTTg5MC44NjE1MiwzNDMuNDRjMi4xMTI0LTQuNDY2NTgtLjA1MzQ5LTkuMjM3NjEtMy43NjM3OC0xMi4wOTA3Mi00LjY3NTU3LTMuNTk1MzktMTAuNzIyMS0zLjAwMDg1LTE2LjA0MDA4LTEuMjk5MDUtNS44MjIzOCwxLjg2MzItMTEuNTEzNjYsNS4yMTYwOC0xNy44MDM4Myw1LjAyMzM3YTExLjEzMDU4LDExLjEzMDU4LDAsMCwxLTEwLjI0NDA3LTcuMjc3NjRjLTMuMzY4Ny04LjYzOS40MzU2MS0xOC4yOTQ4OCw2LjI5OTcxLTI0Ljg0NjgxYTM0LjI2NzY2LDM0LjI2NzY2LDAsMCwxLDI2LjU0NC0xMS41ODYsMzQuNjQ5ODksMzQuNjQ5ODksMCwwLDEsMjguMDY4LDE2LjkwMjYsMS41NDA3OSwxLjU0MDc5LDAsMCwwLDIuMDUyMjkuNTM4MTMsMzYuODgyMjUsMzYuODgyMjUsMCwwLDEsMjguMzkzNzctLjcxNDMyLDM2LjI4OTg0LDM2LjI4OTg0LDAsMCwxLDIyLjU4MDQyLDM0LjQ5MTg4Yy0uMDUsMS45MzEyMiwyLjk1MDA1LDEuOTMwMSwzLDBhMzkuODkxNTUsMzkuODkxNTUsMCwwLDAtMTAuNTk5MjgtMjcuODEyNDksMzguNzE4NzEsMzguNzE4NzEsMCwwLDAtMjcuNTY2ODEtMTIuMTY3NzIsMzkuMzM2NDEsMzkuMzM2NDEsMCwwLDAtMTcuMzIyMjYsMy42MTIyM2wyLjA1MjI5LjUzODEzYTM3LjY5ODg2LDM3LjY5ODg2LDAsMCwwLTI1LjA5ODgtMTcuNzI4LDM2LjQ4NTQyLDM2LjQ4NTQyLDAsMCwwLTI5LjQyMzg0LDcuMzI3NzJjLTcuNzAxNjUsNi4wMjcwNy0xMy41Mzg0OSwxNS4zODAxNi0xMy4xNzUxOSwyNS40MTA3MS4xNTcyMSw0LjM0MDQ3LDEuNDQ3MTMsOC43OTYsNC40NjA2LDEyLjAzMDUxLDMuODU5ODEsNC4xNDI4Nyw5LjYyMjI5LDQuODU5NDQsMTQuOTQ2MzEsMy43OTgsNy4wNzU1NC0xLjQxMDcxLDEzLjUzNTMzLTYuMDY0NDksMjAuOTExMzMtNS45MjExM2ExMC4yMTE2NCwxMC4yMTE2NCwwLDAsMSw3LjY0MTcsMy40NDUzYzEuNjI0NTUsMS44MzMzNSwyLjYwNDIsNC40NzA0MiwxLjQ5NzE2LDYuODExMjItLjgyMDk0LDEuNzM1ODUsMS43NjQ2MywzLjI2MDI2LDIuNTkwNDEsMS41MTQxNloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNNDEyLjA5NDI2LDcwNC4zMjI4N2MtMzUuNTk5MTIuMDAxLTY4LjY5NDMzLTEuMjIwNzEtOTguMzIyMjYtMy42ODU1NS0zOC43MjY1Ni0zLjIyMjY2LTY5LjQxNDU1LTguNDAzMzItOTEuMjEwNDUtMTUuMzk2NDgtMjMuMDc2NjYtNy40MDUyOC0zNS4zMTkzNC0xNi42NjctMzYuMzg4MTgtMjcuNTI4MzItMi4wODMtMjEuMTU4MjEsMzkuMzM0LTQwLjcyNDYxLDc0LjQ0NTMxLTUzLjQxMzA5bDEuMDE5NTMsMi44MjIyN2MtNDguMjE2OCwxNy40MjM4Mi03My45NTcsMzUuMjg2MTMtNzIuNDc5NDksNTAuMjk3ODUsMS44ODE4MywxOS4xMTkxNCw0Ny4zOTIwOSwzMy43ODEyNSwxMjQuODYxODEsNDAuMjI3NTQsNzkuMzI1Miw2LjYwMDU4LDE4My43MTcyOSw0LjI2MTcyLDI5My45NDcyNy02LjU4OTg1LDExMC4yMy0xMC44NDg2MywyMTMuMDc1NjgtMjguOTA2MjUsMjg5LjU5MTMxLTUwLjg0NTcsNzQuNzI2MDctMjEuNDI1NzgsMTE2LjUwNDg4LTQ0LjY3OTY5LDExNC42MjMtNjMuNzk4ODMtMS41NjI1LTE1Ljg3NC0zMy4yMDI2NC0yOC43OTMtODkuMDkxOC0zNi4zNzg5bC40MDMzMi0yLjk3MjY2YzQwLjYwOTg2LDUuNTExNzIsODkuNDc5NDksMTYuNzYxNzIsOTEuNjczODMsMzkuMDU3NjIsMS4wNjkzMywxMC44NjEzMi05LjEzMzMsMjIuMzMyLTMwLjMyMjc2LDM0LjA5Mzc1LTIwLjAxNDY1LDExLjEwOTM3LTQ5LjEwMzUxLDIyLjE3Mjg1LTg2LjQ1ODQ5LDMyLjg4MjgxLTc2LjY4NTA2LDIxLjk4ODI4LTE3OS43MTk3Myw0MC4wODEwNS0yOTAuMTI0NTEsNTAuOTQ4MjRDNTM5LjAwMjQ3LDcwMC44Niw0NzIuMDE2NjMsNzA0LjMyMjg3LDQxMi4wOTQyNiw3MDQuMzIyODdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjNmM2M2ZmIi8+PGNpcmNsZSBjeD0iODM4LjQ1NjUzIiBjeT0iNDM0LjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iIzZjNjNmZiIvPjxjaXJjbGUgY3g9IjMzMS40NTY1MyIgY3k9IjE3LjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iI2U2ZTZlNiIvPjxjaXJjbGUgY3g9IjE5LjQ1NjUzIiBjeT0iNDMzLjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iI2U2ZTZlNiIvPjxjaXJjbGUgY3g9IjEyNy40NTY1MyIgY3k9IjEwOC40ODMwNSIgcj0iMTAuNzAyMzQiIGZpbGw9IiNmZjY1ODQiLz48Y2lyY2xlIGN4PSI3Ny40NTY1MyIgY3k9IjUxNC40ODMwNSIgcj0iMTAuNzAyMzQiIGZpbGw9IiNmZjY1ODQiLz48Y2lyY2xlIGN4PSI4MDcuNDU2NTMiIGN5PSIzMzkuNDgzMDUiIHI9IjEwLjcwMjM0IiBmaWxsPSIjZmY2NTg0Ii8+PGNpcmNsZSBjeD0iNjQ1LjQ1NjUzIiBjeT0iNTk4LjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iI2U2ZTZlNiIvPjwvc3ZnPg==";
|
|
|
const getPathOfImage$3 = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink$3 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filePath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$3(vault, file);
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink$3 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filePath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$3(vault, file);
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const ShareMemoImageDialog = (props) => {
|
|
|
var _a;
|
|
|
const {
|
|
|
memo: propsMemo,
|
|
|
destroy
|
|
|
} = props;
|
|
|
const {
|
|
|
memos
|
|
|
} = appStore.getState().memoState;
|
|
|
let memosLength;
|
|
|
let createdDays;
|
|
|
if (memos.length) {
|
|
|
memosLength = memos.length - 1;
|
|
|
createdDays = memos ? Math.ceil((Date.now() - utils$1.getTimeStampByDate(memos[memosLength].createdAt)) / 1e3 / 3600 / 24) : 0;
|
|
|
}
|
|
|
const memo2 = __spreadProps(__spreadValues({}, propsMemo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt)
|
|
|
});
|
|
|
const footerEnd = ShareFooterEnd.replace("{UserName}", UserName);
|
|
|
const footerStart = ShareFooterStart.replace("{MemosNum}", memos.length.toString()).replace("{UsedDay}", createdDays.toString());
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink$3(one));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink$3(two));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
const [shortcutImgUrl, setShortcutImgUrl] = _react_17_0_2_react.exports.useState("");
|
|
|
const [imgAmount, setImgAmount] = _react_17_0_2_react.exports.useState(externalImageUrls.length);
|
|
|
const memoElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (imgAmount > 0) {
|
|
|
return;
|
|
|
}
|
|
|
changeBackgroundImage();
|
|
|
setTimeout(() => {
|
|
|
if (!memoElRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
let shareDialogBackgroundColor;
|
|
|
if (document.body.className.contains("theme-dark")) {
|
|
|
shareDialogBackgroundColor = "#727171";
|
|
|
} else {
|
|
|
shareDialogBackgroundColor = "#eaeaea";
|
|
|
}
|
|
|
toImage(memoElRef.current, {
|
|
|
backgroundColor: shareDialogBackgroundColor,
|
|
|
pixelRatio: window.devicePixelRatio * 2
|
|
|
}).then((url) => {
|
|
|
setShortcutImgUrl(url);
|
|
|
}).catch(() => {
|
|
|
});
|
|
|
}, ANIMATION_DURATION);
|
|
|
}, [imgAmount]);
|
|
|
const handleCloseBtnClick = () => {
|
|
|
destroy();
|
|
|
};
|
|
|
const convertBase64ToBlob = (base64, type) => {
|
|
|
const bytes = window.atob(base64);
|
|
|
const ab2 = new ArrayBuffer(bytes.length);
|
|
|
const ia2 = new Uint8Array(ab2);
|
|
|
for (var i = 0; i < bytes.length; i++) {
|
|
|
ia2[i] = bytes.charCodeAt(i);
|
|
|
}
|
|
|
return new Blob([ab2], {
|
|
|
type
|
|
|
});
|
|
|
};
|
|
|
const convertBackgroundToBase64 = async (path) => {
|
|
|
const {
|
|
|
vault
|
|
|
} = dailyNotesService.getState().app;
|
|
|
const buffer = await vault.adapter.readBinary(path);
|
|
|
const arr = new Uint8Array(buffer);
|
|
|
const blob = new Blob([arr], {
|
|
|
type: "image/png"
|
|
|
});
|
|
|
return new Promise((resolve) => {
|
|
|
const reader = new FileReader();
|
|
|
reader.onloadend = () => {
|
|
|
const base64Url = reader.result;
|
|
|
resolve(base64Url);
|
|
|
};
|
|
|
reader.readAsDataURL(blob);
|
|
|
});
|
|
|
};
|
|
|
const changeBackgroundImage = async () => {
|
|
|
const {
|
|
|
app: app2
|
|
|
} = dailyNotesService.getState();
|
|
|
let imageUrl;
|
|
|
let imagePath;
|
|
|
const lightBackgroundImage = encodeURI(lightBackground);
|
|
|
const darkBackgroundImage = encodeURI(darkBackground);
|
|
|
if (document.body.className.contains("theme-light")) {
|
|
|
if (await app2.vault.adapter.exists(DefaultLightBackgroundImage) && /\.(png|svg|jpg|jpeg)/g.test(DefaultLightBackgroundImage)) {
|
|
|
imagePath = DefaultLightBackgroundImage;
|
|
|
imageUrl = await convertBackgroundToBase64(imagePath);
|
|
|
} else {
|
|
|
imageUrl = lightBackgroundImage;
|
|
|
}
|
|
|
} else if (document.body.className.contains("theme-dark")) {
|
|
|
if (await app2.vault.adapter.exists(DefaultDarkBackgroundImage) && /\.(png|svg|jpg|jpeg)/g.test(DefaultDarkBackgroundImage)) {
|
|
|
imagePath = DefaultDarkBackgroundImage;
|
|
|
imageUrl = await convertBackgroundToBase64(imagePath);
|
|
|
} else {
|
|
|
imageUrl = darkBackgroundImage;
|
|
|
}
|
|
|
}
|
|
|
const memoShareDiv = document.querySelector(".dialog-wrapper .memo-background .property-image");
|
|
|
memoShareDiv.style.backgroundImage = "url('" + imageUrl + "')";
|
|
|
if (document.body.className.contains("theme-dark")) {
|
|
|
memoShareDiv.style.backgroundColor = "#1f1f1f";
|
|
|
}
|
|
|
};
|
|
|
const handleCopytoClipboardBtnClick = async () => {
|
|
|
const {
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const divs = document.querySelector(".memo-shortcut-img");
|
|
|
const myBase64 = divs.getAttribute("src").split("base64,")[1];
|
|
|
const blobInput = convertBase64ToBlob(myBase64, "image/png");
|
|
|
let aFile;
|
|
|
if (AutoSaveWhenOnMobile && require$$0.Platform.isMobile) {
|
|
|
blobInput.arrayBuffer().then(async (buffer) => {
|
|
|
const ext = "png";
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
for (const string in dailyNotes) {
|
|
|
if (dailyNotes[string] instanceof require$$0.TFile) {
|
|
|
aFile = dailyNotes[string];
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (aFile !== void 0) {
|
|
|
await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, aFile), buffer);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
const clipboardItemInput = new ClipboardItem({
|
|
|
"image/png": blobInput
|
|
|
});
|
|
|
window.navigator["clipboard"].write([clipboardItemInput]);
|
|
|
new require$$0.Notice("Send to clipboard successfully");
|
|
|
};
|
|
|
const handleImageOnLoad = (ev) => {
|
|
|
if (ev.type === "error") {
|
|
|
new require$$0.Notice("\u6709\u4E2A\u56FE\u7247\u52A0\u8F7D\u5931\u8D25\u4E86\u{1F61F}");
|
|
|
ev.target.remove();
|
|
|
}
|
|
|
setImgAmount(imgAmount - 1);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-header-container",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F970}"
|
|
|
}), t("Share Memo Image")]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btn-group",
|
|
|
children: [/* @__PURE__ */ jsx("button", {
|
|
|
className: "btn copy-btn",
|
|
|
onClick: handleCopytoClipboardBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: share
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: handleCloseBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-content-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: `tip-words-container ${shortcutImgUrl ? "finish" : "loading"}`,
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: shortcutImgUrl ? t("\u2197Click the button to save") : t("Image is generating...")
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-container",
|
|
|
ref: memoElRef,
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: shortcutImgUrl !== "",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "memo-shortcut-img",
|
|
|
src: shortcutImgUrl
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-background",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "property-image",
|
|
|
style: {
|
|
|
backgroundSize: "cover",
|
|
|
backgroundRepeat: "no-repeat"
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "background-container"
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-container",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", {
|
|
|
src: imgUrl,
|
|
|
alt: "",
|
|
|
referrerPolicy: "no-referrer",
|
|
|
onLoad: handleImageOnLoad,
|
|
|
onError: handleImageOnLoad
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-container internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", {
|
|
|
className: "memo-img",
|
|
|
src: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
path: imgUrl.filePath
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "watermark-container",
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "normal-text footer-start",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "property-social-icons"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "name-text",
|
|
|
children: footerStart
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text footer-end",
|
|
|
children: /* @__PURE__ */ jsx("span", {
|
|
|
className: "name-text",
|
|
|
children: footerEnd
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function showShareMemoImageDialog(memo2) {
|
|
|
showDialog({
|
|
|
className: "share-memo-image-dialog"
|
|
|
}, ShareMemoImageDialog, {
|
|
|
memo: memo2
|
|
|
});
|
|
|
}
|
|
|
var memo = "";
|
|
|
const showMemoInDailyNotes = async (memoId) => {
|
|
|
const { app: app2, dailyNotes } = dailyNotesService.getState();
|
|
|
const lineNum = parseInt(memoId.slice(14));
|
|
|
const memoDateString = memoId.slice(0, 14);
|
|
|
const date = require$$0.moment(memoDateString, "YYYYMMDDHHmmss");
|
|
|
const file = getDailyNote_1(date, dailyNotes);
|
|
|
if (!require$$0.Platform.isMobile) {
|
|
|
const leaf = app2.workspace.splitActiveLeaf();
|
|
|
leaf.openFile(file, { eState: { line: lineNum } });
|
|
|
} else {
|
|
|
let leaf = app2.workspace.activeLeaf;
|
|
|
if (leaf === null) {
|
|
|
leaf = app2.workspace.getLeaf(true);
|
|
|
}
|
|
|
leaf.openFile(file, { eState: { line: lineNum } });
|
|
|
}
|
|
|
return;
|
|
|
};
|
|
|
var more = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTYgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0xMiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ii8+PC9zdmc+";
|
|
|
var taskBlank = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNDA3MDQzMTQ2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE4ODEiIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0iIzEyOTZkYiI+PHBhdGggZD0iTTIyNCA4MDAuMjU2TDIyMy43MTIgMjI0SDMyMHYzMS42OGMwIDM1LjQ1NiAyOC42NCA2NC4zMiA2My44NzIgNjQuMzJoMjU2LjI1NkE2NC4xNiA2NC4xNiAwIDAgMCA3MDQgMjU1LjY4VjIyNGw5Ni0wLjI1Nkw4MDAuMjU2IDgwMCAyMjQgODAwLjI1NnpNNjQwIDE5Mi4zMkw2NDAuMTI4IDI1NiAzODQgMjU1LjY4VjE5Mi4zMkwzODMuODcyIDE5MiA2NDAgMTkyLjMyek03OTkuODQgMTYwSDY5NS4wNGMtMTEuMDcyLTE5LjA0LTMxLjQyNC0zMi01NC45MTItMzJoLTI1Ni4yNTZjLTIzLjQ4OCAwLTQzLjgwOCAxMi45MjgtNTQuOTEyIDMySDIyMy43MTJBNjMuNzc2IDYzLjc3NiAwIDAgMCAxNjAgMjIzLjc0NHY1NzYuNTEyQzE2MCA4MzUuMzkyIDE4OC42MDggODY0IDIyMy43NDQgODY0aDU3Ni41MTJBNjMuODQgNjMuODQgMCAwIDAgODY0IDgwMC4yNTZWMjIzLjc0NEE2NCA2NCAwIDAgMCA3OTkuODQgMTYweiIgcC1pZD0iMTg4MiI+PC9wYXRoPjwvc3ZnPg0K";
|
|
|
const getPathOfImage$2 = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink$2 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$2(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink$2 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$2(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const Memo = (props) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
memo: propsMemo
|
|
|
} = props;
|
|
|
const memo2 = __spreadProps(__spreadValues({}, propsMemo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt)
|
|
|
});
|
|
|
const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false);
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink$2(one));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink$2(two));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
const handleShowMemoStoryDialog = () => {
|
|
|
showMemoCardDialog(memo2);
|
|
|
};
|
|
|
const handleMarkMemoClick = () => {
|
|
|
if (UseButtonToShowEditor && DefaultEditorLocation === "Bottom") {
|
|
|
let elem = document.querySelector("div[data-type='memos_view'] .view-content .memo-show-editor-button");
|
|
|
if (typeof elem.onclick == "function" && elem !== void 0) {
|
|
|
elem.onclick.apply(elem);
|
|
|
}
|
|
|
}
|
|
|
globalStateService.setMarkMemoId(memo2.id);
|
|
|
};
|
|
|
const handleEditMemoClick = () => {
|
|
|
if (UseButtonToShowEditor && DefaultEditorLocation === "Bottom") {
|
|
|
let elem = document.querySelector("div[data-type='memos_view'] .view-content .memo-show-editor-button");
|
|
|
if (typeof elem.onclick == "function" && elem !== void 0) {
|
|
|
elem.onclick.apply(elem);
|
|
|
}
|
|
|
}
|
|
|
globalStateService.setEditMemoId(memo2.id);
|
|
|
};
|
|
|
const handleSourceMemoClick = () => {
|
|
|
showMemoInDailyNotes(memo2.id);
|
|
|
};
|
|
|
const handleDeleteMemoClick = async () => {
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
try {
|
|
|
await memoService.hideMemoById(memo2.id);
|
|
|
} catch (error) {
|
|
|
new require$$0.Notice(error.message);
|
|
|
}
|
|
|
if (globalStateService.getState().editMemoId === memo2.id) {
|
|
|
globalStateService.setEditMemoId("");
|
|
|
}
|
|
|
} else {
|
|
|
toggleConfirmDeleteBtn();
|
|
|
}
|
|
|
};
|
|
|
const handleMouseLeaveMemoWrapper = () => {
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
toggleConfirmDeleteBtn(false);
|
|
|
}
|
|
|
};
|
|
|
const handleGenMemoImageBtnClick = () => {
|
|
|
showShareMemoImageDialog(memo2);
|
|
|
};
|
|
|
const handleMemoTypeShow = () => {
|
|
|
if (!ShowTaskLabel) {
|
|
|
return;
|
|
|
}
|
|
|
if (memo2.memoType === "TASK-TODO") {
|
|
|
return taskBlank;
|
|
|
} else if (memo2.memoType === "TASK-DONE") {
|
|
|
return task;
|
|
|
}
|
|
|
};
|
|
|
const handleMemoKeyDown = _react_17_0_2_react.exports.useCallback((event) => {
|
|
|
if (event.ctrlKey || event.metaKey) {
|
|
|
handleSourceMemoClick();
|
|
|
}
|
|
|
}, []);
|
|
|
const handleMemoDoubleClick = _react_17_0_2_react.exports.useCallback((event) => {
|
|
|
if (event) {
|
|
|
handleEditMemoClick();
|
|
|
}
|
|
|
}, []);
|
|
|
const handleMemoContentClick = async (e) => {
|
|
|
var _a2;
|
|
|
const targetEl = e.target;
|
|
|
if (targetEl.className === "memo-link-text") {
|
|
|
const memoId = (_a2 = targetEl.dataset) == null ? void 0 : _a2.value;
|
|
|
const memoTemp = memoService.getMemoById(memoId != null ? memoId : "");
|
|
|
if (memoTemp) {
|
|
|
showMemoCardDialog(memoTemp);
|
|
|
} else {
|
|
|
new require$$0.Notice("MEMO Not Found");
|
|
|
targetEl.classList.remove("memo-link-text");
|
|
|
}
|
|
|
} else if (targetEl.className === "todo-block")
|
|
|
;
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `memo-wrapper ${"memos-" + memo2.id} ${memo2.memoType}`,
|
|
|
onMouseLeave: handleMouseLeaveMemoWrapper,
|
|
|
onMouseDown: handleMemoKeyDown,
|
|
|
onDoubleClick: handleMemoDoubleClick,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-top-wrapper",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-top-left-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "time-text",
|
|
|
onClick: handleShowMemoStoryDialog,
|
|
|
children: memo2.createdAtStr
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: `memo-type-img ${(memo2.memoType === "TASK-TODO" || memo2.memoType === "TASK-DONE") && ShowTaskLabel ? "" : "hidden"}`,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
src: (_b = handleMemoTypeShow()) != null ? _b : "",
|
|
|
alt: "memo-type"
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn more-action-btn",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: more
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "more-action-btns-wrapper",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "more-action-btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleShowMemoStoryDialog,
|
|
|
children: t("READ")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleMarkMemoClick,
|
|
|
children: t("MARK")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleGenMemoImageBtnClick,
|
|
|
children: t("SHARE")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleEditMemoClick,
|
|
|
children: t("EDIT")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleSourceMemoClick,
|
|
|
children: t("SOURCE")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`,
|
|
|
onClick: handleDeleteMemoClick,
|
|
|
children: showConfirmDeleteBtn ? t("CONFIRM\uFF01") : t("DELETE")
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
onClick: handleMemoContentClick,
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content, memo2.id)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
alt: "",
|
|
|
className: "memo-img",
|
|
|
imgUrl,
|
|
|
referrerPolicy: "no-referrer"
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
className: "memo-img",
|
|
|
imgUrl: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
filepath: imgUrl.filepath
|
|
|
}, idx))
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function formatMemoContent(content, memoid) {
|
|
|
var _a;
|
|
|
content = encodeHtml(content);
|
|
|
content = parseRawTextToHtml(content).split("<br>").map((t2) => {
|
|
|
return `<p>${t2 !== "" ? t2 : "<br>"}</p>`;
|
|
|
}).join("");
|
|
|
const {
|
|
|
shouldUseMarkdownParser,
|
|
|
shouldHideImageUrl
|
|
|
} = globalStateService.getState();
|
|
|
if (shouldUseMarkdownParser) {
|
|
|
content = parseMarkedToHtml(content, memoid);
|
|
|
}
|
|
|
if (shouldHideImageUrl) {
|
|
|
content = content.replace(WIKI_IMAGE_URL_REG, "").replace(MARKDOWN_URL_REG, "").replace(IMAGE_URL_REG, "");
|
|
|
}
|
|
|
content = content.replace(TAG_REG, "<span class='tag-span'>#$1</span>").replace(FIRST_TAG_REG, "<p><span class='tag-span'>#$2</span>").replace(LINK_REG, "$1<a class='link' target='_blank' rel='noreferrer' href='$2'>$2</a>").replace(MD_LINK_REG, "<a class='link' target='_blank' rel='noreferrer' href='$2'>$1</a>").replace(MEMO_LINK_REG, "<span class='memo-link-text' data-value='$2'>$1</span>");
|
|
|
const tempDivContainer = document.createElement("div");
|
|
|
tempDivContainer.innerHTML = content;
|
|
|
for (let i = 0; i < tempDivContainer.children.length; i++) {
|
|
|
const c = tempDivContainer.children[i];
|
|
|
if (c.tagName === "P" && c.textContent === "" && ((_a = c.firstElementChild) == null ? void 0 : _a.tagName) !== "BR") {
|
|
|
c.remove();
|
|
|
i--;
|
|
|
continue;
|
|
|
}
|
|
|
}
|
|
|
return tempDivContainer.innerHTML;
|
|
|
}
|
|
|
var Memo$1 = _react_17_0_2_react.exports.memo(Memo);
|
|
|
var memolist = "";
|
|
|
let copyShownMemos;
|
|
|
const MemoList = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query
|
|
|
},
|
|
|
memoState: {
|
|
|
memos
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [isFetching, setFetchStatus] = _react_17_0_2_react.exports.useState(true);
|
|
|
const wrapperElement = _react_17_0_2_react.exports.useRef(null);
|
|
|
const {
|
|
|
tag: tagQuery,
|
|
|
duration,
|
|
|
type: memoContentType,
|
|
|
text: textQuery,
|
|
|
filter: queryId
|
|
|
} = query;
|
|
|
const queryFilter = queryService.getQueryById(queryId);
|
|
|
const showMemoFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoContentType || textQuery || queryFilter);
|
|
|
const shownMemos = showMemoFilter || queryFilter || HideDoneTasks ? memos.filter((memo2) => {
|
|
|
var _a, _b, _c;
|
|
|
let shouldShow = true;
|
|
|
if (memo2.memoType !== void 0) {
|
|
|
if (HideDoneTasks && memo2.memoType === "TASK-DONE") {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (queryFilter) {
|
|
|
const filters = JSON.parse(queryFilter.querystring);
|
|
|
if (Array.isArray(filters)) {
|
|
|
shouldShow = checkShouldShowMemoWithFilters(memo2, filters);
|
|
|
}
|
|
|
}
|
|
|
if (tagQuery) {
|
|
|
const tagsSet = new Set();
|
|
|
for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) {
|
|
|
const tag2 = t2.replace(TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) {
|
|
|
const tag2 = t2.replace(NOP_FIRST_TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
for (const t2 of Array.from((_c = memo2.content.match(FIRST_TAG_REG)) != null ? _c : [])) {
|
|
|
const tag2 = t2.replace(FIRST_TAG_REG, "$2").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
if (!tagsSet.has(tagQuery)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (duration && duration.from < duration.to && (utils$1.getTimeStampByDate(memo2.createdAt) < duration.from || utils$1.getTimeStampByDate(memo2.createdAt) > duration.to)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
if (memoContentType) {
|
|
|
if (memoContentType === "NOT_TAGGED" && (memo2.content.match(TAG_REG) !== null || memo2.content.match(NOP_FIRST_TAG_REG) !== null)) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoContentType === "LINKED" && memo2.content.match(LINK_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoContentType === "IMAGED" && memo2.content.match(IMAGE_URL_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoContentType === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (textQuery && !memo2.content.includes(textQuery)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
return shouldShow;
|
|
|
}) : memos;
|
|
|
copyShownMemos = shownMemos;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
memoService.fetchAllMemos().then(() => {
|
|
|
setFetchStatus(false);
|
|
|
}).catch(() => {
|
|
|
new require$$0.Notice("\u{1F62D} Fetch Error");
|
|
|
});
|
|
|
dailyNotesService.getMyAllDailyNotes().then(() => {
|
|
|
setFetchStatus(false);
|
|
|
}).catch(() => {
|
|
|
new require$$0.Notice("\u{1F62D} Fetch DailyNotes Error");
|
|
|
});
|
|
|
dailyNotesService.getState();
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a;
|
|
|
(_a = wrapperElement.current) == null ? void 0 : _a.scrollTo({
|
|
|
top: 0
|
|
|
});
|
|
|
}, [query]);
|
|
|
const handleMemoListClick = _react_17_0_2_react.exports.useCallback((event) => {
|
|
|
const {
|
|
|
workspace
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const targetEl = event.target;
|
|
|
if (targetEl.tagName === "SPAN" && targetEl.className === "tag-span") {
|
|
|
const tagName = targetEl.innerText.slice(1);
|
|
|
const currTagQuery = locationService.getState().query.tag;
|
|
|
if (currTagQuery === tagName) {
|
|
|
locationService.setTagQuery("");
|
|
|
} else {
|
|
|
locationService.setTagQuery(tagName);
|
|
|
}
|
|
|
} else if (targetEl.tagName === "A" && targetEl.className === "internal-link") {
|
|
|
const sourcePath = targetEl.getAttribute("data-filepath");
|
|
|
if (require$$0.Platform.isMobile) {
|
|
|
workspace.openLinkText(sourcePath, sourcePath, false);
|
|
|
} else {
|
|
|
workspace.openLinkText(sourcePath, sourcePath, true);
|
|
|
}
|
|
|
}
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `memolist-wrapper ${isFetching ? "" : "completed"}`,
|
|
|
onClick: handleMemoListClick,
|
|
|
ref: wrapperElement,
|
|
|
children: [shownMemos.map((memo2) => /* @__PURE__ */ jsx(Memo$1, {
|
|
|
memo: memo2
|
|
|
}, `${memo2.id}-${memo2.updatedAt}`)), /* @__PURE__ */ jsx("div", {
|
|
|
className: "status-text-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "status-text",
|
|
|
children: isFetching ? t("Fetching data...") : shownMemos.length === 0 ? t("Noooop!") : showMemoFilter ? "" : t("All Data is Loaded \u{1F389}")
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const getMemosByDate = (memos) => {
|
|
|
const dataArr = [];
|
|
|
memos.map((mapItem) => {
|
|
|
if (dataArr.length == 0) {
|
|
|
dataArr.push({ date: require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD"), have: [mapItem] });
|
|
|
} else {
|
|
|
const res = dataArr.some((item) => {
|
|
|
if (item.date == require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD")) {
|
|
|
item.have.push(mapItem);
|
|
|
return true;
|
|
|
}
|
|
|
});
|
|
|
if (!res) {
|
|
|
dataArr.push({ date: require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD"), have: [mapItem] });
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return dataArr;
|
|
|
};
|
|
|
const transferMemosIntoText = (dailyMemos) => {
|
|
|
let outputText = "";
|
|
|
let dataArr = [];
|
|
|
let indent = "";
|
|
|
const { format: format2 } = getDailyNoteSettings_1();
|
|
|
dailyMemos.map((mapItem) => {
|
|
|
dataArr = mapItem.have;
|
|
|
if (ShowDate) {
|
|
|
outputText = outputText + "- [[" + require$$0.moment(mapItem.date, "YYYY-MM-DD").format(format2) + "]]\n";
|
|
|
indent = " ";
|
|
|
}
|
|
|
if (ShowTime) {
|
|
|
for (let i = 0; i < dataArr.length; i++) {
|
|
|
const time = require$$0.moment(dataArr[i].createdAt, "YYYY/MM/DD HH:mm:ss").format("HH:mm");
|
|
|
let formatContent;
|
|
|
if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) {
|
|
|
formatContent = DefaultMemoComposition.replace(/{TIME}/g, time).replace(/{CONTENT}/g, dataArr[i].content);
|
|
|
} else {
|
|
|
formatContent = time + " " + dataArr[i].content;
|
|
|
}
|
|
|
if (dataArr[i].memoType === "JOURNAL") {
|
|
|
outputText = outputText + indent + "- " + formatContent + "\n";
|
|
|
} else {
|
|
|
if (dataArr[i].memoType === "TASK-TODO") {
|
|
|
outputText = outputText + indent + "- [ ] " + formatContent + "\n";
|
|
|
} else if (dataArr[i].memoType === "TASK-DONE") {
|
|
|
outputText = outputText + indent + "- [x] " + formatContent + "\n";
|
|
|
} else {
|
|
|
const taskMark = dataArr[i].memoType.match(/TASK-(.*)?/g)[1];
|
|
|
outputText = outputText + indent + "- [" + taskMark + "] " + formatContent + "\n";
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
for (let i = 0; i < dataArr.length; i++) {
|
|
|
if (dataArr[i].memoType === "JOURNAL") {
|
|
|
outputText = outputText + indent + "- " + dataArr[i].content + "\n";
|
|
|
} else {
|
|
|
if (dataArr[i].memoType === "TASK-TODO") {
|
|
|
outputText = outputText + indent + "- [ ] " + dataArr[i].content + "\n";
|
|
|
} else if (dataArr[i].memoType === "TASK-DONE") {
|
|
|
outputText = outputText + indent + "- [x] " + dataArr[i].content + "\n";
|
|
|
} else {
|
|
|
const taskMark = dataArr[i].memoType.match(/TASK-(.*)?/g)[1];
|
|
|
outputText = outputText + indent + "- [" + taskMark + "] " + dataArr[i].content + "\n";
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (ShowDate && AddBlankLineWhenDate) {
|
|
|
outputText = outputText + "\n";
|
|
|
}
|
|
|
});
|
|
|
const removeBrContent = outputText.replace(/<br>/g, "\n ");
|
|
|
return removeBrContent;
|
|
|
};
|
|
|
const MemoFilter = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const {
|
|
|
tag: tagQuery,
|
|
|
duration,
|
|
|
type: memoType,
|
|
|
text: textQuery,
|
|
|
filter
|
|
|
} = query;
|
|
|
const queryFilter = queryService.getQueryById(filter);
|
|
|
const showFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoType || textQuery || queryFilter);
|
|
|
const handleCopyClick = async () => {
|
|
|
if (copyShownMemos.length > 0) {
|
|
|
const memosByDate = getMemosByDate(copyShownMemos);
|
|
|
const queryDailyMemos = transferMemosIntoText(memosByDate);
|
|
|
await utils$1.copyTextToClipboard(queryDailyMemos);
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `filter-query-container ${showFilter ? "" : "hidden"}`,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-query",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: "FILTER: "
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container " + (queryFilter ? "" : "hidden"),
|
|
|
onClick: () => {
|
|
|
locationService.setMemoFilter("");
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F516}"
|
|
|
}), " ", queryFilter == null ? void 0 : queryFilter.title]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container " + (tagQuery ? "" : "hidden"),
|
|
|
onClick: () => {
|
|
|
locationService.setTagQuery("");
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F3F7}\uFE0F"
|
|
|
}), " ", tagQuery]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container " + (memoType ? "" : "hidden"),
|
|
|
onClick: () => {
|
|
|
locationService.setMemoTypeQuery("");
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F4E6}"
|
|
|
}), " ", getTextWithMemoType(memoType)]
|
|
|
}), duration && duration.from < duration.to ? /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container",
|
|
|
onClick: () => {
|
|
|
locationService.setFromAndToQuery(0, 0);
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F5D3}\uFE0F"
|
|
|
}), " ", require$$0.moment(duration.from, "x").format("YYYY/MM/DD"), " ", t("to"), " ", require$$0.moment(duration.to, "x").add(1, "days").format("YYYY/MM/DD")]
|
|
|
}) : null, /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container " + (textQuery ? "" : "hidden"),
|
|
|
onClick: () => {
|
|
|
locationService.setTextQuery("");
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F50D}"
|
|
|
}), " ", textQuery]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "copy-memo",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: copy,
|
|
|
onClick: handleCopyClick
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function Memos$1() {
|
|
|
if (require$$0.Platform.isMobile && DefaultEditorLocation === "Bottom") {
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx(MemosHeader, {}), /* @__PURE__ */ jsx(MemoFilter, {}), /* @__PURE__ */ jsx(MemoList, {}), /* @__PURE__ */ jsx(MemoEditor, {})]
|
|
|
});
|
|
|
} else {
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx(MemosHeader, {}), /* @__PURE__ */ jsx(MemoEditor, {}), /* @__PURE__ */ jsx(MemoFilter, {}), /* @__PURE__ */ jsx(MemoList, {})]
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
function useLoading(initialState = true) {
|
|
|
const [state, setState] = _react_17_0_2_react.exports.useState({ isLoading: initialState, isFailed: false, isSucceed: false });
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
setLoading: () => {
|
|
|
setState(__spreadProps(__spreadValues({}, state), {
|
|
|
isLoading: true,
|
|
|
isFailed: false,
|
|
|
isSucceed: false
|
|
|
}));
|
|
|
},
|
|
|
setFinish: () => {
|
|
|
setState(__spreadProps(__spreadValues({}, state), {
|
|
|
isLoading: false,
|
|
|
isFailed: false,
|
|
|
isSucceed: true
|
|
|
}));
|
|
|
},
|
|
|
setError: () => {
|
|
|
setState(__spreadProps(__spreadValues({}, state), {
|
|
|
isLoading: false,
|
|
|
isFailed: true,
|
|
|
isSucceed: false
|
|
|
}));
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
const getPathOfImage$1 = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink$1 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$1(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink$1 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$1(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const DeletedMemo = (props) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
memo: propsMemo,
|
|
|
handleDeletedMemoAction
|
|
|
} = props;
|
|
|
const memo2 = __spreadProps(__spreadValues({}, propsMemo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt),
|
|
|
deletedAtStr: utils$1.getDateTimeString((_a = propsMemo.deletedAt) != null ? _a : Date.now())
|
|
|
});
|
|
|
const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false);
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink$1(one));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_b = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _b[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink$1(two));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
const handleDeleteMemoClick = async () => {
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
try {
|
|
|
await memoService.deleteMemoById(memo2.id);
|
|
|
handleDeletedMemoAction(memo2.id);
|
|
|
} catch (error) {
|
|
|
new require$$0.Notice(error.message);
|
|
|
}
|
|
|
} else {
|
|
|
toggleConfirmDeleteBtn();
|
|
|
}
|
|
|
};
|
|
|
const handleRestoreMemoClick = async () => {
|
|
|
try {
|
|
|
await memoService.restoreMemoById(memo2.id);
|
|
|
handleDeletedMemoAction(memo2.id);
|
|
|
new require$$0.Notice("RESTORE SUCCEED");
|
|
|
} catch (error) {
|
|
|
new require$$0.Notice(error.message);
|
|
|
}
|
|
|
};
|
|
|
const handleMouseLeaveMemoWrapper = () => {
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
toggleConfirmDeleteBtn(false);
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `memo-wrapper ${"memos-" + memo2.id}`,
|
|
|
onMouseLeave: handleMouseLeaveMemoWrapper,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-top-wrapper",
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "time-text",
|
|
|
children: [t("DELETE AT"), " ", memo2.deletedAtStr]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn more-action-btn",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: more
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "more-action-btns-wrapper",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "more-action-btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn restore-btn",
|
|
|
onClick: handleRestoreMemoClick,
|
|
|
children: t("RESTORE")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`,
|
|
|
onClick: handleDeleteMemoClick,
|
|
|
children: showConfirmDeleteBtn ? t("CONFIRM\uFF01") : t("DELETE")
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
alt: "",
|
|
|
className: "memo-img",
|
|
|
imgUrl,
|
|
|
referrerPolicy: "no-referrer"
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
className: "memo-img",
|
|
|
imgUrl: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
filepath: imgUrl.filepath
|
|
|
}, idx))
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var memoTrash = "";
|
|
|
const MemoTrash = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query
|
|
|
},
|
|
|
globalState: {
|
|
|
isMobileView
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const loadingState = useLoading();
|
|
|
const [deletedMemos, setDeletedMemos] = _react_17_0_2_react.exports.useState([]);
|
|
|
const {
|
|
|
tag: tagQuery,
|
|
|
duration,
|
|
|
type: memoType,
|
|
|
text: textQuery,
|
|
|
filter: queryId
|
|
|
} = query;
|
|
|
const queryFilter = queryService.getQueryById(queryId);
|
|
|
const showMemoFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoType || textQuery || queryFilter);
|
|
|
const shownMemos = showMemoFilter || queryFilter ? deletedMemos.filter((memo2) => {
|
|
|
var _a, _b;
|
|
|
let shouldShow = true;
|
|
|
if (queryFilter) {
|
|
|
const filters = JSON.parse(queryFilter.querystring);
|
|
|
if (Array.isArray(filters)) {
|
|
|
shouldShow = checkShouldShowMemoWithFilters(memo2, filters);
|
|
|
}
|
|
|
}
|
|
|
if (tagQuery) {
|
|
|
const tagsSet = new Set();
|
|
|
for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) {
|
|
|
const tag2 = t2.replace(TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) {
|
|
|
const tag2 = t2.replace(NOP_FIRST_TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
if (!tagsSet.has(tagQuery)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (duration && duration.from < duration.to && (utils$1.getTimeStampByDate(memo2.createdAt) < duration.from || utils$1.getTimeStampByDate(memo2.createdAt) > duration.to)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
if (memoType) {
|
|
|
if (memoType === "NOT_TAGGED" && memo2.content.match(TAG_REG) !== null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoType === "LINKED" && memo2.content.match(LINK_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoType === "IMAGED" && memo2.content.match(IMAGE_URL_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoType === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (textQuery && !memo2.content.includes(textQuery)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
return shouldShow;
|
|
|
}) : deletedMemos;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
memoService.fetchAllMemos();
|
|
|
memoService.fetchDeletedMemos().then((result) => {
|
|
|
if (result.length !== 0) {
|
|
|
setDeletedMemos(result);
|
|
|
}
|
|
|
}).catch((error) => {
|
|
|
new require$$0.Notice("Failed to fetch deleted memos: ", error);
|
|
|
}).finally(() => {
|
|
|
loadingState.setFinish();
|
|
|
});
|
|
|
locationService.clearQuery();
|
|
|
}, []);
|
|
|
const handleDeletedMemoAction = _react_17_0_2_react.exports.useCallback((memoId) => {
|
|
|
setDeletedMemos((deletedMemos2) => deletedMemos2.filter((memo2) => memo2.id !== memoId));
|
|
|
}, []);
|
|
|
const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
globalStateService.setShowSiderbarInMobileView(true);
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-trash-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "section-header-container",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: isMobileView,
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "action-btn",
|
|
|
onClick: handleShowSidebarBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: menuSvg,
|
|
|
alt: "menu"
|
|
|
})
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: t("Recycle bin")
|
|
|
})]
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(MemoFilter, {}), loadingState.isLoading ? /* @__PURE__ */ jsx("div", {
|
|
|
className: "tip-text-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: t("Fetching data...")
|
|
|
})
|
|
|
}) : deletedMemos.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
|
className: "tip-text-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: t("Here is No Zettels.")
|
|
|
})
|
|
|
}) : /* @__PURE__ */ jsx("div", {
|
|
|
className: "deleted-memos-container",
|
|
|
children: shownMemos.map((memo2) => /* @__PURE__ */ jsx(DeletedMemo, {
|
|
|
memo: memo2,
|
|
|
handleDeletedMemoAction
|
|
|
}, `${memo2.id}-${memo2.updatedAt}`))
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var preferencesSection = "";
|
|
|
var checkboxActive = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWNWgxNHYxNHpNMTcuOTkgOWwtMS40MS0xLjQyLTYuNTkgNi41OS0yLjU4LTIuNTctMS40MiAxLjQxIDQgMy45OXoiLz48L3N2Zz4=";
|
|
|
var checkbox = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ii8+PC9zdmc+";
|
|
|
const PreferencesSection = () => {
|
|
|
const {
|
|
|
globalState
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const {
|
|
|
useTinyUndoHistoryCache,
|
|
|
shouldHideImageUrl,
|
|
|
shouldSplitMemoWord,
|
|
|
shouldUseMarkdownParser
|
|
|
} = globalState;
|
|
|
const demoMemoContent = "\u{1F44B} \u4F60\u597D\u5440\uFF5E\u6B22\u8FCE\u4F7F\u7528memos!\n* \u2728 **\u5F00\u6E90\u9879\u76EE**\uFF1B\n* \u{1F60B} \u7CBE\u7F8E\u4E14\u7EC6\u8282\u7684\u89C6\u89C9\u6837\u5F0F\uFF1B\n* \u{1F4D1} \u4F53\u9A8C\u4F18\u826F\u7684\u4EA4\u4E92\u903B\u8F91\uFF1B";
|
|
|
const handleOpenTinyUndoChanged = () => {
|
|
|
globalStateService.setAppSetting({
|
|
|
useTinyUndoHistoryCache: !useTinyUndoHistoryCache
|
|
|
});
|
|
|
};
|
|
|
const handleSplitWordsValueChanged = () => {
|
|
|
globalStateService.setAppSetting({
|
|
|
shouldSplitMemoWord: !shouldSplitMemoWord
|
|
|
});
|
|
|
};
|
|
|
const handleHideImageUrlValueChanged = () => {
|
|
|
globalStateService.setAppSetting({
|
|
|
shouldHideImageUrl: !shouldHideImageUrl
|
|
|
});
|
|
|
};
|
|
|
const handleUseMarkdownParserChanged = () => {
|
|
|
globalStateService.setAppSetting({
|
|
|
shouldUseMarkdownParser: !shouldUseMarkdownParser
|
|
|
});
|
|
|
};
|
|
|
const handleExportBtnClick = async () => {
|
|
|
const formatedMemos = memoService.getState().memos.map((m2) => {
|
|
|
return __spreadValues({}, m2);
|
|
|
});
|
|
|
const jsonStr = JSON.stringify(formatedMemos);
|
|
|
const element = document.createElement("a");
|
|
|
element.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(jsonStr));
|
|
|
element.setAttribute("download", "data.json");
|
|
|
element.style.display = "none";
|
|
|
document.body.appendChild(element);
|
|
|
element.click();
|
|
|
document.body.removeChild(element);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-container preferences-section-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: "Memo \u663E\u793A\u76F8\u5173"
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "demo-content-container memo-content-text",
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(demoMemoContent)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsxs("label", {
|
|
|
className: "form-label checkbox-form-label",
|
|
|
onClick: handleSplitWordsValueChanged,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: "\u4E2D\u82F1\u6587\u5185\u5BB9\u81EA\u52A8\u95F4\u9694"
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: shouldSplitMemoWord ? checkboxActive : checkbox
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("label", {
|
|
|
className: "form-label checkbox-form-label",
|
|
|
onClick: handleUseMarkdownParserChanged,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: "\u90E8\u5206 markdown \u683C\u5F0F\u89E3\u6790"
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: shouldUseMarkdownParser ? checkboxActive : checkbox
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("label", {
|
|
|
className: "form-label checkbox-form-label",
|
|
|
onClick: handleHideImageUrlValueChanged,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: "\u9690\u85CF\u56FE\u7247\u94FE\u63A5\u5730\u5740"
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: shouldHideImageUrl ? checkboxActive : checkbox
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-container preferences-section-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: "\u7F16\u8F91\u5668"
|
|
|
}), /* @__PURE__ */ jsxs("label", {
|
|
|
className: "form-label checkbox-form-label",
|
|
|
onClick: handleOpenTinyUndoChanged,
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "normal-text",
|
|
|
children: ["\u542F\u7528", " ", /* @__PURE__ */ jsx("a", {
|
|
|
target: "_blank",
|
|
|
href: "https://github.com/boojack/tiny-undo",
|
|
|
onClick: (e) => e.stopPropagation(),
|
|
|
rel: "noreferrer",
|
|
|
children: "tiny-undo"
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: useTinyUndoHistoryCache ? checkboxActive : checkbox
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-container hidden",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: "\u5176\u4ED6"
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "btn-container",
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn export-btn",
|
|
|
onClick: handleExportBtnClick,
|
|
|
children: "\u5BFC\u51FA\u6570\u636E(JSON)"
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var setting = "";
|
|
|
const Setting = () => {
|
|
|
const {
|
|
|
globalState: {
|
|
|
isMobileView
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
memoService.fetchAllMemos();
|
|
|
}, []);
|
|
|
const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
globalStateService.setShowSiderbarInMobileView(true);
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "preference-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "section-header-container",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: isMobileView,
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "action-btn",
|
|
|
onClick: handleShowSidebarBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: menuSvg,
|
|
|
alt: "menu"
|
|
|
})
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: "\u8D26\u53F7\u4E0E\u8BBE\u7F6E"
|
|
|
})]
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "sections-wrapper",
|
|
|
children: /* @__PURE__ */ jsx(PreferencesSection, {})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const homeRouter = {
|
|
|
"/recycle": /* @__PURE__ */ jsx(MemoTrash, {}),
|
|
|
"/setting": /* @__PURE__ */ jsx(Setting, {}),
|
|
|
"*": /* @__PURE__ */ jsx(Memos$1, {})
|
|
|
};
|
|
|
const routerSwitch = (router) => {
|
|
|
return (pathname) => {
|
|
|
for (const key of Object.keys(router)) {
|
|
|
if (key === pathname) {
|
|
|
return router[key];
|
|
|
}
|
|
|
}
|
|
|
return router["*"];
|
|
|
};
|
|
|
};
|
|
|
const homeRouterSwitch = routerSwitch(homeRouter);
|
|
|
var aboutSiteDialog = "";
|
|
|
const AboutSiteDialog = ({
|
|
|
destroy
|
|
|
}) => {
|
|
|
const handleCloseBtnClick = () => {
|
|
|
destroy();
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-header-container",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F920}"
|
|
|
}), "About ", /* @__PURE__ */ jsx("b", {
|
|
|
children: "Obsidian-Memos"
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: handleCloseBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-content-container",
|
|
|
children: ["Hi, I am Quorafind(Boninall), if you are interested in this project, please support my work and enthusiasm by buying me a coffee on ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://www.buymeacoffee.com/boninall",
|
|
|
children: "https://www.buymeacoffee.com/boninall"
|
|
|
}), /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://www.buymeacoffee.com/boninall",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
src: `https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=boninall&button_colour=6495ED&font_colour=ffffff&font_family=Lato&outline_colour=000000&coffee_colour=FFDD00`
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("br", {}), /* @__PURE__ */ jsxs("p", {
|
|
|
children: ["\u57FA\u4E8E ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://github.com/justmemos/memos",
|
|
|
children: "memos"
|
|
|
}), " \u5F00\u6E90\u9879\u76EE\u6240\u6784\u5EFA\u7684\u9879\u76EE\u3002 NOTE: Based on", " ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://github.com/justmemos/memos",
|
|
|
children: "memos"
|
|
|
}), " project to build."]
|
|
|
}), /* @__PURE__ */ jsx("br", {}), /* @__PURE__ */ jsxs("p", {
|
|
|
children: ["\u{1F3D7} This project is working in progress, ", /* @__PURE__ */ jsx("br", {}), " and very pleasure to welcome your", " ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://github.com/Quorafind/obsidian-memos/issues",
|
|
|
children: "issues"
|
|
|
}), " and", " ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://github.com/Quorafind/obsidian-memos/pulls",
|
|
|
children: "Pull Request"
|
|
|
}), "."]
|
|
|
}), /* @__PURE__ */ jsx("hr", {}), /* @__PURE__ */ jsxs("p", {
|
|
|
className: "normal-text",
|
|
|
children: ["Last updated on ", /* @__PURE__ */ jsx("span", {
|
|
|
className: "pre-text",
|
|
|
children: "2022/01/04 22:55:15"
|
|
|
}), " \u{1F389}"]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function showAboutSiteDialog() {
|
|
|
showDialog({
|
|
|
className: "about-site-dialog"
|
|
|
}, AboutSiteDialog);
|
|
|
}
|
|
|
var menuBtnsPopup = "";
|
|
|
const MenuBtnsPopup = (props) => {
|
|
|
const {
|
|
|
shownStatus,
|
|
|
setShownStatus
|
|
|
} = props;
|
|
|
const {
|
|
|
app: app2
|
|
|
} = dailyNotesService.getState();
|
|
|
const popupElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (shownStatus) {
|
|
|
const handleClickOutside = (event) => {
|
|
|
var _a;
|
|
|
if (!((_a = popupElRef.current) == null ? void 0 : _a.contains(event.target))) {
|
|
|
event.stopPropagation();
|
|
|
}
|
|
|
setShownStatus(false);
|
|
|
};
|
|
|
window.addEventListener("click", handleClickOutside, {
|
|
|
capture: true,
|
|
|
once: true
|
|
|
});
|
|
|
}
|
|
|
}, [shownStatus]);
|
|
|
const handleMyAccountBtnClick = () => {
|
|
|
app2.setting.open();
|
|
|
app2.setting.openTabById("obsidian-memos");
|
|
|
};
|
|
|
const handleMemosTrashBtnClick = () => {
|
|
|
locationService.pushHistory("/recycle");
|
|
|
};
|
|
|
const handleAboutBtnClick = () => {
|
|
|
showAboutSiteDialog();
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `menu-btns-popup ${shownStatus ? "" : "hidden"}`,
|
|
|
ref: popupElRef,
|
|
|
children: [/* @__PURE__ */ jsxs("button", {
|
|
|
className: "btn action-btn",
|
|
|
onClick: handleMyAccountBtnClick,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon",
|
|
|
children: "\u{1F464}"
|
|
|
}), " ", t("Settings")]
|
|
|
}), /* @__PURE__ */ jsxs("button", {
|
|
|
className: "btn action-btn",
|
|
|
onClick: handleMemosTrashBtnClick,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon",
|
|
|
children: "\u{1F5D1}\uFE0F"
|
|
|
}), " ", t("Recycle bin")]
|
|
|
}), /* @__PURE__ */ jsxs("button", {
|
|
|
className: "btn action-btn",
|
|
|
onClick: handleAboutBtnClick,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon",
|
|
|
children: "\u{1F920}"
|
|
|
}), " ", t("About Me")]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var dailyMemo = "";
|
|
|
const getPathOfImage = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink = (lineText, app2) => {
|
|
|
var _a, _b;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = app2.metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filePath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage(app2.vault, file);
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink = (lineText, app2) => {
|
|
|
var _a, _b;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = app2.metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filePath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage(app2.vault, file);
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const DailyMemo = (props) => {
|
|
|
var _a;
|
|
|
const {
|
|
|
app: app2
|
|
|
} = appStore.getState().dailyNotesState;
|
|
|
const {
|
|
|
memo: propsMemo
|
|
|
} = props;
|
|
|
const memo2 = __spreadProps(__spreadValues({}, propsMemo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt),
|
|
|
timeStr: utils$1.getTimeString(propsMemo.createdAt)
|
|
|
});
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink(one, app2));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink(two, app2));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "daily-memo-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "time-wrapper",
|
|
|
children: /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: memo2.timeStr
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-content-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-container",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", {
|
|
|
src: imgUrl,
|
|
|
referrerPolicy: "no-referrer"
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-container internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", {
|
|
|
src: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
path: imgUrl.filePath
|
|
|
}, idx))
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var datePicker = "";
|
|
|
var arrowLeft = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJsNC41OC00LjU5eiIvPjwvc3ZnPg==";
|
|
|
var arrowRight = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02LTYtNnoiLz48L3N2Zz4=";
|
|
|
const DatePicker = (props) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
className,
|
|
|
datestamp,
|
|
|
handleDateStampChange
|
|
|
} = props;
|
|
|
const [currentDateStamp, setCurrentDateStamp] = _react_17_0_2_react.exports.useState(getMonthFirstDayDateStamp(datestamp));
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
setCurrentDateStamp(getMonthFirstDayDateStamp(datestamp));
|
|
|
}, [datestamp]);
|
|
|
const firstDate = new Date(currentDateStamp);
|
|
|
const firstDateDay = firstDate.getDay() === 0 ? 7 : firstDate.getDay();
|
|
|
const dayList = [];
|
|
|
for (let i = 0; i < firstDateDay; i++) {
|
|
|
dayList.push({
|
|
|
date: 0,
|
|
|
datestamp: firstDate.getTime() - DAILY_TIMESTAMP * (7 - i)
|
|
|
});
|
|
|
}
|
|
|
const dayAmount = getMonthDayAmount(currentDateStamp);
|
|
|
for (let i = 1; i <= dayAmount; i++) {
|
|
|
dayList.push({
|
|
|
date: i,
|
|
|
datestamp: firstDate.getTime() + DAILY_TIMESTAMP * (i - 1)
|
|
|
});
|
|
|
}
|
|
|
const handleDateItemClick = (datestamp2) => {
|
|
|
handleDateStampChange(datestamp2);
|
|
|
};
|
|
|
const handleChangeMonthBtnClick = (i) => {
|
|
|
const year = firstDate.getFullYear();
|
|
|
const month = firstDate.getMonth() + 1;
|
|
|
let nextDateStamp = 0;
|
|
|
if (month === 1 && i === -1) {
|
|
|
nextDateStamp = new Date(`${year - 1}/12/1`).getTime();
|
|
|
} else if (month === 12 && i === 1) {
|
|
|
nextDateStamp = new Date(`${year + 1}/1/1`).getTime();
|
|
|
} else {
|
|
|
nextDateStamp = new Date(`${year}/${month + i}/1`).getTime();
|
|
|
}
|
|
|
setCurrentDateStamp(getMonthFirstDayDateStamp(nextDateStamp));
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `date-picker-wrapper ${className}`,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-picker-header",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => handleChangeMonthBtnClick(-1),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowLeft
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("span", {
|
|
|
className: "normal-text",
|
|
|
children: [firstDate.getFullYear(), " ", t("year"), " ", (_a = t("monthsShort")[firstDate.getMonth()]) != null ? _a : firstDate.getMonth() + 1, " ", (_b = t("month")) != null ? _b : ""]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => handleChangeMonthBtnClick(1),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowRight
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-picker-day-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-picker-day-header",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: t("weekDaysShort")[0]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: t("weekDaysShort")[1]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: t("weekDaysShort")[2]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: t("weekDaysShort")[3]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: t("weekDaysShort")[4]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: t("weekDaysShort")[5]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: t("weekDaysShort")[6]
|
|
|
})]
|
|
|
}), dayList.map((d) => {
|
|
|
if (d.date === 0) {
|
|
|
return /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item null",
|
|
|
children: ""
|
|
|
}, d.datestamp);
|
|
|
} else {
|
|
|
return /* @__PURE__ */ jsx("span", {
|
|
|
className: `day-item ${d.datestamp === datestamp ? "current" : ""}`,
|
|
|
onClick: () => handleDateItemClick(d.datestamp),
|
|
|
children: d.date
|
|
|
}, d.datestamp);
|
|
|
}
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function getMonthDayAmount(datestamp) {
|
|
|
const dateTemp = new Date(datestamp);
|
|
|
const currentDate = new Date(`${dateTemp.getFullYear()}/${dateTemp.getMonth() + 1}/1`);
|
|
|
const nextMonthDate = currentDate.getMonth() === 11 ? new Date(`${currentDate.getFullYear() + 1}/1/1`) : new Date(`${currentDate.getFullYear()}/${currentDate.getMonth() + 2}/1`);
|
|
|
return (nextMonthDate.getTime() - currentDate.getTime()) / DAILY_TIMESTAMP;
|
|
|
}
|
|
|
function getMonthFirstDayDateStamp(timestamp) {
|
|
|
const dateTemp = new Date(timestamp);
|
|
|
const currentDate = new Date(`${dateTemp.getFullYear()}/${dateTemp.getMonth() + 1}/1`);
|
|
|
return currentDate.getTime();
|
|
|
}
|
|
|
var dailyMemoDiaryDialog = "";
|
|
|
const DailyMemoDiaryDialog = (props) => {
|
|
|
const loadingState = useLoading();
|
|
|
const [memos, setMemos] = _react_17_0_2_react.exports.useState([]);
|
|
|
const [currentDateStamp, setCurrentDateStamp] = _react_17_0_2_react.exports.useState(utils$1.getDateStampByDate(utils$1.getDateString(props.currentDateStamp)));
|
|
|
const [showDatePicker, toggleShowDatePicker] = useToggle(false);
|
|
|
const memosElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const currentDate = new Date(currentDateStamp);
|
|
|
const {
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const setDailyMemos = () => {
|
|
|
const dailyMemos = memoService.getState().memos.filter((a) => utils$1.getTimeStampByDate(a.createdAt) >= currentDateStamp && utils$1.getTimeStampByDate(a.createdAt) < currentDateStamp + DAILY_TIMESTAMP).sort((a, b) => utils$1.getTimeStampByDate(a.createdAt) - utils$1.getTimeStampByDate(b.createdAt));
|
|
|
setMemos(dailyMemos);
|
|
|
loadingState.setFinish();
|
|
|
};
|
|
|
setDailyMemos();
|
|
|
}, [currentDateStamp]);
|
|
|
const convertBase64ToBlob = (base64, type) => {
|
|
|
var bytes = window.atob(base64);
|
|
|
var ab2 = new ArrayBuffer(bytes.length);
|
|
|
var ia2 = new Uint8Array(ab2);
|
|
|
for (var i = 0; i < bytes.length; i++) {
|
|
|
ia2[i] = bytes.charCodeAt(i);
|
|
|
}
|
|
|
return new Blob([ab2], {
|
|
|
type
|
|
|
});
|
|
|
};
|
|
|
const handleShareBtnClick = async () => {
|
|
|
toggleShowDatePicker(false);
|
|
|
setTimeout(() => {
|
|
|
if (!memosElRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
toImage(memosElRef.current, {
|
|
|
backgroundColor: "#ffffff",
|
|
|
pixelRatio: window.devicePixelRatio * 2
|
|
|
}).then((url) => {
|
|
|
if (AutoSaveWhenOnMobile && require$$0.Platform.isMobile) {
|
|
|
const myBase64 = url.split("base64,")[1];
|
|
|
const blobInput = convertBase64ToBlob(myBase64, "image/png");
|
|
|
blobInput.arrayBuffer().then(async (buffer) => {
|
|
|
let aFile;
|
|
|
const ext = "png";
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
for (const string in dailyNotes) {
|
|
|
if (dailyNotes[string] instanceof require$$0.TFile) {
|
|
|
aFile = dailyNotes[string];
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (aFile !== void 0) {
|
|
|
await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, aFile), buffer);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
showPreviewImageDialog(url);
|
|
|
}).catch(() => {
|
|
|
});
|
|
|
}, 0);
|
|
|
};
|
|
|
const handleDataPickerChange = (datestamp) => {
|
|
|
setCurrentDateStamp(datestamp);
|
|
|
toggleShowDatePicker(false);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "dialog-header-container",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "header-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: t("Daily Memos")
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => setCurrentDateStamp(currentDateStamp - DAILY_TIMESTAMP),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowLeft
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => setCurrentDateStamp(currentDateStamp + DAILY_TIMESTAMP),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowRight
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text share-btn",
|
|
|
onClick: handleShareBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: share
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => props.destroy(),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-content-container",
|
|
|
ref: memosElRef,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-card-container",
|
|
|
onClick: () => toggleShowDatePicker(),
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "year-text",
|
|
|
children: currentDate.getFullYear()
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "month-text",
|
|
|
children: t("months")[currentDate.getMonth()]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "date-text",
|
|
|
children: currentDate.getDate()
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "day-text",
|
|
|
children: t("weekDays")[currentDate.getDay()]
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx(DatePicker, {
|
|
|
className: `date-picker ${showDatePicker ? "" : "hidden"}`,
|
|
|
datestamp: currentDateStamp,
|
|
|
handleDateStampChange: handleDataPickerChange
|
|
|
}), loadingState.isLoading ? /* @__PURE__ */ jsx("div", {
|
|
|
className: "tip-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: t("Loading...")
|
|
|
})
|
|
|
}) : memos.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
|
className: "tip-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: t("Noooop!")
|
|
|
})
|
|
|
}) : /* @__PURE__ */ jsx("div", {
|
|
|
className: "dailymemos-wrapper",
|
|
|
children: memos.map((memo2) => /* @__PURE__ */ jsx(DailyMemo, {
|
|
|
memo: memo2
|
|
|
}, `${memo2.id}-${memo2.updatedAt}`))
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function showDailyMemoDiaryDialog(datestamp = Date.now()) {
|
|
|
showDialog({
|
|
|
className: "daily-memo-diary-dialog"
|
|
|
}, DailyMemoDiaryDialog, {
|
|
|
currentDateStamp: datestamp
|
|
|
});
|
|
|
}
|
|
|
var userBanner = "";
|
|
|
const UserBanner = () => {
|
|
|
const {
|
|
|
memoState: {
|
|
|
memos,
|
|
|
tags
|
|
|
},
|
|
|
userState: {
|
|
|
user
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const username = user ? user.username : UserName;
|
|
|
let memosLength;
|
|
|
let createdDays;
|
|
|
if (memos.length) {
|
|
|
memosLength = memos.length - 1;
|
|
|
createdDays = memos ? Math.ceil((Date.now() - utils$1.getTimeStampByDate(memos[memosLength].createdAt)) / 1e3 / 3600 / 24) + 1 : 0;
|
|
|
}
|
|
|
const [shouldShowPopupBtns, setShouldShowPopupBtns] = _react_17_0_2_react.exports.useState(false);
|
|
|
const handleUsernameClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
locationService.pushHistory("/");
|
|
|
locationService.clearQuery();
|
|
|
}, []);
|
|
|
const handlePopupBtnClick = () => {
|
|
|
const sidebarEl = document.querySelector(".memos-sidebar-wrapper");
|
|
|
const popupEl = document.querySelector(".menu-btns-popup");
|
|
|
popupEl.style.top = 70 - sidebarEl.scrollTop + "px";
|
|
|
setShouldShowPopupBtns(true);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "user-banner-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "userinfo-header-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "username-text",
|
|
|
onClick: handleUsernameClick,
|
|
|
children: username
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "action-btn menu-popup-btn",
|
|
|
onClick: handlePopupBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
src: more,
|
|
|
className: "icon-img"
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(MenuBtnsPopup, {
|
|
|
shownStatus: shouldShowPopupBtns,
|
|
|
setShownStatus: setShouldShowPopupBtns
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "status-text-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "status-text memos-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "amount-text",
|
|
|
children: memos.length
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "type-text",
|
|
|
children: "MEMO"
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "status-text tags-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "amount-text",
|
|
|
children: tags.length
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "type-text",
|
|
|
children: t("TAG")
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "status-text duration-text",
|
|
|
onClick: () => showDailyMemoDiaryDialog(),
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "amount-text",
|
|
|
children: createdDays != null ? createdDays : 0
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "type-text",
|
|
|
children: t("DAY")
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var selector = "";
|
|
|
const nullItem = {
|
|
|
text: t("SELECT"),
|
|
|
value: ""
|
|
|
};
|
|
|
const Selector = (props) => {
|
|
|
const {
|
|
|
className,
|
|
|
dataSource,
|
|
|
handleValueChanged,
|
|
|
value
|
|
|
} = props;
|
|
|
const [showSelector, toggleSelectorStatus] = useToggle(false);
|
|
|
const seletorElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
let currentItem = nullItem;
|
|
|
for (const d of dataSource) {
|
|
|
if (d.value === value) {
|
|
|
currentItem = d;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (showSelector) {
|
|
|
const handleClickOutside = (event) => {
|
|
|
var _a;
|
|
|
if (!((_a = seletorElRef.current) == null ? void 0 : _a.contains(event.target))) {
|
|
|
toggleSelectorStatus(false);
|
|
|
}
|
|
|
};
|
|
|
window.addEventListener("click", handleClickOutside, {
|
|
|
capture: true,
|
|
|
once: true
|
|
|
});
|
|
|
}
|
|
|
}, [showSelector]);
|
|
|
const handleItemClick = (item) => {
|
|
|
if (handleValueChanged) {
|
|
|
handleValueChanged(item.value);
|
|
|
}
|
|
|
toggleSelectorStatus(false);
|
|
|
};
|
|
|
const handleCurrentValueClick = (event) => {
|
|
|
event.stopPropagation();
|
|
|
toggleSelectorStatus();
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `selector-wrapper ${className != null ? className : ""}`,
|
|
|
ref: seletorElRef,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: `current-value-container ${showSelector ? "active" : ""}`,
|
|
|
onClick: handleCurrentValueClick,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "value-text",
|
|
|
children: currentItem.text
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "arrow-text",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowRight
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: `items-wrapper ${showSelector ? "" : "hidden"}`,
|
|
|
children: dataSource.map((d) => {
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
className: `item-container ${d.value === value ? "selected" : ""}`,
|
|
|
onClick: () => {
|
|
|
handleItemClick(d);
|
|
|
},
|
|
|
children: d.text
|
|
|
}, d.value);
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var Selector$1 = _react_17_0_2_react.exports.memo(Selector);
|
|
|
var createQueryDialog = "";
|
|
|
const CreateQueryDialog = (props) => {
|
|
|
const {
|
|
|
destroy,
|
|
|
queryId
|
|
|
} = props;
|
|
|
const [title, setTitle] = _react_17_0_2_react.exports.useState("");
|
|
|
const [filters, setFilters] = _react_17_0_2_react.exports.useState([]);
|
|
|
const requestState = useLoading(false);
|
|
|
const shownMemoLength = memoService.getState().memos.filter((memo2) => {
|
|
|
return checkShouldShowMemoWithFilters(memo2, filters);
|
|
|
}).length;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const queryTemp = queryService.getQueryById(queryId != null ? queryId : "");
|
|
|
if (queryTemp) {
|
|
|
setTitle(queryTemp.title);
|
|
|
const temp = JSON.parse(queryTemp.querystring);
|
|
|
if (Array.isArray(temp)) {
|
|
|
setFilters(temp);
|
|
|
}
|
|
|
}
|
|
|
}, [queryId]);
|
|
|
const handleTitleInputChange = (e) => {
|
|
|
const text = e.target.value;
|
|
|
setTitle(text);
|
|
|
};
|
|
|
const handleSaveBtnClick = async () => {
|
|
|
if (!title) {
|
|
|
new require$$0.Notice("TITLE CANNOT BE NULL\uFF01");
|
|
|
return;
|
|
|
} else if (filters.length === 0) {
|
|
|
new require$$0.Notice("FILTER CANNOT BE NULL\uFF01");
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
if (queryId) {
|
|
|
const editedQuery = await queryService.updateQuery(queryId, title, JSON.stringify(filters));
|
|
|
queryService.editQuery(editedQuery);
|
|
|
queryService.getMyAllQueries();
|
|
|
} else {
|
|
|
const query = await queryService.createQuery(title, JSON.stringify(filters));
|
|
|
queryService.pushQuery(query);
|
|
|
queryService.getMyAllQueries();
|
|
|
}
|
|
|
} catch (error) {
|
|
|
new require$$0.Notice(error.message);
|
|
|
}
|
|
|
destroy();
|
|
|
};
|
|
|
const handleAddFilterBenClick = () => {
|
|
|
if (filters.length > 0) {
|
|
|
const lastFilter = filters[filters.length - 1];
|
|
|
if (lastFilter.value.value === "") {
|
|
|
new require$$0.Notice("\u5148\u5B8C\u5584\u4E0A\u4E00\u4E2A\u8FC7\u6EE4\u5668\u5427");
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
setFilters([...filters, getDefaultFilter()]);
|
|
|
};
|
|
|
const handleFilterChange = _react_17_0_2_react.exports.useCallback((index, filter) => {
|
|
|
setFilters((filters2) => {
|
|
|
const temp = [...filters2];
|
|
|
temp[index] = filter;
|
|
|
return temp;
|
|
|
});
|
|
|
}, []);
|
|
|
const handleFilterRemove = _react_17_0_2_react.exports.useCallback((index) => {
|
|
|
setFilters((filters2) => {
|
|
|
const temp = filters2.filter((_, i) => i !== index);
|
|
|
return temp;
|
|
|
});
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-header-container",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F516}"
|
|
|
}), queryId ? t("EDIT QUERY") : t("CREATE QUERY")]
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: destroy,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-content-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "form-item-container input-form-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: t("TITLE")
|
|
|
}), /* @__PURE__ */ jsx("input", {
|
|
|
className: "title-input",
|
|
|
type: "text",
|
|
|
value: title,
|
|
|
onChange: handleTitleInputChange
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "form-item-container filter-form-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: t("FILTER")
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filters-wrapper",
|
|
|
children: [filters.map((f2, index) => {
|
|
|
return /* @__PURE__ */ jsx(MemoFilterInputer, {
|
|
|
index,
|
|
|
filter: f2,
|
|
|
handleFilterChange,
|
|
|
handleFilterRemove
|
|
|
}, index);
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "create-filter-btn",
|
|
|
onClick: handleAddFilterBenClick,
|
|
|
children: t("ADD FILTER TERMS")
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-footer-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: `tip-text ${filters.length === 0 && "hidden"}`,
|
|
|
children: [t("MATCH"), " Memo ", /* @__PURE__ */ jsx("strong", {
|
|
|
children: shownMemoLength
|
|
|
}), " ", t("TIMES")]
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: `btn save-btn ${requestState.isLoading ? "requesting" : ""}`,
|
|
|
onClick: handleSaveBtnClick,
|
|
|
children: "SAVE"
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const FilterInputer = (props) => {
|
|
|
const {
|
|
|
index,
|
|
|
filter,
|
|
|
handleFilterChange,
|
|
|
handleFilterRemove
|
|
|
} = props;
|
|
|
const {
|
|
|
type
|
|
|
} = filter;
|
|
|
const [inputElements, setInputElements] = _react_17_0_2_react.exports.useState(/* @__PURE__ */ jsx(Fragment, {}));
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
let operatorElement = /* @__PURE__ */ jsx(Fragment, {});
|
|
|
if (Object.keys(filterConsts).includes(type)) {
|
|
|
operatorElement = /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "operator-selector",
|
|
|
dataSource: Object.values(filterConsts[type].operators),
|
|
|
value: filter.value.operator,
|
|
|
handleValueChanged: handleOperatorChange
|
|
|
});
|
|
|
}
|
|
|
let valueElement = /* @__PURE__ */ jsx(Fragment, {});
|
|
|
switch (type) {
|
|
|
case "TYPE": {
|
|
|
valueElement = /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "value-selector",
|
|
|
dataSource: filterConsts["TYPE"].values,
|
|
|
value: filter.value.value,
|
|
|
handleValueChanged: handleValueChange
|
|
|
});
|
|
|
break;
|
|
|
}
|
|
|
case "TAG": {
|
|
|
valueElement = /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "value-selector",
|
|
|
dataSource: memoService.getState().tags.sort().map((t2) => {
|
|
|
return {
|
|
|
text: t2,
|
|
|
value: t2
|
|
|
};
|
|
|
}),
|
|
|
value: filter.value.value,
|
|
|
handleValueChanged: handleValueChange
|
|
|
});
|
|
|
break;
|
|
|
}
|
|
|
case "TEXT": {
|
|
|
valueElement = /* @__PURE__ */ jsx("input", {
|
|
|
type: "text",
|
|
|
className: "value-inputer",
|
|
|
value: filter.value.value,
|
|
|
onChange: (event) => {
|
|
|
handleValueChange(event.target.value);
|
|
|
event.target.focus();
|
|
|
}
|
|
|
});
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
setInputElements(/* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [operatorElement, valueElement]
|
|
|
}));
|
|
|
}, [type, filter]);
|
|
|
const handleRelationChange = _react_17_0_2_react.exports.useCallback((value) => {
|
|
|
if (["AND", "OR"].includes(value)) {
|
|
|
handleFilterChange(index, __spreadProps(__spreadValues({}, filter), {
|
|
|
relation: value
|
|
|
}));
|
|
|
}
|
|
|
}, [filter]);
|
|
|
const handleTypeChange = _react_17_0_2_react.exports.useCallback((value) => {
|
|
|
if (filter.type !== value) {
|
|
|
const ops = Object.values(filterConsts[value].operators);
|
|
|
handleFilterChange(index, __spreadProps(__spreadValues({}, filter), {
|
|
|
type: value,
|
|
|
value: {
|
|
|
operator: ops[0].value,
|
|
|
value: ""
|
|
|
}
|
|
|
}));
|
|
|
}
|
|
|
}, [filter]);
|
|
|
const handleOperatorChange = _react_17_0_2_react.exports.useCallback((value) => {
|
|
|
handleFilterChange(index, __spreadProps(__spreadValues({}, filter), {
|
|
|
value: __spreadProps(__spreadValues({}, filter.value), {
|
|
|
operator: value
|
|
|
})
|
|
|
}));
|
|
|
}, [filter]);
|
|
|
const handleValueChange = _react_17_0_2_react.exports.useCallback((value) => {
|
|
|
handleFilterChange(index, __spreadProps(__spreadValues({}, filter), {
|
|
|
value: __spreadProps(__spreadValues({}, filter.value), {
|
|
|
value
|
|
|
})
|
|
|
}));
|
|
|
}, [filter]);
|
|
|
const handleRemoveBtnClick = () => {
|
|
|
handleFilterRemove(index);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-filter-input-wrapper",
|
|
|
children: [index > 0 ? /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "relation-selector",
|
|
|
dataSource: relationConsts,
|
|
|
value: filter.relation,
|
|
|
handleValueChanged: handleRelationChange
|
|
|
}) : null, /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "type-selector",
|
|
|
dataSource: Object.values(filterConsts),
|
|
|
value: filter.type,
|
|
|
handleValueChanged: handleTypeChange
|
|
|
}), inputElements, /* @__PURE__ */ jsx("img", {
|
|
|
className: "remove-btn",
|
|
|
src: close,
|
|
|
onClick: handleRemoveBtnClick
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const MemoFilterInputer = _react_17_0_2_react.exports.memo(FilterInputer);
|
|
|
function showCreateQueryDialog(queryId) {
|
|
|
showDialog({
|
|
|
className: "create-query-dialog"
|
|
|
}, CreateQueryDialog, {
|
|
|
queryId
|
|
|
});
|
|
|
}
|
|
|
var queryList = "";
|
|
|
var moreWhite = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iI0ZGRkZGRiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTYgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0xMiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ii8+PC9zdmc+";
|
|
|
const QueryList = () => {
|
|
|
const {
|
|
|
queryState: {
|
|
|
queries
|
|
|
},
|
|
|
locationState: {
|
|
|
query: {
|
|
|
filter
|
|
|
}
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const loadingState = useLoading();
|
|
|
const sortedQueries = queries.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).sort((a, b) => {
|
|
|
var _a, _b;
|
|
|
return utils$1.getTimeStampByDate((_a = b.pinnedAt) != null ? _a : 0) - utils$1.getTimeStampByDate((_b = a.pinnedAt) != null ? _b : 0);
|
|
|
});
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
queryService.getMyAllQueries().catch(() => {
|
|
|
}).finally(() => {
|
|
|
loadingState.setFinish();
|
|
|
});
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "queries-wrapper",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: t("QUERY")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: () => showCreateQueryDialog(),
|
|
|
children: "+"
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: loadingState.isSucceed && sortedQueries.length === 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "create-query-btn-container",
|
|
|
children: /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: () => showCreateQueryDialog(),
|
|
|
children: t("CREATE FILTER")
|
|
|
})
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "queries-container",
|
|
|
children: sortedQueries.map((q2) => {
|
|
|
return /* @__PURE__ */ jsx(QueryItemContainer, {
|
|
|
query: q2,
|
|
|
isActive: q2.id === filter
|
|
|
}, q2.id);
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const QueryItemContainer = (props) => {
|
|
|
const {
|
|
|
query,
|
|
|
isActive
|
|
|
} = props;
|
|
|
const [showActionBtns, toggleShowActionBtns] = useToggle(false);
|
|
|
const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false);
|
|
|
const handleQueryClick = () => {
|
|
|
if (isActive) {
|
|
|
locationService.setMemoFilter("");
|
|
|
} else {
|
|
|
locationService.setMemoFilter(query.id);
|
|
|
}
|
|
|
};
|
|
|
const handleShowActionBtnClick = (event) => {
|
|
|
event.stopPropagation();
|
|
|
toggleShowActionBtns();
|
|
|
};
|
|
|
const handleActionBtnContainerMouseLeave = () => {
|
|
|
toggleShowActionBtns(false);
|
|
|
};
|
|
|
const handleDeleteMemoClick = async (event) => {
|
|
|
event.stopPropagation();
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
try {
|
|
|
await queryService.deleteQuery(query.id);
|
|
|
} catch (error) {
|
|
|
new require$$0.Notice(error.message);
|
|
|
}
|
|
|
} else {
|
|
|
toggleConfirmDeleteBtn();
|
|
|
}
|
|
|
};
|
|
|
const handleEditQueryBtnClick = (event) => {
|
|
|
event.stopPropagation();
|
|
|
showCreateQueryDialog(query.id);
|
|
|
};
|
|
|
const handlePinQueryBtnClick = async (event) => {
|
|
|
event.stopPropagation();
|
|
|
try {
|
|
|
if (query.pinnedAt) {
|
|
|
await queryService.unpinQuery(query.id);
|
|
|
queryService.editQuery(__spreadProps(__spreadValues({}, query), {
|
|
|
pinnedAt: ""
|
|
|
}));
|
|
|
} else {
|
|
|
await queryService.pinQuery(query.id);
|
|
|
queryService.editQuery(__spreadProps(__spreadValues({}, query), {
|
|
|
pinnedAt: utils$1.getDateTimeString(Date.now())
|
|
|
}));
|
|
|
}
|
|
|
} catch (error) {
|
|
|
}
|
|
|
};
|
|
|
const handleDeleteBtnMouseLeave = () => {
|
|
|
toggleConfirmDeleteBtn(false);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsx(Fragment, {
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: `query-item-container ${isActive ? "active" : ""}`,
|
|
|
onClick: handleQueryClick,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "query-text-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "#"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "query-text",
|
|
|
children: query.title
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "action-btn toggle-btn",
|
|
|
onClick: handleShowActionBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: isActive ? moreWhite : more
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: `action-btns-wrapper ${showActionBtns ? "" : "hidden"}`,
|
|
|
onMouseLeave: handleActionBtnContainerMouseLeave,
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "action-btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handlePinQueryBtnClick,
|
|
|
children: query.pinnedAt ? t("UNPIN") : t("PIN")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleEditQueryBtnClick,
|
|
|
children: t("EDIT")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`,
|
|
|
onClick: handleDeleteMemoClick,
|
|
|
onMouseLeave: handleDeleteBtnMouseLeave,
|
|
|
children: showConfirmDeleteBtn ? t("CONFIRM\uFF01") : t("DELETE")
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})
|
|
|
});
|
|
|
};
|
|
|
var tagList = "";
|
|
|
const TagList = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query: {
|
|
|
tag: tagQuery
|
|
|
}
|
|
|
},
|
|
|
memoState: {
|
|
|
tags: tagsText,
|
|
|
memos
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [tags, setTags] = _react_17_0_2_react.exports.useState([]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
memoService.updateTagsState();
|
|
|
}, [memos]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const sortedTags = Array.from(tagsText).sort();
|
|
|
const root = {
|
|
|
subTags: []
|
|
|
};
|
|
|
for (const tag2 of sortedTags) {
|
|
|
const subtags = tag2.split("/");
|
|
|
let tempObj = root;
|
|
|
let tagText = "";
|
|
|
for (let i = 0; i < subtags.length; i++) {
|
|
|
const key = subtags[i];
|
|
|
if (i === 0) {
|
|
|
tagText += key;
|
|
|
} else {
|
|
|
tagText += "/" + key;
|
|
|
}
|
|
|
let obj = null;
|
|
|
for (const t2 of tempObj.subTags) {
|
|
|
if (t2.text === tagText) {
|
|
|
obj = t2;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (!obj) {
|
|
|
obj = {
|
|
|
key,
|
|
|
text: tagText,
|
|
|
subTags: []
|
|
|
};
|
|
|
tempObj.subTags.push(obj);
|
|
|
}
|
|
|
tempObj = obj;
|
|
|
}
|
|
|
}
|
|
|
setTags(root.subTags);
|
|
|
}, [tagsText]);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "tags-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: t("Frequently Used Tags")
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "tags-container",
|
|
|
children: [tags.map((t2, idx) => /* @__PURE__ */ jsx(TagItemContainer, {
|
|
|
tag: t2,
|
|
|
tagQuery
|
|
|
}, t2.text + "-" + idx)), /* @__PURE__ */ jsx(Only, {
|
|
|
when: tags.length < 5 && memoService.initialized,
|
|
|
children: /* @__PURE__ */ jsxs("p", {
|
|
|
className: "tag-tip-container",
|
|
|
children: ["Input", /* @__PURE__ */ jsx("span", {
|
|
|
className: "code-text",
|
|
|
children: "#Tag "
|
|
|
}), "to create tag..."]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const TagItemContainer = (props) => {
|
|
|
const {
|
|
|
tag: tag2,
|
|
|
tagQuery
|
|
|
} = props;
|
|
|
const isActive = tagQuery === tag2.text;
|
|
|
const hasSubTags = tag2.subTags.length > 0;
|
|
|
const [showSubTags, toggleSubTags] = useToggle(false);
|
|
|
const handleTagClick = () => {
|
|
|
if (isActive) {
|
|
|
locationService.setTagQuery("");
|
|
|
} else {
|
|
|
utils$1.copyTextToClipboard(`#${tag2.text} `);
|
|
|
if (!["/", "/recycle"].includes(locationService.getState().pathname)) {
|
|
|
locationService.setPathname("/");
|
|
|
}
|
|
|
locationService.setTagQuery(tag2.text);
|
|
|
}
|
|
|
};
|
|
|
const handleToggleBtnClick = (event) => {
|
|
|
event.stopPropagation();
|
|
|
toggleSubTags();
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: `tag-item-container ${isActive ? "active" : ""}`,
|
|
|
onClick: handleTagClick,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "tag-text-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "#"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tag-text",
|
|
|
children: tag2.key
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "btns-container",
|
|
|
children: hasSubTags ? /* @__PURE__ */ jsx("span", {
|
|
|
className: `action-btn toggle-btn ${showSubTags ? "shown" : ""}`,
|
|
|
onClick: handleToggleBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowRight
|
|
|
})
|
|
|
}) : null
|
|
|
})]
|
|
|
}), hasSubTags ? /* @__PURE__ */ jsx("div", {
|
|
|
className: `subtags-container ${showSubTags ? "" : "hidden"}`,
|
|
|
children: tag2.subTags.map((st, idx) => /* @__PURE__ */ jsx(TagItemContainer, {
|
|
|
tag: st,
|
|
|
tagQuery
|
|
|
}, st.text + "-" + idx))
|
|
|
}) : null]
|
|
|
});
|
|
|
};
|
|
|
var react_1 = _react_17_0_2_react.exports;
|
|
|
var isFunction = function(setStateAction) {
|
|
|
return typeof setStateAction === "function";
|
|
|
};
|
|
|
var useStateRef = function(initialState) {
|
|
|
var _a = react_1.useState(initialState), state = _a[0], setState = _a[1];
|
|
|
var ref = react_1.useRef(state);
|
|
|
var dispatch = react_1.useCallback(function(setStateAction) {
|
|
|
ref.current = isFunction(setStateAction) ? setStateAction(ref.current) : setStateAction;
|
|
|
setState(ref.current);
|
|
|
}, []);
|
|
|
return [state, dispatch, ref];
|
|
|
};
|
|
|
var dist = useStateRef;
|
|
|
var usageHeatMap = "";
|
|
|
const tableConfig = {
|
|
|
width: 12,
|
|
|
height: 7
|
|
|
};
|
|
|
const getInitialUsageStat = (usedDaysAmount, beginDayTimestamp) => {
|
|
|
const initialUsageStat = [];
|
|
|
for (let i = 0; i <= usedDaysAmount; i++) {
|
|
|
initialUsageStat.push({
|
|
|
timestamp: parseInt(require$$0.moment(beginDayTimestamp).add(i, "days").format("x")),
|
|
|
count: 0
|
|
|
});
|
|
|
}
|
|
|
return initialUsageStat;
|
|
|
};
|
|
|
const UsageHeatMap = () => {
|
|
|
const todayTimeStamp = parseInt(require$$0.moment().endOf("day").format("x"));
|
|
|
const todayDay = new Date(todayTimeStamp).getDay() || 7;
|
|
|
const nullCell = new Array(7 - todayDay).fill(0);
|
|
|
const usedDaysAmount = (tableConfig.width - 1) * tableConfig.height + todayDay;
|
|
|
const beginDayTimestamp = parseInt(require$$0.moment().startOf("day").subtract(usedDaysAmount, "days").format("x"));
|
|
|
const startDate = require$$0.moment().startOf("day").subtract(usedDaysAmount, "days");
|
|
|
const {
|
|
|
memoState: {
|
|
|
memos
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [allStat, setAllStat] = dist(getInitialUsageStat(usedDaysAmount, beginDayTimestamp));
|
|
|
const [popupStat, setPopupStat] = dist(null);
|
|
|
const [currentStat, setCurrentStat] = dist(null);
|
|
|
const [fromTo, setFromTo, fromToRef] = dist("");
|
|
|
const containerElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const popupRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const newStat = getInitialUsageStat(usedDaysAmount, beginDayTimestamp);
|
|
|
for (const m2 of memos) {
|
|
|
const creationDate = require$$0.moment(m2.createdAt.replaceAll("/", "-")).startOf("day");
|
|
|
const index = creationDate.diff(startDate, "days");
|
|
|
if (index >= 0 && index < newStat.length) {
|
|
|
newStat[index].count += 1;
|
|
|
}
|
|
|
}
|
|
|
setAllStat([...newStat]);
|
|
|
}, [memos]);
|
|
|
const handleUsageStatItemMouseEnter = _react_17_0_2_react.exports.useCallback((event, item) => {
|
|
|
var _a, _b;
|
|
|
setPopupStat(item);
|
|
|
if (!popupRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const {
|
|
|
isMobileView
|
|
|
} = globalStateService.getState();
|
|
|
const targetEl = event.target;
|
|
|
const sidebarEl = document.querySelector(".memos-sidebar-wrapper");
|
|
|
popupRef.current.style.left = targetEl.offsetLeft - ((_b = (_a = containerElRef.current) == null ? void 0 : _a.offsetLeft) != null ? _b : 0) + "px";
|
|
|
let topValue = targetEl.offsetTop;
|
|
|
if (!isMobileView) {
|
|
|
topValue -= sidebarEl.scrollTop;
|
|
|
}
|
|
|
popupRef.current.style.top = topValue + "px";
|
|
|
}, []);
|
|
|
const handleUsageStatItemMouseLeave = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
setPopupStat(null);
|
|
|
}, []);
|
|
|
const handleUsageStatItemClick = _react_17_0_2_react.exports.useCallback((event, item) => {
|
|
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
|
|
|
if (((_a = locationService.getState().query.duration) == null ? void 0 : _a.from) === item.timestamp && require$$0.moment((_b = locationService.getState().query.duration) == null ? void 0 : _b.from).diff((_c = locationService.getState().query.duration) == null ? void 0 : _c.to, "day") == 0) {
|
|
|
locationService.setFromAndToQuery(0, 0);
|
|
|
setCurrentStat(null);
|
|
|
setFromTo(null);
|
|
|
} else if (((_d = locationService.getState().query.duration) == null ? void 0 : _d.from) !== item.timestamp && ((_e = locationService.getState().query.duration) == null ? void 0 : _e.from) > 0 && event.shiftKey) {
|
|
|
const timeStampDays = require$$0.moment(item.timestamp).endOf("day").diff((_f = locationService.getState().query.duration) == null ? void 0 : _f.to, "day");
|
|
|
if (timeStampDays > 0 && require$$0.moment((_g = locationService.getState().query.duration) == null ? void 0 : _g.from).diff((_h = locationService.getState().query.duration) == null ? void 0 : _h.to, "day") == 0) {
|
|
|
setFromTo("from");
|
|
|
} else if (timeStampDays < 0 && require$$0.moment((_i = locationService.getState().query.duration) == null ? void 0 : _i.from).diff((_j = locationService.getState().query.duration) == null ? void 0 : _j.to, "day") == 0) {
|
|
|
setFromTo("to");
|
|
|
}
|
|
|
if (require$$0.moment((_k = locationService.getState().query.duration) == null ? void 0 : _k.from).isBefore(item.timestamp)) {
|
|
|
if (fromToRef.current === "to") {
|
|
|
if (timeStampDays < 0) {
|
|
|
locationService.setFromAndToQuery(item.timestamp, (_l = locationService.getState().query.duration) == null ? void 0 : _l.to);
|
|
|
} else {
|
|
|
locationService.setFromAndToQuery(parseInt(require$$0.moment((_m = locationService.getState().query.duration) == null ? void 0 : _m.to).startOf("day").format("x")), parseInt(require$$0.moment(item.timestamp).endOf("day").format("x")));
|
|
|
setFromTo("from");
|
|
|
}
|
|
|
} else if (fromToRef.current === "from") {
|
|
|
if (timeStampDays < 0) {
|
|
|
locationService.setFromAndToQuery((_n = locationService.getState().query.duration) == null ? void 0 : _n.from, parseInt(require$$0.moment(item.timestamp).endOf("day").format("x")));
|
|
|
} else {
|
|
|
locationService.setFromAndToQuery((_o = locationService.getState().query.duration) == null ? void 0 : _o.from, parseInt(require$$0.moment(item.timestamp).endOf("day").format("x")));
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
if (fromToRef.current === "to") {
|
|
|
locationService.setFromAndToQuery(item.timestamp, (_p = locationService.getState().query.duration) == null ? void 0 : _p.to);
|
|
|
} else if (fromToRef.current === "from") {
|
|
|
locationService.setFromAndToQuery(item.timestamp, parseInt(require$$0.moment((_q = locationService.getState().query.duration) == null ? void 0 : _q.from).endOf("day").format("x")));
|
|
|
setFromTo("to");
|
|
|
}
|
|
|
}
|
|
|
} else if (((_r = locationService.getState().query.duration) == null ? void 0 : _r.from) === 0 && event.shiftKey) {
|
|
|
locationService.setFromAndToQuery(item.timestamp, parseInt(require$$0.moment().endOf("day").format("x")));
|
|
|
} else if (item.count > 0 && (event.ctrlKey || event.metaKey)) {
|
|
|
const {
|
|
|
app: app2,
|
|
|
dailyNotes
|
|
|
} = dailyNotesService.getState();
|
|
|
const file = getDailyNote_1(require$$0.moment(item.timestamp), dailyNotes);
|
|
|
if (!require$$0.Platform.isMobile) {
|
|
|
const leaf = app2.workspace.splitActiveLeaf();
|
|
|
leaf.openFile(file);
|
|
|
} else {
|
|
|
let leaf = app2.workspace.activeLeaf;
|
|
|
if (leaf === null) {
|
|
|
leaf = app2.workspace.getLeaf(true);
|
|
|
}
|
|
|
leaf.openFile(file);
|
|
|
}
|
|
|
} else if (item.count > 0 && !event.shiftKey && !event.ctrlKey && !event.metaKey) {
|
|
|
if (!["/", "/recycle"].includes(locationService.getState().pathname)) {
|
|
|
locationService.setPathname("/");
|
|
|
}
|
|
|
locationService.setFromAndToQuery(item.timestamp, utils$1.getTimeStampByDate(require$$0.moment(item.timestamp + DAILY_TIMESTAMP).subtract(1, "days").endOf("day").format("YYYY-MM-DD HH:mm:ss")));
|
|
|
setCurrentStat(item);
|
|
|
}
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "usage-heat-map-wrapper",
|
|
|
ref: containerElRef,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "day-tip-text-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: t("weekDaysShort")[0]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: t("weekDaysShort")[2]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: t("weekDaysShort")[4]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: t("weekDaysShort")[6]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
ref: popupRef,
|
|
|
className: "usage-detail-container pop-up " + (popupStat ? "" : "hidden"),
|
|
|
children: [popupStat == null ? void 0 : popupStat.count, " memos on", " ", /* @__PURE__ */ jsx("span", {
|
|
|
className: "date-text",
|
|
|
children: new Date(popupStat == null ? void 0 : popupStat.timestamp).toDateString()
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "usage-heat-map",
|
|
|
children: [allStat.map((v2, i) => {
|
|
|
const count = v2.count;
|
|
|
const colorLevel = count <= 0 ? "" : count <= 1 ? "stat-day-L1-bg" : count <= 2 ? "stat-day-L2-bg" : count <= 4 ? "stat-day-L3-bg" : "stat-day-L4-bg";
|
|
|
return /* @__PURE__ */ jsx("span", {
|
|
|
className: `stat-container ${colorLevel} ${currentStat === v2 ? "current" : ""} ${todayTimeStamp === v2.timestamp ? "today" : ""}`,
|
|
|
onMouseEnter: (e) => handleUsageStatItemMouseEnter(e, v2),
|
|
|
onMouseLeave: handleUsageStatItemMouseLeave,
|
|
|
onClick: (e) => handleUsageStatItemClick(e, v2)
|
|
|
}, i);
|
|
|
}), nullCell.map((v2, i) => /* @__PURE__ */ jsx("span", {
|
|
|
className: "stat-container null"
|
|
|
}, i))]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var siderbar = "";
|
|
|
const Sidebar = () => {
|
|
|
const {
|
|
|
locationState,
|
|
|
globalState: {
|
|
|
isMobileView,
|
|
|
showSiderbarInMobileView
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const wrapperElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const handleClickOutsideOfWrapper = _react_17_0_2_react.exports.useMemo(() => {
|
|
|
return (event) => {
|
|
|
var _a, _b, _c;
|
|
|
const siderbarShown = globalStateService.getState().showSiderbarInMobileView;
|
|
|
if (!siderbarShown) {
|
|
|
window.removeEventListener("click", handleClickOutsideOfWrapper, {
|
|
|
capture: true
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
if (!((_a = wrapperElRef.current) == null ? void 0 : _a.contains(event.target))) {
|
|
|
if ((_c = (_b = wrapperElRef.current) == null ? void 0 : _b.parentNode) == null ? void 0 : _c.contains(event.target)) {
|
|
|
if (siderbarShown) {
|
|
|
event.stopPropagation();
|
|
|
}
|
|
|
globalStateService.setShowSiderbarInMobileView(false);
|
|
|
window.removeEventListener("click", handleClickOutsideOfWrapper, {
|
|
|
capture: true
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
globalStateService.setShowSiderbarInMobileView(false);
|
|
|
}, [locationState]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (showSiderbarInMobileView) {
|
|
|
document.body.classList.add(SHOW_SIDERBAR_MOBILE_CLASSNAME);
|
|
|
} else {
|
|
|
document.body.classList.remove(SHOW_SIDERBAR_MOBILE_CLASSNAME);
|
|
|
}
|
|
|
}, [showSiderbarInMobileView]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (isMobileView && showSiderbarInMobileView) {
|
|
|
window.addEventListener("click", handleClickOutsideOfWrapper, {
|
|
|
capture: true
|
|
|
});
|
|
|
}
|
|
|
}, [isMobileView, showSiderbarInMobileView]);
|
|
|
return /* @__PURE__ */ jsxs("aside", {
|
|
|
className: "memos-sidebar-wrapper",
|
|
|
ref: wrapperElRef,
|
|
|
children: [/* @__PURE__ */ jsx(UserBanner, {}), /* @__PURE__ */ jsx(UsageHeatMap, {}), /* @__PURE__ */ jsx(QueryList, {}), /* @__PURE__ */ jsx(TagList, {})]
|
|
|
});
|
|
|
};
|
|
|
var home = "";
|
|
|
function Home() {
|
|
|
const {
|
|
|
locationState: {
|
|
|
pathname
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const loadingState = useLoading();
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
loadingState.setFinish();
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsx(Fragment, {
|
|
|
children: /* @__PURE__ */ jsxs("section", {
|
|
|
id: "page-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx(Sidebar, {}), /* @__PURE__ */ jsx("main", {
|
|
|
className: "content-wrapper",
|
|
|
children: homeRouterSwitch(pathname)
|
|
|
})]
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
var app = "";
|
|
|
(() => {
|
|
|
if (!String.prototype.replaceAll) {
|
|
|
String.prototype.replaceAll = function(str, newStr) {
|
|
|
if (Object.prototype.toString.call(str).toLowerCase() === "[object regexp]") {
|
|
|
return this.replace(str, newStr);
|
|
|
}
|
|
|
return this.replace(new RegExp(str, "g"), newStr);
|
|
|
};
|
|
|
}
|
|
|
})();
|
|
|
var global$1 = "";
|
|
|
function StrictApp() {
|
|
|
return /* @__PURE__ */ jsx(Provider, {
|
|
|
store: appStore,
|
|
|
context: appContext,
|
|
|
children: /* @__PURE__ */ jsx(App, {})
|
|
|
});
|
|
|
}
|
|
|
function App() {
|
|
|
_react_17_0_2_react.exports.useContext(appContext);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const handleWindowResize = () => {
|
|
|
globalStateService.setIsMobileView(document.body.clientWidth <= 875);
|
|
|
};
|
|
|
handleWindowResize();
|
|
|
window.addEventListener("resize", handleWindowResize);
|
|
|
return () => {
|
|
|
window.removeEventListener("resize", handleWindowResize);
|
|
|
};
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsx(Fragment, {
|
|
|
children: /* @__PURE__ */ jsx(Home, {})
|
|
|
});
|
|
|
}
|
|
|
class Memos extends require$$0.ItemView {
|
|
|
constructor(leaf, plugin) {
|
|
|
super(leaf);
|
|
|
__publicField(this, "plugin");
|
|
|
__publicField(this, "hoverPopover");
|
|
|
__publicField(this, "memosComponent");
|
|
|
this.plugin = plugin;
|
|
|
}
|
|
|
getDisplayText() {
|
|
|
return "Memos";
|
|
|
}
|
|
|
getIcon() {
|
|
|
return "Memos";
|
|
|
}
|
|
|
getViewType() {
|
|
|
return MEMOS_VIEW_TYPE;
|
|
|
}
|
|
|
onMemosSettingsUpdate() {
|
|
|
memoService.clearMemos();
|
|
|
memoService.fetchAllMemos();
|
|
|
}
|
|
|
async onFileDeleted(file) {
|
|
|
if (getDateFromFile_1(file, "day")) {
|
|
|
await dailyNotesService.getMyAllDailyNotes();
|
|
|
memoService.clearMemos();
|
|
|
memoService.fetchAllMemos();
|
|
|
}
|
|
|
}
|
|
|
async onFileModified(file) {
|
|
|
const date = getDateFromFile_1(file, "day");
|
|
|
if (date && this.memosComponent) {
|
|
|
memoService.fetchAllMemos();
|
|
|
}
|
|
|
}
|
|
|
onFileCreated(file) {
|
|
|
if (this.app.workspace.layoutReady && this.memosComponent) {
|
|
|
if (getDateFromFile_1(file, "day")) {
|
|
|
dailyNotesService.getMyAllDailyNotes();
|
|
|
memoService.fetchAllMemos();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async onOpen() {
|
|
|
this.onMemosSettingsUpdate = this.onMemosSettingsUpdate.bind(this);
|
|
|
this.onFileCreated = this.onFileCreated.bind(this);
|
|
|
this.onFileDeleted = this.onFileDeleted.bind(this);
|
|
|
this.onFileModified = this.onFileModified.bind(this);
|
|
|
this.registerEvent(this.plugin.app.workspace.on("layout-change", () => {
|
|
|
if (!this.memosComponent)
|
|
|
return;
|
|
|
const leaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (!(leaves.length > 0)) {
|
|
|
return;
|
|
|
}
|
|
|
const leaf = leaves[0];
|
|
|
const side = leaf.getRoot().side;
|
|
|
let sidebar;
|
|
|
let page;
|
|
|
if (leaf.view.containerEl.querySelector(".memos-sidebar-wrapper")) {
|
|
|
sidebar = leaf.view.containerEl.querySelector(".memos-sidebar-wrapper");
|
|
|
} else {
|
|
|
sidebar = leaf.view.containerEl.querySelector(".memos-sidebar-wrapper-display");
|
|
|
}
|
|
|
if (leaf.view.containerEl.querySelector(".content-wrapper")) {
|
|
|
page = leaf.view.containerEl.querySelector(".content-wrapper");
|
|
|
} else {
|
|
|
page = leaf.view.containerEl.querySelector(".content-wrapper-padding-fix");
|
|
|
}
|
|
|
if (side !== void 0 && (side === "left" || side === "right")) {
|
|
|
if (!(sidebar == null ? void 0 : sidebar.className.contains("memos-sidebar-wrapper-display")) && page !== void 0) {
|
|
|
sidebar.className = "memos-sidebar-wrapper-display";
|
|
|
page.className = "content-wrapper-padding-fix";
|
|
|
}
|
|
|
} else {
|
|
|
if ((sidebar == null ? void 0 : sidebar.classList.contains("memos-sidebar-wrapper-display")) && page !== void 0) {
|
|
|
sidebar.className = "memos-sidebar-wrapper";
|
|
|
page.className = "content-wrapper";
|
|
|
}
|
|
|
}
|
|
|
}));
|
|
|
this.registerEvent(this.app.workspace.on("obsidian-memos:settings-updated", this.onMemosSettingsUpdate));
|
|
|
this.registerEvent(this.app.vault.on("create", this.onFileCreated));
|
|
|
this.registerEvent(this.app.vault.on("delete", this.onFileDeleted));
|
|
|
this.registerEvent(this.app.vault.on("modify", this.onFileModified));
|
|
|
dailyNotesService.getApp(this.app);
|
|
|
InsertAfter = this.plugin.settings.InsertAfter;
|
|
|
UserName = this.plugin.settings.UserName;
|
|
|
ProcessEntriesBelow = this.plugin.settings.ProcessEntriesBelow;
|
|
|
SaveMemoButtonLabel = this.plugin.settings.SaveMemoButtonLabel;
|
|
|
DefaultPrefix = this.plugin.settings.DefaultPrefix;
|
|
|
InsertDateFormat = this.plugin.settings.InsertDateFormat;
|
|
|
DefaultEditorLocation = this.plugin.settings.DefaultEditorLocation;
|
|
|
UseButtonToShowEditor = this.plugin.settings.UseButtonToShowEditor;
|
|
|
FocusOnEditor = this.plugin.settings.FocusOnEditor;
|
|
|
OpenDailyMemosWithMemos = this.plugin.settings.OpenDailyMemosWithMemos;
|
|
|
HideDoneTasks = this.plugin.settings.HideDoneTasks;
|
|
|
ShareFooterStart = this.plugin.settings.ShareFooterStart;
|
|
|
ShareFooterEnd = this.plugin.settings.ShareFooterEnd;
|
|
|
this.plugin.settings.OpenMemosAutomatically;
|
|
|
ShowTime = this.plugin.settings.ShowTime;
|
|
|
ShowDate = this.plugin.settings.ShowDate;
|
|
|
AddBlankLineWhenDate = this.plugin.settings.AddBlankLineWhenDate;
|
|
|
AutoSaveWhenOnMobile = this.plugin.settings.AutoSaveWhenOnMobile;
|
|
|
this.plugin.settings.QueryFileName;
|
|
|
this.plugin.settings.DeleteFileName;
|
|
|
UseVaultTags = this.plugin.settings.UseVaultTags;
|
|
|
DefaultDarkBackgroundImage = this.plugin.settings.DefaultDarkBackgroundImage;
|
|
|
DefaultLightBackgroundImage = this.plugin.settings.DefaultLightBackgroundImage;
|
|
|
DefaultMemoComposition = this.plugin.settings.DefaultMemoComposition;
|
|
|
ShowTaskLabel = this.plugin.settings.ShowTaskLabel;
|
|
|
this.memosComponent = React$1.createElement(StrictApp);
|
|
|
ReactDOM$1.render(this.memosComponent, this.contentEl);
|
|
|
}
|
|
|
async onClose() {
|
|
|
}
|
|
|
}
|
|
|
let InsertAfter;
|
|
|
let UserName;
|
|
|
let ProcessEntriesBelow;
|
|
|
let SaveMemoButtonLabel;
|
|
|
let DefaultPrefix;
|
|
|
let InsertDateFormat;
|
|
|
let DefaultEditorLocation;
|
|
|
let UseButtonToShowEditor;
|
|
|
let FocusOnEditor;
|
|
|
let OpenDailyMemosWithMemos;
|
|
|
let HideDoneTasks;
|
|
|
let ShareFooterStart;
|
|
|
let ShareFooterEnd;
|
|
|
let ShowTime;
|
|
|
let ShowDate;
|
|
|
let AddBlankLineWhenDate;
|
|
|
let AutoSaveWhenOnMobile;
|
|
|
let UseVaultTags;
|
|
|
let DefaultDarkBackgroundImage;
|
|
|
let DefaultLightBackgroundImage;
|
|
|
let DefaultMemoComposition;
|
|
|
let ShowTaskLabel;
|
|
|
const icons = {
|
|
|
Memos: `<svg t="1641348507339" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2120" width="100" height="100"><path d="M126.692653 478.099639l-90.757281 0c-19.019408 0-34.437336 15.423923-34.437336 34.417356 0 18.992434 15.416929 34.477297 34.437336 34.477297l90.757281 0c19.013414 0 34.42335-15.484863 34.42335-34.477297C161.116003 493.523561 145.706067 478.099639 126.692653 478.099639zM244.662333 243.526943c13.742566-13.110184 14.310011-34.948836 1.185841-48.706388l-62.644762-65.668806c-13.128167-13.762547-34.974811-14.229091-48.717377-1.118906s-14.261059 34.911872-1.132893 48.674419l62.644762 65.668806C209.123074 256.13262 230.919767 256.637127 244.662333 243.526943zM543.066631 957.422083l-60.603757 0c-18.654764 0-33.794964 15.147193-33.794964 33.862898 0 18.661757 15.1402 32.71502 33.794964 32.71502l60.603757 0c18.654764 0 33.794964-14.053262 33.794964-32.71502C576.861595 972.568277 561.721395 957.422083 543.066631 957.422083zM988.076617 479.050709l-90.757281 0c-19.019408 0-34.437336 15.423923-34.437336 34.417356s15.416929 34.477297 34.437336 34.477297l90.757281 0c19.013414 0 34.42335-15.484863 34.42335-34.477297S1007.09003 479.050709 988.076617 479.050709zM512.268737 192.765564c-172.737143 0-312.75527 150.079292-312.75527 322.746503 0 125.630192 74.080583 233.957298 180.936128 283.703669l0 84.51838c0 16.762614 15.410935 31.35435 34.42335 31.35435 0.598415 0 1.193833-0.014985 1.785255-0.042958 0.618395 0.026974 1.239788 0.042958 1.867175 0.042958l187.479731 0c5.905227 0 11.455802-1.220807 16.288078-3.477601 12.231044-4.657447 20.795671-15.383962 20.795671-27.87575l0-84.052835c107.391021-49.534578 181.935151-158.147405 181.935151-284.168214C825.024007 342.843857 684.997888 192.765564 512.268737 192.765564zM574.863548 742.713968l0 80.17063c0 3.159911-0.221783 5.976158-0.642372 8.496694l0 19.092336-124.910895 0 0-17.71768c-0.423586-2.856208-0.642372-6.123015-0.642372-9.870351l0-80.443363c-99.204024-27.75387-171.970892-118.821847-171.970892-226.930167 0-130.094827 105.4689-245.507007 235.571719-245.507007s235.563727 115.41218 235.563727 245.507007C747.832465 623.984031 674.578074 715.293772 574.863548 742.713968zM895.407204 129.328576c-13.429872-13.429872-35.233558-13.439862-48.677416 0.004995l-64.174267 64.175266c-13.448853 13.448853-13.443858 35.257534-0.013986 48.687406 13.429872 13.429872 35.281511 13.477825 48.730364 0.028972l64.175266-64.175266C908.889025 164.605092 908.837076 142.758448 895.407204 129.328576zM511.796199 159.617967c18.992434 0 34.417356-15.410935 34.417356-34.42335l0-90.757281c0-19.019408-15.423923-34.437336-34.417356-34.437336-18.992434 0-34.477297 15.416929-34.477297 34.437336l0 90.757281C477.317903 144.208031 492.802766 159.617967 511.796199 159.617967z" fill="currentColor" p-id="2121"></path></svg>`
|
|
|
};
|
|
|
function addIcons() {
|
|
|
Object.keys(icons).forEach((key) => {
|
|
|
require$$0.addIcon(key, icons[key]);
|
|
|
});
|
|
|
}
|
|
|
const DEFAULT_SETTINGS = {
|
|
|
StartDate: "Sunday",
|
|
|
InsertAfter: "# Journal",
|
|
|
UserName: "MEMO \u{1F609}",
|
|
|
ProcessEntriesBelow: "",
|
|
|
Language: "en",
|
|
|
SaveMemoButtonLabel: "NOTEIT",
|
|
|
ShareFooterStart: "{MemosNum} Memos {UsedDay} Day",
|
|
|
ShareFooterEnd: "\u270D\uFE0F by {UserName}",
|
|
|
DefaultPrefix: "List",
|
|
|
InsertDateFormat: "Tasks",
|
|
|
DefaultEditorLocation: "Top",
|
|
|
UseButtonToShowEditor: false,
|
|
|
FocusOnEditor: true,
|
|
|
OpenDailyMemosWithMemos: true,
|
|
|
HideDoneTasks: false,
|
|
|
ShowTaskLabel: false,
|
|
|
OpenMemosAutomatically: false,
|
|
|
ShowTime: true,
|
|
|
ShowDate: true,
|
|
|
AddBlankLineWhenDate: false,
|
|
|
AutoSaveWhenOnMobile: false,
|
|
|
DeleteFileName: "delete",
|
|
|
QueryFileName: "query",
|
|
|
UseVaultTags: false,
|
|
|
DefaultLightBackgroundImage: "",
|
|
|
DefaultDarkBackgroundImage: "",
|
|
|
DefaultMemoComposition: "{TIME} {CONTENT}"
|
|
|
};
|
|
|
class MemosSettingTab extends require$$0.PluginSettingTab {
|
|
|
constructor(app2, plugin) {
|
|
|
super(app2, plugin);
|
|
|
__publicField(this, "plugin");
|
|
|
__publicField(this, "applyDebounceTimer", 0);
|
|
|
this.plugin = plugin;
|
|
|
}
|
|
|
applySettingsUpdate() {
|
|
|
clearTimeout(this.applyDebounceTimer);
|
|
|
const plugin = this.plugin;
|
|
|
this.applyDebounceTimer = window.setTimeout(() => {
|
|
|
plugin.saveSettings();
|
|
|
}, 100);
|
|
|
memoService.updateTagsState();
|
|
|
}
|
|
|
async changeFileName(originalFileName, fileName) {
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/" + originalFileName + ".md";
|
|
|
const newFilePath = filePath + "/" + fileName + ".md";
|
|
|
const getFile = this.app.vault.getAbstractFileByPath(absolutePath);
|
|
|
await this.app.fileManager.renameFile(getFile, newFilePath);
|
|
|
}
|
|
|
async hide() {
|
|
|
}
|
|
|
async display() {
|
|
|
await this.plugin.loadSettings();
|
|
|
const { containerEl } = this;
|
|
|
this.containerEl.empty();
|
|
|
this.containerEl.createEl("h1", { text: t("Basic Options") });
|
|
|
new require$$0.Setting(containerEl).setName(t("User name in Memos")).setDesc(t("Set your user name here. 'Memos \u{1F60F}' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.UserName).setValue(this.plugin.settings.UserName).onChange(async (value) => {
|
|
|
this.plugin.settings.UserName = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Insert after heading")).setDesc(t("You should set the same heading below if you want to insert and process memos below the same heading.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.InsertAfter).setValue(this.plugin.settings.InsertAfter).onChange(async (value) => {
|
|
|
this.plugin.settings.InsertAfter = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Process Memos below")).setDesc(t("Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ProcessEntriesBelow).setValue(this.plugin.settings.ProcessEntriesBelow).onChange(async (value) => {
|
|
|
this.plugin.settings.ProcessEntriesBelow = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Save Memo button label")).setDesc(t("The text shown on the save Memo button in the UI. 'NOTEIT' by default.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.SaveMemoButtonLabel).setValue(this.plugin.settings.SaveMemoButtonLabel).onChange(async (value) => {
|
|
|
this.plugin.settings.SaveMemoButtonLabel = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Focus on editor when open memos")).setDesc(t("Focus on editor when open memos. Focus by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.FocusOnEditor).onChange(async (value) => {
|
|
|
this.plugin.settings.FocusOnEditor = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Open daily memos with open memos")).setDesc(t("Open daily memos with open memos. Open by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.OpenDailyMemosWithMemos).onChange(async (value) => {
|
|
|
this.plugin.settings.OpenDailyMemosWithMemos = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Open Memos when obsidian opens")).setDesc(t("When enable this, Memos will open when Obsidian opens. False by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.OpenMemosAutomatically).onChange(async (value) => {
|
|
|
this.plugin.settings.OpenMemosAutomatically = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Hide done tasks in Memo list")).setDesc(t("Hide all done tasks in Memo list. Show done tasks by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.HideDoneTasks).onChange(async (value) => {
|
|
|
this.plugin.settings.HideDoneTasks = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Show Tasks Label")).setDesc(t("Show tasks label near the time text. False by default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowTaskLabel).onChange(async (value) => {
|
|
|
this.plugin.settings.ShowTaskLabel = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Use Tags In Vault")).setDesc(t("Use tags in vault rather than only in Memos. False by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.UseVaultTags).onChange(async (value) => {
|
|
|
this.plugin.settings.UseVaultTags = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
this.containerEl.createEl("h1", { text: t("Advanced Options") });
|
|
|
let dropdown;
|
|
|
new require$$0.Setting(containerEl).setName(t("Default prefix")).setDesc(t("Set the default prefix when create memo, 'List' by default.")).addDropdown(async (d) => {
|
|
|
dropdown = d;
|
|
|
dropdown.addOption("List", t("List"));
|
|
|
dropdown.addOption("Task", t("Task"));
|
|
|
dropdown.setValue(this.plugin.settings.DefaultPrefix).onChange(async (value) => {
|
|
|
this.plugin.settings.DefaultPrefix = value;
|
|
|
this.applySettingsUpdate();
|
|
|
});
|
|
|
});
|
|
|
new require$$0.Setting(containerEl).setName(t("Default insert date format")).setDesc(t("Set the default date format when insert date by @, 'Tasks' by default.")).addDropdown(async (d) => {
|
|
|
dropdown = d;
|
|
|
dropdown.addOption("Tasks", "Tasks");
|
|
|
dropdown.addOption("Dataview", "Dataview");
|
|
|
dropdown.setValue(this.plugin.settings.InsertDateFormat).onChange(async (value) => {
|
|
|
this.plugin.settings.InsertDateFormat = value;
|
|
|
this.applySettingsUpdate();
|
|
|
});
|
|
|
});
|
|
|
new require$$0.Setting(containerEl).setName(t("Show Time When Copy Results")).setDesc(t("Show time when you copy results, like 12:00. Copy time by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowTime).onChange(async (value) => {
|
|
|
this.plugin.settings.ShowTime = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Show Date When Copy Results")).setDesc(t("Show date when you copy results, like [[2022-01-01]]. Copy date by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowDate).onChange(async (value) => {
|
|
|
this.plugin.settings.ShowDate = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Add Blank Line Between Different Date")).setDesc(t("Add blank line when copy result with date. No blank line by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.AddBlankLineWhenDate).onChange(async (value) => {
|
|
|
this.plugin.settings.AddBlankLineWhenDate = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("File Name of Recycle Bin")).setDesc(t("Set the filename for recycle bin. 'delete' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DeleteFileName).setValue(this.plugin.settings.DeleteFileName).onChange(async (value) => {
|
|
|
await this.changeFileName(this.plugin.settings.DeleteFileName, value);
|
|
|
this.plugin.settings.DeleteFileName = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("File Name of Query File")).setDesc(t("Set the filename for query file. 'query' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.QueryFileName).setValue(this.plugin.settings.QueryFileName).onChange(async (value) => {
|
|
|
await this.changeFileName(this.plugin.settings.QueryFileName, value);
|
|
|
this.plugin.settings.QueryFileName = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
this.containerEl.createEl("h1", { text: t("Mobile Options") });
|
|
|
new require$$0.Setting(containerEl).setName(t("Default editor position on mobile")).setDesc(t("Set the default editor position on Mobile, 'Top' by default.")).addDropdown(async (d) => {
|
|
|
dropdown = d;
|
|
|
dropdown.addOption("Top", t("Top"));
|
|
|
dropdown.addOption("Bottom", t("Bottom"));
|
|
|
dropdown.setValue(this.plugin.settings.DefaultEditorLocation).onChange(async (value) => {
|
|
|
this.plugin.settings.DefaultEditorLocation = value;
|
|
|
this.applySettingsUpdate();
|
|
|
});
|
|
|
});
|
|
|
new require$$0.Setting(containerEl).setName(t("Use button to show editor on mobile")).setDesc(t("Set a float button to call editor on mobile. Only when editor located at the bottom works.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.UseButtonToShowEditor).onChange(async (value) => {
|
|
|
this.plugin.settings.UseButtonToShowEditor = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
this.containerEl.createEl("h1", { text: t("Share Options") });
|
|
|
new require$$0.Setting(containerEl).setName(t("Share Memos Image Footer Start")).setDesc(t("Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ShareFooterStart).setValue(this.plugin.settings.ShareFooterStart).onChange(async (value) => {
|
|
|
this.plugin.settings.ShareFooterStart = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Share Memos Image Footer End")).setDesc(t("Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ShareFooterEnd).setValue(this.plugin.settings.ShareFooterEnd).onChange(async (value) => {
|
|
|
this.plugin.settings.ShareFooterEnd = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Background Image in Light Theme")).setDesc(t('Set background image in light theme. Set something like "Daily/one.png"')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DefaultLightBackgroundImage).setValue(this.plugin.settings.DefaultLightBackgroundImage).onChange(async (value) => {
|
|
|
this.plugin.settings.DefaultLightBackgroundImage = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Background Image in Dark Theme")).setDesc(t('Set background image in dark theme. Set something like "Daily/one.png"')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DefaultDarkBackgroundImage).setValue(this.plugin.settings.DefaultDarkBackgroundImage).onChange(async (value) => {
|
|
|
this.plugin.settings.DefaultDarkBackgroundImage = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Save Shared Image To Folder For Mobile")).setDesc(t("Save image to folder for mobile. False by Default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.AutoSaveWhenOnMobile).onChange(async (value) => {
|
|
|
this.plugin.settings.AutoSaveWhenOnMobile = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
this.containerEl.createEl("h1", { text: t("Experimental Options") });
|
|
|
new require$$0.Setting(containerEl).setName(t("Default Memo Composition")).setDesc(t('Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DefaultMemoComposition).setValue(this.plugin.settings.DefaultMemoComposition).onChange(async (value) => {
|
|
|
this.plugin.settings.DefaultMemoComposition = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
this.containerEl.createEl("h1", { text: t("Say Thank You") });
|
|
|
new require$$0.Setting(containerEl).setName(t("Donate")).setDesc(t("If you like this plugin, consider donating to support continued development:")).addButton((bt) => {
|
|
|
bt.buttonEl.outerHTML = `<a href="https://www.buymeacoffee.com/boninall"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=boninall&button_colour=6495ED&font_colour=ffffff&font_family=Inter&outline_colour=000000&coffee_colour=FFDD00"></a>`;
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
class MemosPlugin extends require$$0.Plugin {
|
|
|
constructor() {
|
|
|
super(...arguments);
|
|
|
__publicField(this, "settings");
|
|
|
}
|
|
|
async onload() {
|
|
|
console.log("obsidian-memos loading...");
|
|
|
await this.loadSettings();
|
|
|
this.registerView(MEMOS_VIEW_TYPE, (leaf) => new Memos(leaf, this));
|
|
|
this.addSettingTab(new MemosSettingTab(this.app, this));
|
|
|
addIcons();
|
|
|
this.addRibbonIcon("Memos", t("ribbonIconTitle"), () => {
|
|
|
new require$$0.Notice("Open Memos Successfully");
|
|
|
this.openMemos();
|
|
|
});
|
|
|
if (appHasDailyNotesPluginLoaded_1()) {
|
|
|
new require$$0.Notice("Check if you opened Daily Notes Plugin");
|
|
|
}
|
|
|
this.addCommand({
|
|
|
id: "open-memos",
|
|
|
name: "Open Memos",
|
|
|
callback: () => this.openMemos(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "focus-on-memos-editor",
|
|
|
name: "Focus On Memos Editor",
|
|
|
callback: () => this.focusOnEditor(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "show-daily-memo",
|
|
|
name: "Show Daily Memo",
|
|
|
callback: () => this.openDailyMemo(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "note-it",
|
|
|
name: "Note It",
|
|
|
callback: () => this.noteIt(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "focus-on-search-bar",
|
|
|
name: "Search It",
|
|
|
callback: () => this.searchIt(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "change-status",
|
|
|
name: "Change Status Between Task Or List",
|
|
|
callback: () => this.changeStatus(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.app.workspace.onLayoutReady(this.onLayoutReady.bind(this));
|
|
|
console.log(t("welcome"));
|
|
|
}
|
|
|
async loadSettings() {
|
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
|
|
}
|
|
|
async saveSettings() {
|
|
|
await this.saveData(this.settings);
|
|
|
}
|
|
|
onunload() {
|
|
|
this.app.workspace.detachLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
new require$$0.Notice("Close Memos Successfully");
|
|
|
}
|
|
|
async onLayoutReady() {
|
|
|
const leaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
if (this.settings.FocusOnEditor) {
|
|
|
const leaf = leaves[0];
|
|
|
leaf.view.containerEl.querySelector("textarea").focus();
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
if (!this.settings.OpenMemosAutomatically) {
|
|
|
return;
|
|
|
}
|
|
|
this.openMemos();
|
|
|
}
|
|
|
async openDailyMemo() {
|
|
|
const workspaceLeaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (OpenDailyMemosWithMemos === true) {
|
|
|
if (workspaceLeaves !== void 0 && workspaceLeaves.length === 0) {
|
|
|
this.openMemos();
|
|
|
showDailyMemoDiaryDialog();
|
|
|
} else {
|
|
|
showDailyMemoDiaryDialog();
|
|
|
}
|
|
|
} else {
|
|
|
showDailyMemoDiaryDialog();
|
|
|
}
|
|
|
}
|
|
|
async openMemos() {
|
|
|
const workspace = this.app.workspace;
|
|
|
workspace.detachLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
const leaf = workspace.getLeaf(!require$$0.Platform.isMobile && workspace.activeLeaf && workspace.activeLeaf.view instanceof require$$0.FileView);
|
|
|
await leaf.setViewState({ type: MEMOS_VIEW_TYPE });
|
|
|
workspace.revealLeaf(leaf);
|
|
|
if (FocusOnEditor) {
|
|
|
if (leaf.view.containerEl.querySelector("textarea") !== void 0) {
|
|
|
leaf.view.containerEl.querySelector("textarea").focus();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
searchIt() {
|
|
|
const workspace = this.app.workspace;
|
|
|
const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
workspace.setActiveLeaf(leaf);
|
|
|
leaf.view.containerEl.querySelector(".search-bar-inputer .text-input").focus();
|
|
|
} else {
|
|
|
this.openMemos();
|
|
|
}
|
|
|
}
|
|
|
focusOnEditor() {
|
|
|
const workspace = this.app.workspace;
|
|
|
const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
workspace.setActiveLeaf(leaf);
|
|
|
leaf.view.containerEl.querySelector("textarea").focus();
|
|
|
} else {
|
|
|
this.openMemos();
|
|
|
}
|
|
|
}
|
|
|
noteIt() {
|
|
|
const workspace = this.app.workspace;
|
|
|
const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
workspace.setActiveLeaf(leaf);
|
|
|
leaf.view.containerEl.querySelector(".memo-editor .confirm-btn").click();
|
|
|
} else {
|
|
|
this.openMemos();
|
|
|
}
|
|
|
}
|
|
|
changeStatus() {
|
|
|
const workspace = this.app.workspace;
|
|
|
const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
workspace.setActiveLeaf(leaf);
|
|
|
leaf.view.containerEl.querySelector(".list-or-task").click();
|
|
|
} else {
|
|
|
this.openMemos();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
module.exports = MemosPlugin;
|
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsic3JjL2NvbnN0YW50cy50cyIsIm5vZGVfbW9kdWxlcy9fb2JqZWN0LWFzc2lnbkA0LjEuMUBvYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX3NjaGVkdWxlckAwLjIwLjJAc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMiLCJub2RlX21vZHVsZXMvX3NjaGVkdWxlckAwLjIwLjJAc2NoZWR1bGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kb21AMTcuMC4yQHJlYWN0LWRvbS9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kb21AMTcuMC4yQHJlYWN0LWRvbS9pbmRleC5qcyIsInNyYy9sYWJzL2NvbWJpbmVSZWR1Y2Vycy50cyIsInNyYy9sYWJzL2NyZWF0ZVN0b3JlLnRzIiwic3JjL3N0b3Jlcy9nbG9iYWxTdGF0ZVN0b3JlLnRzIiwic3JjL3N0b3Jlcy9sb2NhdGlvblN0b3JlLnRzIiwic3JjL2hlbHBlcnMvdXRpbHMudHMiLCJzcmMvc3RvcmVzL21lbW9TdG9yZS50cyIsInNyYy9zdG9yZXMvdXNlclN0b3JlLnRzIiwic3JjL3N0b3Jlcy9xdWVyeVN0b3JlLnRzIiwibm9kZV9tb2R1bGVzL19vYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2VAMC45LjRAb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlL2Rpc3QvbWFpbi5qcyIsInNyYy9zdG9yZXMvZGFpbHlOb3Rlc1N0b3JlLnRzIiwic3JjL3N0b3Jlcy9hcHBTdG9yZS50cyIsInNyYy9zdG9yZXMvYXBwQ29udGV4dC50cyIsInNyYy9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZS50cyIsInNyYy9oZWxwZXJzL3N0b3JhZ2UudHMiLCJzcmMvc2VydmljZXMvZ2xvYmFsU3RhdGVTZXJ2aWNlLnRzIiwic3JjL3NlcnZpY2VzL2xvY2F0aW9uU2VydmljZS50cyIsInNyYy9vYkNvbXBvbmVudHMvb2JVcGRhdGVNZW1vLnRzIiwic3JjL29iQ29tcG9uZW50cy9vYkdldFF1ZXJpZXMudHMiLCJzcmMvb2JDb21wb25lbnRzL29iQ3JlYXRlUXVlcnkudHMiLCJzcmMvb2JDb21wb25lbnRzL29iR2V0TWVtb3MudHMiLCJzcmMvb2JDb21wb25lbnRzL29iVXBkYXRlUXVlcnkudHMiLCJzcmMvb2JDb21wb25lbnRzL29iQ3JlYXRlTWVtby50cyIsInNyYy9vYkNvbXBvbmVudHMvb2JEZWxldGVNZW1vLnRzIiwic3JjL29iQ29tcG9uZW50cy9vYkhpZGVNZW1vLnRzIiwic3JjL29iQ29tcG9uZW50cy9vYkRlbGV0ZVF1ZXJ5LnRzIiwic3JjL29iQ29tcG9uZW50cy9vYlBpblF1ZXJ5LnRzIiwic3JjL2hlbHBlcnMvYXBpLnRzIiwic3JjL2hlbHBlcnMvY29uc3RzLnRzIiwic3JjL3NlcnZpY2VzL21lbW9TZXJ2aWNlLnRzIiwic3JjL3NlcnZpY2VzL3F1ZXJ5U2VydmljZS50cyIsInNyYy9zZXJ2aWNlcy9yZXNvdXJjZVNlcnZpY2UudHMiLCJub2RlX21vZHVsZXMvX3RpbnktdW5kb0AwLjAuOEB0aW55LXVuZG8vZGlzdC9UaW55VW5kby5qcyIsInNyYy9ob29rcy91c2VSZWZyZXNoLnRzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvanN4LXJ1bnRpbWUuanMiLCJyZWFjdC9qc3gtcnVudGltZSIsInNyYy9jb21wb25lbnRzL2NvbW1vbi9Pbmx5V2hlbi50c3giLCJub2RlX21vZHVsZXMvX3RleHRhcmVhLWNhcmV0QDMuMC4yQHRleHRhcmVhLWNhcmV0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19jdXN0b20tZXZlbnRAMS4wLjFAY3VzdG9tLWV2ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19Ad2Vic2NvcGVpb19yZWFjdC10ZXh0YXJlYS1hdXRvY29tcGxldGVANC45LjFAQHdlYnNjb3BlaW8vcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlL2Rpc3QvcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlLmVzLmpzIiwic3JjL29iQ29tcG9uZW50cy9vYlRhZ1N1Z2dlc3Rlci50cyIsInNyYy9vYkNvbXBvbmVudHMvb2JGaWxlU3VnZ2VzdGVyLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvYXIudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9jei50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2RhLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvZGUudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9lbi50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2VuLWdiLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvZXMudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9mci50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2hpLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvaWQudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9pdC50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2phLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUva28udHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9ubC50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL25vLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvcGwudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9wdC50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL3B0LWJyLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvcm8udHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9ydS50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL3RyLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvemgtY24udHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS96aC10dy50cyIsInNyYy90cmFuc2xhdGlvbnMvaGVscGVyLnRzIiwic3JjL2NvbXBvbmVudHMvRWRpdG9yL0VkaXRvci50c3giLCJub2RlX21vZHVsZXMvX3RzbGliQDIuMy4xQHRzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9fQHJlYWNoX3V0aWxzQDAuMTYuMEBAcmVhY2gvdXRpbHMvY2FuLXVzZS1kb20vZGlzdC9yZWFjaC11dGlscy1jYW4tdXNlLWRvbS5lc20uanMiLCJub2RlX21vZHVsZXMvX0ByZWFjaF91dGlsc0AwLjE2LjBAQHJlYWNoL3V0aWxzL3VzZS1pc29tb3JwaGljLWxheW91dC1lZmZlY3QvZGlzdC9yZWFjaC11dGlscy11c2UtaXNvbW9ycGhpYy1sYXlvdXQtZWZmZWN0LmVzbS5qcyIsIm5vZGVfbW9kdWxlcy9fQHJlYWNoX2F1dG8taWRAMC4xNi4wQEByZWFjaC9hdXRvLWlkL2Rpc3QvcmVhY2gtYXV0by1pZC5lc20uanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRGb3JtYXRMb25nRm4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRNYXRjaEZuL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL3RvRGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL3RvSW50ZWdlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2FkZERheXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vYWRkTW9udGhzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2FkZE1pbGxpc2Vjb25kcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9zdGFydE9mV2Vlay9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc3RhcnRPZkRheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vYWRkV2Vla3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vYWRkWWVhcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vaXNTYW1lRGF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzRGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9pc1ZhbGlkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2RpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vZW5kT2ZNb250aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9zdGFydE9mTW9udGgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc3RhcnRPZlllYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vZW5kT2ZXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdExvbmcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvbG9jYWxpemUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvbWF0Y2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL3N1Yk1pbGxpc2Vjb25kcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL2dldFVUQ0RheU9mWWVhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENJU09XZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDSVNPV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9zdGFydE9mVVRDSVNPV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9nZXRVVENJU09XZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9zdGFydE9mVVRDV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9nZXRVVENXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvYWRkTGVhZGluZ1plcm9zL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZm9ybWF0L2xpZ2h0Rm9ybWF0dGVycy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvcHJvdGVjdGVkVG9rZW5zL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2Zvcm1hdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9nZXREYXlzSW5Nb250aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9nZXRUaW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2dldFVuaXhUaW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2dldFdlZWtZZWFyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL3N0YXJ0T2ZXZWVrWWVhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9nZXRXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xhc3REYXlPZk1vbnRoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2dldFdlZWtzSW5Nb250aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9pc0FmdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzQmVmb3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzU2FtZU1vbnRoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzU2FtZVllYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc2V0TW9udGgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc2V0WWVhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9Nb250aHNEcm9wZG93bi9Nb250aHNEcm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9CdXR0b24vQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL05hdmlnYXRpb24vTmF2aWdhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9ZZWFyc0Ryb3Bkb3duL1llYXJzRHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2hvb2tzL3VzZUNvbnRyb2xsZWRWYWx1ZS91c2VDb250cm9sbGVkVmFsdWUuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL05hdmlnYXRpb24vdXRpbHMvZ2V0SW5pdGlhbE1vbnRoLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL3VzZU5hdmlnYXRpb25TdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTmF2aWdhdGlvbi91dGlscy9nZXREaXNwbGF5TW9udGhzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL3V0aWxzL2dldE5leHRNb250aC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTmF2aWdhdGlvbi91dGlscy9nZXRQcmV2aW91c01vbnRoLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL05hdmlnYXRpb25Db250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL3VzZU5hdmlnYXRpb24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvQ2FwdGlvbi9DYXB0aW9uLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0NhcHRpb25MYWJlbC9DYXB0aW9uTGFiZWwuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL3R5cGVzL0RheVBpY2tlck11bHRpcGxlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9TZWxlY3RNdWx0aXBsZS9TZWxlY3RNdWx0aXBsZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL1NlbGVjdE11bHRpcGxlL3VzZVNlbGVjdE11bHRpcGxlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC90eXBlcy9EYXlQaWNrZXJSYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvU2VsZWN0UmFuZ2UvdXRpbHMvYWRkVG9SYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvU2VsZWN0UmFuZ2UvU2VsZWN0UmFuZ2VDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9TZWxlY3RSYW5nZS91c2VTZWxlY3RSYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvdHlwZXMvRGF5UGlja2VyU2luZ2xlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9TZWxlY3RTaW5nbGUvU2VsZWN0U2luZ2xlQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvU2VsZWN0U2luZ2xlL3VzZVNlbGVjdFNpbmdsZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTW9kaWZpZXJzL3V0aWxzL3RvTWF0Y2hlckFycmF5LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9Nb2RpZmllcnMvdXRpbHMvZ2V0Q3VzdG9tTW9kaWZpZXJzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC90eXBlcy9Nb2RpZmllcnMuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL01vZGlmaWVycy91dGlscy9nZXRJbnRlcm5hbE1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTW9kaWZpZXJzL01vZGlmaWVyc0NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL01vZGlmaWVycy91c2VNb2RpZmllcnMuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL3R5cGVzL01hdGNoZXJzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9ob29rcy91c2VEYXlNb2RpZmllcnMvdXRpbHMvaXNEYXRlSW5SYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvaG9va3MvdXNlRGF5TW9kaWZpZXJzL3V0aWxzL2lzTWF0Y2guanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2hvb2tzL3VzZURheU1vZGlmaWVycy91dGlscy9nZXRNb2RpZmllclN0YXR1cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvaG9va3MvdXNlRGF5TW9kaWZpZXJzL3VzZURheU1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRm9jdXMvZ2V0SW5pdGlhbEZvY3VzVGFyZ2V0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9Gb2N1cy9Gb2N1c0NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0ZvY3VzL3VzZUZvY3VzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0RheS9ob29rcy91c2VEYXlGb2N1cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9EYXkvaG9va3MvdXNlRGF5LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0RheS9EYXkuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvRGF5Q29udGVudC9EYXlDb250ZW50LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0Ryb3Bkb3duL0Ryb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0Zvb3Rlci9Gb290ZXIuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvSGVhZC91dGlscy9nZXRXZWVrZGF5cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9IZWFkL0hlYWQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvSWNvbkRyb3Bkb3duL0ljb25Ecm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9JY29uTGVmdC9JY29uTGVmdC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9JY29uUmlnaHQvSWNvblJpZ2h0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1Jvdy9Sb3cuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvV2Vla051bWJlci9XZWVrTnVtYmVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvZGVmYXVsdENsYXNzTmFtZXMuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9mb3JtYXR0ZXJzL2Zvcm1hdENhcHRpb24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9mb3JtYXR0ZXJzL2Zvcm1hdERheS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2Zvcm1hdHRlcnMvZm9ybWF0TW9udGhDYXB0aW9uLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvZm9ybWF0dGVycy9mb3JtYXRXZWVrTnVtYmVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvZm9ybWF0dGVycy9mb3JtYXRXZWVrZGF5TmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2Zvcm1hdHRlcnMvZm9ybWF0WWVhckNhcHRpb24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9sYWJlbHMvbGFiZWxEYXkuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9sYWJlbHMvbGFiZWxNb250aERyb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvbGFiZWxzL2xhYmVsTmV4dC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2xhYmVscy9sYWJlbFByZXZpb3VzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvbGFiZWxzL2xhYmVsV2Vla2RheS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2xhYmVscy9sYWJlbFdlZWtOdW1iZXIuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9sYWJlbHMvbGFiZWxZZWFyRHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci91dGlscy9wYXJzZUZyb21Ub1Byb3BzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvRGF5UGlja2VyQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL3VzZURheVBpY2tlci5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9UYWJsZS91dGlscy9nZXRPdXRzaWRlRW5kRGF5cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9UYWJsZS91dGlscy9nZXRPdXRzaWRlU3RhcnREYXlzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1RhYmxlL3V0aWxzL2dldFdlZWtzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1RhYmxlL1RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL01vbnRoL01vbnRoLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1Jvb3QvUm9vdC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvUm9vdFByb3ZpZGVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9EYXlQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LXBvcHBlckAyLjIuNUByZWFjdC1wb3BwZXIvbGliL2VzbS91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9lbnVtcy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tYXRoLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNTY3JvbGxQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9oaWRlLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QWx0QXhpcy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9vcmRlck1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9jcmVhdGVQb3BwZXIuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1mYXN0LWNvbXBhcmVAMy4yLjBAcmVhY3QtZmFzdC1jb21wYXJlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1wb3BwZXJAMi4yLjVAcmVhY3QtcG9wcGVyL2xpYi9lc20vdXNlUG9wcGVyLmpzIiwibm9kZV9tb2R1bGVzL19wcm9wLXR5cGVzQDE1LjguMUBwcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIm5vZGVfbW9kdWxlcy9fcHJvcC10eXBlc0AxNS44LjFAcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCJub2RlX21vZHVsZXMvX3Byb3AtdHlwZXNAMTUuOC4xQHByb3AtdHlwZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX3RhYmJhYmxlQDUuMi4xQHRhYmJhYmxlL2Rpc3QvaW5kZXguZXNtLmpzIiwibm9kZV9tb2R1bGVzL19mb2N1cy10cmFwQDYuNy4yQGZvY3VzLXRyYXAvZGlzdC9mb2N1cy10cmFwLmVzbS5qcyIsIm5vZGVfbW9kdWxlcy9fZm9jdXMtdHJhcC1yZWFjdEA4LjkuMUBmb2N1cy10cmFwLXJlYWN0L2Rpc3QvZm9jdXMtdHJhcC1yZWFjdC5qcyIsInNyYy9ob29rcy91c2VUb2dnbGUudHMiLCJzcmMvY29tcG9uZW50cy9NZW1vRWRpdG9yLnRzeCIsInNyYy9oZWxwZXJzL2ZpbHRlci50cyIsInNyYy9jb21wb25lbnRzL1NlYXJjaEJhci50c3giLCJzcmMvY29tcG9uZW50cy9NZW1vc0hlYWRlci50c3giLCJzcmMvaGVscGVycy9tYXJrZWQudHMiLCJzcmMvbGFicy9Qcm92aWRlci50c3giLCJzcmMvY29tcG9uZW50cy9EaWFsb2cudHN4Iiwic3JjL2NvbXBvbmVudHMvUHJldmlld0ltYWdlRGlhbG9nLnRzeCIsInNyYy9jb21wb25lbnRzL0ltYWdlLnRzeCIsInNyYy9jb21wb25lbnRzL01lbW9DYXJkRGlhbG9nLnRzeCIsInNyYy9sYWJzL2h0bWwyaW1hZ2UvY29udmVydFJlc291cmNlVG9EYXRhVVJMLnRzIiwic3JjL2xhYnMvaHRtbDJpbWFnZS9nZXRDbG9uZVN0eWxlZEVsZW1lbnQudHMiLCJzcmMvbGFicy9odG1sMmltYWdlL2dldEZvbnRzU3R5bGVFbGVtZW50LnRzIiwic3JjL2xhYnMvaHRtbDJpbWFnZS9pbmRleC50cyIsInNyYy9jb21wb25lbnRzL1NoYXJlTWVtb0ltYWdlRGlhbG9nLnRzeCIsInNyYy9vYkNvbXBvbmVudHMvb2JTaG93TWVtby50cyIsInNyYy9jb21wb25lbnRzL01lbW8udHN4Iiwic3JjL2NvbXBvbmVudHMvTWVtb0xpc3QudHN4Iiwic3JjL29iQ29tcG9uZW50cy9vYkNvcHlNZW1vcy50cyIsInNyYy9jb21wb25lbnRzL01lbW9GaWx0ZXIudHN4Iiwic3JjL3BhZ2VzL01lbW9zLnRzeCIsInNyYy9ob29rcy91c2VMb2FkaW5nLnRzIiwic3JjL2NvbXBvbmVudHMvRGVsZXRlZE1lbW8udHN4Iiwic3JjL3BhZ2VzL01lbW9UcmFzaC50c3giLCJzcmMvY29tcG9uZW50cy9QcmVmZXJlbmNlc1NlY3Rpb24udHN4Iiwic3JjL3BhZ2VzL1NldHRpbmcudHN4Iiwic3JjL3JvdXRlcnMvaG9tZVJvdXRlci50c3giLCJzcmMvcm91dGVycy9pbmRleC50cyIsInNyYy9jb21wb25lbnRzL0Fib3V0U2l0ZURpYWxvZy50c3giLCJzcmMvY29tcG9uZW50cy9NZW51QnRuc1BvcHVwLnRzeCIsInNyYy9jb21wb25lbnRzL0RhaWx5TWVtby50c3giLCJzcmMvY29tcG9uZW50cy9jb21tb24vRGF0ZVBpY2tlci50c3giLCJzcmMvY29tcG9uZW50cy9EYWlseU1lbW9EaWFyeURpYWxvZy50c3giLCJzcmMvY29tcG9uZW50cy9Vc2VyQmFubmVyLnRzeCIsInNyYy9jb21wb25lbnRzL2NvbW1vbi9TZWxlY3Rvci50c3giLCJzcmMvY29tcG9uZW50cy9DcmVhdGVRdWVyeURpYWxvZy50c3giLCJzcmMvY29tcG9uZW50cy9RdWVyeUxpc3QudHN4Iiwic3JjL2NvbXBvbmVudHMvVGFnTGlzdC50c3giLCJub2RlX21vZHVsZXMvX3JlYWN0LXVzZXN0YXRlcmVmQDEuMC44QHJlYWN0LXVzZXN0YXRlcmVmL2Rpc3QvaW5kZXguanMiLCJzcmMvY29tcG9uZW50cy9Vc2FnZUhlYXRNYXAudHN4Iiwic3JjL2NvbXBvbmVudHMvU2lkZWJhci50c3giLCJzcmMvcGFnZXMvSG9tZS50c3giLCJzcmMvaGVscGVycy9wb2x5ZmlsbC50cyIsInNyYy9BcHAudHN4Iiwic3JjL21lbW9zLnRzIiwic3JjL29iQ29tcG9uZW50cy9jdXN0b21JY29ucy50cyIsInNyYy9zZXR0aW5nLnRzIiwic3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBNRU1PU19WSUVXX1RZUEUgPSAnbWVtb3Nfdmlldyc7XG5leHBvcnQgY29uc3QgVklFV19UWVBFID0gJ3JlYWN0LXZpZXcnO1xuIiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4ndXNlIHN0cmljdCc7dmFyIGw9cmVxdWlyZShcIm9iamVjdC1hc3NpZ25cIiksbj02MDEwMyxwPTYwMTA2O2V4cG9ydHMuRnJhZ21lbnQ9NjAxMDc7ZXhwb3J0cy5TdHJpY3RNb2RlPTYwMTA4O2V4cG9ydHMuUHJvZmlsZXI9NjAxMTQ7dmFyIHE9NjAxMDkscj02MDExMCx0PTYwMTEyO2V4cG9ydHMuU3VzcGVuc2U9NjAxMTM7dmFyIHU9NjAxMTUsdj02MDExNjtcbmlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3Ipe3ZhciB3PVN5bWJvbC5mb3I7bj13KFwicmVhY3QuZWxlbWVudFwiKTtwPXcoXCJyZWFjdC5wb3J0YWxcIik7ZXhwb3J0cy5GcmFnbWVudD13KFwicmVhY3QuZnJhZ21lbnRcIik7ZXhwb3J0cy5TdHJpY3RNb2RlPXcoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTtleHBvcnRzLlByb2ZpbGVyPXcoXCJyZWFjdC5wcm9maWxlclwiKTtxPXcoXCJyZWFjdC5wcm92aWRlclwiKTtyPXcoXCJyZWFjdC5jb250ZXh0XCIpO3Q9dyhcInJlYWN0LmZvcndhcmRfcmVmXCIpO2V4cG9ydHMuU3VzcGVuc2U9dyhcInJlYWN0LnN1c3BlbnNlXCIpO3U9dyhcInJlYWN0Lm1lbW9cIik7dj13KFwicmVhY3QubGF6eVwiKX12YXIgeD1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG5mdW5jdGlvbiB5KGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT14JiZhW3hdfHxhW1wiQEBpdGVyYXRvclwiXTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT9hOm51bGx9ZnVuY3Rpb24geihhKXtmb3IodmFyIGI9XCJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD1cIithLGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWIrPVwiJmFyZ3NbXT1cIitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2NdKTtyZXR1cm5cIk1pbmlmaWVkIFJlYWN0IGVycm9yICNcIithK1wiOyB2aXNpdCBcIitiK1wiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5cIn1cbnZhciBBPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxCPXt9O2Z1bmN0aW9uIEMoYSxiLGMpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9Qjt0aGlzLnVwZGF0ZXI9Y3x8QX1DLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O0MucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYil7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSYmbnVsbCE9YSl0aHJvdyBFcnJvcih6KDg1KSk7dGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLGEsYixcInNldFN0YXRlXCIpfTtDLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsYSxcImZvcmNlVXBkYXRlXCIpfTtcbmZ1bmN0aW9uIEQoKXt9RC5wcm90b3R5cGU9Qy5wcm90b3R5cGU7ZnVuY3Rpb24gRShhLGIsYyl7dGhpcy5wcm9wcz1hO3RoaXMuY29udGV4dD1iO3RoaXMucmVmcz1CO3RoaXMudXBkYXRlcj1jfHxBfXZhciBGPUUucHJvdG90eXBlPW5ldyBEO0YuY29uc3RydWN0b3I9RTtsKEYsQy5wcm90b3R5cGUpO0YuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIEc9e2N1cnJlbnQ6bnVsbH0sSD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEk9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIEooYSxiLGMpe3ZhciBlLGQ9e30saz1udWxsLGg9bnVsbDtpZihudWxsIT1iKWZvcihlIGluIHZvaWQgMCE9PWIucmVmJiYoaD1iLnJlZiksdm9pZCAwIT09Yi5rZXkmJihrPVwiXCIrYi5rZXkpLGIpSC5jYWxsKGIsZSkmJiFJLmhhc093blByb3BlcnR5KGUpJiYoZFtlXT1iW2VdKTt2YXIgZz1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWcpZC5jaGlsZHJlbj1jO2Vsc2UgaWYoMTxnKXtmb3IodmFyIGY9QXJyYXkoZyksbT0wO208ZzttKyspZlttXT1hcmd1bWVudHNbbSsyXTtkLmNoaWxkcmVuPWZ9aWYoYSYmYS5kZWZhdWx0UHJvcHMpZm9yKGUgaW4gZz1hLmRlZmF1bHRQcm9wcyxnKXZvaWQgMD09PWRbZV0mJihkW2VdPWdbZV0pO3JldHVybnskJHR5cGVvZjpuLHR5cGU6YSxrZXk6ayxyZWY6aCxwcm9wczpkLF9vd25lcjpHLmN1cnJlbnR9fVxuZnVuY3Rpb24gSyhhLGIpe3JldHVybnskJHR5cGVvZjpuLHR5cGU6YS50eXBlLGtleTpiLHJlZjphLnJlZixwcm9wczphLnByb3BzLF9vd25lcjphLl9vd25lcn19ZnVuY3Rpb24gTChhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09bn1mdW5jdGlvbiBlc2NhcGUoYSl7dmFyIGI9e1wiPVwiOlwiPTBcIixcIjpcIjpcIj0yXCJ9O3JldHVyblwiJFwiK2EucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfSl9dmFyIE09L1xcLysvZztmdW5jdGlvbiBOKGEsYil7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmbnVsbCE9YS5rZXk/ZXNjYXBlKFwiXCIrYS5rZXkpOmIudG9TdHJpbmcoMzYpfVxuZnVuY3Rpb24gTyhhLGIsYyxlLGQpe3ZhciBrPXR5cGVvZiBhO2lmKFwidW5kZWZpbmVkXCI9PT1rfHxcImJvb2xlYW5cIj09PWspYT1udWxsO3ZhciBoPSExO2lmKG51bGw9PT1hKWg9ITA7ZWxzZSBzd2l0Y2goayl7Y2FzZSBcInN0cmluZ1wiOmNhc2UgXCJudW1iZXJcIjpoPSEwO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjpzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSBuOmNhc2UgcDpoPSEwfX1pZihoKXJldHVybiBoPWEsZD1kKGgpLGE9XCJcIj09PWU/XCIuXCIrTihoLDApOmUsQXJyYXkuaXNBcnJheShkKT8oYz1cIlwiLG51bGwhPWEmJihjPWEucmVwbGFjZShNLFwiJCYvXCIpK1wiL1wiKSxPKGQsYixjLFwiXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGF9KSk6bnVsbCE9ZCYmKEwoZCkmJihkPUsoZCxjKyghZC5rZXl8fGgmJmgua2V5PT09ZC5rZXk/XCJcIjooXCJcIitkLmtleSkucmVwbGFjZShNLFwiJCYvXCIpK1wiL1wiKSthKSksYi5wdXNoKGQpKSwxO2g9MDtlPVwiXCI9PT1lP1wiLlwiOmUrXCI6XCI7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGc9XG4wO2c8YS5sZW5ndGg7ZysrKXtrPWFbZ107dmFyIGY9ZStOKGssZyk7aCs9TyhrLGIsYyxmLGQpfWVsc2UgaWYoZj15KGEpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmKWZvcihhPWYuY2FsbChhKSxnPTA7IShrPWEubmV4dCgpKS5kb25lOylrPWsudmFsdWUsZj1lK04oayxnKyspLGgrPU8oayxiLGMsZixkKTtlbHNlIGlmKFwib2JqZWN0XCI9PT1rKXRocm93IGI9XCJcIithLEVycm9yKHooMzEsXCJbb2JqZWN0IE9iamVjdF1cIj09PWI/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhhKS5qb2luKFwiLCBcIikrXCJ9XCI6YikpO3JldHVybiBofWZ1bmN0aW9uIFAoYSxiLGMpe2lmKG51bGw9PWEpcmV0dXJuIGE7dmFyIGU9W10sZD0wO08oYSxlLFwiXCIsXCJcIixmdW5jdGlvbihhKXtyZXR1cm4gYi5jYWxsKGMsYSxkKyspfSk7cmV0dXJuIGV9XG5mdW5jdGlvbiBRKGEpe2lmKC0xPT09YS5fc3RhdHVzKXt2YXIgYj1hLl9yZXN1bHQ7Yj1iKCk7YS5fc3RhdHVzPTA7YS5fcmVzdWx0PWI7Yi50aGVuKGZ1bmN0aW9uKGIpezA9PT1hLl9zdGF0dXMmJihiPWIuZGVmYXVsdCxhLl9zdGF0dXM9MSxhLl9yZXN1bHQ9Yil9LGZ1bmN0aW9uKGIpezA9PT1hLl9zdGF0dXMmJihhLl9zdGF0dXM9MixhLl9yZXN1bHQ9Yil9KX1pZigxPT09YS5fc3RhdHVzKXJldHVybiBhLl9yZXN1bHQ7dGhyb3cgYS5fcmVzdWx0O312YXIgUj17Y3VycmVudDpudWxsfTtmdW5jdGlvbiBTKCl7dmFyIGE9Ui5jdXJyZW50O2lmKG51bGw9PT1hKXRocm93IEVycm9yKHooMzIxKSk7cmV0dXJuIGF9dmFyIFQ9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6UixSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzp7dHJhbnNpdGlvbjowfSxSZWFjdEN1cnJlbnRPd25lcjpHLElzU29tZVJlbmRlcmVyQWN0aW5nOntjdXJyZW50OiExfSxhc3NpZ246bH07XG5leHBvcnRzLkNoaWxkcmVuPXttYXA6UCxmb3JFYWNoOmZ1bmN0aW9uKGEsYixjKXtQKGEsZnVuY3Rpb24oKXtiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYyl9LGNvdW50OmZ1bmN0aW9uKGEpe3ZhciBiPTA7UChhLGZ1bmN0aW9uKCl7YisrfSk7cmV0dXJuIGJ9LHRvQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIFAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYX0pfHxbXX0sb25seTpmdW5jdGlvbihhKXtpZighTChhKSl0aHJvdyBFcnJvcih6KDE0MykpO3JldHVybiBhfX07ZXhwb3J0cy5Db21wb25lbnQ9QztleHBvcnRzLlB1cmVDb21wb25lbnQ9RTtleHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPVQ7XG5leHBvcnRzLmNsb25lRWxlbWVudD1mdW5jdGlvbihhLGIsYyl7aWYobnVsbD09PWF8fHZvaWQgMD09PWEpdGhyb3cgRXJyb3IoeigyNjcsYSkpO3ZhciBlPWwoe30sYS5wcm9wcyksZD1hLmtleSxrPWEucmVmLGg9YS5fb3duZXI7aWYobnVsbCE9Yil7dm9pZCAwIT09Yi5yZWYmJihrPWIucmVmLGg9Ry5jdXJyZW50KTt2b2lkIDAhPT1iLmtleSYmKGQ9XCJcIitiLmtleSk7aWYoYS50eXBlJiZhLnR5cGUuZGVmYXVsdFByb3BzKXZhciBnPWEudHlwZS5kZWZhdWx0UHJvcHM7Zm9yKGYgaW4gYilILmNhbGwoYixmKSYmIUkuaGFzT3duUHJvcGVydHkoZikmJihlW2ZdPXZvaWQgMD09PWJbZl0mJnZvaWQgMCE9PWc/Z1tmXTpiW2ZdKX12YXIgZj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWYpZS5jaGlsZHJlbj1jO2Vsc2UgaWYoMTxmKXtnPUFycmF5KGYpO2Zvcih2YXIgbT0wO208ZjttKyspZ1ttXT1hcmd1bWVudHNbbSsyXTtlLmNoaWxkcmVuPWd9cmV0dXJueyQkdHlwZW9mOm4sdHlwZTphLnR5cGUsXG5rZXk6ZCxyZWY6ayxwcm9wczplLF9vd25lcjpofX07ZXhwb3J0cy5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9bnVsbCk7YT17JCR0eXBlb2Y6cixfY2FsY3VsYXRlQ2hhbmdlZEJpdHM6YixfY3VycmVudFZhbHVlOmEsX2N1cnJlbnRWYWx1ZTI6YSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGx9O2EuUHJvdmlkZXI9eyQkdHlwZW9mOnEsX2NvbnRleHQ6YX07cmV0dXJuIGEuQ29uc3VtZXI9YX07ZXhwb3J0cy5jcmVhdGVFbGVtZW50PUo7ZXhwb3J0cy5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGEpe3ZhciBiPUouYmluZChudWxsLGEpO2IudHlwZT1hO3JldHVybiBifTtleHBvcnRzLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fTtleHBvcnRzLmZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOnQscmVuZGVyOmF9fTtleHBvcnRzLmlzVmFsaWRFbGVtZW50PUw7XG5leHBvcnRzLmxhenk9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOnYsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDphfSxfaW5pdDpRfX07ZXhwb3J0cy5tZW1vPWZ1bmN0aW9uKGEsYil7cmV0dXJueyQkdHlwZW9mOnUsdHlwZTphLGNvbXBhcmU6dm9pZCAwPT09Yj9udWxsOmJ9fTtleHBvcnRzLnVzZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoKS51c2VDYWxsYmFjayhhLGIpfTtleHBvcnRzLnVzZUNvbnRleHQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUygpLnVzZUNvbnRleHQoYSxiKX07ZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVzZUVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBTKCkudXNlRWZmZWN0KGEsYil9O2V4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFMoKS51c2VJbXBlcmF0aXZlSGFuZGxlKGEsYixjKX07XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBTKCkudXNlTGF5b3V0RWZmZWN0KGEsYil9O2V4cG9ydHMudXNlTWVtbz1mdW5jdGlvbihhLGIpe3JldHVybiBTKCkudXNlTWVtbyhhLGIpfTtleHBvcnRzLnVzZVJlZHVjZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTKCkudXNlUmVkdWNlcihhLGIsYyl9O2V4cG9ydHMudXNlUmVmPWZ1bmN0aW9uKGEpe3JldHVybiBTKCkudXNlUmVmKGEpfTtleHBvcnRzLnVzZVN0YXRlPWZ1bmN0aW9uKGEpe3JldHVybiBTKCkudXNlU3RhdGUoYSl9O2V4cG9ydHMudmVyc2lvbj1cIjE3LjAuMlwiO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjAuMjAuMlxuICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0Jzt2YXIgZixnLGgsaztpZihcIm9iamVjdFwiPT09dHlwZW9mIHBlcmZvcm1hbmNlJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgcGVyZm9ybWFuY2Uubm93KXt2YXIgbD1wZXJmb3JtYW5jZTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBsLm5vdygpfX1lbHNle3ZhciBwPURhdGUscT1wLm5vdygpO2V4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHAubm93KCktcX19XG5pZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvd3x8XCJmdW5jdGlvblwiIT09dHlwZW9mIE1lc3NhZ2VDaGFubmVsKXt2YXIgdD1udWxsLHU9bnVsbCx3PWZ1bmN0aW9uKCl7aWYobnVsbCE9PXQpdHJ5e3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7dCghMCxhKTt0PW51bGx9Y2F0Y2goYil7dGhyb3cgc2V0VGltZW91dCh3LDApLGI7fX07Zj1mdW5jdGlvbihhKXtudWxsIT09dD9zZXRUaW1lb3V0KGYsMCxhKToodD1hLHNldFRpbWVvdXQodywwKSl9O2c9ZnVuY3Rpb24oYSxiKXt1PXNldFRpbWVvdXQoYSxiKX07aD1mdW5jdGlvbigpe2NsZWFyVGltZW91dCh1KX07ZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZD1mdW5jdGlvbigpe3JldHVybiExfTtrPWV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oKXt9fWVsc2V7dmFyIHg9d2luZG93LnNldFRpbWVvdXQseT13aW5kb3cuY2xlYXJUaW1lb3V0O2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgY29uc29sZSl7dmFyIHo9XG53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XCJmdW5jdGlvblwiIT09dHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJmNvbnNvbGUuZXJyb3IoXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHJlcXVlc3RBbmltYXRpb25GcmFtZS4gTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSBwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxsc1wiKTtcImZ1bmN0aW9uXCIhPT10eXBlb2YgeiYmY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgY2FuY2VsQW5pbWF0aW9uRnJhbWUuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgcG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHNcIil9dmFyIEE9ITEsQj1udWxsLEM9LTEsRD01LEU9MDtleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIGV4cG9ydHMudW5zdGFibGVfbm93KCk+PVxuRX07az1mdW5jdGlvbigpe307ZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZT1mdW5jdGlvbihhKXswPmF8fDEyNTxhP2NvbnNvbGUuZXJyb3IoXCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWRcIik6RD0wPGE/TWF0aC5mbG9vcigxRTMvYSk6NX07dmFyIEY9bmV3IE1lc3NhZ2VDaGFubmVsLEc9Ri5wb3J0MjtGLnBvcnQxLm9ubWVzc2FnZT1mdW5jdGlvbigpe2lmKG51bGwhPT1CKXt2YXIgYT1leHBvcnRzLnVuc3RhYmxlX25vdygpO0U9YStEO3RyeXtCKCEwLGEpP0cucG9zdE1lc3NhZ2UobnVsbCk6KEE9ITEsQj1udWxsKX1jYXRjaChiKXt0aHJvdyBHLnBvc3RNZXNzYWdlKG51bGwpLGI7fX1lbHNlIEE9ITF9O2Y9ZnVuY3Rpb24oYSl7Qj1hO0F8fChBPSEwLEcucG9zdE1lc3NhZ2UobnVsbCkpfTtnPWZ1bmN0aW9uKGEsYil7Qz1cbngoZnVuY3Rpb24oKXthKGV4cG9ydHMudW5zdGFibGVfbm93KCkpfSxiKX07aD1mdW5jdGlvbigpe3koQyk7Qz0tMX19ZnVuY3Rpb24gSChhLGIpe3ZhciBjPWEubGVuZ3RoO2EucHVzaChiKTthOmZvcig7Oyl7dmFyIGQ9Yy0xPj4+MSxlPWFbZF07aWYodm9pZCAwIT09ZSYmMDxJKGUsYikpYVtkXT1iLGFbY109ZSxjPWQ7ZWxzZSBicmVhayBhfX1mdW5jdGlvbiBKKGEpe2E9YVswXTtyZXR1cm4gdm9pZCAwPT09YT9udWxsOmF9XG5mdW5jdGlvbiBLKGEpe3ZhciBiPWFbMF07aWYodm9pZCAwIT09Yil7dmFyIGM9YS5wb3AoKTtpZihjIT09Yil7YVswXT1jO2E6Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7KXt2YXIgbT0yKihkKzEpLTEsbj1hW21dLHY9bSsxLHI9YVt2XTtpZih2b2lkIDAhPT1uJiYwPkkobixjKSl2b2lkIDAhPT1yJiYwPkkocixuKT8oYVtkXT1yLGFbdl09YyxkPXYpOihhW2RdPW4sYVttXT1jLGQ9bSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYwPkkocixjKSlhW2RdPXIsYVt2XT1jLGQ9djtlbHNlIGJyZWFrIGF9fXJldHVybiBifXJldHVybiBudWxsfWZ1bmN0aW9uIEkoYSxiKXt2YXIgYz1hLnNvcnRJbmRleC1iLnNvcnRJbmRleDtyZXR1cm4gMCE9PWM/YzphLmlkLWIuaWR9dmFyIEw9W10sTT1bXSxOPTEsTz1udWxsLFA9MyxRPSExLFI9ITEsUz0hMTtcbmZ1bmN0aW9uIFQoYSl7Zm9yKHZhciBiPUooTSk7bnVsbCE9PWI7KXtpZihudWxsPT09Yi5jYWxsYmFjaylLKE0pO2Vsc2UgaWYoYi5zdGFydFRpbWU8PWEpSyhNKSxiLnNvcnRJbmRleD1iLmV4cGlyYXRpb25UaW1lLEgoTCxiKTtlbHNlIGJyZWFrO2I9SihNKX19ZnVuY3Rpb24gVShhKXtTPSExO1QoYSk7aWYoIVIpaWYobnVsbCE9PUooTCkpUj0hMCxmKFYpO2Vsc2V7dmFyIGI9SihNKTtudWxsIT09YiYmZyhVLGIuc3RhcnRUaW1lLWEpfX1cbmZ1bmN0aW9uIFYoYSxiKXtSPSExO1MmJihTPSExLGgoKSk7UT0hMDt2YXIgYz1QO3RyeXtUKGIpO2ZvcihPPUooTCk7bnVsbCE9PU8mJighKE8uZXhwaXJhdGlvblRpbWU+Yil8fGEmJiFleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkKCkpOyl7dmFyIGQ9Ty5jYWxsYmFjaztpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZCl7Ty5jYWxsYmFjaz1udWxsO1A9Ty5wcmlvcml0eUxldmVsO3ZhciBlPWQoTy5leHBpcmF0aW9uVGltZTw9Yik7Yj1leHBvcnRzLnVuc3RhYmxlX25vdygpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBlP08uY2FsbGJhY2s9ZTpPPT09SihMKSYmSyhMKTtUKGIpfWVsc2UgSyhMKTtPPUooTCl9aWYobnVsbCE9PU8pdmFyIG09ITA7ZWxzZXt2YXIgbj1KKE0pO251bGwhPT1uJiZnKFUsbi5zdGFydFRpbWUtYik7bT0hMX1yZXR1cm4gbX1maW5hbGx5e089bnVsbCxQPWMsUT0hMX19dmFyIFc9aztleHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01O1xuZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eT0xO2V4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHk9NDtleHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5PTM7ZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmc9bnVsbDtleHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7ZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihhKXthLmNhbGxiYWNrPW51bGx9O2V4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb249ZnVuY3Rpb24oKXtSfHxRfHwoUj0hMCxmKFYpKX07ZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBQfTtleHBvcnRzLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIEooTCl9O1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKGEpe3N3aXRjaChQKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgYj0zO2JyZWFrO2RlZmF1bHQ6Yj1QfXZhciBjPVA7UD1iO3RyeXtyZXR1cm4gYSgpfWZpbmFsbHl7UD1jfX07ZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbj1mdW5jdGlvbigpe307ZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9VztleHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihhLGIpe3N3aXRjaChhKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6YT0zfXZhciBjPVA7UD1hO3RyeXtyZXR1cm4gYigpfWZpbmFsbHl7UD1jfX07XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yz8oYz1jLmRlbGF5LGM9XCJudW1iZXJcIj09PXR5cGVvZiBjJiYwPGM/ZCtjOmQpOmM9ZDtzd2l0Y2goYSl7Y2FzZSAxOnZhciBlPS0xO2JyZWFrO2Nhc2UgMjplPTI1MDticmVhaztjYXNlIDU6ZT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDplPTFFNDticmVhaztkZWZhdWx0OmU9NUUzfWU9YytlO2E9e2lkOk4rKyxjYWxsYmFjazpiLHByaW9yaXR5TGV2ZWw6YSxzdGFydFRpbWU6YyxleHBpcmF0aW9uVGltZTplLHNvcnRJbmRleDotMX07Yz5kPyhhLnNvcnRJbmRleD1jLEgoTSxhKSxudWxsPT09SihMKSYmYT09PUooTSkmJihTP2goKTpTPSEwLGcoVSxjLWQpKSk6KGEuc29ydEluZGV4PWUsSChMLGEpLFJ8fFF8fChSPSEwLGYoVikpKTtyZXR1cm4gYX07XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1QO3JldHVybiBmdW5jdGlvbigpe3ZhciBjPVA7UD1iO3RyeXtyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtQPWN9fX07XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNy4wLjJcbiAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4vKlxuIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuKi9cbid1c2Ugc3RyaWN0Jzt2YXIgYWE9cmVxdWlyZShcInJlYWN0XCIpLG09cmVxdWlyZShcIm9iamVjdC1hc3NpZ25cIikscj1yZXF1aXJlKFwic2NoZWR1bGVyXCIpO2Z1bmN0aW9uIHkoYSl7Zm9yKHZhciBiPVwiaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9XCIrYSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyliKz1cIiZhcmdzW109XCIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tjXSk7cmV0dXJuXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjXCIrYStcIjsgdmlzaXQgXCIrYitcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuXCJ9aWYoIWFhKXRocm93IEVycm9yKHkoMjI3KSk7dmFyIGJhPW5ldyBTZXQsY2E9e307ZnVuY3Rpb24gZGEoYSxiKXtlYShhLGIpO2VhKGErXCJDYXB0dXJlXCIsYil9XG5mdW5jdGlvbiBlYShhLGIpe2NhW2FdPWI7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliYS5hZGQoYlthXSl9XG52YXIgZmE9IShcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvd3x8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3cuZG9jdW1lbnR8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpLGhhPS9eWzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXVs6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXSokLyxpYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuamE9e30sa2E9e307ZnVuY3Rpb24gbGEoYSl7aWYoaWEuY2FsbChrYSxhKSlyZXR1cm4hMDtpZihpYS5jYWxsKGphLGEpKXJldHVybiExO2lmKGhhLnRlc3QoYSkpcmV0dXJuIGthW2FdPSEwO2phW2FdPSEwO3JldHVybiExfWZ1bmN0aW9uIG1hKGEsYixjLGQpe2lmKG51bGwhPT1jJiYwPT09Yy50eXBlKXJldHVybiExO3N3aXRjaCh0eXBlb2YgYil7Y2FzZSBcImZ1bmN0aW9uXCI6Y2FzZSBcInN5bWJvbFwiOnJldHVybiEwO2Nhc2UgXCJib29sZWFuXCI6aWYoZClyZXR1cm4hMTtpZihudWxsIT09YylyZXR1cm4hYy5hY2NlcHRzQm9vbGVhbnM7YT1hLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw1KTtyZXR1cm5cImRhdGEtXCIhPT1hJiZcImFyaWEtXCIhPT1hO2RlZmF1bHQ6cmV0dXJuITF9fVxuZnVuY3Rpb24gbmEoYSxiLGMsZCl7aWYobnVsbD09PWJ8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYnx8bWEoYSxiLGMsZCkpcmV0dXJuITA7aWYoZClyZXR1cm4hMTtpZihudWxsIT09Yylzd2l0Y2goYy50eXBlKXtjYXNlIDM6cmV0dXJuIWI7Y2FzZSA0OnJldHVybiExPT09YjtjYXNlIDU6cmV0dXJuIGlzTmFOKGIpO2Nhc2UgNjpyZXR1cm4gaXNOYU4oYil8fDE+Yn1yZXR1cm4hMX1mdW5jdGlvbiBCKGEsYixjLGQsZSxmLGcpe3RoaXMuYWNjZXB0c0Jvb2xlYW5zPTI9PT1ifHwzPT09Ynx8ND09PWI7dGhpcy5hdHRyaWJ1dGVOYW1lPWQ7dGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2U9ZTt0aGlzLm11c3RVc2VQcm9wZXJ0eT1jO3RoaXMucHJvcGVydHlOYW1lPWE7dGhpcy50eXBlPWI7dGhpcy5zYW5pdGl6ZVVSTD1mO3RoaXMucmVtb3ZlRW1wdHlTdHJpbmc9Z312YXIgRD17fTtcblwiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDAsITEsYSxudWxsLCExLCExKX0pO1tbXCJhY2NlcHRDaGFyc2V0XCIsXCJhY2NlcHQtY2hhcnNldFwiXSxbXCJjbGFzc05hbWVcIixcImNsYXNzXCJdLFtcImh0bWxGb3JcIixcImZvclwiXSxbXCJodHRwRXF1aXZcIixcImh0dHAtZXF1aXZcIl1dLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YVswXTtEW2JdPW5ldyBCKGIsMSwhMSxhWzFdLG51bGwsITEsITEpfSk7W1wiY29udGVudEVkaXRhYmxlXCIsXCJkcmFnZ2FibGVcIixcInNwZWxsQ2hlY2tcIixcInZhbHVlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDIsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7XG5bXCJhdXRvUmV2ZXJzZVwiLFwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFwiLFwiZm9jdXNhYmxlXCIsXCJwcmVzZXJ2ZUFscGhhXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDIsITEsYSxudWxsLCExLCExKX0pO1wiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwzLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiY2hlY2tlZFwiLFwibXVsdGlwbGVcIixcIm11dGVkXCIsXCJzZWxlY3RlZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwzLCEwLGEsbnVsbCwhMSwhMSl9KTtbXCJjYXB0dXJlXCIsXCJkb3dubG9hZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSw0LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJjb2xzXCIsXCJyb3dzXCIsXCJzaXplXCIsXCJzcGFuXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDYsITEsYSxudWxsLCExLCExKX0pO1tcInJvd1NwYW5cIixcInN0YXJ0XCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDUsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7dmFyIG9hPS9bXFwtOl0oW2Etel0pL2c7ZnVuY3Rpb24gcGEoYSl7cmV0dXJuIGFbMV0udG9VcHBlckNhc2UoKX1cblwiYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHRcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2Uob2EsXG5wYSk7RFtiXT1uZXcgQihiLDEsITEsYSxudWxsLCExLCExKX0pO1wieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKG9hLHBhKTtEW2JdPW5ldyBCKGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCExLCExKX0pO1tcInhtbDpiYXNlXCIsXCJ4bWw6bGFuZ1wiLFwieG1sOnNwYWNlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKG9hLHBhKTtEW2JdPW5ldyBCKGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsITEsITEpfSk7W1widGFiSW5kZXhcIixcImNyb3NzT3JpZ2luXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7XG5ELnhsaW5rSHJlZj1uZXcgQihcInhsaW5rSHJlZlwiLDEsITEsXCJ4bGluazpocmVmXCIsXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsITAsITEpO1tcInNyY1wiLFwiaHJlZlwiLFwiYWN0aW9uXCIsXCJmb3JtQWN0aW9uXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7XG5mdW5jdGlvbiBxYShhLGIsYyxkKXt2YXIgZT1ELmhhc093blByb3BlcnR5KGIpP0RbYl06bnVsbDt2YXIgZj1udWxsIT09ZT8wPT09ZS50eXBlOmQ/ITE6ISgyPGIubGVuZ3RoKXx8XCJvXCIhPT1iWzBdJiZcIk9cIiE9PWJbMF18fFwiblwiIT09YlsxXSYmXCJOXCIhPT1iWzFdPyExOiEwO2Z8fChuYShiLGMsZSxkKSYmKGM9bnVsbCksZHx8bnVsbD09PWU/bGEoYikmJihudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTphLnNldEF0dHJpYnV0ZShiLFwiXCIrYykpOmUubXVzdFVzZVByb3BlcnR5P2FbZS5wcm9wZXJ0eU5hbWVdPW51bGw9PT1jPzM9PT1lLnR5cGU/ITE6XCJcIjpjOihiPWUuYXR0cmlidXRlTmFtZSxkPWUuYXR0cmlidXRlTmFtZXNwYWNlLG51bGw9PT1jP2EucmVtb3ZlQXR0cmlidXRlKGIpOihlPWUudHlwZSxjPTM9PT1lfHw0PT09ZSYmITA9PT1jP1wiXCI6XCJcIitjLGQ/YS5zZXRBdHRyaWJ1dGVOUyhkLGIsYyk6YS5zZXRBdHRyaWJ1dGUoYixjKSkpKX1cbnZhciByYT1hYS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCxzYT02MDEwMyx0YT02MDEwNix1YT02MDEwNyx3YT02MDEwOCx4YT02MDExNCx5YT02MDEwOSx6YT02MDExMCxBYT02MDExMixCYT02MDExMyxDYT02MDEyMCxEYT02MDExNSxFYT02MDExNixGYT02MDEyMSxHYT02MDEyOCxIYT02MDEyOSxJYT02MDEzMCxKYT02MDEzMTtcbmlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3Ipe3ZhciBFPVN5bWJvbC5mb3I7c2E9RShcInJlYWN0LmVsZW1lbnRcIik7dGE9RShcInJlYWN0LnBvcnRhbFwiKTt1YT1FKFwicmVhY3QuZnJhZ21lbnRcIik7d2E9RShcInJlYWN0LnN0cmljdF9tb2RlXCIpO3hhPUUoXCJyZWFjdC5wcm9maWxlclwiKTt5YT1FKFwicmVhY3QucHJvdmlkZXJcIik7emE9RShcInJlYWN0LmNvbnRleHRcIik7QWE9RShcInJlYWN0LmZvcndhcmRfcmVmXCIpO0JhPUUoXCJyZWFjdC5zdXNwZW5zZVwiKTtDYT1FKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKTtEYT1FKFwicmVhY3QubWVtb1wiKTtFYT1FKFwicmVhY3QubGF6eVwiKTtGYT1FKFwicmVhY3QuYmxvY2tcIik7RShcInJlYWN0LnNjb3BlXCIpO0dhPUUoXCJyZWFjdC5vcGFxdWUuaWRcIik7SGE9RShcInJlYWN0LmRlYnVnX3RyYWNlX21vZGVcIik7SWE9RShcInJlYWN0Lm9mZnNjcmVlblwiKTtKYT1FKFwicmVhY3QubGVnYWN5X2hpZGRlblwiKX1cbnZhciBLYT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7ZnVuY3Rpb24gTGEoYSl7aWYobnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYSlyZXR1cm4gbnVsbDthPUthJiZhW0thXXx8YVtcIkBAaXRlcmF0b3JcIl07cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGE/YTpudWxsfXZhciBNYTtmdW5jdGlvbiBOYShhKXtpZih2b2lkIDA9PT1NYSl0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2goYyl7dmFyIGI9Yy5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtNYT1iJiZiWzFdfHxcIlwifXJldHVyblwiXFxuXCIrTWErYX12YXIgT2E9ITE7XG5mdW5jdGlvbiBQYShhLGIpe2lmKCFhfHxPYSlyZXR1cm5cIlwiO09hPSEwO3ZhciBjPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYoYilpZihiPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKTt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSxcInByb3BzXCIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCk7fX0pLFwib2JqZWN0XCI9PT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdChiLFtdKX1jYXRjaChrKXt2YXIgZD1rfVJlZmxlY3QuY29uc3RydWN0KGEsW10sYil9ZWxzZXt0cnl7Yi5jYWxsKCl9Y2F0Y2goayl7ZD1rfWEuY2FsbChiLnByb3RvdHlwZSl9ZWxzZXt0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2goayl7ZD1rfWEoKX19Y2F0Y2goayl7aWYoayYmZCYmXCJzdHJpbmdcIj09PXR5cGVvZiBrLnN0YWNrKXtmb3IodmFyIGU9ay5zdGFjay5zcGxpdChcIlxcblwiKSxcbmY9ZC5zdGFjay5zcGxpdChcIlxcblwiKSxnPWUubGVuZ3RoLTEsaD1mLmxlbmd0aC0xOzE8PWcmJjA8PWgmJmVbZ10hPT1mW2hdOyloLS07Zm9yKDsxPD1nJiYwPD1oO2ctLSxoLS0paWYoZVtnXSE9PWZbaF0pe2lmKDEhPT1nfHwxIT09aCl7ZG8gaWYoZy0tLGgtLSwwPmh8fGVbZ10hPT1mW2hdKXJldHVyblwiXFxuXCIrZVtnXS5yZXBsYWNlKFwiIGF0IG5ldyBcIixcIiBhdCBcIik7d2hpbGUoMTw9ZyYmMDw9aCl9YnJlYWt9fX1maW5hbGx5e09hPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPWN9cmV0dXJuKGE9YT9hLmRpc3BsYXlOYW1lfHxhLm5hbWU6XCJcIik/TmEoYSk6XCJcIn1cbmZ1bmN0aW9uIFFhKGEpe3N3aXRjaChhLnRhZyl7Y2FzZSA1OnJldHVybiBOYShhLnR5cGUpO2Nhc2UgMTY6cmV0dXJuIE5hKFwiTGF6eVwiKTtjYXNlIDEzOnJldHVybiBOYShcIlN1c3BlbnNlXCIpO2Nhc2UgMTk6cmV0dXJuIE5hKFwiU3VzcGVuc2VMaXN0XCIpO2Nhc2UgMDpjYXNlIDI6Y2FzZSAxNTpyZXR1cm4gYT1QYShhLnR5cGUsITEpLGE7Y2FzZSAxMTpyZXR1cm4gYT1QYShhLnR5cGUucmVuZGVyLCExKSxhO2Nhc2UgMjI6cmV0dXJuIGE9UGEoYS50eXBlLl9yZW5kZXIsITEpLGE7Y2FzZSAxOnJldHVybiBhPVBhKGEudHlwZSwhMCksYTtkZWZhdWx0OnJldHVyblwiXCJ9fVxuZnVuY3Rpb24gUmEoYSl7aWYobnVsbD09YSlyZXR1cm4gbnVsbDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gYS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtzd2l0Y2goYSl7Y2FzZSB1YTpyZXR1cm5cIkZyYWdtZW50XCI7Y2FzZSB0YTpyZXR1cm5cIlBvcnRhbFwiO2Nhc2UgeGE6cmV0dXJuXCJQcm9maWxlclwiO2Nhc2Ugd2E6cmV0dXJuXCJTdHJpY3RNb2RlXCI7Y2FzZSBCYTpyZXR1cm5cIlN1c3BlbnNlXCI7Y2FzZSBDYTpyZXR1cm5cIlN1c3BlbnNlTGlzdFwifWlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSlzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSB6YTpyZXR1cm4oYS5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLkNvbnN1bWVyXCI7Y2FzZSB5YTpyZXR1cm4oYS5fY29udGV4dC5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLlByb3ZpZGVyXCI7Y2FzZSBBYTp2YXIgYj1hLnJlbmRlcjtiPWIuZGlzcGxheU5hbWV8fGIubmFtZXx8XCJcIjtcbnJldHVybiBhLmRpc3BsYXlOYW1lfHwoXCJcIiE9PWI/XCJGb3J3YXJkUmVmKFwiK2IrXCIpXCI6XCJGb3J3YXJkUmVmXCIpO2Nhc2UgRGE6cmV0dXJuIFJhKGEudHlwZSk7Y2FzZSBGYTpyZXR1cm4gUmEoYS5fcmVuZGVyKTtjYXNlIEVhOmI9YS5fcGF5bG9hZDthPWEuX2luaXQ7dHJ5e3JldHVybiBSYShhKGIpKX1jYXRjaChjKXt9fXJldHVybiBudWxsfWZ1bmN0aW9uIFNhKGEpe3N3aXRjaCh0eXBlb2YgYSl7Y2FzZSBcImJvb2xlYW5cIjpjYXNlIFwibnVtYmVyXCI6Y2FzZSBcIm9iamVjdFwiOmNhc2UgXCJzdHJpbmdcIjpjYXNlIFwidW5kZWZpbmVkXCI6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1mdW5jdGlvbiBUYShhKXt2YXIgYj1hLnR5cGU7cmV0dXJuKGE9YS5ub2RlTmFtZSkmJlwiaW5wdXRcIj09PWEudG9Mb3dlckNhc2UoKSYmKFwiY2hlY2tib3hcIj09PWJ8fFwicmFkaW9cIj09PWIpfVxuZnVuY3Rpb24gVWEoYSl7dmFyIGI9VGEoYSk/XCJjaGVja2VkXCI6XCJ2YWx1ZVwiLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSxiKSxkPVwiXCIrYVtiXTtpZighYS5oYXNPd25Qcm9wZXJ0eShiKSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5nZXQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLnNldCl7dmFyIGU9Yy5nZXQsZj1jLnNldDtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGEpe2Q9XCJcIithO2YuY2FsbCh0aGlzLGEpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6Yy5lbnVtZXJhYmxlfSk7cmV0dXJue2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGR9LHNldFZhbHVlOmZ1bmN0aW9uKGEpe2Q9XCJcIithfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXthLl92YWx1ZVRyYWNrZXI9XG5udWxsO2RlbGV0ZSBhW2JdfX19fWZ1bmN0aW9uIFZhKGEpe2EuX3ZhbHVlVHJhY2tlcnx8KGEuX3ZhbHVlVHJhY2tlcj1VYShhKSl9ZnVuY3Rpb24gV2EoYSl7aWYoIWEpcmV0dXJuITE7dmFyIGI9YS5fdmFsdWVUcmFja2VyO2lmKCFiKXJldHVybiEwO3ZhciBjPWIuZ2V0VmFsdWUoKTt2YXIgZD1cIlwiO2EmJihkPVRhKGEpP2EuY2hlY2tlZD9cInRydWVcIjpcImZhbHNlXCI6YS52YWx1ZSk7YT1kO3JldHVybiBhIT09Yz8oYi5zZXRWYWx1ZShhKSwhMCk6ITF9ZnVuY3Rpb24gWGEoYSl7YT1hfHwoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudDp2b2lkIDApO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudHx8YS5ib2R5fWNhdGNoKGIpe3JldHVybiBhLmJvZHl9fVxuZnVuY3Rpb24gWWEoYSxiKXt2YXIgYz1iLmNoZWNrZWQ7cmV0dXJuIG0oe30sYix7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bnVsbCE9Yz9jOmEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZH0pfWZ1bmN0aW9uIFphKGEsYil7dmFyIGM9bnVsbD09Yi5kZWZhdWx0VmFsdWU/XCJcIjpiLmRlZmF1bHRWYWx1ZSxkPW51bGwhPWIuY2hlY2tlZD9iLmNoZWNrZWQ6Yi5kZWZhdWx0Q2hlY2tlZDtjPVNhKG51bGwhPWIudmFsdWU/Yi52YWx1ZTpjKTthLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOmQsaW5pdGlhbFZhbHVlOmMsY29udHJvbGxlZDpcImNoZWNrYm94XCI9PT1iLnR5cGV8fFwicmFkaW9cIj09PWIudHlwZT9udWxsIT1iLmNoZWNrZWQ6bnVsbCE9Yi52YWx1ZX19ZnVuY3Rpb24gJGEoYSxiKXtiPWIuY2hlY2tlZDtudWxsIT1iJiZxYShhLFwiY2hlY2tlZFwiLGIsITEpfVxuZnVuY3Rpb24gYWIoYSxiKXskYShhLGIpO3ZhciBjPVNhKGIudmFsdWUpLGQ9Yi50eXBlO2lmKG51bGwhPWMpaWYoXCJudW1iZXJcIj09PWQpe2lmKDA9PT1jJiZcIlwiPT09YS52YWx1ZXx8YS52YWx1ZSE9YylhLnZhbHVlPVwiXCIrY31lbHNlIGEudmFsdWUhPT1cIlwiK2MmJihhLnZhbHVlPVwiXCIrYyk7ZWxzZSBpZihcInN1Ym1pdFwiPT09ZHx8XCJyZXNldFwiPT09ZCl7YS5yZW1vdmVBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtyZXR1cm59Yi5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpP2JiKGEsYi50eXBlLGMpOmIuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikmJmJiKGEsYi50eXBlLFNhKGIuZGVmYXVsdFZhbHVlKSk7bnVsbD09Yi5jaGVja2VkJiZudWxsIT1iLmRlZmF1bHRDaGVja2VkJiYoYS5kZWZhdWx0Q2hlY2tlZD0hIWIuZGVmYXVsdENoZWNrZWQpfVxuZnVuY3Rpb24gY2IoYSxiLGMpe2lmKGIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKXx8Yi5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSl7dmFyIGQ9Yi50eXBlO2lmKCEoXCJzdWJtaXRcIiE9PWQmJlwicmVzZXRcIiE9PWR8fHZvaWQgMCE9PWIudmFsdWUmJm51bGwhPT1iLnZhbHVlKSlyZXR1cm47Yj1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU7Y3x8Yj09PWEudmFsdWV8fChhLnZhbHVlPWIpO2EuZGVmYXVsdFZhbHVlPWJ9Yz1hLm5hbWU7XCJcIiE9PWMmJihhLm5hbWU9XCJcIik7YS5kZWZhdWx0Q2hlY2tlZD0hIWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcIlwiIT09YyYmKGEubmFtZT1jKX1cbmZ1bmN0aW9uIGJiKGEsYixjKXtpZihcIm51bWJlclwiIT09Ynx8WGEoYS5vd25lckRvY3VtZW50KSE9PWEpbnVsbD09Yz9hLmRlZmF1bHRWYWx1ZT1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU6YS5kZWZhdWx0VmFsdWUhPT1cIlwiK2MmJihhLmRlZmF1bHRWYWx1ZT1cIlwiK2MpfWZ1bmN0aW9uIGRiKGEpe3ZhciBiPVwiXCI7YWEuQ2hpbGRyZW4uZm9yRWFjaChhLGZ1bmN0aW9uKGEpe251bGwhPWEmJihiKz1hKX0pO3JldHVybiBifWZ1bmN0aW9uIGViKGEsYil7YT1tKHtjaGlsZHJlbjp2b2lkIDB9LGIpO2lmKGI9ZGIoYi5jaGlsZHJlbikpYS5jaGlsZHJlbj1iO3JldHVybiBhfVxuZnVuY3Rpb24gZmIoYSxiLGMsZCl7YT1hLm9wdGlvbnM7aWYoYil7Yj17fTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyliW1wiJFwiK2NbZV1dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZT1iLmhhc093blByb3BlcnR5KFwiJFwiK2FbY10udmFsdWUpLGFbY10uc2VsZWN0ZWQhPT1lJiYoYVtjXS5zZWxlY3RlZD1lKSxlJiZkJiYoYVtjXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Yz1cIlwiK1NhKGMpO2I9bnVsbDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtpZihhW2VdLnZhbHVlPT09Yyl7YVtlXS5zZWxlY3RlZD0hMDtkJiYoYVtlXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn1udWxsIT09Ynx8YVtlXS5kaXNhYmxlZHx8KGI9YVtlXSl9bnVsbCE9PWImJihiLnNlbGVjdGVkPSEwKX19XG5mdW5jdGlvbiBnYihhLGIpe2lmKG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpdGhyb3cgRXJyb3IoeSg5MSkpO3JldHVybiBtKHt9LGIse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOlwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGhiKGEsYil7dmFyIGM9Yi52YWx1ZTtpZihudWxsPT1jKXtjPWIuY2hpbGRyZW47Yj1iLmRlZmF1bHRWYWx1ZTtpZihudWxsIT1jKXtpZihudWxsIT1iKXRocm93IEVycm9yKHkoOTIpKTtpZihBcnJheS5pc0FycmF5KGMpKXtpZighKDE+PWMubGVuZ3RoKSl0aHJvdyBFcnJvcih5KDkzKSk7Yz1jWzBdfWI9Y31udWxsPT1iJiYoYj1cIlwiKTtjPWJ9YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6U2EoYyl9fVxuZnVuY3Rpb24gaWIoYSxiKXt2YXIgYz1TYShiLnZhbHVlKSxkPVNhKGIuZGVmYXVsdFZhbHVlKTtudWxsIT1jJiYoYz1cIlwiK2MsYyE9PWEudmFsdWUmJihhLnZhbHVlPWMpLG51bGw9PWIuZGVmYXVsdFZhbHVlJiZhLmRlZmF1bHRWYWx1ZSE9PWMmJihhLmRlZmF1bHRWYWx1ZT1jKSk7bnVsbCE9ZCYmKGEuZGVmYXVsdFZhbHVlPVwiXCIrZCl9ZnVuY3Rpb24gamIoYSl7dmFyIGI9YS50ZXh0Q29udGVudDtiPT09YS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmXCJcIiE9PWImJm51bGwhPT1iJiYoYS52YWx1ZT1iKX12YXIga2I9e2h0bWw6XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsbWF0aG1sOlwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiLHN2ZzpcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJ9O1xuZnVuY3Rpb24gbGIoYSl7c3dpdGNoKGEpe2Nhc2UgXCJzdmdcIjpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7Y2FzZSBcIm1hdGhcIjpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIjtkZWZhdWx0OnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwifX1mdW5jdGlvbiBtYihhLGIpe3JldHVybiBudWxsPT1hfHxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj09PWE/bGIoYik6XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPT09YSYmXCJmb3JlaWduT2JqZWN0XCI9PT1iP1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiOmF9XG52YXIgbmIsb2I9ZnVuY3Rpb24oYSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBNU0FwcCYmTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24oYixjLGQsZSl7TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gYShiLGMsZCxlKX0pfTphfShmdW5jdGlvbihhLGIpe2lmKGEubmFtZXNwYWNlVVJJIT09a2Iuc3ZnfHxcImlubmVySFRNTFwiaW4gYSlhLmlubmVySFRNTD1iO2Vsc2V7bmI9bmJ8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7bmIuaW5uZXJIVE1MPVwiPHN2Zz5cIitiLnZhbHVlT2YoKS50b1N0cmluZygpK1wiPC9zdmc+XCI7Zm9yKGI9bmIuZmlyc3RDaGlsZDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IoO2IuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChiLmZpcnN0Q2hpbGQpfX0pO1xuZnVuY3Rpb24gcGIoYSxiKXtpZihiKXt2YXIgYz1hLmZpcnN0Q2hpbGQ7aWYoYyYmYz09PWEubGFzdENoaWxkJiYzPT09Yy5ub2RlVHlwZSl7Yy5ub2RlVmFsdWU9YjtyZXR1cm59fWEudGV4dENvbnRlbnQ9Yn1cbnZhciBxYj17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxjb2x1bW5zOiEwLGZsZXg6ITAsZmxleEdyb3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhPcmRlcjohMCxncmlkQXJlYTohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1NwYW46ITAsZ3JpZFJvd1N0YXJ0OiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3BhbjohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsXG5mbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxyYj1bXCJXZWJraXRcIixcIm1zXCIsXCJNb3pcIixcIk9cIl07T2JqZWN0LmtleXMocWIpLmZvckVhY2goZnVuY3Rpb24oYSl7cmIuZm9yRWFjaChmdW5jdGlvbihiKXtiPWIrYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnN1YnN0cmluZygxKTtxYltiXT1xYlthXX0pfSk7ZnVuY3Rpb24gc2IoYSxiLGMpe3JldHVybiBudWxsPT1ifHxcImJvb2xlYW5cIj09PXR5cGVvZiBifHxcIlwiPT09Yj9cIlwiOmN8fFwibnVtYmVyXCIhPT10eXBlb2YgYnx8MD09PWJ8fHFiLmhhc093blByb3BlcnR5KGEpJiZxYlthXT8oXCJcIitiKS50cmltKCk6YitcInB4XCJ9XG5mdW5jdGlvbiB0YihhLGIpe2E9YS5zdHlsZTtmb3IodmFyIGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD0wPT09Yy5pbmRleE9mKFwiLS1cIiksZT1zYihjLGJbY10sZCk7XCJmbG9hdFwiPT09YyYmKGM9XCJjc3NGbG9hdFwiKTtkP2Euc2V0UHJvcGVydHkoYyxlKTphW2NdPWV9fXZhciB1Yj1tKHttZW51aXRlbTohMH0se2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0pO1xuZnVuY3Rpb24gdmIoYSxiKXtpZihiKXtpZih1YlthXSYmKG51bGwhPWIuY2hpbGRyZW58fG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHkoMTM3LGEpKTtpZihudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKXtpZihudWxsIT1iLmNoaWxkcmVuKXRocm93IEVycm9yKHkoNjApKTtpZighKFwib2JqZWN0XCI9PT10eXBlb2YgYi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmXCJfX2h0bWxcImluIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHkoNjEpKTt9aWYobnVsbCE9Yi5zdHlsZSYmXCJvYmplY3RcIiE9PXR5cGVvZiBiLnN0eWxlKXRocm93IEVycm9yKHkoNjIpKTt9fVxuZnVuY3Rpb24gd2IoYSxiKXtpZigtMT09PWEuaW5kZXhPZihcIi1cIikpcmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBiLmlzO3N3aXRjaChhKXtjYXNlIFwiYW5ub3RhdGlvbi14bWxcIjpjYXNlIFwiY29sb3ItcHJvZmlsZVwiOmNhc2UgXCJmb250LWZhY2VcIjpjYXNlIFwiZm9udC1mYWNlLXNyY1wiOmNhc2UgXCJmb250LWZhY2UtdXJpXCI6Y2FzZSBcImZvbnQtZmFjZS1mb3JtYXRcIjpjYXNlIFwiZm9udC1mYWNlLW5hbWVcIjpjYXNlIFwibWlzc2luZy1nbHlwaFwiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fWZ1bmN0aW9uIHhiKGEpe2E9YS50YXJnZXR8fGEuc3JjRWxlbWVudHx8d2luZG93O2EuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJihhPWEuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpO3JldHVybiAzPT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YX12YXIgeWI9bnVsbCx6Yj1udWxsLEFiPW51bGw7XG5mdW5jdGlvbiBCYihhKXtpZihhPUNiKGEpKXtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgeWIpdGhyb3cgRXJyb3IoeSgyODApKTt2YXIgYj1hLnN0YXRlTm9kZTtiJiYoYj1EYihiKSx5YihhLnN0YXRlTm9kZSxhLnR5cGUsYikpfX1mdW5jdGlvbiBFYihhKXt6Yj9BYj9BYi5wdXNoKGEpOkFiPVthXTp6Yj1hfWZ1bmN0aW9uIEZiKCl7aWYoemIpe3ZhciBhPXpiLGI9QWI7QWI9emI9bnVsbDtCYihhKTtpZihiKWZvcihhPTA7YTxiLmxlbmd0aDthKyspQmIoYlthXSl9fWZ1bmN0aW9uIEdiKGEsYil7cmV0dXJuIGEoYil9ZnVuY3Rpb24gSGIoYSxiLGMsZCxlKXtyZXR1cm4gYShiLGMsZCxlKX1mdW5jdGlvbiBJYigpe312YXIgSmI9R2IsS2I9ITEsTGI9ITE7ZnVuY3Rpb24gTWIoKXtpZihudWxsIT09emJ8fG51bGwhPT1BYilJYigpLEZiKCl9XG5mdW5jdGlvbiBOYihhLGIsYyl7aWYoTGIpcmV0dXJuIGEoYixjKTtMYj0hMDt0cnl7cmV0dXJuIEpiKGEsYixjKX1maW5hbGx5e0xiPSExLE1iKCl9fVxuZnVuY3Rpb24gT2IoYSxiKXt2YXIgYz1hLnN0YXRlTm9kZTtpZihudWxsPT09YylyZXR1cm4gbnVsbDt2YXIgZD1EYihjKTtpZihudWxsPT09ZClyZXR1cm4gbnVsbDtjPWRbYl07YTpzd2l0Y2goYil7Y2FzZSBcIm9uQ2xpY2tcIjpjYXNlIFwib25DbGlja0NhcHR1cmVcIjpjYXNlIFwib25Eb3VibGVDbGlja1wiOmNhc2UgXCJvbkRvdWJsZUNsaWNrQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlRG93blwiOmNhc2UgXCJvbk1vdXNlRG93bkNhcHR1cmVcIjpjYXNlIFwib25Nb3VzZU1vdmVcIjpjYXNlIFwib25Nb3VzZU1vdmVDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VVcFwiOmNhc2UgXCJvbk1vdXNlVXBDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VFbnRlclwiOihkPSFkLmRpc2FibGVkKXx8KGE9YS50eXBlLGQ9IShcImJ1dHRvblwiPT09YXx8XCJpbnB1dFwiPT09YXx8XCJzZWxlY3RcIj09PWF8fFwidGV4dGFyZWFcIj09PWEpKTthPSFkO2JyZWFrIGE7ZGVmYXVsdDphPSExfWlmKGEpcmV0dXJuIG51bGw7aWYoYyYmXCJmdW5jdGlvblwiIT09XG50eXBlb2YgYyl0aHJvdyBFcnJvcih5KDIzMSxiLHR5cGVvZiBjKSk7cmV0dXJuIGN9dmFyIFBiPSExO2lmKGZhKXRyeXt2YXIgUWI9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFFiLFwicGFzc2l2ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtQYj0hMH19KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIixRYixRYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsUWIsUWIpfWNhdGNoKGEpe1BiPSExfWZ1bmN0aW9uIFJiKGEsYixjLGQsZSxmLGcsaCxrKXt2YXIgbD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMyk7dHJ5e2IuYXBwbHkoYyxsKX1jYXRjaChuKXt0aGlzLm9uRXJyb3Iobil9fXZhciBTYj0hMSxUYj1udWxsLFViPSExLFZiPW51bGwsV2I9e29uRXJyb3I6ZnVuY3Rpb24oYSl7U2I9ITA7VGI9YX19O2Z1bmN0aW9uIFhiKGEsYixjLGQsZSxmLGcsaCxrKXtTYj0hMTtUYj1udWxsO1JiLmFwcGx5KFdiLGFyZ3VtZW50cyl9XG5mdW5jdGlvbiBZYihhLGIsYyxkLGUsZixnLGgsayl7WGIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKFNiKXtpZihTYil7dmFyIGw9VGI7U2I9ITE7VGI9bnVsbH1lbHNlIHRocm93IEVycm9yKHkoMTk4KSk7VWJ8fChVYj0hMCxWYj1sKX19ZnVuY3Rpb24gWmIoYSl7dmFyIGI9YSxjPWE7aWYoYS5hbHRlcm5hdGUpZm9yKDtiLnJldHVybjspYj1iLnJldHVybjtlbHNle2E9YjtkbyBiPWEsMCE9PShiLmZsYWdzJjEwMjYpJiYoYz1iLnJldHVybiksYT1iLnJldHVybjt3aGlsZShhKX1yZXR1cm4gMz09PWIudGFnP2M6bnVsbH1mdW5jdGlvbiAkYihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1hLm1lbW9pemVkU3RhdGU7bnVsbD09PWImJihhPWEuYWx0ZXJuYXRlLG51bGwhPT1hJiYoYj1hLm1lbW9pemVkU3RhdGUpKTtpZihudWxsIT09YilyZXR1cm4gYi5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIGFjKGEpe2lmKFpiKGEpIT09YSl0aHJvdyBFcnJvcih5KDE4OCkpO31cbmZ1bmN0aW9uIGJjKGEpe3ZhciBiPWEuYWx0ZXJuYXRlO2lmKCFiKXtiPVpiKGEpO2lmKG51bGw9PT1iKXRocm93IEVycm9yKHkoMTg4KSk7cmV0dXJuIGIhPT1hP251bGw6YX1mb3IodmFyIGM9YSxkPWI7Oyl7dmFyIGU9Yy5yZXR1cm47aWYobnVsbD09PWUpYnJlYWs7dmFyIGY9ZS5hbHRlcm5hdGU7aWYobnVsbD09PWYpe2Q9ZS5yZXR1cm47aWYobnVsbCE9PWQpe2M9ZDtjb250aW51ZX1icmVha31pZihlLmNoaWxkPT09Zi5jaGlsZCl7Zm9yKGY9ZS5jaGlsZDtmOyl7aWYoZj09PWMpcmV0dXJuIGFjKGUpLGE7aWYoZj09PWQpcmV0dXJuIGFjKGUpLGI7Zj1mLnNpYmxpbmd9dGhyb3cgRXJyb3IoeSgxODgpKTt9aWYoYy5yZXR1cm4hPT1kLnJldHVybiljPWUsZD1mO2Vsc2V7Zm9yKHZhciBnPSExLGg9ZS5jaGlsZDtoOyl7aWYoaD09PWMpe2c9ITA7Yz1lO2Q9ZjticmVha31pZihoPT09ZCl7Zz0hMDtkPWU7Yz1mO2JyZWFrfWg9aC5zaWJsaW5nfWlmKCFnKXtmb3IoaD1mLmNoaWxkO2g7KXtpZihoPT09XG5jKXtnPSEwO2M9ZjtkPWU7YnJlYWt9aWYoaD09PWQpe2c9ITA7ZD1mO2M9ZTticmVha31oPWguc2libGluZ31pZighZyl0aHJvdyBFcnJvcih5KDE4OSkpO319aWYoYy5hbHRlcm5hdGUhPT1kKXRocm93IEVycm9yKHkoMTkwKSk7fWlmKDMhPT1jLnRhZyl0aHJvdyBFcnJvcih5KDE4OCkpO3JldHVybiBjLnN0YXRlTm9kZS5jdXJyZW50PT09Yz9hOmJ9ZnVuY3Rpb24gY2MoYSl7YT1iYyhhKTtpZighYSlyZXR1cm4gbnVsbDtmb3IodmFyIGI9YTs7KXtpZig1PT09Yi50YWd8fDY9PT1iLnRhZylyZXR1cm4gYjtpZihiLmNoaWxkKWIuY2hpbGQucmV0dXJuPWIsYj1iLmNoaWxkO2Vsc2V7aWYoYj09PWEpYnJlYWs7Zm9yKDshYi5zaWJsaW5nOyl7aWYoIWIucmV0dXJufHxiLnJldHVybj09PWEpcmV0dXJuIG51bGw7Yj1iLnJldHVybn1iLnNpYmxpbmcucmV0dXJuPWIucmV0dXJuO2I9Yi5zaWJsaW5nfX1yZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIGRjKGEsYil7Zm9yKHZhciBjPWEuYWx0ZXJuYXRlO251bGwhPT1iOyl7aWYoYj09PWF8fGI9PT1jKXJldHVybiEwO2I9Yi5yZXR1cm59cmV0dXJuITF9dmFyIGVjLGZjLGdjLGhjLGljPSExLGpjPVtdLGtjPW51bGwsbGM9bnVsbCxtYz1udWxsLG5jPW5ldyBNYXAsb2M9bmV3IE1hcCxwYz1bXSxxYz1cIm1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXRcIi5zcGxpdChcIiBcIik7XG5mdW5jdGlvbiByYyhhLGIsYyxkLGUpe3JldHVybntibG9ja2VkT246YSxkb21FdmVudE5hbWU6YixldmVudFN5c3RlbUZsYWdzOmN8MTYsbmF0aXZlRXZlbnQ6ZSx0YXJnZXRDb250YWluZXJzOltkXX19ZnVuY3Rpb24gc2MoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImZvY3VzaW5cIjpjYXNlIFwiZm9jdXNvdXRcIjprYz1udWxsO2JyZWFrO2Nhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6bGM9bnVsbDticmVhaztjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcIm1vdXNlb3V0XCI6bWM9bnVsbDticmVhaztjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcm91dFwiOm5jLmRlbGV0ZShiLnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOm9jLmRlbGV0ZShiLnBvaW50ZXJJZCl9fVxuZnVuY3Rpb24gdGMoYSxiLGMsZCxlLGYpe2lmKG51bGw9PT1hfHxhLm5hdGl2ZUV2ZW50IT09ZilyZXR1cm4gYT1yYyhiLGMsZCxlLGYpLG51bGwhPT1iJiYoYj1DYihiKSxudWxsIT09YiYmZmMoYikpLGE7YS5ldmVudFN5c3RlbUZsYWdzfD1kO2I9YS50YXJnZXRDb250YWluZXJzO251bGwhPT1lJiYtMT09PWIuaW5kZXhPZihlKSYmYi5wdXNoKGUpO3JldHVybiBhfVxuZnVuY3Rpb24gdWMoYSxiLGMsZCxlKXtzd2l0Y2goYil7Y2FzZSBcImZvY3VzaW5cIjpyZXR1cm4ga2M9dGMoa2MsYSxiLGMsZCxlKSwhMDtjYXNlIFwiZHJhZ2VudGVyXCI6cmV0dXJuIGxjPXRjKGxjLGEsYixjLGQsZSksITA7Y2FzZSBcIm1vdXNlb3ZlclwiOnJldHVybiBtYz10YyhtYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJwb2ludGVyb3ZlclwiOnZhciBmPWUucG9pbnRlcklkO25jLnNldChmLHRjKG5jLmdldChmKXx8bnVsbCxhLGIsYyxkLGUpKTtyZXR1cm4hMDtjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpyZXR1cm4gZj1lLnBvaW50ZXJJZCxvYy5zZXQoZix0YyhvYy5nZXQoZil8fG51bGwsYSxiLGMsZCxlKSksITB9cmV0dXJuITF9XG5mdW5jdGlvbiB2YyhhKXt2YXIgYj13YyhhLnRhcmdldCk7aWYobnVsbCE9PWIpe3ZhciBjPVpiKGIpO2lmKG51bGwhPT1jKWlmKGI9Yy50YWcsMTM9PT1iKXtpZihiPSRiKGMpLG51bGwhPT1iKXthLmJsb2NrZWRPbj1iO2hjKGEubGFuZVByaW9yaXR5LGZ1bmN0aW9uKCl7ci51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkoYS5wcmlvcml0eSxmdW5jdGlvbigpe2djKGMpfSl9KTtyZXR1cm59fWVsc2UgaWYoMz09PWImJmMuc3RhdGVOb2RlLmh5ZHJhdGUpe2EuYmxvY2tlZE9uPTM9PT1jLnRhZz9jLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX1hLmJsb2NrZWRPbj1udWxsfVxuZnVuY3Rpb24geGMoYSl7aWYobnVsbCE9PWEuYmxvY2tlZE9uKXJldHVybiExO2Zvcih2YXIgYj1hLnRhcmdldENvbnRhaW5lcnM7MDxiLmxlbmd0aDspe3ZhciBjPXljKGEuZG9tRXZlbnROYW1lLGEuZXZlbnRTeXN0ZW1GbGFncyxiWzBdLGEubmF0aXZlRXZlbnQpO2lmKG51bGwhPT1jKXJldHVybiBiPUNiKGMpLG51bGwhPT1iJiZmYyhiKSxhLmJsb2NrZWRPbj1jLCExO2Iuc2hpZnQoKX1yZXR1cm4hMH1mdW5jdGlvbiB6YyhhLGIsYyl7eGMoYSkmJmMuZGVsZXRlKGIpfVxuZnVuY3Rpb24gQWMoKXtmb3IoaWM9ITE7MDxqYy5sZW5ndGg7KXt2YXIgYT1qY1swXTtpZihudWxsIT09YS5ibG9ja2VkT24pe2E9Q2IoYS5ibG9ja2VkT24pO251bGwhPT1hJiZlYyhhKTticmVha31mb3IodmFyIGI9YS50YXJnZXRDb250YWluZXJzOzA8Yi5sZW5ndGg7KXt2YXIgYz15YyhhLmRvbUV2ZW50TmFtZSxhLmV2ZW50U3lzdGVtRmxhZ3MsYlswXSxhLm5hdGl2ZUV2ZW50KTtpZihudWxsIT09Yyl7YS5ibG9ja2VkT249YzticmVha31iLnNoaWZ0KCl9bnVsbD09PWEuYmxvY2tlZE9uJiZqYy5zaGlmdCgpfW51bGwhPT1rYyYmeGMoa2MpJiYoa2M9bnVsbCk7bnVsbCE9PWxjJiZ4YyhsYykmJihsYz1udWxsKTtudWxsIT09bWMmJnhjKG1jKSYmKG1jPW51bGwpO25jLmZvckVhY2goemMpO29jLmZvckVhY2goemMpfVxuZnVuY3Rpb24gQmMoYSxiKXthLmJsb2NrZWRPbj09PWImJihhLmJsb2NrZWRPbj1udWxsLGljfHwoaWM9ITAsci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKHIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksQWMpKSl9XG5mdW5jdGlvbiBDYyhhKXtmdW5jdGlvbiBiKGIpe3JldHVybiBCYyhiLGEpfWlmKDA8amMubGVuZ3RoKXtCYyhqY1swXSxhKTtmb3IodmFyIGM9MTtjPGpjLmxlbmd0aDtjKyspe3ZhciBkPWpjW2NdO2QuYmxvY2tlZE9uPT09YSYmKGQuYmxvY2tlZE9uPW51bGwpfX1udWxsIT09a2MmJkJjKGtjLGEpO251bGwhPT1sYyYmQmMobGMsYSk7bnVsbCE9PW1jJiZCYyhtYyxhKTtuYy5mb3JFYWNoKGIpO29jLmZvckVhY2goYik7Zm9yKGM9MDtjPHBjLmxlbmd0aDtjKyspZD1wY1tjXSxkLmJsb2NrZWRPbj09PWEmJihkLmJsb2NrZWRPbj1udWxsKTtmb3IoOzA8cGMubGVuZ3RoJiYoYz1wY1swXSxudWxsPT09Yy5ibG9ja2VkT24pOyl2YyhjKSxudWxsPT09Yy5ibG9ja2VkT24mJnBjLnNoaWZ0KCl9XG5mdW5jdGlvbiBEYyhhLGIpe3ZhciBjPXt9O2NbYS50b0xvd2VyQ2FzZSgpXT1iLnRvTG93ZXJDYXNlKCk7Y1tcIldlYmtpdFwiK2FdPVwid2Via2l0XCIrYjtjW1wiTW96XCIrYV09XCJtb3pcIitiO3JldHVybiBjfXZhciBFYz17YW5pbWF0aW9uZW5kOkRjKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25FbmRcIiksYW5pbWF0aW9uaXRlcmF0aW9uOkRjKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25JdGVyYXRpb25cIiksYW5pbWF0aW9uc3RhcnQ6RGMoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvblN0YXJ0XCIpLHRyYW5zaXRpb25lbmQ6RGMoXCJUcmFuc2l0aW9uXCIsXCJUcmFuc2l0aW9uRW5kXCIpfSxGYz17fSxHYz17fTtcbmZhJiYoR2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKS5zdHlsZSxcIkFuaW1hdGlvbkV2ZW50XCJpbiB3aW5kb3d8fChkZWxldGUgRWMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgRWMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgRWMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSxcIlRyYW5zaXRpb25FdmVudFwiaW4gd2luZG93fHxkZWxldGUgRWMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtmdW5jdGlvbiBIYyhhKXtpZihGY1thXSlyZXR1cm4gRmNbYV07aWYoIUVjW2FdKXJldHVybiBhO3ZhciBiPUVjW2FdLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpJiZjIGluIEdjKXJldHVybiBGY1thXT1iW2NdO3JldHVybiBhfVxudmFyIEljPUhjKFwiYW5pbWF0aW9uZW5kXCIpLEpjPUhjKFwiYW5pbWF0aW9uaXRlcmF0aW9uXCIpLEtjPUhjKFwiYW5pbWF0aW9uc3RhcnRcIiksTGM9SGMoXCJ0cmFuc2l0aW9uZW5kXCIpLE1jPW5ldyBNYXAsTmM9bmV3IE1hcCxPYz1bXCJhYm9ydFwiLFwiYWJvcnRcIixJYyxcImFuaW1hdGlvbkVuZFwiLEpjLFwiYW5pbWF0aW9uSXRlcmF0aW9uXCIsS2MsXCJhbmltYXRpb25TdGFydFwiLFwiY2FucGxheVwiLFwiY2FuUGxheVwiLFwiY2FucGxheXRocm91Z2hcIixcImNhblBsYXlUaHJvdWdoXCIsXCJkdXJhdGlvbmNoYW5nZVwiLFwiZHVyYXRpb25DaGFuZ2VcIixcImVtcHRpZWRcIixcImVtcHRpZWRcIixcImVuY3J5cHRlZFwiLFwiZW5jcnlwdGVkXCIsXCJlbmRlZFwiLFwiZW5kZWRcIixcImVycm9yXCIsXCJlcnJvclwiLFwiZ290cG9pbnRlcmNhcHR1cmVcIixcImdvdFBvaW50ZXJDYXB0dXJlXCIsXCJsb2FkXCIsXCJsb2FkXCIsXCJsb2FkZWRkYXRhXCIsXCJsb2FkZWREYXRhXCIsXCJsb2FkZWRtZXRhZGF0YVwiLFwibG9hZGVkTWV0YWRhdGFcIixcImxvYWRzdGFydFwiLFwibG9hZFN0YXJ0XCIsXG5cImxvc3Rwb2ludGVyY2FwdHVyZVwiLFwibG9zdFBvaW50ZXJDYXB0dXJlXCIsXCJwbGF5aW5nXCIsXCJwbGF5aW5nXCIsXCJwcm9ncmVzc1wiLFwicHJvZ3Jlc3NcIixcInNlZWtpbmdcIixcInNlZWtpbmdcIixcInN0YWxsZWRcIixcInN0YWxsZWRcIixcInN1c3BlbmRcIixcInN1c3BlbmRcIixcInRpbWV1cGRhdGVcIixcInRpbWVVcGRhdGVcIixMYyxcInRyYW5zaXRpb25FbmRcIixcIndhaXRpbmdcIixcIndhaXRpbmdcIl07ZnVuY3Rpb24gUGMoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrPTIpe3ZhciBkPWFbY10sZT1hW2MrMV07ZT1cIm9uXCIrKGVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpKTtOYy5zZXQoZCxiKTtNYy5zZXQoZCxlKTtkYShlLFtkXSl9fXZhciBRYz1yLnVuc3RhYmxlX25vdztRYygpO3ZhciBGPTg7XG5mdW5jdGlvbiBSYyhhKXtpZigwIT09KDEmYSkpcmV0dXJuIEY9MTUsMTtpZigwIT09KDImYSkpcmV0dXJuIEY9MTQsMjtpZigwIT09KDQmYSkpcmV0dXJuIEY9MTMsNDt2YXIgYj0yNCZhO2lmKDAhPT1iKXJldHVybiBGPTEyLGI7aWYoMCE9PShhJjMyKSlyZXR1cm4gRj0xMSwzMjtiPTE5MiZhO2lmKDAhPT1iKXJldHVybiBGPTEwLGI7aWYoMCE9PShhJjI1NikpcmV0dXJuIEY9OSwyNTY7Yj0zNTg0JmE7aWYoMCE9PWIpcmV0dXJuIEY9OCxiO2lmKDAhPT0oYSY0MDk2KSlyZXR1cm4gRj03LDQwOTY7Yj00MTg2MTEyJmE7aWYoMCE9PWIpcmV0dXJuIEY9NixiO2I9NjI5MTQ1NjAmYTtpZigwIT09YilyZXR1cm4gRj01LGI7aWYoYSY2NzEwODg2NClyZXR1cm4gRj00LDY3MTA4ODY0O2lmKDAhPT0oYSYxMzQyMTc3MjgpKXJldHVybiBGPTMsMTM0MjE3NzI4O2I9ODA1MzA2MzY4JmE7aWYoMCE9PWIpcmV0dXJuIEY9MixiO2lmKDAhPT0oMTA3Mzc0MTgyNCZhKSlyZXR1cm4gRj0xLDEwNzM3NDE4MjQ7XG5GPTg7cmV0dXJuIGF9ZnVuY3Rpb24gU2MoYSl7c3dpdGNoKGEpe2Nhc2UgOTk6cmV0dXJuIDE1O2Nhc2UgOTg6cmV0dXJuIDEwO2Nhc2UgOTc6Y2FzZSA5NjpyZXR1cm4gODtjYXNlIDk1OnJldHVybiAyO2RlZmF1bHQ6cmV0dXJuIDB9fWZ1bmN0aW9uIFRjKGEpe3N3aXRjaChhKXtjYXNlIDE1OmNhc2UgMTQ6cmV0dXJuIDk5O2Nhc2UgMTM6Y2FzZSAxMjpjYXNlIDExOmNhc2UgMTA6cmV0dXJuIDk4O2Nhc2UgOTpjYXNlIDg6Y2FzZSA3OmNhc2UgNjpjYXNlIDQ6Y2FzZSA1OnJldHVybiA5NztjYXNlIDM6Y2FzZSAyOmNhc2UgMTpyZXR1cm4gOTU7Y2FzZSAwOnJldHVybiA5MDtkZWZhdWx0OnRocm93IEVycm9yKHkoMzU4LGEpKTt9fVxuZnVuY3Rpb24gVWMoYSxiKXt2YXIgYz1hLnBlbmRpbmdMYW5lcztpZigwPT09YylyZXR1cm4gRj0wO3ZhciBkPTAsZT0wLGY9YS5leHBpcmVkTGFuZXMsZz1hLnN1c3BlbmRlZExhbmVzLGg9YS5waW5nZWRMYW5lcztpZigwIT09ZilkPWYsZT1GPTE1O2Vsc2UgaWYoZj1jJjEzNDIxNzcyNywwIT09Zil7dmFyIGs9ZiZ+ZzswIT09az8oZD1SYyhrKSxlPUYpOihoJj1mLDAhPT1oJiYoZD1SYyhoKSxlPUYpKX1lbHNlIGY9YyZ+ZywwIT09Zj8oZD1SYyhmKSxlPUYpOjAhPT1oJiYoZD1SYyhoKSxlPUYpO2lmKDA9PT1kKXJldHVybiAwO2Q9MzEtVmMoZCk7ZD1jJigoMD5kPzA6MTw8ZCk8PDEpLTE7aWYoMCE9PWImJmIhPT1kJiYwPT09KGImZykpe1JjKGIpO2lmKGU8PUYpcmV0dXJuIGI7Rj1lfWI9YS5lbnRhbmdsZWRMYW5lcztpZigwIT09Yilmb3IoYT1hLmVudGFuZ2xlbWVudHMsYiY9ZDswPGI7KWM9MzEtVmMoYiksZT0xPDxjLGR8PWFbY10sYiY9fmU7cmV0dXJuIGR9XG5mdW5jdGlvbiBXYyhhKXthPWEucGVuZGluZ0xhbmVzJi0xMDczNzQxODI1O3JldHVybiAwIT09YT9hOmEmMTA3Mzc0MTgyND8xMDczNzQxODI0OjB9ZnVuY3Rpb24gWGMoYSxiKXtzd2l0Y2goYSl7Y2FzZSAxNTpyZXR1cm4gMTtjYXNlIDE0OnJldHVybiAyO2Nhc2UgMTI6cmV0dXJuIGE9WWMoMjQmfmIpLDA9PT1hP1hjKDEwLGIpOmE7Y2FzZSAxMDpyZXR1cm4gYT1ZYygxOTImfmIpLDA9PT1hP1hjKDgsYik6YTtjYXNlIDg6cmV0dXJuIGE9WWMoMzU4NCZ+YiksMD09PWEmJihhPVljKDQxODYxMTImfmIpLDA9PT1hJiYoYT01MTIpKSxhO2Nhc2UgMjpyZXR1cm4gYj1ZYyg4MDUzMDYzNjgmfmIpLDA9PT1iJiYoYj0yNjg0MzU0NTYpLGJ9dGhyb3cgRXJyb3IoeSgzNTgsYSkpO31mdW5jdGlvbiBZYyhhKXtyZXR1cm4gYSYtYX1mdW5jdGlvbiBaYyhhKXtmb3IodmFyIGI9W10sYz0wOzMxPmM7YysrKWIucHVzaChhKTtyZXR1cm4gYn1cbmZ1bmN0aW9uICRjKGEsYixjKXthLnBlbmRpbmdMYW5lc3w9Yjt2YXIgZD1iLTE7YS5zdXNwZW5kZWRMYW5lcyY9ZDthLnBpbmdlZExhbmVzJj1kO2E9YS5ldmVudFRpbWVzO2I9MzEtVmMoYik7YVtiXT1jfXZhciBWYz1NYXRoLmNsejMyP01hdGguY2x6MzI6YWQsYmQ9TWF0aC5sb2csY2Q9TWF0aC5MTjI7ZnVuY3Rpb24gYWQoYSl7cmV0dXJuIDA9PT1hPzMyOjMxLShiZChhKS9jZHwwKXwwfXZhciBkZD1yLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LGVkPXIudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5LGZkPSEwO2Z1bmN0aW9uIGdkKGEsYixjLGQpe0tifHxJYigpO3ZhciBlPWhkLGY9S2I7S2I9ITA7dHJ5e0hiKGUsYSxiLGMsZCl9ZmluYWxseXsoS2I9Zil8fE1iKCl9fWZ1bmN0aW9uIGlkKGEsYixjLGQpe2VkKGRkLGhkLmJpbmQobnVsbCxhLGIsYyxkKSl9XG5mdW5jdGlvbiBoZChhLGIsYyxkKXtpZihmZCl7dmFyIGU7aWYoKGU9MD09PShiJjQpKSYmMDxqYy5sZW5ndGgmJi0xPHFjLmluZGV4T2YoYSkpYT1yYyhudWxsLGEsYixjLGQpLGpjLnB1c2goYSk7ZWxzZXt2YXIgZj15YyhhLGIsYyxkKTtpZihudWxsPT09ZillJiZzYyhhLGQpO2Vsc2V7aWYoZSl7aWYoLTE8cWMuaW5kZXhPZihhKSl7YT1yYyhmLGEsYixjLGQpO2pjLnB1c2goYSk7cmV0dXJufWlmKHVjKGYsYSxiLGMsZCkpcmV0dXJuO3NjKGEsZCl9amQoYSxiLGQsbnVsbCxjKX19fX1cbmZ1bmN0aW9uIHljKGEsYixjLGQpe3ZhciBlPXhiKGQpO2U9d2MoZSk7aWYobnVsbCE9PWUpe3ZhciBmPVpiKGUpO2lmKG51bGw9PT1mKWU9bnVsbDtlbHNle3ZhciBnPWYudGFnO2lmKDEzPT09Zyl7ZT0kYihmKTtpZihudWxsIT09ZSlyZXR1cm4gZTtlPW51bGx9ZWxzZSBpZigzPT09Zyl7aWYoZi5zdGF0ZU5vZGUuaHlkcmF0ZSlyZXR1cm4gMz09PWYudGFnP2Yuc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtlPW51bGx9ZWxzZSBmIT09ZSYmKGU9bnVsbCl9fWpkKGEsYixkLGUsYyk7cmV0dXJuIG51bGx9dmFyIGtkPW51bGwsbGQ9bnVsbCxtZD1udWxsO1xuZnVuY3Rpb24gbmQoKXtpZihtZClyZXR1cm4gbWQ7dmFyIGEsYj1sZCxjPWIubGVuZ3RoLGQsZT1cInZhbHVlXCJpbiBrZD9rZC52YWx1ZTprZC50ZXh0Q29udGVudCxmPWUubGVuZ3RoO2ZvcihhPTA7YTxjJiZiW2FdPT09ZVthXTthKyspO3ZhciBnPWMtYTtmb3IoZD0xO2Q8PWcmJmJbYy1kXT09PWVbZi1kXTtkKyspO3JldHVybiBtZD1lLnNsaWNlKGEsMTxkPzEtZDp2b2lkIDApfWZ1bmN0aW9uIG9kKGEpe3ZhciBiPWEua2V5Q29kZTtcImNoYXJDb2RlXCJpbiBhPyhhPWEuY2hhckNvZGUsMD09PWEmJjEzPT09YiYmKGE9MTMpKTphPWI7MTA9PT1hJiYoYT0xMyk7cmV0dXJuIDMyPD1hfHwxMz09PWE/YTowfWZ1bmN0aW9uIHBkKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWQoKXtyZXR1cm4hMX1cbmZ1bmN0aW9uIHJkKGEpe2Z1bmN0aW9uIGIoYixkLGUsZixnKXt0aGlzLl9yZWFjdE5hbWU9Yjt0aGlzLl90YXJnZXRJbnN0PWU7dGhpcy50eXBlPWQ7dGhpcy5uYXRpdmVFdmVudD1mO3RoaXMudGFyZ2V0PWc7dGhpcy5jdXJyZW50VGFyZ2V0PW51bGw7Zm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmKGI9YVtjXSx0aGlzW2NdPWI/YihmKTpmW2NdKTt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD0obnVsbCE9Zi5kZWZhdWx0UHJldmVudGVkP2YuZGVmYXVsdFByZXZlbnRlZDohMT09PWYucmV0dXJuVmFsdWUpP3BkOnFkO3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cWQ7cmV0dXJuIHRoaXN9bShiLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6XCJ1bmtub3duXCIhPT10eXBlb2YgYS5yZXR1cm5WYWx1ZSYmXG4oYS5yZXR1cm5WYWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGQpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5hdGl2ZUV2ZW50O2EmJihhLnN0b3BQcm9wYWdhdGlvbj9hLnN0b3BQcm9wYWdhdGlvbigpOlwidW5rbm93blwiIT09dHlwZW9mIGEuY2FuY2VsQnViYmxlJiYoYS5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cGQpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7fSxpc1BlcnNpc3RlbnQ6cGR9KTtyZXR1cm4gYn1cbnZhciBzZD17ZXZlbnRQaGFzZTowLGJ1YmJsZXM6MCxjYW5jZWxhYmxlOjAsdGltZVN0YW1wOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDowLGlzVHJ1c3RlZDowfSx0ZD1yZChzZCksdWQ9bSh7fSxzZCx7dmlldzowLGRldGFpbDowfSksdmQ9cmQodWQpLHdkLHhkLHlkLEFkPW0oe30sdWQse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6emQsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWEucmVsYXRlZFRhcmdldD9hLmZyb21FbGVtZW50PT09YS5zcmNFbGVtZW50P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQ6YS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oYSl7aWYoXCJtb3ZlbWVudFhcImluXG5hKXJldHVybiBhLm1vdmVtZW50WDthIT09eWQmJih5ZCYmXCJtb3VzZW1vdmVcIj09PWEudHlwZT8od2Q9YS5zY3JlZW5YLXlkLnNjcmVlblgseGQ9YS5zY3JlZW5ZLXlkLnNjcmVlblkpOnhkPXdkPTAseWQ9YSk7cmV0dXJuIHdkfSxtb3ZlbWVudFk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJtb3ZlbWVudFlcImluIGE/YS5tb3ZlbWVudFk6eGR9fSksQmQ9cmQoQWQpLENkPW0oe30sQWQse2RhdGFUcmFuc2ZlcjowfSksRGQ9cmQoQ2QpLEVkPW0oe30sdWQse3JlbGF0ZWRUYXJnZXQ6MH0pLEZkPXJkKEVkKSxHZD1tKHt9LHNkLHthbmltYXRpb25OYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxIZD1yZChHZCksSWQ9bSh7fSxzZCx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihhKXtyZXR1cm5cImNsaXBib2FyZERhdGFcImluIGE/YS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLEpkPXJkKElkKSxLZD1tKHt9LHNkLHtkYXRhOjB9KSxMZD1yZChLZCksTWQ9e0VzYzpcIkVzY2FwZVwiLFxuU3BhY2ViYXI6XCIgXCIsTGVmdDpcIkFycm93TGVmdFwiLFVwOlwiQXJyb3dVcFwiLFJpZ2h0OlwiQXJyb3dSaWdodFwiLERvd246XCJBcnJvd0Rvd25cIixEZWw6XCJEZWxldGVcIixXaW46XCJPU1wiLE1lbnU6XCJDb250ZXh0TWVudVwiLEFwcHM6XCJDb250ZXh0TWVudVwiLFNjcm9sbDpcIlNjcm9sbExvY2tcIixNb3pQcmludGFibGVLZXk6XCJVbmlkZW50aWZpZWRcIn0sTmQ9ezg6XCJCYWNrc3BhY2VcIiw5OlwiVGFiXCIsMTI6XCJDbGVhclwiLDEzOlwiRW50ZXJcIiwxNjpcIlNoaWZ0XCIsMTc6XCJDb250cm9sXCIsMTg6XCJBbHRcIiwxOTpcIlBhdXNlXCIsMjA6XCJDYXBzTG9ja1wiLDI3OlwiRXNjYXBlXCIsMzI6XCIgXCIsMzM6XCJQYWdlVXBcIiwzNDpcIlBhZ2VEb3duXCIsMzU6XCJFbmRcIiwzNjpcIkhvbWVcIiwzNzpcIkFycm93TGVmdFwiLDM4OlwiQXJyb3dVcFwiLDM5OlwiQXJyb3dSaWdodFwiLDQwOlwiQXJyb3dEb3duXCIsNDU6XCJJbnNlcnRcIiw0NjpcIkRlbGV0ZVwiLDExMjpcIkYxXCIsMTEzOlwiRjJcIiwxMTQ6XCJGM1wiLDExNTpcIkY0XCIsMTE2OlwiRjVcIiwxMTc6XCJGNlwiLDExODpcIkY3XCIsXG4xMTk6XCJGOFwiLDEyMDpcIkY5XCIsMTIxOlwiRjEwXCIsMTIyOlwiRjExXCIsMTIzOlwiRjEyXCIsMTQ0OlwiTnVtTG9ja1wiLDE0NTpcIlNjcm9sbExvY2tcIiwyMjQ6XCJNZXRhXCJ9LE9kPXtBbHQ6XCJhbHRLZXlcIixDb250cm9sOlwiY3RybEtleVwiLE1ldGE6XCJtZXRhS2V5XCIsU2hpZnQ6XCJzaGlmdEtleVwifTtmdW5jdGlvbiBQZChhKXt2YXIgYj10aGlzLm5hdGl2ZUV2ZW50O3JldHVybiBiLmdldE1vZGlmaWVyU3RhdGU/Yi5nZXRNb2RpZmllclN0YXRlKGEpOihhPU9kW2FdKT8hIWJbYV06ITF9ZnVuY3Rpb24gemQoKXtyZXR1cm4gUGR9XG52YXIgUWQ9bSh7fSx1ZCx7a2V5OmZ1bmN0aW9uKGEpe2lmKGEua2V5KXt2YXIgYj1NZFthLmtleV18fGEua2V5O2lmKFwiVW5pZGVudGlmaWVkXCIhPT1iKXJldHVybiBifXJldHVyblwia2V5cHJlc3NcIj09PWEudHlwZT8oYT1vZChhKSwxMz09PWE/XCJFbnRlclwiOlN0cmluZy5mcm9tQ2hhckNvZGUoYSkpOlwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/TmRbYS5rZXlDb2RlXXx8XCJVbmlkZW50aWZpZWRcIjpcIlwifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTp6ZCxjaGFyQ29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1hLnR5cGU/b2QoYSk6MH0sa2V5Q29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1cbmEudHlwZT9vZChhKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfX0pLFJkPXJkKFFkKSxTZD1tKHt9LEFkLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pLFRkPXJkKFNkKSxVZD1tKHt9LHVkLHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6emR9KSxWZD1yZChVZCksV2Q9bSh7fSxzZCx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxYZD1yZChXZCksWWQ9bSh7fSxBZCx7ZGVsdGFYOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFYXCJpbiBhP2EuZGVsdGFYOlwid2hlZWxEZWx0YVhcImluIGE/LWEud2hlZWxEZWx0YVg6MH0sXG5kZWx0YVk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJkZWx0YVlcImluIGE/YS5kZWx0YVk6XCJ3aGVlbERlbHRhWVwiaW4gYT8tYS53aGVlbERlbHRhWTpcIndoZWVsRGVsdGFcImluIGE/LWEud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pLFpkPXJkKFlkKSwkZD1bOSwxMywyNywzMl0sYWU9ZmEmJlwiQ29tcG9zaXRpb25FdmVudFwiaW4gd2luZG93LGJlPW51bGw7ZmEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmKGJlPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIGNlPWZhJiZcIlRleHRFdmVudFwiaW4gd2luZG93JiYhYmUsZGU9ZmEmJighYWV8fGJlJiY4PGJlJiYxMT49YmUpLGVlPVN0cmluZy5mcm9tQ2hhckNvZGUoMzIpLGZlPSExO1xuZnVuY3Rpb24gZ2UoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImtleXVwXCI6cmV0dXJuLTEhPT0kZC5pbmRleE9mKGIua2V5Q29kZSk7Y2FzZSBcImtleWRvd25cIjpyZXR1cm4gMjI5IT09Yi5rZXlDb2RlO2Nhc2UgXCJrZXlwcmVzc1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwiZm9jdXNvdXRcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBoZShhKXthPWEuZGV0YWlsO3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmXCJkYXRhXCJpbiBhP2EuZGF0YTpudWxsfXZhciBpZT0hMTtmdW5jdGlvbiBqZShhLGIpe3N3aXRjaChhKXtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gaGUoYik7Y2FzZSBcImtleXByZXNzXCI6aWYoMzIhPT1iLndoaWNoKXJldHVybiBudWxsO2ZlPSEwO3JldHVybiBlZTtjYXNlIFwidGV4dElucHV0XCI6cmV0dXJuIGE9Yi5kYXRhLGE9PT1lZSYmZmU/bnVsbDphO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxuZnVuY3Rpb24ga2UoYSxiKXtpZihpZSlyZXR1cm5cImNvbXBvc2l0aW9uZW5kXCI9PT1hfHwhYWUmJmdlKGEsYik/KGE9bmQoKSxtZD1sZD1rZD1udWxsLGllPSExLGEpOm51bGw7c3dpdGNoKGEpe2Nhc2UgXCJwYXN0ZVwiOnJldHVybiBudWxsO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKCEoYi5jdHJsS2V5fHxiLmFsdEtleXx8Yi5tZXRhS2V5KXx8Yi5jdHJsS2V5JiZiLmFsdEtleSl7aWYoYi5jaGFyJiYxPGIuY2hhci5sZW5ndGgpcmV0dXJuIGIuY2hhcjtpZihiLndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIud2hpY2gpfXJldHVybiBudWxsO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOnJldHVybiBkZSYmXCJrb1wiIT09Yi5sb2NhbGU/bnVsbDpiLmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG52YXIgbGU9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsXCJkYXRldGltZS1sb2NhbFwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gbWUoYSl7dmFyIGI9YSYmYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVyblwiaW5wdXRcIj09PWI/ISFsZVthLnR5cGVdOlwidGV4dGFyZWFcIj09PWI/ITA6ITF9ZnVuY3Rpb24gbmUoYSxiLGMsZCl7RWIoZCk7Yj1vZShiLFwib25DaGFuZ2VcIik7MDxiLmxlbmd0aCYmKGM9bmV3IHRkKFwib25DaGFuZ2VcIixcImNoYW5nZVwiLG51bGwsYyxkKSxhLnB1c2goe2V2ZW50OmMsbGlzdGVuZXJzOmJ9KSl9dmFyIHBlPW51bGwscWU9bnVsbDtmdW5jdGlvbiByZShhKXtzZShhLDApfWZ1bmN0aW9uIHRlKGEpe3ZhciBiPXVlKGEpO2lmKFdhKGIpKXJldHVybiBhfVxuZnVuY3Rpb24gdmUoYSxiKXtpZihcImNoYW5nZVwiPT09YSlyZXR1cm4gYn12YXIgd2U9ITE7aWYoZmEpe3ZhciB4ZTtpZihmYSl7dmFyIHllPVwib25pbnB1dFwiaW4gZG9jdW1lbnQ7aWYoIXllKXt2YXIgemU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt6ZS5zZXRBdHRyaWJ1dGUoXCJvbmlucHV0XCIsXCJyZXR1cm47XCIpO3llPVwiZnVuY3Rpb25cIj09PXR5cGVvZiB6ZS5vbmlucHV0fXhlPXllfWVsc2UgeGU9ITE7d2U9eGUmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gQWUoKXtwZSYmKHBlLmRldGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSxxZT1wZT1udWxsKX1mdW5jdGlvbiBCZShhKXtpZihcInZhbHVlXCI9PT1hLnByb3BlcnR5TmFtZSYmdGUocWUpKXt2YXIgYj1bXTtuZShiLHFlLGEseGIoYSkpO2E9cmU7aWYoS2IpYShiKTtlbHNle0tiPSEwO3RyeXtHYihhLGIpfWZpbmFsbHl7S2I9ITEsTWIoKX19fX1cbmZ1bmN0aW9uIENlKGEsYixjKXtcImZvY3VzaW5cIj09PWE/KEFlKCkscGU9YixxZT1jLHBlLmF0dGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSk6XCJmb2N1c291dFwiPT09YSYmQWUoKX1mdW5jdGlvbiBEZShhKXtpZihcInNlbGVjdGlvbmNoYW5nZVwiPT09YXx8XCJrZXl1cFwiPT09YXx8XCJrZXlkb3duXCI9PT1hKXJldHVybiB0ZShxZSl9ZnVuY3Rpb24gRWUoYSxiKXtpZihcImNsaWNrXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBGZShhLGIpe2lmKFwiaW5wdXRcIj09PWF8fFwiY2hhbmdlXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBHZShhLGIpe3JldHVybiBhPT09YiYmKDAhPT1hfHwxL2E9PT0xL2IpfHxhIT09YSYmYiE9PWJ9dmFyIEhlPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBPYmplY3QuaXM/T2JqZWN0LmlzOkdlLEllPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBKZShhLGIpe2lmKEhlKGEsYikpcmV0dXJuITA7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhfHxudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBifHxudWxsPT09YilyZXR1cm4hMTt2YXIgYz1PYmplY3Qua2V5cyhhKSxkPU9iamVjdC5rZXlzKGIpO2lmKGMubGVuZ3RoIT09ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylpZighSWUuY2FsbChiLGNbZF0pfHwhSGUoYVtjW2RdXSxiW2NbZF1dKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBLZShhKXtmb3IoO2EmJmEuZmlyc3RDaGlsZDspYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9XG5mdW5jdGlvbiBMZShhLGIpe3ZhciBjPUtlKGEpO2E9MDtmb3IodmFyIGQ7Yzspe2lmKDM9PT1jLm5vZGVUeXBlKXtkPWErYy50ZXh0Q29udGVudC5sZW5ndGg7aWYoYTw9YiYmZD49YilyZXR1cm57bm9kZTpjLG9mZnNldDpiLWF9O2E9ZH1hOntmb3IoO2M7KXtpZihjLm5leHRTaWJsaW5nKXtjPWMubmV4dFNpYmxpbmc7YnJlYWsgYX1jPWMucGFyZW50Tm9kZX1jPXZvaWQgMH1jPUtlKGMpfX1mdW5jdGlvbiBNZShhLGIpe3JldHVybiBhJiZiP2E9PT1iPyEwOmEmJjM9PT1hLm5vZGVUeXBlPyExOmImJjM9PT1iLm5vZGVUeXBlP01lKGEsYi5wYXJlbnROb2RlKTpcImNvbnRhaW5zXCJpbiBhP2EuY29udGFpbnMoYik6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2KTohMTohMX1cbmZ1bmN0aW9uIE5lKCl7Zm9yKHZhciBhPXdpbmRvdyxiPVhhKCk7YiBpbnN0YW5jZW9mIGEuSFRNTElGcmFtZUVsZW1lbnQ7KXt0cnl7dmFyIGM9XCJzdHJpbmdcIj09PXR5cGVvZiBiLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZn1jYXRjaChkKXtjPSExfWlmKGMpYT1iLmNvbnRlbnRXaW5kb3c7ZWxzZSBicmVhaztiPVhhKGEuZG9jdW1lbnQpfXJldHVybiBifWZ1bmN0aW9uIE9lKGEpe3ZhciBiPWEmJmEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYiYmKFwiaW5wdXRcIj09PWImJihcInRleHRcIj09PWEudHlwZXx8XCJzZWFyY2hcIj09PWEudHlwZXx8XCJ0ZWxcIj09PWEudHlwZXx8XCJ1cmxcIj09PWEudHlwZXx8XCJwYXNzd29yZFwiPT09YS50eXBlKXx8XCJ0ZXh0YXJlYVwiPT09Ynx8XCJ0cnVlXCI9PT1hLmNvbnRlbnRFZGl0YWJsZSl9XG52YXIgUGU9ZmEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxRZT1udWxsLFJlPW51bGwsU2U9bnVsbCxUZT0hMTtcbmZ1bmN0aW9uIFVlKGEsYixjKXt2YXIgZD1jLndpbmRvdz09PWM/Yy5kb2N1bWVudDo5PT09Yy5ub2RlVHlwZT9jOmMub3duZXJEb2N1bWVudDtUZXx8bnVsbD09UWV8fFFlIT09WGEoZCl8fChkPVFlLFwic2VsZWN0aW9uU3RhcnRcImluIGQmJk9lKGQpP2Q9e3N0YXJ0OmQuc2VsZWN0aW9uU3RhcnQsZW5kOmQuc2VsZWN0aW9uRW5kfTooZD0oZC5vd25lckRvY3VtZW50JiZkLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCksZD17YW5jaG9yTm9kZTpkLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OmQuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpkLmZvY3VzTm9kZSxmb2N1c09mZnNldDpkLmZvY3VzT2Zmc2V0fSksU2UmJkplKFNlLGQpfHwoU2U9ZCxkPW9lKFJlLFwib25TZWxlY3RcIiksMDxkLmxlbmd0aCYmKGI9bmV3IHRkKFwib25TZWxlY3RcIixcInNlbGVjdFwiLG51bGwsYixjKSxhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmR9KSxiLnRhcmdldD1RZSkpKX1cblBjKFwiY2FuY2VsIGNhbmNlbCBjbGljayBjbGljayBjbG9zZSBjbG9zZSBjb250ZXh0bWVudSBjb250ZXh0TWVudSBjb3B5IGNvcHkgY3V0IGN1dCBhdXhjbGljayBhdXhDbGljayBkYmxjbGljayBkb3VibGVDbGljayBkcmFnZW5kIGRyYWdFbmQgZHJhZ3N0YXJ0IGRyYWdTdGFydCBkcm9wIGRyb3AgZm9jdXNpbiBmb2N1cyBmb2N1c291dCBibHVyIGlucHV0IGlucHV0IGludmFsaWQgaW52YWxpZCBrZXlkb3duIGtleURvd24ga2V5cHJlc3Mga2V5UHJlc3Mga2V5dXAga2V5VXAgbW91c2Vkb3duIG1vdXNlRG93biBtb3VzZXVwIG1vdXNlVXAgcGFzdGUgcGFzdGUgcGF1c2UgcGF1c2UgcGxheSBwbGF5IHBvaW50ZXJjYW5jZWwgcG9pbnRlckNhbmNlbCBwb2ludGVyZG93biBwb2ludGVyRG93biBwb2ludGVydXAgcG9pbnRlclVwIHJhdGVjaGFuZ2UgcmF0ZUNoYW5nZSByZXNldCByZXNldCBzZWVrZWQgc2Vla2VkIHN1Ym1pdCBzdWJtaXQgdG91Y2hjYW5jZWwgdG91Y2hDYW5jZWwgdG91Y2hlbmQgdG91Y2hFbmQgdG91Y2hzdGFydCB0b3VjaFN0YXJ0IHZvbHVtZWNoYW5nZSB2b2x1bWVDaGFuZ2VcIi5zcGxpdChcIiBcIiksXG4wKTtQYyhcImRyYWcgZHJhZyBkcmFnZW50ZXIgZHJhZ0VudGVyIGRyYWdleGl0IGRyYWdFeGl0IGRyYWdsZWF2ZSBkcmFnTGVhdmUgZHJhZ292ZXIgZHJhZ092ZXIgbW91c2Vtb3ZlIG1vdXNlTW92ZSBtb3VzZW91dCBtb3VzZU91dCBtb3VzZW92ZXIgbW91c2VPdmVyIHBvaW50ZXJtb3ZlIHBvaW50ZXJNb3ZlIHBvaW50ZXJvdXQgcG9pbnRlck91dCBwb2ludGVyb3ZlciBwb2ludGVyT3ZlciBzY3JvbGwgc2Nyb2xsIHRvZ2dsZSB0b2dnbGUgdG91Y2htb3ZlIHRvdWNoTW92ZSB3aGVlbCB3aGVlbFwiLnNwbGl0KFwiIFwiKSwxKTtQYyhPYywyKTtmb3IodmFyIFZlPVwiY2hhbmdlIHNlbGVjdGlvbmNoYW5nZSB0ZXh0SW5wdXQgY29tcG9zaXRpb25zdGFydCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnVwZGF0ZVwiLnNwbGl0KFwiIFwiKSxXZT0wO1dlPFZlLmxlbmd0aDtXZSsrKU5jLnNldChWZVtXZV0sMCk7ZWEoXCJvbk1vdXNlRW50ZXJcIixbXCJtb3VzZW91dFwiLFwibW91c2VvdmVyXCJdKTtcbmVhKFwib25Nb3VzZUxlYXZlXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7ZWEoXCJvblBvaW50ZXJFbnRlclwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtlYShcIm9uUG9pbnRlckxlYXZlXCIsW1wicG9pbnRlcm91dFwiLFwicG9pbnRlcm92ZXJcIl0pO2RhKFwib25DaGFuZ2VcIixcImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpKTtkYShcIm9uU2VsZWN0XCIsXCJmb2N1c291dCBjb250ZXh0bWVudSBkcmFnZW5kIGZvY3VzaW4ga2V5ZG93biBrZXl1cCBtb3VzZWRvd24gbW91c2V1cCBzZWxlY3Rpb25jaGFuZ2VcIi5zcGxpdChcIiBcIikpO2RhKFwib25CZWZvcmVJbnB1dFwiLFtcImNvbXBvc2l0aW9uZW5kXCIsXCJrZXlwcmVzc1wiLFwidGV4dElucHV0XCIsXCJwYXN0ZVwiXSk7ZGEoXCJvbkNvbXBvc2l0aW9uRW5kXCIsXCJjb21wb3NpdGlvbmVuZCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKSk7XG5kYShcIm9uQ29tcG9zaXRpb25TdGFydFwiLFwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKSk7ZGEoXCJvbkNvbXBvc2l0aW9uVXBkYXRlXCIsXCJjb21wb3NpdGlvbnVwZGF0ZSBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKSk7dmFyIFhlPVwiYWJvcnQgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBsb2FkZWRkYXRhIGxvYWRlZG1ldGFkYXRhIGxvYWRzdGFydCBwYXVzZSBwbGF5IHBsYXlpbmcgcHJvZ3Jlc3MgcmF0ZWNoYW5nZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZ1wiLnNwbGl0KFwiIFwiKSxZZT1uZXcgU2V0KFwiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlXCIuc3BsaXQoXCIgXCIpLmNvbmNhdChYZSkpO1xuZnVuY3Rpb24gWmUoYSxiLGMpe3ZhciBkPWEudHlwZXx8XCJ1bmtub3duLWV2ZW50XCI7YS5jdXJyZW50VGFyZ2V0PWM7WWIoZCxiLHZvaWQgMCxhKTthLmN1cnJlbnRUYXJnZXQ9bnVsbH1cbmZ1bmN0aW9uIHNlKGEsYil7Yj0wIT09KGImNCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT1kLmV2ZW50O2Q9ZC5saXN0ZW5lcnM7YTp7dmFyIGY9dm9pZCAwO2lmKGIpZm9yKHZhciBnPWQubGVuZ3RoLTE7MDw9ZztnLS0pe3ZhciBoPWRbZ10saz1oLmluc3RhbmNlLGw9aC5jdXJyZW50VGFyZ2V0O2g9aC5saXN0ZW5lcjtpZihrIT09ZiYmZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGE7WmUoZSxoLGwpO2Y9a31lbHNlIGZvcihnPTA7ZzxkLmxlbmd0aDtnKyspe2g9ZFtnXTtrPWguaW5zdGFuY2U7bD1oLmN1cnJlbnRUYXJnZXQ7aD1oLmxpc3RlbmVyO2lmKGshPT1mJiZlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgYTtaZShlLGgsbCk7Zj1rfX19aWYoVWIpdGhyb3cgYT1WYixVYj0hMSxWYj1udWxsLGE7fVxuZnVuY3Rpb24gRyhhLGIpe3ZhciBjPSRlKGIpLGQ9YStcIl9fYnViYmxlXCI7Yy5oYXMoZCl8fChhZihiLGEsMiwhMSksYy5hZGQoZCkpfXZhciBiZj1cIl9yZWFjdExpc3RlbmluZ1wiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO2Z1bmN0aW9uIGNmKGEpe2FbYmZdfHwoYVtiZl09ITAsYmEuZm9yRWFjaChmdW5jdGlvbihiKXtZZS5oYXMoYil8fGRmKGIsITEsYSxudWxsKTtkZihiLCEwLGEsbnVsbCl9KSl9XG5mdW5jdGlvbiBkZihhLGIsYyxkKXt2YXIgZT00PGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MCxmPWM7XCJzZWxlY3Rpb25jaGFuZ2VcIj09PWEmJjkhPT1jLm5vZGVUeXBlJiYoZj1jLm93bmVyRG9jdW1lbnQpO2lmKG51bGwhPT1kJiYhYiYmWWUuaGFzKGEpKXtpZihcInNjcm9sbFwiIT09YSlyZXR1cm47ZXw9MjtmPWR9dmFyIGc9JGUoZiksaD1hK1wiX19cIisoYj9cImNhcHR1cmVcIjpcImJ1YmJsZVwiKTtnLmhhcyhoKXx8KGImJihlfD00KSxhZihmLGEsZSxiKSxnLmFkZChoKSl9XG5mdW5jdGlvbiBhZihhLGIsYyxkKXt2YXIgZT1OYy5nZXQoYik7c3dpdGNoKHZvaWQgMD09PWU/MjplKXtjYXNlIDA6ZT1nZDticmVhaztjYXNlIDE6ZT1pZDticmVhaztkZWZhdWx0OmU9aGR9Yz1lLmJpbmQobnVsbCxiLGMsYSk7ZT12b2lkIDA7IVBifHxcInRvdWNoc3RhcnRcIiE9PWImJlwidG91Y2htb3ZlXCIhPT1iJiZcIndoZWVsXCIhPT1ifHwoZT0hMCk7ZD92b2lkIDAhPT1lP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMse2NhcHR1cmU6ITAscGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMCk6dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtwYXNzaXZlOmV9KTphLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX1cbmZ1bmN0aW9uIGpkKGEsYixjLGQsZSl7dmFyIGY9ZDtpZigwPT09KGImMSkmJjA9PT0oYiYyKSYmbnVsbCE9PWQpYTpmb3IoOzspe2lmKG51bGw9PT1kKXJldHVybjt2YXIgZz1kLnRhZztpZigzPT09Z3x8ND09PWcpe3ZhciBoPWQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYoaD09PWV8fDg9PT1oLm5vZGVUeXBlJiZoLnBhcmVudE5vZGU9PT1lKWJyZWFrO2lmKDQ9PT1nKWZvcihnPWQucmV0dXJuO251bGwhPT1nOyl7dmFyIGs9Zy50YWc7aWYoMz09PWt8fDQ9PT1rKWlmKGs9Zy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxrPT09ZXx8OD09PWsubm9kZVR5cGUmJmsucGFyZW50Tm9kZT09PWUpcmV0dXJuO2c9Zy5yZXR1cm59Zm9yKDtudWxsIT09aDspe2c9d2MoaCk7aWYobnVsbD09PWcpcmV0dXJuO2s9Zy50YWc7aWYoNT09PWt8fDY9PT1rKXtkPWY9Zztjb250aW51ZSBhfWg9aC5wYXJlbnROb2RlfX1kPWQucmV0dXJufU5iKGZ1bmN0aW9uKCl7dmFyIGQ9ZixlPXhiKGMpLGc9W107XG5hOnt2YXIgaD1NYy5nZXQoYSk7aWYodm9pZCAwIT09aCl7dmFyIGs9dGQseD1hO3N3aXRjaChhKXtjYXNlIFwia2V5cHJlc3NcIjppZigwPT09b2QoYykpYnJlYWsgYTtjYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXl1cFwiOms9UmQ7YnJlYWs7Y2FzZSBcImZvY3VzaW5cIjp4PVwiZm9jdXNcIjtrPUZkO2JyZWFrO2Nhc2UgXCJmb2N1c291dFwiOng9XCJibHVyXCI7az1GZDticmVhaztjYXNlIFwiYmVmb3JlYmx1clwiOmNhc2UgXCJhZnRlcmJsdXJcIjprPUZkO2JyZWFrO2Nhc2UgXCJjbGlja1wiOmlmKDI9PT1jLmJ1dHRvbilicmVhayBhO2Nhc2UgXCJhdXhjbGlja1wiOmNhc2UgXCJkYmxjbGlja1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwibW91c2Vtb3ZlXCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwibW91c2VvdXRcIjpjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcImNvbnRleHRtZW51XCI6az1CZDticmVhaztjYXNlIFwiZHJhZ1wiOmNhc2UgXCJkcmFnZW5kXCI6Y2FzZSBcImRyYWdlbnRlclwiOmNhc2UgXCJkcmFnZXhpdFwiOmNhc2UgXCJkcmFnbGVhdmVcIjpjYXNlIFwiZHJhZ292ZXJcIjpjYXNlIFwiZHJhZ3N0YXJ0XCI6Y2FzZSBcImRyb3BcIjprPVxuRGQ7YnJlYWs7Y2FzZSBcInRvdWNoY2FuY2VsXCI6Y2FzZSBcInRvdWNoZW5kXCI6Y2FzZSBcInRvdWNobW92ZVwiOmNhc2UgXCJ0b3VjaHN0YXJ0XCI6az1WZDticmVhaztjYXNlIEljOmNhc2UgSmM6Y2FzZSBLYzprPUhkO2JyZWFrO2Nhc2UgTGM6az1YZDticmVhaztjYXNlIFwic2Nyb2xsXCI6az12ZDticmVhaztjYXNlIFwid2hlZWxcIjprPVpkO2JyZWFrO2Nhc2UgXCJjb3B5XCI6Y2FzZSBcImN1dFwiOmNhc2UgXCJwYXN0ZVwiOms9SmQ7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJwb2ludGVyY2FuY2VsXCI6Y2FzZSBcInBvaW50ZXJkb3duXCI6Y2FzZSBcInBvaW50ZXJtb3ZlXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcnVwXCI6az1UZH12YXIgdz0wIT09KGImNCksej0hdyYmXCJzY3JvbGxcIj09PWEsdT13P251bGwhPT1oP2grXCJDYXB0dXJlXCI6bnVsbDpoO3c9W107Zm9yKHZhciB0PWQscTtudWxsIT09XG50Oyl7cT10O3ZhciB2PXEuc3RhdGVOb2RlOzU9PT1xLnRhZyYmbnVsbCE9PXYmJihxPXYsbnVsbCE9PXUmJih2PU9iKHQsdSksbnVsbCE9diYmdy5wdXNoKGVmKHQsdixxKSkpKTtpZih6KWJyZWFrO3Q9dC5yZXR1cm59MDx3Lmxlbmd0aCYmKGg9bmV3IGsoaCx4LG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmgsbGlzdGVuZXJzOnd9KSl9fWlmKDA9PT0oYiY3KSl7YTp7aD1cIm1vdXNlb3ZlclwiPT09YXx8XCJwb2ludGVyb3ZlclwiPT09YTtrPVwibW91c2VvdXRcIj09PWF8fFwicG9pbnRlcm91dFwiPT09YTtpZihoJiYwPT09KGImMTYpJiYoeD1jLnJlbGF0ZWRUYXJnZXR8fGMuZnJvbUVsZW1lbnQpJiYod2MoeCl8fHhbZmZdKSlicmVhayBhO2lmKGt8fGgpe2g9ZS53aW5kb3c9PT1lP2U6KGg9ZS5vd25lckRvY3VtZW50KT9oLmRlZmF1bHRWaWV3fHxoLnBhcmVudFdpbmRvdzp3aW5kb3c7aWYoayl7aWYoeD1jLnJlbGF0ZWRUYXJnZXR8fGMudG9FbGVtZW50LGs9ZCx4PXg/d2MoeCk6bnVsbCxudWxsIT09XG54JiYoej1aYih4KSx4IT09enx8NSE9PXgudGFnJiY2IT09eC50YWcpKXg9bnVsbH1lbHNlIGs9bnVsbCx4PWQ7aWYoayE9PXgpe3c9QmQ7dj1cIm9uTW91c2VMZWF2ZVwiO3U9XCJvbk1vdXNlRW50ZXJcIjt0PVwibW91c2VcIjtpZihcInBvaW50ZXJvdXRcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWEpdz1UZCx2PVwib25Qb2ludGVyTGVhdmVcIix1PVwib25Qb2ludGVyRW50ZXJcIix0PVwicG9pbnRlclwiO3o9bnVsbD09az9oOnVlKGspO3E9bnVsbD09eD9oOnVlKHgpO2g9bmV3IHcodix0K1wibGVhdmVcIixrLGMsZSk7aC50YXJnZXQ9ejtoLnJlbGF0ZWRUYXJnZXQ9cTt2PW51bGw7d2MoZSk9PT1kJiYodz1uZXcgdyh1LHQrXCJlbnRlclwiLHgsYyxlKSx3LnRhcmdldD1xLHcucmVsYXRlZFRhcmdldD16LHY9dyk7ej12O2lmKGsmJngpYjp7dz1rO3U9eDt0PTA7Zm9yKHE9dztxO3E9Z2YocSkpdCsrO3E9MDtmb3Iodj11O3Y7dj1nZih2KSlxKys7Zm9yKDswPHQtcTspdz1nZih3KSx0LS07Zm9yKDswPHEtdDspdT1cbmdmKHUpLHEtLTtmb3IoO3QtLTspe2lmKHc9PT11fHxudWxsIT09dSYmdz09PXUuYWx0ZXJuYXRlKWJyZWFrIGI7dz1nZih3KTt1PWdmKHUpfXc9bnVsbH1lbHNlIHc9bnVsbDtudWxsIT09ayYmaGYoZyxoLGssdywhMSk7bnVsbCE9PXgmJm51bGwhPT16JiZoZihnLHoseCx3LCEwKX19fWE6e2g9ZD91ZShkKTp3aW5kb3c7az1oLm5vZGVOYW1lJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoXCJzZWxlY3RcIj09PWt8fFwiaW5wdXRcIj09PWsmJlwiZmlsZVwiPT09aC50eXBlKXZhciBKPXZlO2Vsc2UgaWYobWUoaCkpaWYod2UpSj1GZTtlbHNle0o9RGU7dmFyIEs9Q2V9ZWxzZShrPWgubm9kZU5hbWUpJiZcImlucHV0XCI9PT1rLnRvTG93ZXJDYXNlKCkmJihcImNoZWNrYm94XCI9PT1oLnR5cGV8fFwicmFkaW9cIj09PWgudHlwZSkmJihKPUVlKTtpZihKJiYoSj1KKGEsZCkpKXtuZShnLEosYyxlKTticmVhayBhfUsmJksoYSxoLGQpO1wiZm9jdXNvdXRcIj09PWEmJihLPWguX3dyYXBwZXJTdGF0ZSkmJlxuSy5jb250cm9sbGVkJiZcIm51bWJlclwiPT09aC50eXBlJiZiYihoLFwibnVtYmVyXCIsaC52YWx1ZSl9Sz1kP3VlKGQpOndpbmRvdztzd2l0Y2goYSl7Y2FzZSBcImZvY3VzaW5cIjppZihtZShLKXx8XCJ0cnVlXCI9PT1LLmNvbnRlbnRFZGl0YWJsZSlRZT1LLFJlPWQsU2U9bnVsbDticmVhaztjYXNlIFwiZm9jdXNvdXRcIjpTZT1SZT1RZT1udWxsO2JyZWFrO2Nhc2UgXCJtb3VzZWRvd25cIjpUZT0hMDticmVhaztjYXNlIFwiY29udGV4dG1lbnVcIjpjYXNlIFwibW91c2V1cFwiOmNhc2UgXCJkcmFnZW5kXCI6VGU9ITE7VWUoZyxjLGUpO2JyZWFrO2Nhc2UgXCJzZWxlY3Rpb25jaGFuZ2VcIjppZihQZSlicmVhaztjYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXl1cFwiOlVlKGcsYyxlKX12YXIgUTtpZihhZSliOntzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjp2YXIgTD1cIm9uQ29tcG9zaXRpb25TdGFydFwiO2JyZWFrIGI7Y2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6TD1cIm9uQ29tcG9zaXRpb25FbmRcIjticmVhayBiO1xuY2FzZSBcImNvbXBvc2l0aW9udXBkYXRlXCI6TD1cIm9uQ29tcG9zaXRpb25VcGRhdGVcIjticmVhayBifUw9dm9pZCAwfWVsc2UgaWU/Z2UoYSxjKSYmKEw9XCJvbkNvbXBvc2l0aW9uRW5kXCIpOlwia2V5ZG93blwiPT09YSYmMjI5PT09Yy5rZXlDb2RlJiYoTD1cIm9uQ29tcG9zaXRpb25TdGFydFwiKTtMJiYoZGUmJlwia29cIiE9PWMubG9jYWxlJiYoaWV8fFwib25Db21wb3NpdGlvblN0YXJ0XCIhPT1MP1wib25Db21wb3NpdGlvbkVuZFwiPT09TCYmaWUmJihRPW5kKCkpOihrZD1lLGxkPVwidmFsdWVcImluIGtkP2tkLnZhbHVlOmtkLnRleHRDb250ZW50LGllPSEwKSksSz1vZShkLEwpLDA8Sy5sZW5ndGgmJihMPW5ldyBMZChMLGEsbnVsbCxjLGUpLGcucHVzaCh7ZXZlbnQ6TCxsaXN0ZW5lcnM6S30pLFE/TC5kYXRhPVE6KFE9aGUoYyksbnVsbCE9PVEmJihMLmRhdGE9USkpKSk7aWYoUT1jZT9qZShhLGMpOmtlKGEsYykpZD1vZShkLFwib25CZWZvcmVJbnB1dFwiKSwwPGQubGVuZ3RoJiYoZT1uZXcgTGQoXCJvbkJlZm9yZUlucHV0XCIsXG5cImJlZm9yZWlucHV0XCIsbnVsbCxjLGUpLGcucHVzaCh7ZXZlbnQ6ZSxsaXN0ZW5lcnM6ZH0pLGUuZGF0YT1RKX1zZShnLGIpfSl9ZnVuY3Rpb24gZWYoYSxiLGMpe3JldHVybntpbnN0YW5jZTphLGxpc3RlbmVyOmIsY3VycmVudFRhcmdldDpjfX1mdW5jdGlvbiBvZShhLGIpe2Zvcih2YXIgYz1iK1wiQ2FwdHVyZVwiLGQ9W107bnVsbCE9PWE7KXt2YXIgZT1hLGY9ZS5zdGF0ZU5vZGU7NT09PWUudGFnJiZudWxsIT09ZiYmKGU9ZixmPU9iKGEsYyksbnVsbCE9ZiYmZC51bnNoaWZ0KGVmKGEsZixlKSksZj1PYihhLGIpLG51bGwhPWYmJmQucHVzaChlZihhLGYsZSkpKTthPWEucmV0dXJufXJldHVybiBkfWZ1bmN0aW9uIGdmKGEpe2lmKG51bGw9PT1hKXJldHVybiBudWxsO2RvIGE9YS5yZXR1cm47d2hpbGUoYSYmNSE9PWEudGFnKTtyZXR1cm4gYT9hOm51bGx9XG5mdW5jdGlvbiBoZihhLGIsYyxkLGUpe2Zvcih2YXIgZj1iLl9yZWFjdE5hbWUsZz1bXTtudWxsIT09YyYmYyE9PWQ7KXt2YXIgaD1jLGs9aC5hbHRlcm5hdGUsbD1oLnN0YXRlTm9kZTtpZihudWxsIT09ayYmaz09PWQpYnJlYWs7NT09PWgudGFnJiZudWxsIT09bCYmKGg9bCxlPyhrPU9iKGMsZiksbnVsbCE9ayYmZy51bnNoaWZ0KGVmKGMsayxoKSkpOmV8fChrPU9iKGMsZiksbnVsbCE9ayYmZy5wdXNoKGVmKGMsayxoKSkpKTtjPWMucmV0dXJufTAhPT1nLmxlbmd0aCYmYS5wdXNoKHtldmVudDpiLGxpc3RlbmVyczpnfSl9ZnVuY3Rpb24gamYoKXt9dmFyIGtmPW51bGwsbGY9bnVsbDtmdW5jdGlvbiBtZihhLGIpe3N3aXRjaChhKXtjYXNlIFwiYnV0dG9uXCI6Y2FzZSBcImlucHV0XCI6Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJ0ZXh0YXJlYVwiOnJldHVybiEhYi5hdXRvRm9jdXN9cmV0dXJuITF9XG5mdW5jdGlvbiBuZihhLGIpe3JldHVyblwidGV4dGFyZWFcIj09PWF8fFwib3B0aW9uXCI9PT1hfHxcIm5vc2NyaXB0XCI9PT1hfHxcInN0cmluZ1wiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwibnVtYmVyXCI9PT10eXBlb2YgYi5jaGlsZHJlbnx8XCJvYmplY3RcIj09PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT09Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9dmFyIG9mPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6dm9pZCAwLHBmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OnZvaWQgMDtmdW5jdGlvbiBxZihhKXsxPT09YS5ub2RlVHlwZT9hLnRleHRDb250ZW50PVwiXCI6OT09PWEubm9kZVR5cGUmJihhPWEuYm9keSxudWxsIT1hJiYoYS50ZXh0Q29udGVudD1cIlwiKSl9XG5mdW5jdGlvbiByZihhKXtmb3IoO251bGwhPWE7YT1hLm5leHRTaWJsaW5nKXt2YXIgYj1hLm5vZGVUeXBlO2lmKDE9PT1ifHwzPT09YilicmVha31yZXR1cm4gYX1mdW5jdGlvbiBzZihhKXthPWEucHJldmlvdXNTaWJsaW5nO2Zvcih2YXIgYj0wO2E7KXtpZig4PT09YS5ub2RlVHlwZSl7dmFyIGM9YS5kYXRhO2lmKFwiJFwiPT09Y3x8XCIkIVwiPT09Y3x8XCIkP1wiPT09Yyl7aWYoMD09PWIpcmV0dXJuIGE7Yi0tfWVsc2VcIi8kXCI9PT1jJiZiKyt9YT1hLnByZXZpb3VzU2libGluZ31yZXR1cm4gbnVsbH12YXIgdGY9MDtmdW5jdGlvbiB1ZihhKXtyZXR1cm57JCR0eXBlb2Y6R2EsdG9TdHJpbmc6YSx2YWx1ZU9mOmF9fXZhciB2Zj1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSx3Zj1cIl9fcmVhY3RGaWJlciRcIit2Zix4Zj1cIl9fcmVhY3RQcm9wcyRcIit2ZixmZj1cIl9fcmVhY3RDb250YWluZXIkXCIrdmYseWY9XCJfX3JlYWN0RXZlbnRzJFwiK3ZmO1xuZnVuY3Rpb24gd2MoYSl7dmFyIGI9YVt3Zl07aWYoYilyZXR1cm4gYjtmb3IodmFyIGM9YS5wYXJlbnROb2RlO2M7KXtpZihiPWNbZmZdfHxjW3dmXSl7Yz1iLmFsdGVybmF0ZTtpZihudWxsIT09Yi5jaGlsZHx8bnVsbCE9PWMmJm51bGwhPT1jLmNoaWxkKWZvcihhPXNmKGEpO251bGwhPT1hOyl7aWYoYz1hW3dmXSlyZXR1cm4gYzthPXNmKGEpfXJldHVybiBifWE9YztjPWEucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBDYihhKXthPWFbd2ZdfHxhW2ZmXTtyZXR1cm4hYXx8NSE9PWEudGFnJiY2IT09YS50YWcmJjEzIT09YS50YWcmJjMhPT1hLnRhZz9udWxsOmF9ZnVuY3Rpb24gdWUoYSl7aWYoNT09PWEudGFnfHw2PT09YS50YWcpcmV0dXJuIGEuc3RhdGVOb2RlO3Rocm93IEVycm9yKHkoMzMpKTt9ZnVuY3Rpb24gRGIoYSl7cmV0dXJuIGFbeGZdfHxudWxsfVxuZnVuY3Rpb24gJGUoYSl7dmFyIGI9YVt5Zl07dm9pZCAwPT09YiYmKGI9YVt5Zl09bmV3IFNldCk7cmV0dXJuIGJ9dmFyIHpmPVtdLEFmPS0xO2Z1bmN0aW9uIEJmKGEpe3JldHVybntjdXJyZW50OmF9fWZ1bmN0aW9uIEgoYSl7MD5BZnx8KGEuY3VycmVudD16ZltBZl0semZbQWZdPW51bGwsQWYtLSl9ZnVuY3Rpb24gSShhLGIpe0FmKys7emZbQWZdPWEuY3VycmVudDthLmN1cnJlbnQ9Yn12YXIgQ2Y9e30sTT1CZihDZiksTj1CZighMSksRGY9Q2Y7XG5mdW5jdGlvbiBFZihhLGIpe3ZhciBjPWEudHlwZS5jb250ZXh0VHlwZXM7aWYoIWMpcmV0dXJuIENmO3ZhciBkPWEuc3RhdGVOb2RlO2lmKGQmJmQuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD09PWIpcmV0dXJuIGQuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7dmFyIGU9e30sZjtmb3IoZiBpbiBjKWVbZl09YltmXTtkJiYoYT1hLnN0YXRlTm9kZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9YixhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWUpO3JldHVybiBlfWZ1bmN0aW9uIEZmKGEpe2E9YS5jaGlsZENvbnRleHRUeXBlcztyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF9ZnVuY3Rpb24gR2YoKXtIKE4pO0goTSl9ZnVuY3Rpb24gSGYoYSxiLGMpe2lmKE0uY3VycmVudCE9PUNmKXRocm93IEVycm9yKHkoMTY4KSk7SShNLGIpO0koTixjKX1cbmZ1bmN0aW9uIElmKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTthPWIuY2hpbGRDb250ZXh0VHlwZXM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGQuZ2V0Q2hpbGRDb250ZXh0KXJldHVybiBjO2Q9ZC5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIGUgaW4gZClpZighKGUgaW4gYSkpdGhyb3cgRXJyb3IoeSgxMDgsUmEoYil8fFwiVW5rbm93blwiLGUpKTtyZXR1cm4gbSh7fSxjLGQpfWZ1bmN0aW9uIEpmKGEpe2E9KGE9YS5zdGF0ZU5vZGUpJiZhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0fHxDZjtEZj1NLmN1cnJlbnQ7SShNLGEpO0koTixOLmN1cnJlbnQpO3JldHVybiEwfWZ1bmN0aW9uIEtmKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTtpZighZCl0aHJvdyBFcnJvcih5KDE2OSkpO2M/KGE9SWYoYSxiLERmKSxkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0PWEsSChOKSxIKE0pLEkoTSxhKSk6SChOKTtJKE4sYyl9XG52YXIgTGY9bnVsbCxNZj1udWxsLE5mPXIudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5LE9mPXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayxQZj1yLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLFFmPXIudW5zdGFibGVfc2hvdWxkWWllbGQsUmY9ci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsU2Y9ci51bnN0YWJsZV9ub3csVGY9ci51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCxVZj1yLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LFZmPXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksV2Y9ci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxYZj1yLnVuc3RhYmxlX0xvd1ByaW9yaXR5LFlmPXIudW5zdGFibGVfSWRsZVByaW9yaXR5LFpmPXt9LCRmPXZvaWQgMCE9PVJmP1JmOmZ1bmN0aW9uKCl7fSxhZz1udWxsLGJnPW51bGwsY2c9ITEsZGc9U2YoKSxPPTFFND5kZz9TZjpmdW5jdGlvbigpe3JldHVybiBTZigpLWRnfTtcbmZ1bmN0aW9uIGVnKCl7c3dpdGNoKFRmKCkpe2Nhc2UgVWY6cmV0dXJuIDk5O2Nhc2UgVmY6cmV0dXJuIDk4O2Nhc2UgV2Y6cmV0dXJuIDk3O2Nhc2UgWGY6cmV0dXJuIDk2O2Nhc2UgWWY6cmV0dXJuIDk1O2RlZmF1bHQ6dGhyb3cgRXJyb3IoeSgzMzIpKTt9fWZ1bmN0aW9uIGZnKGEpe3N3aXRjaChhKXtjYXNlIDk5OnJldHVybiBVZjtjYXNlIDk4OnJldHVybiBWZjtjYXNlIDk3OnJldHVybiBXZjtjYXNlIDk2OnJldHVybiBYZjtjYXNlIDk1OnJldHVybiBZZjtkZWZhdWx0OnRocm93IEVycm9yKHkoMzMyKSk7fX1mdW5jdGlvbiBnZyhhLGIpe2E9ZmcoYSk7cmV0dXJuIE5mKGEsYil9ZnVuY3Rpb24gaGcoYSxiLGMpe2E9ZmcoYSk7cmV0dXJuIE9mKGEsYixjKX1mdW5jdGlvbiBpZygpe2lmKG51bGwhPT1iZyl7dmFyIGE9Ymc7Ymc9bnVsbDtQZihhKX1qZygpfVxuZnVuY3Rpb24gamcoKXtpZighY2cmJm51bGwhPT1hZyl7Y2c9ITA7dmFyIGE9MDt0cnl7dmFyIGI9YWc7Z2coOTksZnVuY3Rpb24oKXtmb3IoO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1iW2FdO2RvIGM9YyghMCk7d2hpbGUobnVsbCE9PWMpfX0pO2FnPW51bGx9Y2F0Y2goYyl7dGhyb3cgbnVsbCE9PWFnJiYoYWc9YWcuc2xpY2UoYSsxKSksT2YoVWYsaWcpLGM7fWZpbmFsbHl7Y2c9ITF9fX12YXIga2c9cmEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7ZnVuY3Rpb24gbGcoYSxiKXtpZihhJiZhLmRlZmF1bHRQcm9wcyl7Yj1tKHt9LGIpO2E9YS5kZWZhdWx0UHJvcHM7Zm9yKHZhciBjIGluIGEpdm9pZCAwPT09YltjXSYmKGJbY109YVtjXSk7cmV0dXJuIGJ9cmV0dXJuIGJ9dmFyIG1nPUJmKG51bGwpLG5nPW51bGwsb2c9bnVsbCxwZz1udWxsO2Z1bmN0aW9uIHFnKCl7cGc9b2c9bmc9bnVsbH1cbmZ1bmN0aW9uIHJnKGEpe3ZhciBiPW1nLmN1cnJlbnQ7SChtZyk7YS50eXBlLl9jb250ZXh0Ll9jdXJyZW50VmFsdWU9Yn1mdW5jdGlvbiBzZyhhLGIpe2Zvcig7bnVsbCE9PWE7KXt2YXIgYz1hLmFsdGVybmF0ZTtpZigoYS5jaGlsZExhbmVzJmIpPT09YilpZihudWxsPT09Y3x8KGMuY2hpbGRMYW5lcyZiKT09PWIpYnJlYWs7ZWxzZSBjLmNoaWxkTGFuZXN8PWI7ZWxzZSBhLmNoaWxkTGFuZXN8PWIsbnVsbCE9PWMmJihjLmNoaWxkTGFuZXN8PWIpO2E9YS5yZXR1cm59fWZ1bmN0aW9uIHRnKGEsYil7bmc9YTtwZz1vZz1udWxsO2E9YS5kZXBlbmRlbmNpZXM7bnVsbCE9PWEmJm51bGwhPT1hLmZpcnN0Q29udGV4dCYmKDAhPT0oYS5sYW5lcyZiKSYmKHVnPSEwKSxhLmZpcnN0Q29udGV4dD1udWxsKX1cbmZ1bmN0aW9uIHZnKGEsYil7aWYocGchPT1hJiYhMSE9PWImJjAhPT1iKXtpZihcIm51bWJlclwiIT09dHlwZW9mIGJ8fDEwNzM3NDE4MjM9PT1iKXBnPWEsYj0xMDczNzQxODIzO2I9e2NvbnRleHQ6YSxvYnNlcnZlZEJpdHM6YixuZXh0Om51bGx9O2lmKG51bGw9PT1vZyl7aWYobnVsbD09PW5nKXRocm93IEVycm9yKHkoMzA4KSk7b2c9YjtuZy5kZXBlbmRlbmNpZXM9e2xhbmVzOjAsZmlyc3RDb250ZXh0OmIscmVzcG9uZGVyczpudWxsfX1lbHNlIG9nPW9nLm5leHQ9Yn1yZXR1cm4gYS5fY3VycmVudFZhbHVlfXZhciB3Zz0hMTtmdW5jdGlvbiB4ZyhhKXthLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGx9LGVmZmVjdHM6bnVsbH19XG5mdW5jdGlvbiB5ZyhhLGIpe2E9YS51cGRhdGVRdWV1ZTtiLnVwZGF0ZVF1ZXVlPT09YSYmKGIudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTphLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6YS5maXJzdEJhc2VVcGRhdGUsbGFzdEJhc2VVcGRhdGU6YS5sYXN0QmFzZVVwZGF0ZSxzaGFyZWQ6YS5zaGFyZWQsZWZmZWN0czphLmVmZmVjdHN9KX1mdW5jdGlvbiB6ZyhhLGIpe3JldHVybntldmVudFRpbWU6YSxsYW5lOmIsdGFnOjAscGF5bG9hZDpudWxsLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfX1mdW5jdGlvbiBBZyhhLGIpe2E9YS51cGRhdGVRdWV1ZTtpZihudWxsIT09YSl7YT1hLnNoYXJlZDt2YXIgYz1hLnBlbmRpbmc7bnVsbD09PWM/Yi5uZXh0PWI6KGIubmV4dD1jLm5leHQsYy5uZXh0PWIpO2EucGVuZGluZz1ifX1cbmZ1bmN0aW9uIEJnKGEsYil7dmFyIGM9YS51cGRhdGVRdWV1ZSxkPWEuYWx0ZXJuYXRlO2lmKG51bGwhPT1kJiYoZD1kLnVwZGF0ZVF1ZXVlLGM9PT1kKSl7dmFyIGU9bnVsbCxmPW51bGw7Yz1jLmZpcnN0QmFzZVVwZGF0ZTtpZihudWxsIT09Yyl7ZG97dmFyIGc9e2V2ZW50VGltZTpjLmV2ZW50VGltZSxsYW5lOmMubGFuZSx0YWc6Yy50YWcscGF5bG9hZDpjLnBheWxvYWQsY2FsbGJhY2s6Yy5jYWxsYmFjayxuZXh0Om51bGx9O251bGw9PT1mP2U9Zj1nOmY9Zi5uZXh0PWc7Yz1jLm5leHR9d2hpbGUobnVsbCE9PWMpO251bGw9PT1mP2U9Zj1iOmY9Zi5uZXh0PWJ9ZWxzZSBlPWY9YjtjPXtiYXNlU3RhdGU6ZC5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmUsbGFzdEJhc2VVcGRhdGU6ZixzaGFyZWQ6ZC5zaGFyZWQsZWZmZWN0czpkLmVmZmVjdHN9O2EudXBkYXRlUXVldWU9YztyZXR1cm59YT1jLmxhc3RCYXNlVXBkYXRlO251bGw9PT1hP2MuZmlyc3RCYXNlVXBkYXRlPWI6YS5uZXh0PVxuYjtjLmxhc3RCYXNlVXBkYXRlPWJ9XG5mdW5jdGlvbiBDZyhhLGIsYyxkKXt2YXIgZT1hLnVwZGF0ZVF1ZXVlO3dnPSExO3ZhciBmPWUuZmlyc3RCYXNlVXBkYXRlLGc9ZS5sYXN0QmFzZVVwZGF0ZSxoPWUuc2hhcmVkLnBlbmRpbmc7aWYobnVsbCE9PWgpe2Uuc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgaz1oLGw9ay5uZXh0O2submV4dD1udWxsO251bGw9PT1nP2Y9bDpnLm5leHQ9bDtnPWs7dmFyIG49YS5hbHRlcm5hdGU7aWYobnVsbCE9PW4pe249bi51cGRhdGVRdWV1ZTt2YXIgQT1uLmxhc3RCYXNlVXBkYXRlO0EhPT1nJiYobnVsbD09PUE/bi5maXJzdEJhc2VVcGRhdGU9bDpBLm5leHQ9bCxuLmxhc3RCYXNlVXBkYXRlPWspfX1pZihudWxsIT09Zil7QT1lLmJhc2VTdGF0ZTtnPTA7bj1sPWs9bnVsbDtkb3toPWYubGFuZTt2YXIgcD1mLmV2ZW50VGltZTtpZigoZCZoKT09PWgpe251bGwhPT1uJiYobj1uLm5leHQ9e2V2ZW50VGltZTpwLGxhbmU6MCx0YWc6Zi50YWcscGF5bG9hZDpmLnBheWxvYWQsY2FsbGJhY2s6Zi5jYWxsYmFjayxcbm5leHQ6bnVsbH0pO2E6e3ZhciBDPWEseD1mO2g9YjtwPWM7c3dpdGNoKHgudGFnKXtjYXNlIDE6Qz14LnBheWxvYWQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIEMpe0E9Qy5jYWxsKHAsQSxoKTticmVhayBhfUE9QzticmVhayBhO2Nhc2UgMzpDLmZsYWdzPUMuZmxhZ3MmLTQwOTd8NjQ7Y2FzZSAwOkM9eC5wYXlsb2FkO2g9XCJmdW5jdGlvblwiPT09dHlwZW9mIEM/Qy5jYWxsKHAsQSxoKTpDO2lmKG51bGw9PT1ofHx2b2lkIDA9PT1oKWJyZWFrIGE7QT1tKHt9LEEsaCk7YnJlYWsgYTtjYXNlIDI6d2c9ITB9fW51bGwhPT1mLmNhbGxiYWNrJiYoYS5mbGFnc3w9MzIsaD1lLmVmZmVjdHMsbnVsbD09PWg/ZS5lZmZlY3RzPVtmXTpoLnB1c2goZikpfWVsc2UgcD17ZXZlbnRUaW1lOnAsbGFuZTpoLHRhZzpmLnRhZyxwYXlsb2FkOmYucGF5bG9hZCxjYWxsYmFjazpmLmNhbGxiYWNrLG5leHQ6bnVsbH0sbnVsbD09PW4/KGw9bj1wLGs9QSk6bj1uLm5leHQ9cCxnfD1oO2Y9Zi5uZXh0O2lmKG51bGw9PT1cbmYpaWYoaD1lLnNoYXJlZC5wZW5kaW5nLG51bGw9PT1oKWJyZWFrO2Vsc2UgZj1oLm5leHQsaC5uZXh0PW51bGwsZS5sYXN0QmFzZVVwZGF0ZT1oLGUuc2hhcmVkLnBlbmRpbmc9bnVsbH13aGlsZSgxKTtudWxsPT09biYmKGs9QSk7ZS5iYXNlU3RhdGU9aztlLmZpcnN0QmFzZVVwZGF0ZT1sO2UubGFzdEJhc2VVcGRhdGU9bjtEZ3w9ZzthLmxhbmVzPWc7YS5tZW1vaXplZFN0YXRlPUF9fWZ1bmN0aW9uIEVnKGEsYixjKXthPWIuZWZmZWN0cztiLmVmZmVjdHM9bnVsbDtpZihudWxsIT09YSlmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLGU9ZC5jYWxsYmFjaztpZihudWxsIT09ZSl7ZC5jYWxsYmFjaz1udWxsO2Q9YztpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZSl0aHJvdyBFcnJvcih5KDE5MSxlKSk7ZS5jYWxsKGQpfX19dmFyIEZnPShuZXcgYWEuQ29tcG9uZW50KS5yZWZzO1xuZnVuY3Rpb24gR2coYSxiLGMsZCl7Yj1hLm1lbW9pemVkU3RhdGU7Yz1jKGQsYik7Yz1udWxsPT09Y3x8dm9pZCAwPT09Yz9iOm0oe30sYixjKTthLm1lbW9pemVkU3RhdGU9YzswPT09YS5sYW5lcyYmKGEudXBkYXRlUXVldWUuYmFzZVN0YXRlPWMpfVxudmFyIEtnPXtpc01vdW50ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5fcmVhY3RJbnRlcm5hbHMpP1piKGEpPT09YTohMX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGEsYixjKXthPWEuX3JlYWN0SW50ZXJuYWxzO3ZhciBkPUhnKCksZT1JZyhhKSxmPXpnKGQsZSk7Zi5wYXlsb2FkPWI7dm9pZCAwIT09YyYmbnVsbCE9PWMmJihmLmNhbGxiYWNrPWMpO0FnKGEsZik7SmcoYSxlLGQpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGEsYixjKXthPWEuX3JlYWN0SW50ZXJuYWxzO3ZhciBkPUhnKCksZT1JZyhhKSxmPXpnKGQsZSk7Zi50YWc9MTtmLnBheWxvYWQ9Yjt2b2lkIDAhPT1jJiZudWxsIT09YyYmKGYuY2FsbGJhY2s9Yyk7QWcoYSxmKTtKZyhhLGUsZCl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihhLGIpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGM9SGcoKSxkPUlnKGEpLGU9emcoYyxkKTtlLnRhZz0yO3ZvaWQgMCE9PWImJm51bGwhPT1iJiYoZS5jYWxsYmFjaz1cbmIpO0FnKGEsZSk7SmcoYSxkLGMpfX07ZnVuY3Rpb24gTGcoYSxiLGMsZCxlLGYsZyl7YT1hLnN0YXRlTm9kZTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYS5zaG91bGRDb21wb25lbnRVcGRhdGU/YS5zaG91bGRDb21wb25lbnRVcGRhdGUoZCxmLGcpOmIucHJvdG90eXBlJiZiLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hSmUoYyxkKXx8IUplKGUsZik6ITB9XG5mdW5jdGlvbiBNZyhhLGIsYyl7dmFyIGQ9ITEsZT1DZjt2YXIgZj1iLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY/Zj12ZyhmKTooZT1GZihiKT9EZjpNLmN1cnJlbnQsZD1iLmNvbnRleHRUeXBlcyxmPShkPW51bGwhPT1kJiZ2b2lkIDAhPT1kKT9FZihhLGUpOkNmKTtiPW5ldyBiKGMsZik7YS5tZW1vaXplZFN0YXRlPW51bGwhPT1iLnN0YXRlJiZ2b2lkIDAhPT1iLnN0YXRlP2Iuc3RhdGU6bnVsbDtiLnVwZGF0ZXI9S2c7YS5zdGF0ZU5vZGU9YjtiLl9yZWFjdEludGVybmFscz1hO2QmJihhPWEuc3RhdGVOb2RlLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD1lLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9Zik7cmV0dXJuIGJ9XG5mdW5jdGlvbiBOZyhhLGIsYyxkKXthPWIuc3RhdGU7XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmYi5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMsZCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmIuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYyxkKTtiLnN0YXRlIT09YSYmS2cuZW5xdWV1ZVJlcGxhY2VTdGF0ZShiLGIuc3RhdGUsbnVsbCl9XG5mdW5jdGlvbiBPZyhhLGIsYyxkKXt2YXIgZT1hLnN0YXRlTm9kZTtlLnByb3BzPWM7ZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGU7ZS5yZWZzPUZnO3hnKGEpO3ZhciBmPWIuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09Zj9lLmNvbnRleHQ9dmcoZik6KGY9RmYoYik/RGY6TS5jdXJyZW50LGUuY29udGV4dD1FZihhLGYpKTtDZyhhLGMsZSxkKTtlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtmPWIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBmJiYoR2coYSxiLGYsYyksZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGUpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc3x8XCJmdW5jdGlvblwiPT09dHlwZW9mIGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLmNvbXBvbmVudFdpbGxNb3VudHx8XG4oYj1lLnN0YXRlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmNvbXBvbmVudFdpbGxNb3VudCYmZS5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSxiIT09ZS5zdGF0ZSYmS2cuZW5xdWV1ZVJlcGxhY2VTdGF0ZShlLGUuc3RhdGUsbnVsbCksQ2coYSxjLGUsZCksZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGUpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmNvbXBvbmVudERpZE1vdW50JiYoYS5mbGFnc3w9NCl9dmFyIFBnPUFycmF5LmlzQXJyYXk7XG5mdW5jdGlvbiBRZyhhLGIsYyl7YT1jLnJlZjtpZihudWxsIT09YSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJlwib2JqZWN0XCIhPT10eXBlb2YgYSl7aWYoYy5fb3duZXIpe2M9Yy5fb3duZXI7aWYoYyl7aWYoMSE9PWMudGFnKXRocm93IEVycm9yKHkoMzA5KSk7dmFyIGQ9Yy5zdGF0ZU5vZGV9aWYoIWQpdGhyb3cgRXJyb3IoeSgxNDcsYSkpO3ZhciBlPVwiXCIrYTtpZihudWxsIT09YiYmbnVsbCE9PWIucmVmJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5yZWYmJmIucmVmLl9zdHJpbmdSZWY9PT1lKXJldHVybiBiLnJlZjtiPWZ1bmN0aW9uKGEpe3ZhciBiPWQucmVmcztiPT09RmcmJihiPWQucmVmcz17fSk7bnVsbD09PWE/ZGVsZXRlIGJbZV06YltlXT1hfTtiLl9zdHJpbmdSZWY9ZTtyZXR1cm4gYn1pZihcInN0cmluZ1wiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IoeSgyODQpKTtpZighYy5fb3duZXIpdGhyb3cgRXJyb3IoeSgyOTAsYSkpO31yZXR1cm4gYX1cbmZ1bmN0aW9uIFJnKGEsYil7aWYoXCJ0ZXh0YXJlYVwiIT09YS50eXBlKXRocm93IEVycm9yKHkoMzEsXCJbb2JqZWN0IE9iamVjdF1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiKT9cIm9iamVjdCB3aXRoIGtleXMge1wiK09iamVjdC5rZXlzKGIpLmpvaW4oXCIsIFwiKStcIn1cIjpiKSk7fVxuZnVuY3Rpb24gU2coYSl7ZnVuY3Rpb24gYihiLGMpe2lmKGEpe3ZhciBkPWIubGFzdEVmZmVjdDtudWxsIT09ZD8oZC5uZXh0RWZmZWN0PWMsYi5sYXN0RWZmZWN0PWMpOmIuZmlyc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0PWM7Yy5uZXh0RWZmZWN0PW51bGw7Yy5mbGFncz04fX1mdW5jdGlvbiBjKGMsZCl7aWYoIWEpcmV0dXJuIG51bGw7Zm9yKDtudWxsIT09ZDspYihjLGQpLGQ9ZC5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIGQoYSxiKXtmb3IoYT1uZXcgTWFwO251bGwhPT1iOyludWxsIT09Yi5rZXk/YS5zZXQoYi5rZXksYik6YS5zZXQoYi5pbmRleCxiKSxiPWIuc2libGluZztyZXR1cm4gYX1mdW5jdGlvbiBlKGEsYil7YT1UZyhhLGIpO2EuaW5kZXg9MDthLnNpYmxpbmc9bnVsbDtyZXR1cm4gYX1mdW5jdGlvbiBmKGIsYyxkKXtiLmluZGV4PWQ7aWYoIWEpcmV0dXJuIGM7ZD1iLmFsdGVybmF0ZTtpZihudWxsIT09ZClyZXR1cm4gZD1kLmluZGV4LGQ8Yz8oYi5mbGFncz0yLFxuYyk6ZDtiLmZsYWdzPTI7cmV0dXJuIGN9ZnVuY3Rpb24gZyhiKXthJiZudWxsPT09Yi5hbHRlcm5hdGUmJihiLmZsYWdzPTIpO3JldHVybiBifWZ1bmN0aW9uIGgoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDYhPT1iLnRhZylyZXR1cm4gYj1VZyhjLGEubW9kZSxkKSxiLnJldHVybj1hLGI7Yj1lKGIsYyk7Yi5yZXR1cm49YTtyZXR1cm4gYn1mdW5jdGlvbiBrKGEsYixjLGQpe2lmKG51bGwhPT1iJiZiLmVsZW1lbnRUeXBlPT09Yy50eXBlKXJldHVybiBkPWUoYixjLnByb3BzKSxkLnJlZj1RZyhhLGIsYyksZC5yZXR1cm49YSxkO2Q9VmcoYy50eXBlLGMua2V5LGMucHJvcHMsbnVsbCxhLm1vZGUsZCk7ZC5yZWY9UWcoYSxiLGMpO2QucmV0dXJuPWE7cmV0dXJuIGR9ZnVuY3Rpb24gbChhLGIsYyxkKXtpZihudWxsPT09Ynx8NCE9PWIudGFnfHxiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIT09Yy5jb250YWluZXJJbmZvfHxiLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiE9PWMuaW1wbGVtZW50YXRpb24pcmV0dXJuIGI9XG5XZyhjLGEubW9kZSxkKSxiLnJldHVybj1hLGI7Yj1lKGIsYy5jaGlsZHJlbnx8W10pO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gbihhLGIsYyxkLGYpe2lmKG51bGw9PT1ifHw3IT09Yi50YWcpcmV0dXJuIGI9WGcoYyxhLm1vZGUsZCxmKSxiLnJldHVybj1hLGI7Yj1lKGIsYyk7Yi5yZXR1cm49YTtyZXR1cm4gYn1mdW5jdGlvbiBBKGEsYixjKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGJ8fFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gYj1VZyhcIlwiK2IsYS5tb2RlLGMpLGIucmV0dXJuPWEsYjtpZihcIm9iamVjdFwiPT09dHlwZW9mIGImJm51bGwhPT1iKXtzd2l0Y2goYi4kJHR5cGVvZil7Y2FzZSBzYTpyZXR1cm4gYz1WZyhiLnR5cGUsYi5rZXksYi5wcm9wcyxudWxsLGEubW9kZSxjKSxjLnJlZj1RZyhhLG51bGwsYiksYy5yZXR1cm49YSxjO2Nhc2UgdGE6cmV0dXJuIGI9V2coYixhLm1vZGUsYyksYi5yZXR1cm49YSxifWlmKFBnKGIpfHxMYShiKSlyZXR1cm4gYj1YZyhiLFxuYS5tb2RlLGMsbnVsbCksYi5yZXR1cm49YSxiO1JnKGEsYil9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcChhLGIsYyxkKXt2YXIgZT1udWxsIT09Yj9iLmtleTpudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgY3x8XCJudW1iZXJcIj09PXR5cGVvZiBjKXJldHVybiBudWxsIT09ZT9udWxsOmgoYSxiLFwiXCIrYyxkKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGMmJm51bGwhPT1jKXtzd2l0Y2goYy4kJHR5cGVvZil7Y2FzZSBzYTpyZXR1cm4gYy5rZXk9PT1lP2MudHlwZT09PXVhP24oYSxiLGMucHJvcHMuY2hpbGRyZW4sZCxlKTprKGEsYixjLGQpOm51bGw7Y2FzZSB0YTpyZXR1cm4gYy5rZXk9PT1lP2woYSxiLGMsZCk6bnVsbH1pZihQZyhjKXx8TGEoYykpcmV0dXJuIG51bGwhPT1lP251bGw6bihhLGIsYyxkLG51bGwpO1JnKGEsYyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2lmKFwic3RyaW5nXCI9PT10eXBlb2YgZHx8XCJudW1iZXJcIj09PXR5cGVvZiBkKXJldHVybiBhPWEuZ2V0KGMpfHxcbm51bGwsaChiLGEsXCJcIitkLGUpO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgZCYmbnVsbCE9PWQpe3N3aXRjaChkLiQkdHlwZW9mKXtjYXNlIHNhOnJldHVybiBhPWEuZ2V0KG51bGw9PT1kLmtleT9jOmQua2V5KXx8bnVsbCxkLnR5cGU9PT11YT9uKGIsYSxkLnByb3BzLmNoaWxkcmVuLGUsZC5rZXkpOmsoYixhLGQsZSk7Y2FzZSB0YTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsbChiLGEsZCxlKX1pZihQZyhkKXx8TGEoZCkpcmV0dXJuIGE9YS5nZXQoYyl8fG51bGwsbihiLGEsZCxlLG51bGwpO1JnKGIsZCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24geChlLGcsaCxrKXtmb3IodmFyIGw9bnVsbCx0PW51bGwsdT1nLHo9Zz0wLHE9bnVsbDtudWxsIT09dSYmejxoLmxlbmd0aDt6Kyspe3UuaW5kZXg+ej8ocT11LHU9bnVsbCk6cT11LnNpYmxpbmc7dmFyIG49cChlLHUsaFt6XSxrKTtpZihudWxsPT09bil7bnVsbD09PXUmJih1PXEpO2JyZWFrfWEmJnUmJm51bGw9PT1cbm4uYWx0ZXJuYXRlJiZiKGUsdSk7Zz1mKG4sZyx6KTtudWxsPT09dD9sPW46dC5zaWJsaW5nPW47dD1uO3U9cX1pZih6PT09aC5sZW5ndGgpcmV0dXJuIGMoZSx1KSxsO2lmKG51bGw9PT11KXtmb3IoO3o8aC5sZW5ndGg7eisrKXU9QShlLGhbel0sayksbnVsbCE9PXUmJihnPWYodSxnLHopLG51bGw9PT10P2w9dTp0LnNpYmxpbmc9dSx0PXUpO3JldHVybiBsfWZvcih1PWQoZSx1KTt6PGgubGVuZ3RoO3orKylxPUModSxlLHosaFt6XSxrKSxudWxsIT09cSYmKGEmJm51bGwhPT1xLmFsdGVybmF0ZSYmdS5kZWxldGUobnVsbD09PXEua2V5P3o6cS5rZXkpLGc9ZihxLGcseiksbnVsbD09PXQ/bD1xOnQuc2libGluZz1xLHQ9cSk7YSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBiKGUsYSl9KTtyZXR1cm4gbH1mdW5jdGlvbiB3KGUsZyxoLGspe3ZhciBsPUxhKGgpO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBsKXRocm93IEVycm9yKHkoMTUwKSk7aD1sLmNhbGwoaCk7aWYobnVsbD09XG5oKXRocm93IEVycm9yKHkoMTUxKSk7Zm9yKHZhciB0PWw9bnVsbCx1PWcsej1nPTAscT1udWxsLG49aC5uZXh0KCk7bnVsbCE9PXUmJiFuLmRvbmU7eisrLG49aC5uZXh0KCkpe3UuaW5kZXg+ej8ocT11LHU9bnVsbCk6cT11LnNpYmxpbmc7dmFyIHc9cChlLHUsbi52YWx1ZSxrKTtpZihudWxsPT09dyl7bnVsbD09PXUmJih1PXEpO2JyZWFrfWEmJnUmJm51bGw9PT13LmFsdGVybmF0ZSYmYihlLHUpO2c9Zih3LGcseik7bnVsbD09PXQ/bD13OnQuc2libGluZz13O3Q9dzt1PXF9aWYobi5kb25lKXJldHVybiBjKGUsdSksbDtpZihudWxsPT09dSl7Zm9yKDshbi5kb25lO3orKyxuPWgubmV4dCgpKW49QShlLG4udmFsdWUsayksbnVsbCE9PW4mJihnPWYobixnLHopLG51bGw9PT10P2w9bjp0LnNpYmxpbmc9bix0PW4pO3JldHVybiBsfWZvcih1PWQoZSx1KTshbi5kb25lO3orKyxuPWgubmV4dCgpKW49Qyh1LGUseixuLnZhbHVlLGspLG51bGwhPT1uJiYoYSYmbnVsbCE9PW4uYWx0ZXJuYXRlJiZcbnUuZGVsZXRlKG51bGw9PT1uLmtleT96Om4ua2V5KSxnPWYobixnLHopLG51bGw9PT10P2w9bjp0LnNpYmxpbmc9bix0PW4pO2EmJnUuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYihlLGEpfSk7cmV0dXJuIGx9cmV0dXJuIGZ1bmN0aW9uKGEsZCxmLGgpe3ZhciBrPVwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWYmJmYudHlwZT09PXVhJiZudWxsPT09Zi5rZXk7ayYmKGY9Zi5wcm9wcy5jaGlsZHJlbik7dmFyIGw9XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09ZjtpZihsKXN3aXRjaChmLiQkdHlwZW9mKXtjYXNlIHNhOmE6e2w9Zi5rZXk7Zm9yKGs9ZDtudWxsIT09azspe2lmKGsua2V5PT09bCl7c3dpdGNoKGsudGFnKXtjYXNlIDc6aWYoZi50eXBlPT09dWEpe2MoYSxrLnNpYmxpbmcpO2Q9ZShrLGYucHJvcHMuY2hpbGRyZW4pO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9YnJlYWs7ZGVmYXVsdDppZihrLmVsZW1lbnRUeXBlPT09Zi50eXBlKXtjKGEsay5zaWJsaW5nKTtcbmQ9ZShrLGYucHJvcHMpO2QucmVmPVFnKGEsayxmKTtkLnJldHVybj1hO2E9ZDticmVhayBhfX1jKGEsayk7YnJlYWt9ZWxzZSBiKGEsayk7az1rLnNpYmxpbmd9Zi50eXBlPT09dWE/KGQ9WGcoZi5wcm9wcy5jaGlsZHJlbixhLm1vZGUsaCxmLmtleSksZC5yZXR1cm49YSxhPWQpOihoPVZnKGYudHlwZSxmLmtleSxmLnByb3BzLG51bGwsYS5tb2RlLGgpLGgucmVmPVFnKGEsZCxmKSxoLnJldHVybj1hLGE9aCl9cmV0dXJuIGcoYSk7Y2FzZSB0YTphOntmb3Ioaz1mLmtleTtudWxsIT09ZDspe2lmKGQua2V5PT09aylpZig0PT09ZC50YWcmJmQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT1mLmNvbnRhaW5lckluZm8mJmQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09Zi5pbXBsZW1lbnRhdGlvbil7YyhhLGQuc2libGluZyk7ZD1lKGQsZi5jaGlsZHJlbnx8W10pO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9ZWxzZXtjKGEsZCk7YnJlYWt9ZWxzZSBiKGEsZCk7ZD1kLnNpYmxpbmd9ZD1cbldnKGYsYS5tb2RlLGgpO2QucmV0dXJuPWE7YT1kfXJldHVybiBnKGEpfWlmKFwic3RyaW5nXCI9PT10eXBlb2YgZnx8XCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBmPVwiXCIrZixudWxsIT09ZCYmNj09PWQudGFnPyhjKGEsZC5zaWJsaW5nKSxkPWUoZCxmKSxkLnJldHVybj1hLGE9ZCk6KGMoYSxkKSxkPVVnKGYsYS5tb2RlLGgpLGQucmV0dXJuPWEsYT1kKSxnKGEpO2lmKFBnKGYpKXJldHVybiB4KGEsZCxmLGgpO2lmKExhKGYpKXJldHVybiB3KGEsZCxmLGgpO2wmJlJnKGEsZik7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBmJiYhaylzd2l0Y2goYS50YWcpe2Nhc2UgMTpjYXNlIDIyOmNhc2UgMDpjYXNlIDExOmNhc2UgMTU6dGhyb3cgRXJyb3IoeSgxNTIsUmEoYS50eXBlKXx8XCJDb21wb25lbnRcIikpO31yZXR1cm4gYyhhLGQpfX12YXIgWWc9U2coITApLFpnPVNnKCExKSwkZz17fSxhaD1CZigkZyksYmg9QmYoJGcpLGNoPUJmKCRnKTtcbmZ1bmN0aW9uIGRoKGEpe2lmKGE9PT0kZyl0aHJvdyBFcnJvcih5KDE3NCkpO3JldHVybiBhfWZ1bmN0aW9uIGVoKGEsYil7SShjaCxiKTtJKGJoLGEpO0koYWgsJGcpO2E9Yi5ub2RlVHlwZTtzd2l0Y2goYSl7Y2FzZSA5OmNhc2UgMTE6Yj0oYj1iLmRvY3VtZW50RWxlbWVudCk/Yi5uYW1lc3BhY2VVUkk6bWIobnVsbCxcIlwiKTticmVhaztkZWZhdWx0OmE9OD09PWE/Yi5wYXJlbnROb2RlOmIsYj1hLm5hbWVzcGFjZVVSSXx8bnVsbCxhPWEudGFnTmFtZSxiPW1iKGIsYSl9SChhaCk7SShhaCxiKX1mdW5jdGlvbiBmaCgpe0goYWgpO0goYmgpO0goY2gpfWZ1bmN0aW9uIGdoKGEpe2RoKGNoLmN1cnJlbnQpO3ZhciBiPWRoKGFoLmN1cnJlbnQpO3ZhciBjPW1iKGIsYS50eXBlKTtiIT09YyYmKEkoYmgsYSksSShhaCxjKSl9ZnVuY3Rpb24gaGgoYSl7YmguY3VycmVudD09PWEmJihIKGFoKSxIKGJoKSl9dmFyIFA9QmYoMCk7XG5mdW5jdGlvbiBpaChhKXtmb3IodmFyIGI9YTtudWxsIT09Yjspe2lmKDEzPT09Yi50YWcpe3ZhciBjPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YyYmKGM9Yy5kZWh5ZHJhdGVkLG51bGw9PT1jfHxcIiQ/XCI9PT1jLmRhdGF8fFwiJCFcIj09PWMuZGF0YSkpcmV0dXJuIGJ9ZWxzZSBpZigxOT09PWIudGFnJiZ2b2lkIDAhPT1iLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIpe2lmKDAhPT0oYi5mbGFncyY2NCkpcmV0dXJuIGJ9ZWxzZSBpZihudWxsIT09Yi5jaGlsZCl7Yi5jaGlsZC5yZXR1cm49YjtiPWIuY2hpbGQ7Y29udGludWV9aWYoYj09PWEpYnJlYWs7Zm9yKDtudWxsPT09Yi5zaWJsaW5nOyl7aWYobnVsbD09PWIucmV0dXJufHxiLnJldHVybj09PWEpcmV0dXJuIG51bGw7Yj1iLnJldHVybn1iLnNpYmxpbmcucmV0dXJuPWIucmV0dXJuO2I9Yi5zaWJsaW5nfXJldHVybiBudWxsfXZhciBqaD1udWxsLGtoPW51bGwsbGg9ITE7XG5mdW5jdGlvbiBtaChhLGIpe3ZhciBjPW5oKDUsbnVsbCxudWxsLDApO2MuZWxlbWVudFR5cGU9XCJERUxFVEVEXCI7Yy50eXBlPVwiREVMRVRFRFwiO2Muc3RhdGVOb2RlPWI7Yy5yZXR1cm49YTtjLmZsYWdzPTg7bnVsbCE9PWEubGFzdEVmZmVjdD8oYS5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YyxhLmxhc3RFZmZlY3Q9Yyk6YS5maXJzdEVmZmVjdD1hLmxhc3RFZmZlY3Q9Y31mdW5jdGlvbiBvaChhLGIpe3N3aXRjaChhLnRhZyl7Y2FzZSA1OnZhciBjPWEudHlwZTtiPTEhPT1iLm5vZGVUeXBlfHxjLnRvTG93ZXJDYXNlKCkhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/bnVsbDpiO3JldHVybiBudWxsIT09Yj8oYS5zdGF0ZU5vZGU9YiwhMCk6ITE7Y2FzZSA2OnJldHVybiBiPVwiXCI9PT1hLnBlbmRpbmdQcm9wc3x8MyE9PWIubm9kZVR5cGU/bnVsbDpiLG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLCEwKTohMTtjYXNlIDEzOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITF9fVxuZnVuY3Rpb24gcGgoYSl7aWYobGgpe3ZhciBiPWtoO2lmKGIpe3ZhciBjPWI7aWYoIW9oKGEsYikpe2I9cmYoYy5uZXh0U2libGluZyk7aWYoIWJ8fCFvaChhLGIpKXthLmZsYWdzPWEuZmxhZ3MmLTEwMjV8MjtsaD0hMTtqaD1hO3JldHVybn1taChqaCxjKX1qaD1hO2toPXJmKGIuZmlyc3RDaGlsZCl9ZWxzZSBhLmZsYWdzPWEuZmxhZ3MmLTEwMjV8MixsaD0hMSxqaD1hfX1mdW5jdGlvbiBxaChhKXtmb3IoYT1hLnJldHVybjtudWxsIT09YSYmNSE9PWEudGFnJiYzIT09YS50YWcmJjEzIT09YS50YWc7KWE9YS5yZXR1cm47amg9YX1cbmZ1bmN0aW9uIHJoKGEpe2lmKGEhPT1qaClyZXR1cm4hMTtpZighbGgpcmV0dXJuIHFoKGEpLGxoPSEwLCExO3ZhciBiPWEudHlwZTtpZig1IT09YS50YWd8fFwiaGVhZFwiIT09YiYmXCJib2R5XCIhPT1iJiYhbmYoYixhLm1lbW9pemVkUHJvcHMpKWZvcihiPWtoO2I7KW1oKGEsYiksYj1yZihiLm5leHRTaWJsaW5nKTtxaChhKTtpZigxMz09PWEudGFnKXthPWEubWVtb2l6ZWRTdGF0ZTthPW51bGwhPT1hP2EuZGVoeWRyYXRlZDpudWxsO2lmKCFhKXRocm93IEVycm9yKHkoMzE3KSk7YTp7YT1hLm5leHRTaWJsaW5nO2ZvcihiPTA7YTspe2lmKDg9PT1hLm5vZGVUeXBlKXt2YXIgYz1hLmRhdGE7aWYoXCIvJFwiPT09Yyl7aWYoMD09PWIpe2toPXJmKGEubmV4dFNpYmxpbmcpO2JyZWFrIGF9Yi0tfWVsc2VcIiRcIiE9PWMmJlwiJCFcIiE9PWMmJlwiJD9cIiE9PWN8fGIrK31hPWEubmV4dFNpYmxpbmd9a2g9bnVsbH19ZWxzZSBraD1qaD9yZihhLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1cbmZ1bmN0aW9uIHNoKCl7a2g9amg9bnVsbDtsaD0hMX12YXIgdGg9W107ZnVuY3Rpb24gdWgoKXtmb3IodmFyIGE9MDthPHRoLmxlbmd0aDthKyspdGhbYV0uX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk9bnVsbDt0aC5sZW5ndGg9MH12YXIgdmg9cmEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcix3aD1yYS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyx4aD0wLFI9bnVsbCxTPW51bGwsVD1udWxsLHloPSExLHpoPSExO2Z1bmN0aW9uIEFoKCl7dGhyb3cgRXJyb3IoeSgzMjEpKTt9ZnVuY3Rpb24gQmgoYSxiKXtpZihudWxsPT09YilyZXR1cm4hMTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoJiZjPGEubGVuZ3RoO2MrKylpZighSGUoYVtjXSxiW2NdKSlyZXR1cm4hMTtyZXR1cm4hMH1cbmZ1bmN0aW9uIENoKGEsYixjLGQsZSxmKXt4aD1mO1I9YjtiLm1lbW9pemVkU3RhdGU9bnVsbDtiLnVwZGF0ZVF1ZXVlPW51bGw7Yi5sYW5lcz0wO3ZoLmN1cnJlbnQ9bnVsbD09PWF8fG51bGw9PT1hLm1lbW9pemVkU3RhdGU/RGg6RWg7YT1jKGQsZSk7aWYoemgpe2Y9MDtkb3t6aD0hMTtpZighKDI1PmYpKXRocm93IEVycm9yKHkoMzAxKSk7Zis9MTtUPVM9bnVsbDtiLnVwZGF0ZVF1ZXVlPW51bGw7dmguY3VycmVudD1GaDthPWMoZCxlKX13aGlsZSh6aCl9dmguY3VycmVudD1HaDtiPW51bGwhPT1TJiZudWxsIT09Uy5uZXh0O3hoPTA7VD1TPVI9bnVsbDt5aD0hMTtpZihiKXRocm93IEVycm9yKHkoMzAwKSk7cmV0dXJuIGF9ZnVuY3Rpb24gSGgoKXt2YXIgYT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtudWxsPT09VD9SLm1lbW9pemVkU3RhdGU9VD1hOlQ9VC5uZXh0PWE7cmV0dXJuIFR9XG5mdW5jdGlvbiBJaCgpe2lmKG51bGw9PT1TKXt2YXIgYT1SLmFsdGVybmF0ZTthPW51bGwhPT1hP2EubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgYT1TLm5leHQ7dmFyIGI9bnVsbD09PVQ/Ui5tZW1vaXplZFN0YXRlOlQubmV4dDtpZihudWxsIT09YilUPWIsUz1hO2Vsc2V7aWYobnVsbD09PWEpdGhyb3cgRXJyb3IoeSgzMTApKTtTPWE7YT17bWVtb2l6ZWRTdGF0ZTpTLm1lbW9pemVkU3RhdGUsYmFzZVN0YXRlOlMuYmFzZVN0YXRlLGJhc2VRdWV1ZTpTLmJhc2VRdWV1ZSxxdWV1ZTpTLnF1ZXVlLG5leHQ6bnVsbH07bnVsbD09PVQ/Ui5tZW1vaXplZFN0YXRlPVQ9YTpUPVQubmV4dD1hfXJldHVybiBUfWZ1bmN0aW9uIEpoKGEsYil7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YihhKTpifVxuZnVuY3Rpb24gS2goYSl7dmFyIGI9SWgoKSxjPWIucXVldWU7aWYobnVsbD09PWMpdGhyb3cgRXJyb3IoeSgzMTEpKTtjLmxhc3RSZW5kZXJlZFJlZHVjZXI9YTt2YXIgZD1TLGU9ZC5iYXNlUXVldWUsZj1jLnBlbmRpbmc7aWYobnVsbCE9PWYpe2lmKG51bGwhPT1lKXt2YXIgZz1lLm5leHQ7ZS5uZXh0PWYubmV4dDtmLm5leHQ9Z31kLmJhc2VRdWV1ZT1lPWY7Yy5wZW5kaW5nPW51bGx9aWYobnVsbCE9PWUpe2U9ZS5uZXh0O2Q9ZC5iYXNlU3RhdGU7dmFyIGg9Zz1mPW51bGwsaz1lO2Rve3ZhciBsPWsubGFuZTtpZigoeGgmbCk9PT1sKW51bGwhPT1oJiYoaD1oLm5leHQ9e2xhbmU6MCxhY3Rpb246ay5hY3Rpb24sZWFnZXJSZWR1Y2VyOmsuZWFnZXJSZWR1Y2VyLGVhZ2VyU3RhdGU6ay5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLGQ9ay5lYWdlclJlZHVjZXI9PT1hP2suZWFnZXJTdGF0ZTphKGQsay5hY3Rpb24pO2Vsc2V7dmFyIG49e2xhbmU6bCxhY3Rpb246ay5hY3Rpb24sZWFnZXJSZWR1Y2VyOmsuZWFnZXJSZWR1Y2VyLFxuZWFnZXJTdGF0ZTprLmVhZ2VyU3RhdGUsbmV4dDpudWxsfTtudWxsPT09aD8oZz1oPW4sZj1kKTpoPWgubmV4dD1uO1IubGFuZXN8PWw7RGd8PWx9az1rLm5leHR9d2hpbGUobnVsbCE9PWsmJmshPT1lKTtudWxsPT09aD9mPWQ6aC5uZXh0PWc7SGUoZCxiLm1lbW9pemVkU3RhdGUpfHwodWc9ITApO2IubWVtb2l6ZWRTdGF0ZT1kO2IuYmFzZVN0YXRlPWY7Yi5iYXNlUXVldWU9aDtjLmxhc3RSZW5kZXJlZFN0YXRlPWR9cmV0dXJuW2IubWVtb2l6ZWRTdGF0ZSxjLmRpc3BhdGNoXX1cbmZ1bmN0aW9uIExoKGEpe3ZhciBiPUloKCksYz1iLnF1ZXVlO2lmKG51bGw9PT1jKXRocm93IEVycm9yKHkoMzExKSk7Yy5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGQ9Yy5kaXNwYXRjaCxlPWMucGVuZGluZyxmPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZSl7Yy5wZW5kaW5nPW51bGw7dmFyIGc9ZT1lLm5leHQ7ZG8gZj1hKGYsZy5hY3Rpb24pLGc9Zy5uZXh0O3doaWxlKGchPT1lKTtIZShmLGIubWVtb2l6ZWRTdGF0ZSl8fCh1Zz0hMCk7Yi5tZW1vaXplZFN0YXRlPWY7bnVsbD09PWIuYmFzZVF1ZXVlJiYoYi5iYXNlU3RhdGU9Zik7Yy5sYXN0UmVuZGVyZWRTdGF0ZT1mfXJldHVybltmLGRdfVxuZnVuY3Rpb24gTWgoYSxiLGMpe3ZhciBkPWIuX2dldFZlcnNpb247ZD1kKGIuX3NvdXJjZSk7dmFyIGU9Yi5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeTtpZihudWxsIT09ZSlhPWU9PT1kO2Vsc2UgaWYoYT1hLm11dGFibGVSZWFkTGFuZXMsYT0oeGgmYSk9PT1hKWIuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk9ZCx0aC5wdXNoKGIpO2lmKGEpcmV0dXJuIGMoYi5fc291cmNlKTt0aC5wdXNoKGIpO3Rocm93IEVycm9yKHkoMzUwKSk7fVxuZnVuY3Rpb24gTmgoYSxiLGMsZCl7dmFyIGU9VTtpZihudWxsPT09ZSl0aHJvdyBFcnJvcih5KDM0OSkpO3ZhciBmPWIuX2dldFZlcnNpb24sZz1mKGIuX3NvdXJjZSksaD12aC5jdXJyZW50LGs9aC51c2VTdGF0ZShmdW5jdGlvbigpe3JldHVybiBNaChlLGIsYyl9KSxsPWtbMV0sbj1rWzBdO2s9VDt2YXIgQT1hLm1lbW9pemVkU3RhdGUscD1BLnJlZnMsQz1wLmdldFNuYXBzaG90LHg9QS5zb3VyY2U7QT1BLnN1YnNjcmliZTt2YXIgdz1SO2EubWVtb2l6ZWRTdGF0ZT17cmVmczpwLHNvdXJjZTpiLHN1YnNjcmliZTpkfTtoLnVzZUVmZmVjdChmdW5jdGlvbigpe3AuZ2V0U25hcHNob3Q9YztwLnNldFNuYXBzaG90PWw7dmFyIGE9ZihiLl9zb3VyY2UpO2lmKCFIZShnLGEpKXthPWMoYi5fc291cmNlKTtIZShuLGEpfHwobChhKSxhPUlnKHcpLGUubXV0YWJsZVJlYWRMYW5lc3w9YSZlLnBlbmRpbmdMYW5lcyk7YT1lLm11dGFibGVSZWFkTGFuZXM7ZS5lbnRhbmdsZWRMYW5lc3w9YTtmb3IodmFyIGQ9XG5lLmVudGFuZ2xlbWVudHMsaD1hOzA8aDspe3ZhciBrPTMxLVZjKGgpLHY9MTw8aztkW2tdfD1hO2gmPX52fX19LFtjLGIsZF0pO2gudXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIGQoYi5fc291cmNlLGZ1bmN0aW9uKCl7dmFyIGE9cC5nZXRTbmFwc2hvdCxjPXAuc2V0U25hcHNob3Q7dHJ5e2MoYShiLl9zb3VyY2UpKTt2YXIgZD1JZyh3KTtlLm11dGFibGVSZWFkTGFuZXN8PWQmZS5wZW5kaW5nTGFuZXN9Y2F0Y2gocSl7YyhmdW5jdGlvbigpe3Rocm93IHE7fSl9fSl9LFtiLGRdKTtIZShDLGMpJiZIZSh4LGIpJiZIZShBLGQpfHwoYT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjpKaCxsYXN0UmVuZGVyZWRTdGF0ZTpufSxhLmRpc3BhdGNoPWw9T2guYmluZChudWxsLFIsYSksay5xdWV1ZT1hLGsuYmFzZVF1ZXVlPW51bGwsbj1NaChlLGIsYyksay5tZW1vaXplZFN0YXRlPWsuYmFzZVN0YXRlPW4pO3JldHVybiBufVxuZnVuY3Rpb24gUGgoYSxiLGMpe3ZhciBkPUloKCk7cmV0dXJuIE5oKGQsYSxiLGMpfWZ1bmN0aW9uIFFoKGEpe3ZhciBiPUhoKCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGEmJihhPWEoKSk7Yi5tZW1vaXplZFN0YXRlPWIuYmFzZVN0YXRlPWE7YT1iLnF1ZXVlPXtwZW5kaW5nOm51bGwsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOkpoLGxhc3RSZW5kZXJlZFN0YXRlOmF9O2E9YS5kaXNwYXRjaD1PaC5iaW5kKG51bGwsUixhKTtyZXR1cm5bYi5tZW1vaXplZFN0YXRlLGFdfVxuZnVuY3Rpb24gUmgoYSxiLGMsZCl7YT17dGFnOmEsY3JlYXRlOmIsZGVzdHJveTpjLGRlcHM6ZCxuZXh0Om51bGx9O2I9Ui51cGRhdGVRdWV1ZTtudWxsPT09Yj8oYj17bGFzdEVmZmVjdDpudWxsfSxSLnVwZGF0ZVF1ZXVlPWIsYi5sYXN0RWZmZWN0PWEubmV4dD1hKTooYz1iLmxhc3RFZmZlY3QsbnVsbD09PWM/Yi5sYXN0RWZmZWN0PWEubmV4dD1hOihkPWMubmV4dCxjLm5leHQ9YSxhLm5leHQ9ZCxiLmxhc3RFZmZlY3Q9YSkpO3JldHVybiBhfWZ1bmN0aW9uIFNoKGEpe3ZhciBiPUhoKCk7YT17Y3VycmVudDphfTtyZXR1cm4gYi5tZW1vaXplZFN0YXRlPWF9ZnVuY3Rpb24gVGgoKXtyZXR1cm4gSWgoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIFVoKGEsYixjLGQpe3ZhciBlPUhoKCk7Ui5mbGFnc3w9YTtlLm1lbW9pemVkU3RhdGU9UmgoMXxiLGMsdm9pZCAwLHZvaWQgMD09PWQ/bnVsbDpkKX1cbmZ1bmN0aW9uIFZoKGEsYixjLGQpe3ZhciBlPUloKCk7ZD12b2lkIDA9PT1kP251bGw6ZDt2YXIgZj12b2lkIDA7aWYobnVsbCE9PVMpe3ZhciBnPVMubWVtb2l6ZWRTdGF0ZTtmPWcuZGVzdHJveTtpZihudWxsIT09ZCYmQmgoZCxnLmRlcHMpKXtSaChiLGMsZixkKTtyZXR1cm59fVIuZmxhZ3N8PWE7ZS5tZW1vaXplZFN0YXRlPVJoKDF8YixjLGYsZCl9ZnVuY3Rpb24gV2goYSxiKXtyZXR1cm4gVWgoNTE2LDQsYSxiKX1mdW5jdGlvbiBYaChhLGIpe3JldHVybiBWaCg1MTYsNCxhLGIpfWZ1bmN0aW9uIFloKGEsYil7cmV0dXJuIFZoKDQsMixhLGIpfWZ1bmN0aW9uIFpoKGEsYil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGIpcmV0dXJuIGE9YSgpLGIoYSksZnVuY3Rpb24oKXtiKG51bGwpfTtpZihudWxsIT09YiYmdm9pZCAwIT09YilyZXR1cm4gYT1hKCksYi5jdXJyZW50PWEsZnVuY3Rpb24oKXtiLmN1cnJlbnQ9bnVsbH19XG5mdW5jdGlvbiAkaChhLGIsYyl7Yz1udWxsIT09YyYmdm9pZCAwIT09Yz9jLmNvbmNhdChbYV0pOm51bGw7cmV0dXJuIFZoKDQsMixaaC5iaW5kKG51bGwsYixhKSxjKX1mdW5jdGlvbiBhaSgpe31mdW5jdGlvbiBiaShhLGIpe3ZhciBjPUloKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZCaChiLGRbMV0pKXJldHVybiBkWzBdO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1mdW5jdGlvbiBjaShhLGIpe3ZhciBjPUloKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZCaChiLGRbMV0pKXJldHVybiBkWzBdO2E9YSgpO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1cbmZ1bmN0aW9uIGRpKGEsYil7dmFyIGM9ZWcoKTtnZyg5OD5jPzk4OmMsZnVuY3Rpb24oKXthKCEwKX0pO2dnKDk3PGM/OTc6YyxmdW5jdGlvbigpe3ZhciBjPXdoLnRyYW5zaXRpb247d2gudHJhbnNpdGlvbj0xO3RyeXthKCExKSxiKCl9ZmluYWxseXt3aC50cmFuc2l0aW9uPWN9fSl9XG5mdW5jdGlvbiBPaChhLGIsYyl7dmFyIGQ9SGcoKSxlPUlnKGEpLGY9e2xhbmU6ZSxhY3Rpb246YyxlYWdlclJlZHVjZXI6bnVsbCxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfSxnPWIucGVuZGluZztudWxsPT09Zz9mLm5leHQ9ZjooZi5uZXh0PWcubmV4dCxnLm5leHQ9Zik7Yi5wZW5kaW5nPWY7Zz1hLmFsdGVybmF0ZTtpZihhPT09Unx8bnVsbCE9PWcmJmc9PT1SKXpoPXloPSEwO2Vsc2V7aWYoMD09PWEubGFuZXMmJihudWxsPT09Z3x8MD09PWcubGFuZXMpJiYoZz1iLmxhc3RSZW5kZXJlZFJlZHVjZXIsbnVsbCE9PWcpKXRyeXt2YXIgaD1iLmxhc3RSZW5kZXJlZFN0YXRlLGs9ZyhoLGMpO2YuZWFnZXJSZWR1Y2VyPWc7Zi5lYWdlclN0YXRlPWs7aWYoSGUoayxoKSlyZXR1cm59Y2F0Y2gobCl7fWZpbmFsbHl7fUpnKGEsZSxkKX19XG52YXIgR2g9e3JlYWRDb250ZXh0OnZnLHVzZUNhbGxiYWNrOkFoLHVzZUNvbnRleHQ6QWgsdXNlRWZmZWN0OkFoLHVzZUltcGVyYXRpdmVIYW5kbGU6QWgsdXNlTGF5b3V0RWZmZWN0OkFoLHVzZU1lbW86QWgsdXNlUmVkdWNlcjpBaCx1c2VSZWY6QWgsdXNlU3RhdGU6QWgsdXNlRGVidWdWYWx1ZTpBaCx1c2VEZWZlcnJlZFZhbHVlOkFoLHVzZVRyYW5zaXRpb246QWgsdXNlTXV0YWJsZVNvdXJjZTpBaCx1c2VPcGFxdWVJZGVudGlmaWVyOkFoLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sRGg9e3JlYWRDb250ZXh0OnZnLHVzZUNhbGxiYWNrOmZ1bmN0aW9uKGEsYil7SGgoKS5tZW1vaXplZFN0YXRlPVthLHZvaWQgMD09PWI/bnVsbDpiXTtyZXR1cm4gYX0sdXNlQ29udGV4dDp2Zyx1c2VFZmZlY3Q6V2gsdXNlSW1wZXJhdGl2ZUhhbmRsZTpmdW5jdGlvbihhLGIsYyl7Yz1udWxsIT09YyYmdm9pZCAwIT09Yz9jLmNvbmNhdChbYV0pOm51bGw7cmV0dXJuIFVoKDQsMixaaC5iaW5kKG51bGwsXG5iLGEpLGMpfSx1c2VMYXlvdXRFZmZlY3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVWgoNCwyLGEsYil9LHVzZU1lbW86ZnVuY3Rpb24oYSxiKXt2YXIgYz1IaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfSx1c2VSZWR1Y2VyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1IaCgpO2I9dm9pZCAwIT09Yz9jKGIpOmI7ZC5tZW1vaXplZFN0YXRlPWQuYmFzZVN0YXRlPWI7YT1kLnF1ZXVlPXtwZW5kaW5nOm51bGwsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOmEsbGFzdFJlbmRlcmVkU3RhdGU6Yn07YT1hLmRpc3BhdGNoPU9oLmJpbmQobnVsbCxSLGEpO3JldHVybltkLm1lbW9pemVkU3RhdGUsYV19LHVzZVJlZjpTaCx1c2VTdGF0ZTpRaCx1c2VEZWJ1Z1ZhbHVlOmFpLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9UWgoYSksYz1iWzBdLGQ9YlsxXTtXaChmdW5jdGlvbigpe3ZhciBiPXdoLnRyYW5zaXRpb247XG53aC50cmFuc2l0aW9uPTE7dHJ5e2QoYSl9ZmluYWxseXt3aC50cmFuc2l0aW9uPWJ9fSxbYV0pO3JldHVybiBjfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9UWgoITEpLGI9YVswXTthPWRpLmJpbmQobnVsbCxhWzFdKTtTaChhKTtyZXR1cm5bYSxiXX0sdXNlTXV0YWJsZVNvdXJjZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9SGgoKTtkLm1lbW9pemVkU3RhdGU9e3JlZnM6e2dldFNuYXBzaG90OmIsc2V0U25hcHNob3Q6bnVsbH0sc291cmNlOmEsc3Vic2NyaWJlOmN9O3JldHVybiBOaChkLGEsYixjKX0sdXNlT3BhcXVlSWRlbnRpZmllcjpmdW5jdGlvbigpe2lmKGxoKXt2YXIgYT0hMSxiPXVmKGZ1bmN0aW9uKCl7YXx8KGE9ITAsYyhcInI6XCIrKHRmKyspLnRvU3RyaW5nKDM2KSkpO3Rocm93IEVycm9yKHkoMzU1KSk7fSksYz1RaChiKVsxXTswPT09KFIubW9kZSYyKSYmKFIuZmxhZ3N8PTUxNixSaCg1LGZ1bmN0aW9uKCl7YyhcInI6XCIrKHRmKyspLnRvU3RyaW5nKDM2KSl9LFxudm9pZCAwLG51bGwpKTtyZXR1cm4gYn1iPVwicjpcIisodGYrKykudG9TdHJpbmcoMzYpO1FoKGIpO3JldHVybiBifSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LEVoPXtyZWFkQ29udGV4dDp2Zyx1c2VDYWxsYmFjazpiaSx1c2VDb250ZXh0OnZnLHVzZUVmZmVjdDpYaCx1c2VJbXBlcmF0aXZlSGFuZGxlOiRoLHVzZUxheW91dEVmZmVjdDpZaCx1c2VNZW1vOmNpLHVzZVJlZHVjZXI6S2gsdXNlUmVmOlRoLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIEtoKEpoKX0sdXNlRGVidWdWYWx1ZTphaSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPUtoKEpoKSxjPWJbMF0sZD1iWzFdO1hoKGZ1bmN0aW9uKCl7dmFyIGI9d2gudHJhbnNpdGlvbjt3aC50cmFuc2l0aW9uPTE7dHJ5e2QoYSl9ZmluYWxseXt3aC50cmFuc2l0aW9uPWJ9fSxbYV0pO3JldHVybiBjfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9S2goSmgpWzBdO3JldHVybltUaCgpLmN1cnJlbnQsXG5hXX0sdXNlTXV0YWJsZVNvdXJjZTpQaCx1c2VPcGFxdWVJZGVudGlmaWVyOmZ1bmN0aW9uKCl7cmV0dXJuIEtoKEpoKVswXX0sdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxGaD17cmVhZENvbnRleHQ6dmcsdXNlQ2FsbGJhY2s6YmksdXNlQ29udGV4dDp2Zyx1c2VFZmZlY3Q6WGgsdXNlSW1wZXJhdGl2ZUhhbmRsZTokaCx1c2VMYXlvdXRFZmZlY3Q6WWgsdXNlTWVtbzpjaSx1c2VSZWR1Y2VyOkxoLHVzZVJlZjpUaCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBMaChKaCl9LHVzZURlYnVnVmFsdWU6YWksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYj1MaChKaCksYz1iWzBdLGQ9YlsxXTtYaChmdW5jdGlvbigpe3ZhciBiPXdoLnRyYW5zaXRpb247d2gudHJhbnNpdGlvbj0xO3RyeXtkKGEpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1ifX0sW2FdKTtyZXR1cm4gY30sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBhPUxoKEpoKVswXTtyZXR1cm5bVGgoKS5jdXJyZW50LFxuYV19LHVzZU11dGFibGVTb3VyY2U6UGgsdXNlT3BhcXVlSWRlbnRpZmllcjpmdW5jdGlvbigpe3JldHVybiBMaChKaClbMF19LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sZWk9cmEuUmVhY3RDdXJyZW50T3duZXIsdWc9ITE7ZnVuY3Rpb24gZmkoYSxiLGMsZCl7Yi5jaGlsZD1udWxsPT09YT9aZyhiLG51bGwsYyxkKTpZZyhiLGEuY2hpbGQsYyxkKX1mdW5jdGlvbiBnaShhLGIsYyxkLGUpe2M9Yy5yZW5kZXI7dmFyIGY9Yi5yZWY7dGcoYixlKTtkPUNoKGEsYixjLGQsZixlKTtpZihudWxsIT09YSYmIXVnKXJldHVybiBiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5mbGFncyY9LTUxNyxhLmxhbmVzJj1+ZSxoaShhLGIsZSk7Yi5mbGFnc3w9MTtmaShhLGIsZCxlKTtyZXR1cm4gYi5jaGlsZH1cbmZ1bmN0aW9uIGlpKGEsYixjLGQsZSxmKXtpZihudWxsPT09YSl7dmFyIGc9Yy50eXBlO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnJiYhamkoZykmJnZvaWQgMD09PWcuZGVmYXVsdFByb3BzJiZudWxsPT09Yy5jb21wYXJlJiZ2b2lkIDA9PT1jLmRlZmF1bHRQcm9wcylyZXR1cm4gYi50YWc9MTUsYi50eXBlPWcsa2koYSxiLGcsZCxlLGYpO2E9VmcoYy50eXBlLG51bGwsZCxiLGIubW9kZSxmKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9Zz1hLmNoaWxkO2lmKDA9PT0oZSZmKSYmKGU9Zy5tZW1vaXplZFByb3BzLGM9Yy5jb21wYXJlLGM9bnVsbCE9PWM/YzpKZSxjKGUsZCkmJmEucmVmPT09Yi5yZWYpKXJldHVybiBoaShhLGIsZik7Yi5mbGFnc3w9MTthPVRnKGcsZCk7YS5yZWY9Yi5yZWY7YS5yZXR1cm49YjtyZXR1cm4gYi5jaGlsZD1hfVxuZnVuY3Rpb24ga2koYSxiLGMsZCxlLGYpe2lmKG51bGwhPT1hJiZKZShhLm1lbW9pemVkUHJvcHMsZCkmJmEucmVmPT09Yi5yZWYpaWYodWc9ITEsMCE9PShmJmUpKTAhPT0oYS5mbGFncyYxNjM4NCkmJih1Zz0hMCk7ZWxzZSByZXR1cm4gYi5sYW5lcz1hLmxhbmVzLGhpKGEsYixmKTtyZXR1cm4gbGkoYSxiLGMsZCxmKX1cbmZ1bmN0aW9uIG1pKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPWQuY2hpbGRyZW4sZj1udWxsIT09YT9hLm1lbW9pemVkU3RhdGU6bnVsbDtpZihcImhpZGRlblwiPT09ZC5tb2RlfHxcInVuc3RhYmxlLWRlZmVyLXdpdGhvdXQtaGlkaW5nXCI9PT1kLm1vZGUpaWYoMD09PShiLm1vZGUmNCkpYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MH0sbmkoYixjKTtlbHNlIGlmKDAhPT0oYyYxMDczNzQxODI0KSliLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowfSxuaShiLG51bGwhPT1mP2YuYmFzZUxhbmVzOmMpO2Vsc2UgcmV0dXJuIGE9bnVsbCE9PWY/Zi5iYXNlTGFuZXN8YzpjLGIubGFuZXM9Yi5jaGlsZExhbmVzPTEwNzM3NDE4MjQsYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6YX0sbmkoYixhKSxudWxsO2Vsc2UgbnVsbCE9PWY/KGQ9Zi5iYXNlTGFuZXN8YyxiLm1lbW9pemVkU3RhdGU9bnVsbCk6ZD1jLG5pKGIsZCk7ZmkoYSxiLGUsYyk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBvaShhLGIpe3ZhciBjPWIucmVmO2lmKG51bGw9PT1hJiZudWxsIT09Y3x8bnVsbCE9PWEmJmEucmVmIT09YyliLmZsYWdzfD0xMjh9ZnVuY3Rpb24gbGkoYSxiLGMsZCxlKXt2YXIgZj1GZihjKT9EZjpNLmN1cnJlbnQ7Zj1FZihiLGYpO3RnKGIsZSk7Yz1DaChhLGIsYyxkLGYsZSk7aWYobnVsbCE9PWEmJiF1ZylyZXR1cm4gYi51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlLGIuZmxhZ3MmPS01MTcsYS5sYW5lcyY9fmUsaGkoYSxiLGUpO2IuZmxhZ3N8PTE7ZmkoYSxiLGMsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBwaShhLGIsYyxkLGUpe2lmKEZmKGMpKXt2YXIgZj0hMDtKZihiKX1lbHNlIGY9ITE7dGcoYixlKTtpZihudWxsPT09Yi5zdGF0ZU5vZGUpbnVsbCE9PWEmJihhLmFsdGVybmF0ZT1udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5mbGFnc3w9MiksTWcoYixjLGQpLE9nKGIsYyxkLGUpLGQ9ITA7ZWxzZSBpZihudWxsPT09YSl7dmFyIGc9Yi5zdGF0ZU5vZGUsaD1iLm1lbW9pemVkUHJvcHM7Zy5wcm9wcz1oO3ZhciBrPWcuY29udGV4dCxsPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBsJiZudWxsIT09bD9sPXZnKGwpOihsPUZmKGMpP0RmOk0uY3VycmVudCxsPUVmKGIsbCkpO3ZhciBuPWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLEE9XCJmdW5jdGlvblwiPT09dHlwZW9mIG58fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO0F8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZcblwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09ZHx8ayE9PWwpJiZOZyhiLGcsZCxsKTt3Zz0hMTt2YXIgcD1iLm1lbW9pemVkU3RhdGU7Zy5zdGF0ZT1wO0NnKGIsZCxnLGUpO2s9Yi5tZW1vaXplZFN0YXRlO2ghPT1kfHxwIT09a3x8Ti5jdXJyZW50fHx3Zz8oXCJmdW5jdGlvblwiPT09dHlwZW9mIG4mJihHZyhiLGMsbixkKSxrPWIubWVtb2l6ZWRTdGF0ZSksKGg9d2d8fExnKGIsYyxoLGQscCxrLGwpKT8oQXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbE1vdW50fHwoXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50V2lsbE1vdW50JiZnLmNvbXBvbmVudFdpbGxNb3VudCgpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJmcuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpKSxcImZ1bmN0aW9uXCI9PT1cbnR5cGVvZiBnLmNvbXBvbmVudERpZE1vdW50JiYoYi5mbGFnc3w9NCkpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQpLGIubWVtb2l6ZWRQcm9wcz1kLGIubWVtb2l6ZWRTdGF0ZT1rKSxnLnByb3BzPWQsZy5zdGF0ZT1rLGcuY29udGV4dD1sLGQ9aCk6KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZE1vdW50JiYoYi5mbGFnc3w9NCksZD0hMSl9ZWxzZXtnPWIuc3RhdGVOb2RlO3lnKGEsYik7aD1iLm1lbW9pemVkUHJvcHM7bD1iLnR5cGU9PT1iLmVsZW1lbnRUeXBlP2g6bGcoYi50eXBlLGgpO2cucHJvcHM9bDtBPWIucGVuZGluZ1Byb3BzO3A9Zy5jb250ZXh0O2s9Yy5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGsmJm51bGwhPT1rP2s9dmcoayk6KGs9RmYoYyk/RGY6TS5jdXJyZW50LGs9RWYoYixrKSk7dmFyIEM9Yy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7KG49XCJmdW5jdGlvblwiPT09dHlwZW9mIEN8fFxuXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUpfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc3x8KGghPT1BfHxwIT09aykmJk5nKGIsZyxkLGspO3dnPSExO3A9Yi5tZW1vaXplZFN0YXRlO2cuc3RhdGU9cDtDZyhiLGQsZyxlKTt2YXIgeD1iLm1lbW9pemVkU3RhdGU7aCE9PUF8fHAhPT14fHxOLmN1cnJlbnR8fHdnPyhcImZ1bmN0aW9uXCI9PT10eXBlb2YgQyYmKEdnKGIsYyxDLGQpLHg9Yi5tZW1vaXplZFN0YXRlKSwobD13Z3x8TGcoYixjLGwsZCxwLHgsaykpPyhufHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFVwZGF0ZXx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGUmJmcuY29tcG9uZW50V2lsbFVwZGF0ZShkLFxueCxrKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShkLHgsaykpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZSYmKGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlJiYoYi5mbGFnc3w9MjU2KSk6KFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZwPT09YS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9MjU2KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9eCksZy5wcm9wcz1kLGcuc3RhdGU9eCxnLmNvbnRleHQ9ayxkPWwpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fFxuaD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZwPT09YS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9MjU2KSxkPSExKX1yZXR1cm4gcWkoYSxiLGMsZCxmLGUpfVxuZnVuY3Rpb24gcWkoYSxiLGMsZCxlLGYpe29pKGEsYik7dmFyIGc9MCE9PShiLmZsYWdzJjY0KTtpZighZCYmIWcpcmV0dXJuIGUmJktmKGIsYywhMSksaGkoYSxiLGYpO2Q9Yi5zdGF0ZU5vZGU7ZWkuY3VycmVudD1iO3ZhciBoPWcmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBjLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj9udWxsOmQucmVuZGVyKCk7Yi5mbGFnc3w9MTtudWxsIT09YSYmZz8oYi5jaGlsZD1ZZyhiLGEuY2hpbGQsbnVsbCxmKSxiLmNoaWxkPVlnKGIsbnVsbCxoLGYpKTpmaShhLGIsaCxmKTtiLm1lbW9pemVkU3RhdGU9ZC5zdGF0ZTtlJiZLZihiLGMsITApO3JldHVybiBiLmNoaWxkfWZ1bmN0aW9uIHJpKGEpe3ZhciBiPWEuc3RhdGVOb2RlO2IucGVuZGluZ0NvbnRleHQ/SGYoYSxiLnBlbmRpbmdDb250ZXh0LGIucGVuZGluZ0NvbnRleHQhPT1iLmNvbnRleHQpOmIuY29udGV4dCYmSGYoYSxiLmNvbnRleHQsITEpO2VoKGEsYi5jb250YWluZXJJbmZvKX1cbnZhciBzaT17ZGVoeWRyYXRlZDpudWxsLHJldHJ5TGFuZTowfTtcbmZ1bmN0aW9uIHRpKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPVAuY3VycmVudCxmPSExLGc7KGc9MCE9PShiLmZsYWdzJjY0KSl8fChnPW51bGwhPT1hJiZudWxsPT09YS5tZW1vaXplZFN0YXRlPyExOjAhPT0oZSYyKSk7Zz8oZj0hMCxiLmZsYWdzJj0tNjUpOm51bGwhPT1hJiZudWxsPT09YS5tZW1vaXplZFN0YXRlfHx2b2lkIDA9PT1kLmZhbGxiYWNrfHwhMD09PWQudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2t8fChlfD0xKTtJKFAsZSYxKTtpZihudWxsPT09YSl7dm9pZCAwIT09ZC5mYWxsYmFjayYmcGgoYik7YT1kLmNoaWxkcmVuO2U9ZC5mYWxsYmFjaztpZihmKXJldHVybiBhPXVpKGIsYSxlLGMpLGIuY2hpbGQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmN9LGIubWVtb2l6ZWRTdGF0ZT1zaSxhO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZC51bnN0YWJsZV9leHBlY3RlZExvYWRUaW1lKXJldHVybiBhPXVpKGIsYSxlLGMpLGIuY2hpbGQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmN9LFxuYi5tZW1vaXplZFN0YXRlPXNpLGIubGFuZXM9MzM1NTQ0MzIsYTtjPXZpKHttb2RlOlwidmlzaWJsZVwiLGNoaWxkcmVuOmF9LGIubW9kZSxjLG51bGwpO2MucmV0dXJuPWI7cmV0dXJuIGIuY2hpbGQ9Y31pZihudWxsIT09YS5tZW1vaXplZFN0YXRlKXtpZihmKXJldHVybiBkPXdpKGEsYixkLmNoaWxkcmVuLGQuZmFsbGJhY2ssYyksZj1iLmNoaWxkLGU9YS5jaGlsZC5tZW1vaXplZFN0YXRlLGYubWVtb2l6ZWRTdGF0ZT1udWxsPT09ZT97YmFzZUxhbmVzOmN9OntiYXNlTGFuZXM6ZS5iYXNlTGFuZXN8Y30sZi5jaGlsZExhbmVzPWEuY2hpbGRMYW5lcyZ+YyxiLm1lbW9pemVkU3RhdGU9c2ksZDtjPXhpKGEsYixkLmNoaWxkcmVuLGMpO2IubWVtb2l6ZWRTdGF0ZT1udWxsO3JldHVybiBjfWlmKGYpcmV0dXJuIGQ9d2koYSxiLGQuY2hpbGRyZW4sZC5mYWxsYmFjayxjKSxmPWIuY2hpbGQsZT1hLmNoaWxkLm1lbW9pemVkU3RhdGUsZi5tZW1vaXplZFN0YXRlPW51bGw9PT1lP3tiYXNlTGFuZXM6Y306XG57YmFzZUxhbmVzOmUuYmFzZUxhbmVzfGN9LGYuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXMmfmMsYi5tZW1vaXplZFN0YXRlPXNpLGQ7Yz14aShhLGIsZC5jaGlsZHJlbixjKTtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gY31mdW5jdGlvbiB1aShhLGIsYyxkKXt2YXIgZT1hLm1vZGUsZj1hLmNoaWxkO2I9e21vZGU6XCJoaWRkZW5cIixjaGlsZHJlbjpifTswPT09KGUmMikmJm51bGwhPT1mPyhmLmNoaWxkTGFuZXM9MCxmLnBlbmRpbmdQcm9wcz1iKTpmPXZpKGIsZSwwLG51bGwpO2M9WGcoYyxlLGQsbnVsbCk7Zi5yZXR1cm49YTtjLnJldHVybj1hO2Yuc2libGluZz1jO2EuY2hpbGQ9ZjtyZXR1cm4gY31cbmZ1bmN0aW9uIHhpKGEsYixjLGQpe3ZhciBlPWEuY2hpbGQ7YT1lLnNpYmxpbmc7Yz1UZyhlLHttb2RlOlwidmlzaWJsZVwiLGNoaWxkcmVuOmN9KTswPT09KGIubW9kZSYyKSYmKGMubGFuZXM9ZCk7Yy5yZXR1cm49YjtjLnNpYmxpbmc9bnVsbDtudWxsIT09YSYmKGEubmV4dEVmZmVjdD1udWxsLGEuZmxhZ3M9OCxiLmZpcnN0RWZmZWN0PWIubGFzdEVmZmVjdD1hKTtyZXR1cm4gYi5jaGlsZD1jfVxuZnVuY3Rpb24gd2koYSxiLGMsZCxlKXt2YXIgZj1iLm1vZGUsZz1hLmNoaWxkO2E9Zy5zaWJsaW5nO3ZhciBoPXttb2RlOlwiaGlkZGVuXCIsY2hpbGRyZW46Y307MD09PShmJjIpJiZiLmNoaWxkIT09Zz8oYz1iLmNoaWxkLGMuY2hpbGRMYW5lcz0wLGMucGVuZGluZ1Byb3BzPWgsZz1jLmxhc3RFZmZlY3QsbnVsbCE9PWc/KGIuZmlyc3RFZmZlY3Q9Yy5maXJzdEVmZmVjdCxiLmxhc3RFZmZlY3Q9ZyxnLm5leHRFZmZlY3Q9bnVsbCk6Yi5maXJzdEVmZmVjdD1iLmxhc3RFZmZlY3Q9bnVsbCk6Yz1UZyhnLGgpO251bGwhPT1hP2Q9VGcoYSxkKTooZD1YZyhkLGYsZSxudWxsKSxkLmZsYWdzfD0yKTtkLnJldHVybj1iO2MucmV0dXJuPWI7Yy5zaWJsaW5nPWQ7Yi5jaGlsZD1jO3JldHVybiBkfWZ1bmN0aW9uIHlpKGEsYil7YS5sYW5lc3w9Yjt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmKGMubGFuZXN8PWIpO3NnKGEucmV0dXJuLGIpfVxuZnVuY3Rpb24gemkoYSxiLGMsZCxlLGYpe3ZhciBnPWEubWVtb2l6ZWRTdGF0ZTtudWxsPT09Zz9hLm1lbW9pemVkU3RhdGU9e2lzQmFja3dhcmRzOmIscmVuZGVyaW5nOm51bGwscmVuZGVyaW5nU3RhcnRUaW1lOjAsbGFzdDpkLHRhaWw6Yyx0YWlsTW9kZTplLGxhc3RFZmZlY3Q6Zn06KGcuaXNCYWNrd2FyZHM9YixnLnJlbmRlcmluZz1udWxsLGcucmVuZGVyaW5nU3RhcnRUaW1lPTAsZy5sYXN0PWQsZy50YWlsPWMsZy50YWlsTW9kZT1lLGcubGFzdEVmZmVjdD1mKX1cbmZ1bmN0aW9uIEFpKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPWQucmV2ZWFsT3JkZXIsZj1kLnRhaWw7ZmkoYSxiLGQuY2hpbGRyZW4sYyk7ZD1QLmN1cnJlbnQ7aWYoMCE9PShkJjIpKWQ9ZCYxfDIsYi5mbGFnc3w9NjQ7ZWxzZXtpZihudWxsIT09YSYmMCE9PShhLmZsYWdzJjY0KSlhOmZvcihhPWIuY2hpbGQ7bnVsbCE9PWE7KXtpZigxMz09PWEudGFnKW51bGwhPT1hLm1lbW9pemVkU3RhdGUmJnlpKGEsYyk7ZWxzZSBpZigxOT09PWEudGFnKXlpKGEsYyk7ZWxzZSBpZihudWxsIT09YS5jaGlsZCl7YS5jaGlsZC5yZXR1cm49YTthPWEuY2hpbGQ7Y29udGludWV9aWYoYT09PWIpYnJlYWsgYTtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fGEucmV0dXJuPT09YilicmVhayBhO2E9YS5yZXR1cm59YS5zaWJsaW5nLnJldHVybj1hLnJldHVybjthPWEuc2libGluZ31kJj0xfUkoUCxkKTtpZigwPT09KGIubW9kZSYyKSliLm1lbW9pemVkU3RhdGU9XG5udWxsO2Vsc2Ugc3dpdGNoKGUpe2Nhc2UgXCJmb3J3YXJkc1wiOmM9Yi5jaGlsZDtmb3IoZT1udWxsO251bGwhPT1jOylhPWMuYWx0ZXJuYXRlLG51bGwhPT1hJiZudWxsPT09aWgoYSkmJihlPWMpLGM9Yy5zaWJsaW5nO2M9ZTtudWxsPT09Yz8oZT1iLmNoaWxkLGIuY2hpbGQ9bnVsbCk6KGU9Yy5zaWJsaW5nLGMuc2libGluZz1udWxsKTt6aShiLCExLGUsYyxmLGIubGFzdEVmZmVjdCk7YnJlYWs7Y2FzZSBcImJhY2t3YXJkc1wiOmM9bnVsbDtlPWIuY2hpbGQ7Zm9yKGIuY2hpbGQ9bnVsbDtudWxsIT09ZTspe2E9ZS5hbHRlcm5hdGU7aWYobnVsbCE9PWEmJm51bGw9PT1paChhKSl7Yi5jaGlsZD1lO2JyZWFrfWE9ZS5zaWJsaW5nO2Uuc2libGluZz1jO2M9ZTtlPWF9emkoYiwhMCxjLG51bGwsZixiLmxhc3RFZmZlY3QpO2JyZWFrO2Nhc2UgXCJ0b2dldGhlclwiOnppKGIsITEsbnVsbCxudWxsLHZvaWQgMCxiLmxhc3RFZmZlY3QpO2JyZWFrO2RlZmF1bHQ6Yi5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBoaShhLGIsYyl7bnVsbCE9PWEmJihiLmRlcGVuZGVuY2llcz1hLmRlcGVuZGVuY2llcyk7RGd8PWIubGFuZXM7aWYoMCE9PShjJmIuY2hpbGRMYW5lcykpe2lmKG51bGwhPT1hJiZiLmNoaWxkIT09YS5jaGlsZCl0aHJvdyBFcnJvcih5KDE1MykpO2lmKG51bGwhPT1iLmNoaWxkKXthPWIuY2hpbGQ7Yz1UZyhhLGEucGVuZGluZ1Byb3BzKTtiLmNoaWxkPWM7Zm9yKGMucmV0dXJuPWI7bnVsbCE9PWEuc2libGluZzspYT1hLnNpYmxpbmcsYz1jLnNpYmxpbmc9VGcoYSxhLnBlbmRpbmdQcm9wcyksYy5yZXR1cm49YjtjLnNpYmxpbmc9bnVsbH1yZXR1cm4gYi5jaGlsZH1yZXR1cm4gbnVsbH12YXIgQmksQ2ksRGksRWk7XG5CaT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1iLmNoaWxkO251bGwhPT1jOyl7aWYoNT09PWMudGFnfHw2PT09Yy50YWcpYS5hcHBlbmRDaGlsZChjLnN0YXRlTm9kZSk7ZWxzZSBpZig0IT09Yy50YWcmJm51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09YilicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YilyZXR1cm47Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX07Q2k9ZnVuY3Rpb24oKXt9O1xuRGk9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YS5tZW1vaXplZFByb3BzO2lmKGUhPT1kKXthPWIuc3RhdGVOb2RlO2RoKGFoLmN1cnJlbnQpO3ZhciBmPW51bGw7c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOmU9WWEoYSxlKTtkPVlhKGEsZCk7Zj1bXTticmVhaztjYXNlIFwib3B0aW9uXCI6ZT1lYihhLGUpO2Q9ZWIoYSxkKTtmPVtdO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjplPW0oe30sZSx7dmFsdWU6dm9pZCAwfSk7ZD1tKHt9LGQse3ZhbHVlOnZvaWQgMH0pO2Y9W107YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6ZT1nYihhLGUpO2Q9Z2IoYSxkKTtmPVtdO2JyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiIT09dHlwZW9mIGUub25DbGljayYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGQub25DbGljayYmKGEub25jbGljaz1qZil9dmIoYyxkKTt2YXIgZztjPW51bGw7Zm9yKGwgaW4gZSlpZighZC5oYXNPd25Qcm9wZXJ0eShsKSYmZS5oYXNPd25Qcm9wZXJ0eShsKSYmbnVsbCE9ZVtsXSlpZihcInN0eWxlXCI9PT1cbmwpe3ZhciBoPWVbbF07Zm9yKGcgaW4gaCloLmhhc093blByb3BlcnR5KGcpJiYoY3x8KGM9e30pLGNbZ109XCJcIil9ZWxzZVwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIiE9PWwmJlwiY2hpbGRyZW5cIiE9PWwmJlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1sJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09bCYmXCJhdXRvRm9jdXNcIiE9PWwmJihjYS5oYXNPd25Qcm9wZXJ0eShsKT9mfHwoZj1bXSk6KGY9Znx8W10pLnB1c2gobCxudWxsKSk7Zm9yKGwgaW4gZCl7dmFyIGs9ZFtsXTtoPW51bGwhPWU/ZVtsXTp2b2lkIDA7aWYoZC5oYXNPd25Qcm9wZXJ0eShsKSYmayE9PWgmJihudWxsIT1rfHxudWxsIT1oKSlpZihcInN0eWxlXCI9PT1sKWlmKGgpe2ZvcihnIGluIGgpIWguaGFzT3duUHJvcGVydHkoZyl8fGsmJmsuaGFzT3duUHJvcGVydHkoZyl8fChjfHwoYz17fSksY1tnXT1cIlwiKTtmb3IoZyBpbiBrKWsuaGFzT3duUHJvcGVydHkoZykmJmhbZ10hPT1rW2ddJiYoY3x8XG4oYz17fSksY1tnXT1rW2ddKX1lbHNlIGN8fChmfHwoZj1bXSksZi5wdXNoKGwsYykpLGM9aztlbHNlXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09bD8oaz1rP2suX19odG1sOnZvaWQgMCxoPWg/aC5fX2h0bWw6dm9pZCAwLG51bGwhPWsmJmghPT1rJiYoZj1mfHxbXSkucHVzaChsLGspKTpcImNoaWxkcmVuXCI9PT1sP1wic3RyaW5nXCIhPT10eXBlb2YgayYmXCJudW1iZXJcIiE9PXR5cGVvZiBrfHwoZj1mfHxbXSkucHVzaChsLFwiXCIrayk6XCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWwmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1sJiYoY2EuaGFzT3duUHJvcGVydHkobCk/KG51bGwhPWsmJlwib25TY3JvbGxcIj09PWwmJkcoXCJzY3JvbGxcIixhKSxmfHxoPT09a3x8KGY9W10pKTpcIm9iamVjdFwiPT09dHlwZW9mIGsmJm51bGwhPT1rJiZrLiQkdHlwZW9mPT09R2E/ay50b1N0cmluZygpOihmPWZ8fFtdKS5wdXNoKGwsaykpfWMmJihmPWZ8fFtdKS5wdXNoKFwic3R5bGVcIixcbmMpO3ZhciBsPWY7aWYoYi51cGRhdGVRdWV1ZT1sKWIuZmxhZ3N8PTR9fTtFaT1mdW5jdGlvbihhLGIsYyxkKXtjIT09ZCYmKGIuZmxhZ3N8PTQpfTtmdW5jdGlvbiBGaShhLGIpe2lmKCFsaClzd2l0Y2goYS50YWlsTW9kZSl7Y2FzZSBcImhpZGRlblwiOmI9YS50YWlsO2Zvcih2YXIgYz1udWxsO251bGwhPT1iOyludWxsIT09Yi5hbHRlcm5hdGUmJihjPWIpLGI9Yi5zaWJsaW5nO251bGw9PT1jP2EudGFpbD1udWxsOmMuc2libGluZz1udWxsO2JyZWFrO2Nhc2UgXCJjb2xsYXBzZWRcIjpjPWEudGFpbDtmb3IodmFyIGQ9bnVsbDtudWxsIT09YzspbnVsbCE9PWMuYWx0ZXJuYXRlJiYoZD1jKSxjPWMuc2libGluZztudWxsPT09ZD9ifHxudWxsPT09YS50YWlsP2EudGFpbD1udWxsOmEudGFpbC5zaWJsaW5nPW51bGw6ZC5zaWJsaW5nPW51bGx9fVxuZnVuY3Rpb24gR2koYSxiLGMpe3ZhciBkPWIucGVuZGluZ1Byb3BzO3N3aXRjaChiLnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIG51bGw7Y2FzZSAxOnJldHVybiBGZihiLnR5cGUpJiZHZigpLG51bGw7Y2FzZSAzOmZoKCk7SChOKTtIKE0pO3VoKCk7ZD1iLnN0YXRlTm9kZTtkLnBlbmRpbmdDb250ZXh0JiYoZC5jb250ZXh0PWQucGVuZGluZ0NvbnRleHQsZC5wZW5kaW5nQ29udGV4dD1udWxsKTtpZihudWxsPT09YXx8bnVsbD09PWEuY2hpbGQpcmgoYik/Yi5mbGFnc3w9NDpkLmh5ZHJhdGV8fChiLmZsYWdzfD0yNTYpO0NpKGIpO3JldHVybiBudWxsO2Nhc2UgNTpoaChiKTt2YXIgZT1kaChjaC5jdXJyZW50KTtjPWIudHlwZTtpZihudWxsIT09YSYmbnVsbCE9Yi5zdGF0ZU5vZGUpRGkoYSxiLGMsZCxlKSxhLnJlZiE9PWIucmVmJiYoYi5mbGFnc3w9MTI4KTtlbHNle2lmKCFkKXtpZihudWxsPT09XG5iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcih5KDE2NikpO3JldHVybiBudWxsfWE9ZGgoYWguY3VycmVudCk7aWYocmgoYikpe2Q9Yi5zdGF0ZU5vZGU7Yz1iLnR5cGU7dmFyIGY9Yi5tZW1vaXplZFByb3BzO2Rbd2ZdPWI7ZFt4Zl09Zjtzd2l0Y2goYyl7Y2FzZSBcImRpYWxvZ1wiOkcoXCJjYW5jZWxcIixkKTtHKFwiY2xvc2VcIixkKTticmVhaztjYXNlIFwiaWZyYW1lXCI6Y2FzZSBcIm9iamVjdFwiOmNhc2UgXCJlbWJlZFwiOkcoXCJsb2FkXCIsZCk7YnJlYWs7Y2FzZSBcInZpZGVvXCI6Y2FzZSBcImF1ZGlvXCI6Zm9yKGE9MDthPFhlLmxlbmd0aDthKyspRyhYZVthXSxkKTticmVhaztjYXNlIFwic291cmNlXCI6RyhcImVycm9yXCIsZCk7YnJlYWs7Y2FzZSBcImltZ1wiOmNhc2UgXCJpbWFnZVwiOmNhc2UgXCJsaW5rXCI6RyhcImVycm9yXCIsZCk7RyhcImxvYWRcIixkKTticmVhaztjYXNlIFwiZGV0YWlsc1wiOkcoXCJ0b2dnbGVcIixkKTticmVhaztjYXNlIFwiaW5wdXRcIjpaYShkLGYpO0coXCJpbnZhbGlkXCIsZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmQuX3dyYXBwZXJTdGF0ZT1cbnt3YXNNdWx0aXBsZTohIWYubXVsdGlwbGV9O0coXCJpbnZhbGlkXCIsZCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aGIoZCxmKSxHKFwiaW52YWxpZFwiLGQpfXZiKGMsZik7YT1udWxsO2Zvcih2YXIgZyBpbiBmKWYuaGFzT3duUHJvcGVydHkoZykmJihlPWZbZ10sXCJjaGlsZHJlblwiPT09Zz9cInN0cmluZ1wiPT09dHlwZW9mIGU/ZC50ZXh0Q29udGVudCE9PWUmJihhPVtcImNoaWxkcmVuXCIsZV0pOlwibnVtYmVyXCI9PT10eXBlb2YgZSYmZC50ZXh0Q29udGVudCE9PVwiXCIrZSYmKGE9W1wiY2hpbGRyZW5cIixcIlwiK2VdKTpjYS5oYXNPd25Qcm9wZXJ0eShnKSYmbnVsbCE9ZSYmXCJvblNjcm9sbFwiPT09ZyYmRyhcInNjcm9sbFwiLGQpKTtzd2l0Y2goYyl7Y2FzZSBcImlucHV0XCI6VmEoZCk7Y2IoZCxmLCEwKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpWYShkKTtqYihkKTticmVhaztjYXNlIFwic2VsZWN0XCI6Y2FzZSBcIm9wdGlvblwiOmJyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiPT09dHlwZW9mIGYub25DbGljayYmKGQub25jbGljaz1cbmpmKX1kPWE7Yi51cGRhdGVRdWV1ZT1kO251bGwhPT1kJiYoYi5mbGFnc3w9NCl9ZWxzZXtnPTk9PT1lLm5vZGVUeXBlP2U6ZS5vd25lckRvY3VtZW50O2E9PT1rYi5odG1sJiYoYT1sYihjKSk7YT09PWtiLmh0bWw/XCJzY3JpcHRcIj09PWM/KGE9Zy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLGEuaW5uZXJIVE1MPVwiPHNjcmlwdD5cXHgzYy9zY3JpcHQ+XCIsYT1hLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCkpOlwic3RyaW5nXCI9PT10eXBlb2YgZC5pcz9hPWcuY3JlYXRlRWxlbWVudChjLHtpczpkLmlzfSk6KGE9Zy5jcmVhdGVFbGVtZW50KGMpLFwic2VsZWN0XCI9PT1jJiYoZz1hLGQubXVsdGlwbGU/Zy5tdWx0aXBsZT0hMDpkLnNpemUmJihnLnNpemU9ZC5zaXplKSkpOmE9Zy5jcmVhdGVFbGVtZW50TlMoYSxjKTthW3dmXT1iO2FbeGZdPWQ7QmkoYSxiLCExLCExKTtiLnN0YXRlTm9kZT1hO2c9d2IoYyxkKTtzd2l0Y2goYyl7Y2FzZSBcImRpYWxvZ1wiOkcoXCJjYW5jZWxcIixhKTtHKFwiY2xvc2VcIixhKTtcbmU9ZDticmVhaztjYXNlIFwiaWZyYW1lXCI6Y2FzZSBcIm9iamVjdFwiOmNhc2UgXCJlbWJlZFwiOkcoXCJsb2FkXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJ2aWRlb1wiOmNhc2UgXCJhdWRpb1wiOmZvcihlPTA7ZTxYZS5sZW5ndGg7ZSsrKUcoWGVbZV0sYSk7ZT1kO2JyZWFrO2Nhc2UgXCJzb3VyY2VcIjpHKFwiZXJyb3JcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcImltZ1wiOmNhc2UgXCJpbWFnZVwiOmNhc2UgXCJsaW5rXCI6RyhcImVycm9yXCIsYSk7RyhcImxvYWRcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpHKFwidG9nZ2xlXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpbnB1dFwiOlphKGEsZCk7ZT1ZYShhLGQpO0coXCJpbnZhbGlkXCIsYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOmU9ZWIoYSxkKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIWQubXVsdGlwbGV9O2U9bSh7fSxkLHt2YWx1ZTp2b2lkIDB9KTtHKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGEsZCk7ZT1cbmdiKGEsZCk7RyhcImludmFsaWRcIixhKTticmVhaztkZWZhdWx0OmU9ZH12YihjLGUpO3ZhciBoPWU7Zm9yKGYgaW4gaClpZihoLmhhc093blByb3BlcnR5KGYpKXt2YXIgaz1oW2ZdO1wic3R5bGVcIj09PWY/dGIoYSxrKTpcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1mPyhrPWs/ay5fX2h0bWw6dm9pZCAwLG51bGwhPWsmJm9iKGEsaykpOlwiY2hpbGRyZW5cIj09PWY/XCJzdHJpbmdcIj09PXR5cGVvZiBrPyhcInRleHRhcmVhXCIhPT1jfHxcIlwiIT09aykmJnBiKGEsayk6XCJudW1iZXJcIj09PXR5cGVvZiBrJiZwYihhLFwiXCIrayk6XCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWYmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1mJiZcImF1dG9Gb2N1c1wiIT09ZiYmKGNhLmhhc093blByb3BlcnR5KGYpP251bGwhPWsmJlwib25TY3JvbGxcIj09PWYmJkcoXCJzY3JvbGxcIixhKTpudWxsIT1rJiZxYShhLGYsayxnKSl9c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlZhKGEpO2NiKGEsZCwhMSk7XG5icmVhaztjYXNlIFwidGV4dGFyZWFcIjpWYShhKTtqYihhKTticmVhaztjYXNlIFwib3B0aW9uXCI6bnVsbCE9ZC52YWx1ZSYmYS5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLFwiXCIrU2EoZC52YWx1ZSkpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjphLm11bHRpcGxlPSEhZC5tdWx0aXBsZTtmPWQudmFsdWU7bnVsbCE9Zj9mYihhLCEhZC5tdWx0aXBsZSxmLCExKTpudWxsIT1kLmRlZmF1bHRWYWx1ZSYmZmIoYSwhIWQubXVsdGlwbGUsZC5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiPT09dHlwZW9mIGUub25DbGljayYmKGEub25jbGljaz1qZil9bWYoYyxkKSYmKGIuZmxhZ3N8PTQpfW51bGwhPT1iLnJlZiYmKGIuZmxhZ3N8PTEyOCl9cmV0dXJuIG51bGw7Y2FzZSA2OmlmKGEmJm51bGwhPWIuc3RhdGVOb2RlKUVpKGEsYixhLm1lbW9pemVkUHJvcHMsZCk7ZWxzZXtpZihcInN0cmluZ1wiIT09dHlwZW9mIGQmJm51bGw9PT1iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcih5KDE2NikpO1xuYz1kaChjaC5jdXJyZW50KTtkaChhaC5jdXJyZW50KTtyaChiKT8oZD1iLnN0YXRlTm9kZSxjPWIubWVtb2l6ZWRQcm9wcyxkW3dmXT1iLGQubm9kZVZhbHVlIT09YyYmKGIuZmxhZ3N8PTQpKTooZD0oOT09PWMubm9kZVR5cGU/YzpjLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKGQpLGRbd2ZdPWIsYi5zdGF0ZU5vZGU9ZCl9cmV0dXJuIG51bGw7Y2FzZSAxMzpIKFApO2Q9Yi5tZW1vaXplZFN0YXRlO2lmKDAhPT0oYi5mbGFncyY2NCkpcmV0dXJuIGIubGFuZXM9YyxiO2Q9bnVsbCE9PWQ7Yz0hMTtudWxsPT09YT92b2lkIDAhPT1iLm1lbW9pemVkUHJvcHMuZmFsbGJhY2smJnJoKGIpOmM9bnVsbCE9PWEubWVtb2l6ZWRTdGF0ZTtpZihkJiYhYyYmMCE9PShiLm1vZGUmMikpaWYobnVsbD09PWEmJiEwIT09Yi5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrfHwwIT09KFAuY3VycmVudCYxKSkwPT09ViYmKFY9Myk7ZWxzZXtpZigwPT09Vnx8Mz09PVYpVj1cbjQ7bnVsbD09PVV8fDA9PT0oRGcmMTM0MjE3NzI3KSYmMD09PShIaSYxMzQyMTc3MjcpfHxJaShVLFcpfWlmKGR8fGMpYi5mbGFnc3w9NDtyZXR1cm4gbnVsbDtjYXNlIDQ6cmV0dXJuIGZoKCksQ2koYiksbnVsbD09PWEmJmNmKGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLG51bGw7Y2FzZSAxMDpyZXR1cm4gcmcoYiksbnVsbDtjYXNlIDE3OnJldHVybiBGZihiLnR5cGUpJiZHZigpLG51bGw7Y2FzZSAxOTpIKFApO2Q9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGw9PT1kKXJldHVybiBudWxsO2Y9MCE9PShiLmZsYWdzJjY0KTtnPWQucmVuZGVyaW5nO2lmKG51bGw9PT1nKWlmKGYpRmkoZCwhMSk7ZWxzZXtpZigwIT09Vnx8bnVsbCE9PWEmJjAhPT0oYS5mbGFncyY2NCkpZm9yKGE9Yi5jaGlsZDtudWxsIT09YTspe2c9aWgoYSk7aWYobnVsbCE9PWcpe2IuZmxhZ3N8PTY0O0ZpKGQsITEpO2Y9Zy51cGRhdGVRdWV1ZTtudWxsIT09ZiYmKGIudXBkYXRlUXVldWU9ZixiLmZsYWdzfD00KTtcbm51bGw9PT1kLmxhc3RFZmZlY3QmJihiLmZpcnN0RWZmZWN0PW51bGwpO2IubGFzdEVmZmVjdD1kLmxhc3RFZmZlY3Q7ZD1jO2ZvcihjPWIuY2hpbGQ7bnVsbCE9PWM7KWY9YyxhPWQsZi5mbGFncyY9MixmLm5leHRFZmZlY3Q9bnVsbCxmLmZpcnN0RWZmZWN0PW51bGwsZi5sYXN0RWZmZWN0PW51bGwsZz1mLmFsdGVybmF0ZSxudWxsPT09Zz8oZi5jaGlsZExhbmVzPTAsZi5sYW5lcz1hLGYuY2hpbGQ9bnVsbCxmLm1lbW9pemVkUHJvcHM9bnVsbCxmLm1lbW9pemVkU3RhdGU9bnVsbCxmLnVwZGF0ZVF1ZXVlPW51bGwsZi5kZXBlbmRlbmNpZXM9bnVsbCxmLnN0YXRlTm9kZT1udWxsKTooZi5jaGlsZExhbmVzPWcuY2hpbGRMYW5lcyxmLmxhbmVzPWcubGFuZXMsZi5jaGlsZD1nLmNoaWxkLGYubWVtb2l6ZWRQcm9wcz1nLm1lbW9pemVkUHJvcHMsZi5tZW1vaXplZFN0YXRlPWcubWVtb2l6ZWRTdGF0ZSxmLnVwZGF0ZVF1ZXVlPWcudXBkYXRlUXVldWUsZi50eXBlPWcudHlwZSxhPWcuZGVwZW5kZW5jaWVzLFxuZi5kZXBlbmRlbmNpZXM9bnVsbD09PWE/bnVsbDp7bGFuZXM6YS5sYW5lcyxmaXJzdENvbnRleHQ6YS5maXJzdENvbnRleHR9KSxjPWMuc2libGluZztJKFAsUC5jdXJyZW50JjF8Mik7cmV0dXJuIGIuY2hpbGR9YT1hLnNpYmxpbmd9bnVsbCE9PWQudGFpbCYmTygpPkppJiYoYi5mbGFnc3w9NjQsZj0hMCxGaShkLCExKSxiLmxhbmVzPTMzNTU0NDMyKX1lbHNle2lmKCFmKWlmKGE9aWgoZyksbnVsbCE9PWEpe2lmKGIuZmxhZ3N8PTY0LGY9ITAsYz1hLnVwZGF0ZVF1ZXVlLG51bGwhPT1jJiYoYi51cGRhdGVRdWV1ZT1jLGIuZmxhZ3N8PTQpLEZpKGQsITApLG51bGw9PT1kLnRhaWwmJlwiaGlkZGVuXCI9PT1kLnRhaWxNb2RlJiYhZy5hbHRlcm5hdGUmJiFsaClyZXR1cm4gYj1iLmxhc3RFZmZlY3Q9ZC5sYXN0RWZmZWN0LG51bGwhPT1iJiYoYi5uZXh0RWZmZWN0PW51bGwpLG51bGx9ZWxzZSAyKk8oKS1kLnJlbmRlcmluZ1N0YXJ0VGltZT5KaSYmMTA3Mzc0MTgyNCE9PWMmJihiLmZsYWdzfD1cbjY0LGY9ITAsRmkoZCwhMSksYi5sYW5lcz0zMzU1NDQzMik7ZC5pc0JhY2t3YXJkcz8oZy5zaWJsaW5nPWIuY2hpbGQsYi5jaGlsZD1nKTooYz1kLmxhc3QsbnVsbCE9PWM/Yy5zaWJsaW5nPWc6Yi5jaGlsZD1nLGQubGFzdD1nKX1yZXR1cm4gbnVsbCE9PWQudGFpbD8oYz1kLnRhaWwsZC5yZW5kZXJpbmc9YyxkLnRhaWw9Yy5zaWJsaW5nLGQubGFzdEVmZmVjdD1iLmxhc3RFZmZlY3QsZC5yZW5kZXJpbmdTdGFydFRpbWU9TygpLGMuc2libGluZz1udWxsLGI9UC5jdXJyZW50LEkoUCxmP2ImMXwyOmImMSksYyk6bnVsbDtjYXNlIDIzOmNhc2UgMjQ6cmV0dXJuIEtpKCksbnVsbCE9PWEmJm51bGwhPT1hLm1lbW9pemVkU3RhdGUhPT0obnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSkmJlwidW5zdGFibGUtZGVmZXItd2l0aG91dC1oaWRpbmdcIiE9PWQubW9kZSYmKGIuZmxhZ3N8PTQpLG51bGx9dGhyb3cgRXJyb3IoeSgxNTYsYi50YWcpKTt9XG5mdW5jdGlvbiBMaShhKXtzd2l0Y2goYS50YWcpe2Nhc2UgMTpGZihhLnR5cGUpJiZHZigpO3ZhciBiPWEuZmxhZ3M7cmV0dXJuIGImNDA5Nj8oYS5mbGFncz1iJi00MDk3fDY0LGEpOm51bGw7Y2FzZSAzOmZoKCk7SChOKTtIKE0pO3VoKCk7Yj1hLmZsYWdzO2lmKDAhPT0oYiY2NCkpdGhyb3cgRXJyb3IoeSgyODUpKTthLmZsYWdzPWImLTQwOTd8NjQ7cmV0dXJuIGE7Y2FzZSA1OnJldHVybiBoaChhKSxudWxsO2Nhc2UgMTM6cmV0dXJuIEgoUCksYj1hLmZsYWdzLGImNDA5Nj8oYS5mbGFncz1iJi00MDk3fDY0LGEpOm51bGw7Y2FzZSAxOTpyZXR1cm4gSChQKSxudWxsO2Nhc2UgNDpyZXR1cm4gZmgoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIHJnKGEpLG51bGw7Y2FzZSAyMzpjYXNlIDI0OnJldHVybiBLaSgpLG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG5mdW5jdGlvbiBNaShhLGIpe3RyeXt2YXIgYz1cIlwiLGQ9YjtkbyBjKz1RYShkKSxkPWQucmV0dXJuO3doaWxlKGQpO3ZhciBlPWN9Y2F0Y2goZil7ZT1cIlxcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6IFwiK2YubWVzc2FnZStcIlxcblwiK2Yuc3RhY2t9cmV0dXJue3ZhbHVlOmEsc291cmNlOmIsc3RhY2s6ZX19ZnVuY3Rpb24gTmkoYSxiKXt0cnl7Y29uc29sZS5lcnJvcihiLnZhbHVlKX1jYXRjaChjKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYzt9KX19dmFyIE9pPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrTWFwP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIFBpKGEsYixjKXtjPXpnKC0xLGMpO2MudGFnPTM7Yy5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciBkPWIudmFsdWU7Yy5jYWxsYmFjaz1mdW5jdGlvbigpe1FpfHwoUWk9ITAsUmk9ZCk7TmkoYSxiKX07cmV0dXJuIGN9XG5mdW5jdGlvbiBTaShhLGIsYyl7Yz16ZygtMSxjKTtjLnRhZz0zO3ZhciBkPWEudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3ZhciBlPWIudmFsdWU7Yy5wYXlsb2FkPWZ1bmN0aW9uKCl7TmkoYSxiKTtyZXR1cm4gZChlKX19dmFyIGY9YS5zdGF0ZU5vZGU7bnVsbCE9PWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLmNvbXBvbmVudERpZENhdGNoJiYoYy5jYWxsYmFjaz1mdW5jdGlvbigpe1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBkJiYobnVsbD09PVRpP1RpPW5ldyBTZXQoW3RoaXNdKTpUaS5hZGQodGhpcyksTmkoYSxiKSk7dmFyIGM9Yi5zdGFjazt0aGlzLmNvbXBvbmVudERpZENhdGNoKGIudmFsdWUse2NvbXBvbmVudFN0YWNrOm51bGwhPT1jP2M6XCJcIn0pfSk7cmV0dXJuIGN9dmFyIFVpPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrU2V0P1dlYWtTZXQ6U2V0O1xuZnVuY3Rpb24gVmkoYSl7dmFyIGI9YS5yZWY7aWYobnVsbCE9PWIpaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGIpdHJ5e2IobnVsbCl9Y2F0Y2goYyl7V2koYSxjKX1lbHNlIGIuY3VycmVudD1udWxsfWZ1bmN0aW9uIFhpKGEsYil7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmNhc2UgMjI6cmV0dXJuO2Nhc2UgMTppZihiLmZsYWdzJjI1NiYmbnVsbCE9PWEpe3ZhciBjPWEubWVtb2l6ZWRQcm9wcyxkPWEubWVtb2l6ZWRTdGF0ZTthPWIuc3RhdGVOb2RlO2I9YS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShiLmVsZW1lbnRUeXBlPT09Yi50eXBlP2M6bGcoYi50eXBlLGMpLGQpO2EuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9Yn1yZXR1cm47Y2FzZSAzOmIuZmxhZ3MmMjU2JiZxZihiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtyZXR1cm47Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpyZXR1cm59dGhyb3cgRXJyb3IoeSgxNjMpKTt9XG5mdW5jdGlvbiBZaShhLGIsYyl7c3dpdGNoKGMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmNhc2UgMjI6Yj1jLnVwZGF0ZVF1ZXVlO2I9bnVsbCE9PWI/Yi5sYXN0RWZmZWN0Om51bGw7aWYobnVsbCE9PWIpe2E9Yj1iLm5leHQ7ZG97aWYoMz09PShhLnRhZyYzKSl7dmFyIGQ9YS5jcmVhdGU7YS5kZXN0cm95PWQoKX1hPWEubmV4dH13aGlsZShhIT09Yil9Yj1jLnVwZGF0ZVF1ZXVlO2I9bnVsbCE9PWI/Yi5sYXN0RWZmZWN0Om51bGw7aWYobnVsbCE9PWIpe2E9Yj1iLm5leHQ7ZG97dmFyIGU9YTtkPWUubmV4dDtlPWUudGFnOzAhPT0oZSY0KSYmMCE9PShlJjEpJiYoWmkoYyxhKSwkaShjLGEpKTthPWR9d2hpbGUoYSE9PWIpfXJldHVybjtjYXNlIDE6YT1jLnN0YXRlTm9kZTtjLmZsYWdzJjQmJihudWxsPT09Yj9hLmNvbXBvbmVudERpZE1vdW50KCk6KGQ9Yy5lbGVtZW50VHlwZT09PWMudHlwZT9iLm1lbW9pemVkUHJvcHM6bGcoYy50eXBlLGIubWVtb2l6ZWRQcm9wcyksYS5jb21wb25lbnREaWRVcGRhdGUoZCxcbmIubWVtb2l6ZWRTdGF0ZSxhLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKSkpO2I9Yy51cGRhdGVRdWV1ZTtudWxsIT09YiYmRWcoYyxiLGEpO3JldHVybjtjYXNlIDM6Yj1jLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1iKXthPW51bGw7aWYobnVsbCE9PWMuY2hpbGQpc3dpdGNoKGMuY2hpbGQudGFnKXtjYXNlIDU6YT1jLmNoaWxkLnN0YXRlTm9kZTticmVhaztjYXNlIDE6YT1jLmNoaWxkLnN0YXRlTm9kZX1FZyhjLGIsYSl9cmV0dXJuO2Nhc2UgNTphPWMuc3RhdGVOb2RlO251bGw9PT1iJiZjLmZsYWdzJjQmJm1mKGMudHlwZSxjLm1lbW9pemVkUHJvcHMpJiZhLmZvY3VzKCk7cmV0dXJuO2Nhc2UgNjpyZXR1cm47Y2FzZSA0OnJldHVybjtjYXNlIDEyOnJldHVybjtjYXNlIDEzOm51bGw9PT1jLm1lbW9pemVkU3RhdGUmJihjPWMuYWx0ZXJuYXRlLG51bGwhPT1jJiYoYz1jLm1lbW9pemVkU3RhdGUsbnVsbCE9PWMmJihjPWMuZGVoeWRyYXRlZCxudWxsIT09YyYmQ2MoYykpKSk7XG5yZXR1cm47Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjA6Y2FzZSAyMTpjYXNlIDIzOmNhc2UgMjQ6cmV0dXJufXRocm93IEVycm9yKHkoMTYzKSk7fVxuZnVuY3Rpb24gYWooYSxiKXtmb3IodmFyIGM9YTs7KXtpZig1PT09Yy50YWcpe3ZhciBkPWMuc3RhdGVOb2RlO2lmKGIpZD1kLnN0eWxlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLnNldFByb3BlcnR5P2Quc2V0UHJvcGVydHkoXCJkaXNwbGF5XCIsXCJub25lXCIsXCJpbXBvcnRhbnRcIik6ZC5kaXNwbGF5PVwibm9uZVwiO2Vsc2V7ZD1jLnN0YXRlTm9kZTt2YXIgZT1jLm1lbW9pemVkUHJvcHMuc3R5bGU7ZT12b2lkIDAhPT1lJiZudWxsIT09ZSYmZS5oYXNPd25Qcm9wZXJ0eShcImRpc3BsYXlcIik/ZS5kaXNwbGF5Om51bGw7ZC5zdHlsZS5kaXNwbGF5PXNiKFwiZGlzcGxheVwiLGUpfX1lbHNlIGlmKDY9PT1jLnRhZyljLnN0YXRlTm9kZS5ub2RlVmFsdWU9Yj9cIlwiOmMubWVtb2l6ZWRQcm9wcztlbHNlIGlmKCgyMyE9PWMudGFnJiYyNCE9PWMudGFnfHxudWxsPT09Yy5tZW1vaXplZFN0YXRlfHxjPT09YSkmJm51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09XG5hKWJyZWFrO2Zvcig7bnVsbD09PWMuc2libGluZzspe2lmKG51bGw9PT1jLnJldHVybnx8Yy5yZXR1cm49PT1hKXJldHVybjtjPWMucmV0dXJufWMuc2libGluZy5yZXR1cm49Yy5yZXR1cm47Yz1jLnNpYmxpbmd9fVxuZnVuY3Rpb24gYmooYSxiKXtpZihNZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIE1mLm9uQ29tbWl0RmliZXJVbm1vdW50KXRyeXtNZi5vbkNvbW1pdEZpYmVyVW5tb3VudChMZixiKX1jYXRjaChmKXt9c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6Y2FzZSAyMjphPWIudXBkYXRlUXVldWU7aWYobnVsbCE9PWEmJihhPWEubGFzdEVmZmVjdCxudWxsIT09YSkpe3ZhciBjPWE9YS5uZXh0O2Rve3ZhciBkPWMsZT1kLmRlc3Ryb3k7ZD1kLnRhZztpZih2b2lkIDAhPT1lKWlmKDAhPT0oZCY0KSlaaShiLGMpO2Vsc2V7ZD1iO3RyeXtlKCl9Y2F0Y2goZil7V2koZCxmKX19Yz1jLm5leHR9d2hpbGUoYyE9PWEpfWJyZWFrO2Nhc2UgMTpWaShiKTthPWIuc3RhdGVOb2RlO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLmNvbXBvbmVudFdpbGxVbm1vdW50KXRyeXthLnByb3BzPWIubWVtb2l6ZWRQcm9wcyxhLnN0YXRlPWIubWVtb2l6ZWRTdGF0ZSxhLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goZil7V2koYixcbmYpfWJyZWFrO2Nhc2UgNTpWaShiKTticmVhaztjYXNlIDQ6Y2ooYSxiKX19ZnVuY3Rpb24gZGooYSl7YS5hbHRlcm5hdGU9bnVsbDthLmNoaWxkPW51bGw7YS5kZXBlbmRlbmNpZXM9bnVsbDthLmZpcnN0RWZmZWN0PW51bGw7YS5sYXN0RWZmZWN0PW51bGw7YS5tZW1vaXplZFByb3BzPW51bGw7YS5tZW1vaXplZFN0YXRlPW51bGw7YS5wZW5kaW5nUHJvcHM9bnVsbDthLnJldHVybj1udWxsO2EudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBlaihhKXtyZXR1cm4gNT09PWEudGFnfHwzPT09YS50YWd8fDQ9PT1hLnRhZ31cbmZ1bmN0aW9uIGZqKGEpe2E6e2Zvcih2YXIgYj1hLnJldHVybjtudWxsIT09Yjspe2lmKGVqKGIpKWJyZWFrIGE7Yj1iLnJldHVybn10aHJvdyBFcnJvcih5KDE2MCkpO312YXIgYz1iO2I9Yy5zdGF0ZU5vZGU7c3dpdGNoKGMudGFnKXtjYXNlIDU6dmFyIGQ9ITE7YnJlYWs7Y2FzZSAzOmI9Yi5jb250YWluZXJJbmZvO2Q9ITA7YnJlYWs7Y2FzZSA0OmI9Yi5jb250YWluZXJJbmZvO2Q9ITA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcih5KDE2MSkpO31jLmZsYWdzJjE2JiYocGIoYixcIlwiKSxjLmZsYWdzJj0tMTcpO2E6Yjpmb3IoYz1hOzspe2Zvcig7bnVsbD09PWMuc2libGluZzspe2lmKG51bGw9PT1jLnJldHVybnx8ZWooYy5yZXR1cm4pKXtjPW51bGw7YnJlYWsgYX1jPWMucmV0dXJufWMuc2libGluZy5yZXR1cm49Yy5yZXR1cm47Zm9yKGM9Yy5zaWJsaW5nOzUhPT1jLnRhZyYmNiE9PWMudGFnJiYxOCE9PWMudGFnOyl7aWYoYy5mbGFncyYyKWNvbnRpbnVlIGI7aWYobnVsbD09PVxuYy5jaGlsZHx8ND09PWMudGFnKWNvbnRpbnVlIGI7ZWxzZSBjLmNoaWxkLnJldHVybj1jLGM9Yy5jaGlsZH1pZighKGMuZmxhZ3MmMikpe2M9Yy5zdGF0ZU5vZGU7YnJlYWsgYX19ZD9naihhLGMsYik6aGooYSxjLGIpfVxuZnVuY3Rpb24gZ2ooYSxiLGMpe3ZhciBkPWEudGFnLGU9NT09PWR8fDY9PT1kO2lmKGUpYT1lP2Euc3RhdGVOb2RlOmEuc3RhdGVOb2RlLmluc3RhbmNlLGI/OD09PWMubm9kZVR5cGU/Yy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLGIpOmMuaW5zZXJ0QmVmb3JlKGEsYik6KDg9PT1jLm5vZGVUeXBlPyhiPWMucGFyZW50Tm9kZSxiLmluc2VydEJlZm9yZShhLGMpKTooYj1jLGIuYXBwZW5kQ2hpbGQoYSkpLGM9Yy5fcmVhY3RSb290Q29udGFpbmVyLG51bGwhPT1jJiZ2b2lkIDAhPT1jfHxudWxsIT09Yi5vbmNsaWNrfHwoYi5vbmNsaWNrPWpmKSk7ZWxzZSBpZig0IT09ZCYmKGE9YS5jaGlsZCxudWxsIT09YSkpZm9yKGdqKGEsYixjKSxhPWEuc2libGluZztudWxsIT09YTspZ2ooYSxiLGMpLGE9YS5zaWJsaW5nfVxuZnVuY3Rpb24gaGooYSxiLGMpe3ZhciBkPWEudGFnLGU9NT09PWR8fDY9PT1kO2lmKGUpYT1lP2Euc3RhdGVOb2RlOmEuc3RhdGVOb2RlLmluc3RhbmNlLGI/Yy5pbnNlcnRCZWZvcmUoYSxiKTpjLmFwcGVuZENoaWxkKGEpO2Vsc2UgaWYoNCE9PWQmJihhPWEuY2hpbGQsbnVsbCE9PWEpKWZvcihoaihhLGIsYyksYT1hLnNpYmxpbmc7bnVsbCE9PWE7KWhqKGEsYixjKSxhPWEuc2libGluZ31cbmZ1bmN0aW9uIGNqKGEsYil7Zm9yKHZhciBjPWIsZD0hMSxlLGY7Oyl7aWYoIWQpe2Q9Yy5yZXR1cm47YTpmb3IoOzspe2lmKG51bGw9PT1kKXRocm93IEVycm9yKHkoMTYwKSk7ZT1kLnN0YXRlTm9kZTtzd2l0Y2goZC50YWcpe2Nhc2UgNTpmPSExO2JyZWFrIGE7Y2FzZSAzOmU9ZS5jb250YWluZXJJbmZvO2Y9ITA7YnJlYWsgYTtjYXNlIDQ6ZT1lLmNvbnRhaW5lckluZm87Zj0hMDticmVhayBhfWQ9ZC5yZXR1cm59ZD0hMH1pZig1PT09Yy50YWd8fDY9PT1jLnRhZyl7YTpmb3IodmFyIGc9YSxoPWMsaz1oOzspaWYoYmooZyxrKSxudWxsIT09ay5jaGlsZCYmNCE9PWsudGFnKWsuY2hpbGQucmV0dXJuPWssaz1rLmNoaWxkO2Vsc2V7aWYoaz09PWgpYnJlYWsgYTtmb3IoO251bGw9PT1rLnNpYmxpbmc7KXtpZihudWxsPT09ay5yZXR1cm58fGsucmV0dXJuPT09aClicmVhayBhO2s9ay5yZXR1cm59ay5zaWJsaW5nLnJldHVybj1rLnJldHVybjtrPWsuc2libGluZ31mPyhnPWUsaD1jLnN0YXRlTm9kZSxcbjg9PT1nLm5vZGVUeXBlP2cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoKTpnLnJlbW92ZUNoaWxkKGgpKTplLnJlbW92ZUNoaWxkKGMuc3RhdGVOb2RlKX1lbHNlIGlmKDQ9PT1jLnRhZyl7aWYobnVsbCE9PWMuY2hpbGQpe2U9Yy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztmPSEwO2MuY2hpbGQucmV0dXJuPWM7Yz1jLmNoaWxkO2NvbnRpbnVlfX1lbHNlIGlmKGJqKGEsYyksbnVsbCE9PWMuY2hpbGQpe2MuY2hpbGQucmV0dXJuPWM7Yz1jLmNoaWxkO2NvbnRpbnVlfWlmKGM9PT1iKWJyZWFrO2Zvcig7bnVsbD09PWMuc2libGluZzspe2lmKG51bGw9PT1jLnJldHVybnx8Yy5yZXR1cm49PT1iKXJldHVybjtjPWMucmV0dXJuOzQ9PT1jLnRhZyYmKGQ9ITEpfWMuc2libGluZy5yZXR1cm49Yy5yZXR1cm47Yz1jLnNpYmxpbmd9fVxuZnVuY3Rpb24gaWooYSxiKXtzd2l0Y2goYi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTpjYXNlIDIyOnZhciBjPWIudXBkYXRlUXVldWU7Yz1udWxsIT09Yz9jLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09Yyl7dmFyIGQ9Yz1jLm5leHQ7ZG8gMz09PShkLnRhZyYzKSYmKGE9ZC5kZXN0cm95LGQuZGVzdHJveT12b2lkIDAsdm9pZCAwIT09YSYmYSgpKSxkPWQubmV4dDt3aGlsZShkIT09Yyl9cmV0dXJuO2Nhc2UgMTpyZXR1cm47Y2FzZSA1OmM9Yi5zdGF0ZU5vZGU7aWYobnVsbCE9Yyl7ZD1iLm1lbW9pemVkUHJvcHM7dmFyIGU9bnVsbCE9PWE/YS5tZW1vaXplZFByb3BzOmQ7YT1iLnR5cGU7dmFyIGY9Yi51cGRhdGVRdWV1ZTtiLnVwZGF0ZVF1ZXVlPW51bGw7aWYobnVsbCE9PWYpe2NbeGZdPWQ7XCJpbnB1dFwiPT09YSYmXCJyYWRpb1wiPT09ZC50eXBlJiZudWxsIT1kLm5hbWUmJiRhKGMsZCk7d2IoYSxlKTtiPXdiKGEsZCk7Zm9yKGU9MDtlPGYubGVuZ3RoO2UrPVxuMil7dmFyIGc9ZltlXSxoPWZbZSsxXTtcInN0eWxlXCI9PT1nP3RiKGMsaCk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09Zz9vYihjLGgpOlwiY2hpbGRyZW5cIj09PWc/cGIoYyxoKTpxYShjLGcsaCxiKX1zd2l0Y2goYSl7Y2FzZSBcImlucHV0XCI6YWIoYyxkKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjppYihjLGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjphPWMuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSxjLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFkLm11bHRpcGxlLGY9ZC52YWx1ZSxudWxsIT1mP2ZiKGMsISFkLm11bHRpcGxlLGYsITEpOmEhPT0hIWQubXVsdGlwbGUmJihudWxsIT1kLmRlZmF1bHRWYWx1ZT9mYihjLCEhZC5tdWx0aXBsZSxkLmRlZmF1bHRWYWx1ZSwhMCk6ZmIoYywhIWQubXVsdGlwbGUsZC5tdWx0aXBsZT9bXTpcIlwiLCExKSl9fX1yZXR1cm47Y2FzZSA2OmlmKG51bGw9PT1iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcih5KDE2MikpO2Iuc3RhdGVOb2RlLm5vZGVWYWx1ZT1cbmIubWVtb2l6ZWRQcm9wcztyZXR1cm47Y2FzZSAzOmM9Yi5zdGF0ZU5vZGU7Yy5oeWRyYXRlJiYoYy5oeWRyYXRlPSExLENjKGMuY29udGFpbmVySW5mbykpO3JldHVybjtjYXNlIDEyOnJldHVybjtjYXNlIDEzOm51bGwhPT1iLm1lbW9pemVkU3RhdGUmJihqaj1PKCksYWooYi5jaGlsZCwhMCkpO2tqKGIpO3JldHVybjtjYXNlIDE5OmtqKGIpO3JldHVybjtjYXNlIDE3OnJldHVybjtjYXNlIDIzOmNhc2UgMjQ6YWooYixudWxsIT09Yi5tZW1vaXplZFN0YXRlKTtyZXR1cm59dGhyb3cgRXJyb3IoeSgxNjMpKTt9ZnVuY3Rpb24ga2ooYSl7dmFyIGI9YS51cGRhdGVRdWV1ZTtpZihudWxsIT09Yil7YS51cGRhdGVRdWV1ZT1udWxsO3ZhciBjPWEuc3RhdGVOb2RlO251bGw9PT1jJiYoYz1hLnN0YXRlTm9kZT1uZXcgVWkpO2IuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZD1sai5iaW5kKG51bGwsYSxiKTtjLmhhcyhiKXx8KGMuYWRkKGIpLGIudGhlbihkLGQpKX0pfX1cbmZ1bmN0aW9uIG1qKGEsYil7cmV0dXJuIG51bGwhPT1hJiYoYT1hLm1lbW9pemVkU3RhdGUsbnVsbD09PWF8fG51bGwhPT1hLmRlaHlkcmF0ZWQpPyhiPWIubWVtb2l6ZWRTdGF0ZSxudWxsIT09YiYmbnVsbD09PWIuZGVoeWRyYXRlZCk6ITF9dmFyIG5qPU1hdGguY2VpbCxvaj1yYS5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLHBqPXJhLlJlYWN0Q3VycmVudE93bmVyLFg9MCxVPW51bGwsWT1udWxsLFc9MCxxaj0wLHJqPUJmKDApLFY9MCxzaj1udWxsLHRqPTAsRGc9MCxIaT0wLHVqPTAsdmo9bnVsbCxqaj0wLEppPUluZmluaXR5O2Z1bmN0aW9uIHdqKCl7Smk9TygpKzUwMH12YXIgWj1udWxsLFFpPSExLFJpPW51bGwsVGk9bnVsbCx4aj0hMSx5aj1udWxsLHpqPTkwLEFqPVtdLEJqPVtdLENqPW51bGwsRGo9MCxFaj1udWxsLEZqPS0xLEdqPTAsSGo9MCxJaj1udWxsLEpqPSExO2Z1bmN0aW9uIEhnKCl7cmV0dXJuIDAhPT0oWCY0OCk/TygpOi0xIT09Rmo/Rmo6Rmo9TygpfVxuZnVuY3Rpb24gSWcoYSl7YT1hLm1vZGU7aWYoMD09PShhJjIpKXJldHVybiAxO2lmKDA9PT0oYSY0KSlyZXR1cm4gOTk9PT1lZygpPzE6MjswPT09R2omJihHaj10aik7aWYoMCE9PWtnLnRyYW5zaXRpb24pezAhPT1IaiYmKEhqPW51bGwhPT12aj92ai5wZW5kaW5nTGFuZXM6MCk7YT1Hajt2YXIgYj00MTg2MTEyJn5IajtiJj0tYjswPT09YiYmKGE9NDE4NjExMiZ+YSxiPWEmLWEsMD09PWImJihiPTgxOTIpKTtyZXR1cm4gYn1hPWVnKCk7MCE9PShYJjQpJiY5OD09PWE/YT1YYygxMixHaik6KGE9U2MoYSksYT1YYyhhLEdqKSk7cmV0dXJuIGF9XG5mdW5jdGlvbiBKZyhhLGIsYyl7aWYoNTA8RGopdGhyb3cgRGo9MCxFaj1udWxsLEVycm9yKHkoMTg1KSk7YT1LaihhLGIpO2lmKG51bGw9PT1hKXJldHVybiBudWxsOyRjKGEsYixjKTthPT09VSYmKEhpfD1iLDQ9PT1WJiZJaShhLFcpKTt2YXIgZD1lZygpOzE9PT1iPzAhPT0oWCY4KSYmMD09PShYJjQ4KT9MaihhKTooTWooYSxjKSwwPT09WCYmKHdqKCksaWcoKSkpOigwPT09KFgmNCl8fDk4IT09ZCYmOTkhPT1kfHwobnVsbD09PUNqP0NqPW5ldyBTZXQoW2FdKTpDai5hZGQoYSkpLE1qKGEsYykpO3ZqPWF9ZnVuY3Rpb24gS2ooYSxiKXthLmxhbmVzfD1iO3ZhciBjPWEuYWx0ZXJuYXRlO251bGwhPT1jJiYoYy5sYW5lc3w9Yik7Yz1hO2ZvcihhPWEucmV0dXJuO251bGwhPT1hOylhLmNoaWxkTGFuZXN8PWIsYz1hLmFsdGVybmF0ZSxudWxsIT09YyYmKGMuY2hpbGRMYW5lc3w9YiksYz1hLGE9YS5yZXR1cm47cmV0dXJuIDM9PT1jLnRhZz9jLnN0YXRlTm9kZTpudWxsfVxuZnVuY3Rpb24gTWooYSxiKXtmb3IodmFyIGM9YS5jYWxsYmFja05vZGUsZD1hLnN1c3BlbmRlZExhbmVzLGU9YS5waW5nZWRMYW5lcyxmPWEuZXhwaXJhdGlvblRpbWVzLGc9YS5wZW5kaW5nTGFuZXM7MDxnOyl7dmFyIGg9MzEtVmMoZyksaz0xPDxoLGw9ZltoXTtpZigtMT09PWwpe2lmKDA9PT0oayZkKXx8MCE9PShrJmUpKXtsPWI7UmMoayk7dmFyIG49RjtmW2hdPTEwPD1uP2wrMjUwOjY8PW4/bCs1RTM6LTF9fWVsc2UgbDw9YiYmKGEuZXhwaXJlZExhbmVzfD1rKTtnJj1+a31kPVVjKGEsYT09PVU/VzowKTtiPUY7aWYoMD09PWQpbnVsbCE9PWMmJihjIT09WmYmJlBmKGMpLGEuY2FsbGJhY2tOb2RlPW51bGwsYS5jYWxsYmFja1ByaW9yaXR5PTApO2Vsc2V7aWYobnVsbCE9PWMpe2lmKGEuY2FsbGJhY2tQcmlvcml0eT09PWIpcmV0dXJuO2MhPT1aZiYmUGYoYyl9MTU9PT1iPyhjPUxqLmJpbmQobnVsbCxhKSxudWxsPT09YWc/KGFnPVtjXSxiZz1PZihVZixqZykpOmFnLnB1c2goYyksXG5jPVpmKToxND09PWI/Yz1oZyg5OSxMai5iaW5kKG51bGwsYSkpOihjPVRjKGIpLGM9aGcoYyxOai5iaW5kKG51bGwsYSkpKTthLmNhbGxiYWNrUHJpb3JpdHk9YjthLmNhbGxiYWNrTm9kZT1jfX1cbmZ1bmN0aW9uIE5qKGEpe0ZqPS0xO0hqPUdqPTA7aWYoMCE9PShYJjQ4KSl0aHJvdyBFcnJvcih5KDMyNykpO3ZhciBiPWEuY2FsbGJhY2tOb2RlO2lmKE9qKCkmJmEuY2FsbGJhY2tOb2RlIT09YilyZXR1cm4gbnVsbDt2YXIgYz1VYyhhLGE9PT1VP1c6MCk7aWYoMD09PWMpcmV0dXJuIG51bGw7dmFyIGQ9Yzt2YXIgZT1YO1h8PTE2O3ZhciBmPVBqKCk7aWYoVSE9PWF8fFchPT1kKXdqKCksUWooYSxkKTtkbyB0cnl7UmooKTticmVha31jYXRjaChoKXtTaihhLGgpfXdoaWxlKDEpO3FnKCk7b2ouY3VycmVudD1mO1g9ZTtudWxsIT09WT9kPTA6KFU9bnVsbCxXPTAsZD1WKTtpZigwIT09KHRqJkhpKSlRaihhLDApO2Vsc2UgaWYoMCE9PWQpezI9PT1kJiYoWHw9NjQsYS5oeWRyYXRlJiYoYS5oeWRyYXRlPSExLHFmKGEuY29udGFpbmVySW5mbykpLGM9V2MoYSksMCE9PWMmJihkPVRqKGEsYykpKTtpZigxPT09ZCl0aHJvdyBiPXNqLFFqKGEsMCksSWkoYSxjKSxNaihhLE8oKSksYjthLmZpbmlzaGVkV29yaz1cbmEuY3VycmVudC5hbHRlcm5hdGU7YS5maW5pc2hlZExhbmVzPWM7c3dpdGNoKGQpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IoeSgzNDUpKTtjYXNlIDI6VWooYSk7YnJlYWs7Y2FzZSAzOklpKGEsYyk7aWYoKGMmNjI5MTQ1NjApPT09YyYmKGQ9amorNTAwLU8oKSwxMDxkKSl7aWYoMCE9PVVjKGEsMCkpYnJlYWs7ZT1hLnN1c3BlbmRlZExhbmVzO2lmKChlJmMpIT09Yyl7SGcoKTthLnBpbmdlZExhbmVzfD1hLnN1c3BlbmRlZExhbmVzJmU7YnJlYWt9YS50aW1lb3V0SGFuZGxlPW9mKFVqLmJpbmQobnVsbCxhKSxkKTticmVha31VaihhKTticmVhaztjYXNlIDQ6SWkoYSxjKTtpZigoYyY0MTg2MTEyKT09PWMpYnJlYWs7ZD1hLmV2ZW50VGltZXM7Zm9yKGU9LTE7MDxjOyl7dmFyIGc9MzEtVmMoYyk7Zj0xPDxnO2c9ZFtnXTtnPmUmJihlPWcpO2MmPX5mfWM9ZTtjPU8oKS1jO2M9KDEyMD5jPzEyMDo0ODA+Yz80ODA6MTA4MD5jPzEwODA6MTkyMD5jPzE5MjA6M0UzPmM/M0UzOjQzMjA+XG5jPzQzMjA6MTk2MCpuaihjLzE5NjApKS1jO2lmKDEwPGMpe2EudGltZW91dEhhbmRsZT1vZihVai5iaW5kKG51bGwsYSksYyk7YnJlYWt9VWooYSk7YnJlYWs7Y2FzZSA1OlVqKGEpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoeSgzMjkpKTt9fU1qKGEsTygpKTtyZXR1cm4gYS5jYWxsYmFja05vZGU9PT1iP05qLmJpbmQobnVsbCxhKTpudWxsfWZ1bmN0aW9uIElpKGEsYil7YiY9fnVqO2ImPX5IaTthLnN1c3BlbmRlZExhbmVzfD1iO2EucGluZ2VkTGFuZXMmPX5iO2ZvcihhPWEuZXhwaXJhdGlvblRpbWVzOzA8Yjspe3ZhciBjPTMxLVZjKGIpLGQ9MTw8YzthW2NdPS0xO2ImPX5kfX1cbmZ1bmN0aW9uIExqKGEpe2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMjcpKTtPaigpO2lmKGE9PT1VJiYwIT09KGEuZXhwaXJlZExhbmVzJlcpKXt2YXIgYj1XO3ZhciBjPVRqKGEsYik7MCE9PSh0aiZIaSkmJihiPVVjKGEsYiksYz1UaihhLGIpKX1lbHNlIGI9VWMoYSwwKSxjPVRqKGEsYik7MCE9PWEudGFnJiYyPT09YyYmKFh8PTY0LGEuaHlkcmF0ZSYmKGEuaHlkcmF0ZT0hMSxxZihhLmNvbnRhaW5lckluZm8pKSxiPVdjKGEpLDAhPT1iJiYoYz1UaihhLGIpKSk7aWYoMT09PWMpdGhyb3cgYz1zaixRaihhLDApLElpKGEsYiksTWooYSxPKCkpLGM7YS5maW5pc2hlZFdvcms9YS5jdXJyZW50LmFsdGVybmF0ZTthLmZpbmlzaGVkTGFuZXM9YjtVaihhKTtNaihhLE8oKSk7cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBWaigpe2lmKG51bGwhPT1Dail7dmFyIGE9Q2o7Q2o9bnVsbDthLmZvckVhY2goZnVuY3Rpb24oYSl7YS5leHBpcmVkTGFuZXN8PTI0JmEucGVuZGluZ0xhbmVzO01qKGEsTygpKX0pfWlnKCl9ZnVuY3Rpb24gV2ooYSxiKXt2YXIgYz1YO1h8PTE7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7WD1jLDA9PT1YJiYod2ooKSxpZygpKX19ZnVuY3Rpb24gWGooYSxiKXt2YXIgYz1YO1gmPS0yO1h8PTg7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7WD1jLDA9PT1YJiYod2ooKSxpZygpKX19ZnVuY3Rpb24gbmkoYSxiKXtJKHJqLHFqKTtxanw9Yjt0anw9Yn1mdW5jdGlvbiBLaSgpe3FqPXJqLmN1cnJlbnQ7SChyail9XG5mdW5jdGlvbiBRaihhLGIpe2EuZmluaXNoZWRXb3JrPW51bGw7YS5maW5pc2hlZExhbmVzPTA7dmFyIGM9YS50aW1lb3V0SGFuZGxlOy0xIT09YyYmKGEudGltZW91dEhhbmRsZT0tMSxwZihjKSk7aWYobnVsbCE9PVkpZm9yKGM9WS5yZXR1cm47bnVsbCE9PWM7KXt2YXIgZD1jO3N3aXRjaChkLnRhZyl7Y2FzZSAxOmQ9ZC50eXBlLmNoaWxkQ29udGV4dFR5cGVzO251bGwhPT1kJiZ2b2lkIDAhPT1kJiZHZigpO2JyZWFrO2Nhc2UgMzpmaCgpO0goTik7SChNKTt1aCgpO2JyZWFrO2Nhc2UgNTpoaChkKTticmVhaztjYXNlIDQ6ZmgoKTticmVhaztjYXNlIDEzOkgoUCk7YnJlYWs7Y2FzZSAxOTpIKFApO2JyZWFrO2Nhc2UgMTA6cmcoZCk7YnJlYWs7Y2FzZSAyMzpjYXNlIDI0OktpKCl9Yz1jLnJldHVybn1VPWE7WT1UZyhhLmN1cnJlbnQsbnVsbCk7Vz1xaj10aj1iO1Y9MDtzaj1udWxsO3VqPUhpPURnPTB9XG5mdW5jdGlvbiBTaihhLGIpe2Rve3ZhciBjPVk7dHJ5e3FnKCk7dmguY3VycmVudD1HaDtpZih5aCl7Zm9yKHZhciBkPVIubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZDspe3ZhciBlPWQucXVldWU7bnVsbCE9PWUmJihlLnBlbmRpbmc9bnVsbCk7ZD1kLm5leHR9eWg9ITF9eGg9MDtUPVM9Uj1udWxsO3poPSExO3BqLmN1cnJlbnQ9bnVsbDtpZihudWxsPT09Y3x8bnVsbD09PWMucmV0dXJuKXtWPTE7c2o9YjtZPW51bGw7YnJlYWt9YTp7dmFyIGY9YSxnPWMucmV0dXJuLGg9YyxrPWI7Yj1XO2guZmxhZ3N8PTIwNDg7aC5maXJzdEVmZmVjdD1oLmxhc3RFZmZlY3Q9bnVsbDtpZihudWxsIT09ayYmXCJvYmplY3RcIj09PXR5cGVvZiBrJiZcImZ1bmN0aW9uXCI9PT10eXBlb2Ygay50aGVuKXt2YXIgbD1rO2lmKDA9PT0oaC5tb2RlJjIpKXt2YXIgbj1oLmFsdGVybmF0ZTtuPyhoLnVwZGF0ZVF1ZXVlPW4udXBkYXRlUXVldWUsaC5tZW1vaXplZFN0YXRlPW4ubWVtb2l6ZWRTdGF0ZSxoLmxhbmVzPW4ubGFuZXMpOlxuKGgudXBkYXRlUXVldWU9bnVsbCxoLm1lbW9pemVkU3RhdGU9bnVsbCl9dmFyIEE9MCE9PShQLmN1cnJlbnQmMSkscD1nO2Rve3ZhciBDO2lmKEM9MTM9PT1wLnRhZyl7dmFyIHg9cC5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT14KUM9bnVsbCE9PXguZGVoeWRyYXRlZD8hMDohMTtlbHNle3ZhciB3PXAubWVtb2l6ZWRQcm9wcztDPXZvaWQgMD09PXcuZmFsbGJhY2s/ITE6ITAhPT13LnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrPyEwOkE/ITE6ITB9fWlmKEMpe3ZhciB6PXAudXBkYXRlUXVldWU7aWYobnVsbD09PXope3ZhciB1PW5ldyBTZXQ7dS5hZGQobCk7cC51cGRhdGVRdWV1ZT11fWVsc2Ugei5hZGQobCk7aWYoMD09PShwLm1vZGUmMikpe3AuZmxhZ3N8PTY0O2guZmxhZ3N8PTE2Mzg0O2guZmxhZ3MmPS0yOTgxO2lmKDE9PT1oLnRhZylpZihudWxsPT09aC5hbHRlcm5hdGUpaC50YWc9MTc7ZWxzZXt2YXIgdD16ZygtMSwxKTt0LnRhZz0yO0FnKGgsdCl9aC5sYW5lc3w9MTticmVhayBhfWs9XG52b2lkIDA7aD1iO3ZhciBxPWYucGluZ0NhY2hlO251bGw9PT1xPyhxPWYucGluZ0NhY2hlPW5ldyBPaSxrPW5ldyBTZXQscS5zZXQobCxrKSk6KGs9cS5nZXQobCksdm9pZCAwPT09ayYmKGs9bmV3IFNldCxxLnNldChsLGspKSk7aWYoIWsuaGFzKGgpKXtrLmFkZChoKTt2YXIgdj1Zai5iaW5kKG51bGwsZixsLGgpO2wudGhlbih2LHYpfXAuZmxhZ3N8PTQwOTY7cC5sYW5lcz1iO2JyZWFrIGF9cD1wLnJldHVybn13aGlsZShudWxsIT09cCk7az1FcnJvcigoUmEoaC50eXBlKXx8XCJBIFJlYWN0IGNvbXBvbmVudFwiKStcIiBzdXNwZW5kZWQgd2hpbGUgcmVuZGVyaW5nLCBidXQgbm8gZmFsbGJhY2sgVUkgd2FzIHNwZWNpZmllZC5cXG5cXG5BZGQgYSA8U3VzcGVuc2UgZmFsbGJhY2s9Li4uPiBjb21wb25lbnQgaGlnaGVyIGluIHRoZSB0cmVlIHRvIHByb3ZpZGUgYSBsb2FkaW5nIGluZGljYXRvciBvciBwbGFjZWhvbGRlciB0byBkaXNwbGF5LlwiKX01IT09ViYmKFY9Mik7az1NaShrLGgpO3A9XG5nO2Rve3N3aXRjaChwLnRhZyl7Y2FzZSAzOmY9aztwLmZsYWdzfD00MDk2O2ImPS1iO3AubGFuZXN8PWI7dmFyIEo9UGkocCxmLGIpO0JnKHAsSik7YnJlYWsgYTtjYXNlIDE6Zj1rO3ZhciBLPXAudHlwZSxRPXAuc3RhdGVOb2RlO2lmKDA9PT0ocC5mbGFncyY2NCkmJihcImZ1bmN0aW9uXCI9PT10eXBlb2YgSy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3J8fG51bGwhPT1RJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgUS5jb21wb25lbnREaWRDYXRjaCYmKG51bGw9PT1UaXx8IVRpLmhhcyhRKSkpKXtwLmZsYWdzfD00MDk2O2ImPS1iO3AubGFuZXN8PWI7dmFyIEw9U2kocCxmLGIpO0JnKHAsTCk7YnJlYWsgYX19cD1wLnJldHVybn13aGlsZShudWxsIT09cCl9WmooYyl9Y2F0Y2godmEpe2I9dmE7WT09PWMmJm51bGwhPT1jJiYoWT1jPWMucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSgxKX1cbmZ1bmN0aW9uIFBqKCl7dmFyIGE9b2ouY3VycmVudDtvai5jdXJyZW50PUdoO3JldHVybiBudWxsPT09YT9HaDphfWZ1bmN0aW9uIFRqKGEsYil7dmFyIGM9WDtYfD0xNjt2YXIgZD1QaigpO1U9PT1hJiZXPT09Ynx8UWooYSxiKTtkbyB0cnl7YWsoKTticmVha31jYXRjaChlKXtTaihhLGUpfXdoaWxlKDEpO3FnKCk7WD1jO29qLmN1cnJlbnQ9ZDtpZihudWxsIT09WSl0aHJvdyBFcnJvcih5KDI2MSkpO1U9bnVsbDtXPTA7cmV0dXJuIFZ9ZnVuY3Rpb24gYWsoKXtmb3IoO251bGwhPT1ZOyliayhZKX1mdW5jdGlvbiBSaigpe2Zvcig7bnVsbCE9PVkmJiFRZigpOyliayhZKX1mdW5jdGlvbiBiayhhKXt2YXIgYj1jayhhLmFsdGVybmF0ZSxhLHFqKTthLm1lbW9pemVkUHJvcHM9YS5wZW5kaW5nUHJvcHM7bnVsbD09PWI/WmooYSk6WT1iO3BqLmN1cnJlbnQ9bnVsbH1cbmZ1bmN0aW9uIFpqKGEpe3ZhciBiPWE7ZG97dmFyIGM9Yi5hbHRlcm5hdGU7YT1iLnJldHVybjtpZigwPT09KGIuZmxhZ3MmMjA0OCkpe2M9R2koYyxiLHFqKTtpZihudWxsIT09Yyl7WT1jO3JldHVybn1jPWI7aWYoMjQhPT1jLnRhZyYmMjMhPT1jLnRhZ3x8bnVsbD09PWMubWVtb2l6ZWRTdGF0ZXx8MCE9PShxaiYxMDczNzQxODI0KXx8MD09PShjLm1vZGUmNCkpe2Zvcih2YXIgZD0wLGU9Yy5jaGlsZDtudWxsIT09ZTspZHw9ZS5sYW5lc3xlLmNoaWxkTGFuZXMsZT1lLnNpYmxpbmc7Yy5jaGlsZExhbmVzPWR9bnVsbCE9PWEmJjA9PT0oYS5mbGFncyYyMDQ4KSYmKG51bGw9PT1hLmZpcnN0RWZmZWN0JiYoYS5maXJzdEVmZmVjdD1iLmZpcnN0RWZmZWN0KSxudWxsIT09Yi5sYXN0RWZmZWN0JiYobnVsbCE9PWEubGFzdEVmZmVjdCYmKGEubGFzdEVmZmVjdC5uZXh0RWZmZWN0PWIuZmlyc3RFZmZlY3QpLGEubGFzdEVmZmVjdD1iLmxhc3RFZmZlY3QpLDE8Yi5mbGFncyYmKG51bGwhPT1cbmEubGFzdEVmZmVjdD9hLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1iOmEuZmlyc3RFZmZlY3Q9YixhLmxhc3RFZmZlY3Q9YikpfWVsc2V7Yz1MaShiKTtpZihudWxsIT09Yyl7Yy5mbGFncyY9MjA0NztZPWM7cmV0dXJufW51bGwhPT1hJiYoYS5maXJzdEVmZmVjdD1hLmxhc3RFZmZlY3Q9bnVsbCxhLmZsYWdzfD0yMDQ4KX1iPWIuc2libGluZztpZihudWxsIT09Yil7WT1iO3JldHVybn1ZPWI9YX13aGlsZShudWxsIT09Yik7MD09PVYmJihWPTUpfWZ1bmN0aW9uIFVqKGEpe3ZhciBiPWVnKCk7Z2coOTksZGsuYmluZChudWxsLGEsYikpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gZGsoYSxiKXtkbyBPaigpO3doaWxlKG51bGwhPT15aik7aWYoMCE9PShYJjQ4KSl0aHJvdyBFcnJvcih5KDMyNykpO3ZhciBjPWEuZmluaXNoZWRXb3JrO2lmKG51bGw9PT1jKXJldHVybiBudWxsO2EuZmluaXNoZWRXb3JrPW51bGw7YS5maW5pc2hlZExhbmVzPTA7aWYoYz09PWEuY3VycmVudCl0aHJvdyBFcnJvcih5KDE3NykpO2EuY2FsbGJhY2tOb2RlPW51bGw7dmFyIGQ9Yy5sYW5lc3xjLmNoaWxkTGFuZXMsZT1kLGY9YS5wZW5kaW5nTGFuZXMmfmU7YS5wZW5kaW5nTGFuZXM9ZTthLnN1c3BlbmRlZExhbmVzPTA7YS5waW5nZWRMYW5lcz0wO2EuZXhwaXJlZExhbmVzJj1lO2EubXV0YWJsZVJlYWRMYW5lcyY9ZTthLmVudGFuZ2xlZExhbmVzJj1lO2U9YS5lbnRhbmdsZW1lbnRzO2Zvcih2YXIgZz1hLmV2ZW50VGltZXMsaD1hLmV4cGlyYXRpb25UaW1lczswPGY7KXt2YXIgaz0zMS1WYyhmKSxsPTE8PGs7ZVtrXT0wO2dba109LTE7aFtrXT0tMTtmJj1+bH1udWxsIT09XG5DaiYmMD09PShkJjI0KSYmQ2ouaGFzKGEpJiZDai5kZWxldGUoYSk7YT09PVUmJihZPVU9bnVsbCxXPTApOzE8Yy5mbGFncz9udWxsIT09Yy5sYXN0RWZmZWN0PyhjLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1jLGQ9Yy5maXJzdEVmZmVjdCk6ZD1jOmQ9Yy5maXJzdEVmZmVjdDtpZihudWxsIT09ZCl7ZT1YO1h8PTMyO3BqLmN1cnJlbnQ9bnVsbDtrZj1mZDtnPU5lKCk7aWYoT2UoZykpe2lmKFwic2VsZWN0aW9uU3RhcnRcImluIGcpaD17c3RhcnQ6Zy5zZWxlY3Rpb25TdGFydCxlbmQ6Zy5zZWxlY3Rpb25FbmR9O2Vsc2UgYTppZihoPShoPWcub3duZXJEb2N1bWVudCkmJmguZGVmYXVsdFZpZXd8fHdpbmRvdywobD1oLmdldFNlbGVjdGlvbiYmaC5nZXRTZWxlY3Rpb24oKSkmJjAhPT1sLnJhbmdlQ291bnQpe2g9bC5hbmNob3JOb2RlO2Y9bC5hbmNob3JPZmZzZXQ7az1sLmZvY3VzTm9kZTtsPWwuZm9jdXNPZmZzZXQ7dHJ5e2gubm9kZVR5cGUsay5ub2RlVHlwZX1jYXRjaCh2YSl7aD1udWxsO1xuYnJlYWsgYX12YXIgbj0wLEE9LTEscD0tMSxDPTAseD0wLHc9Zyx6PW51bGw7Yjpmb3IoOzspe2Zvcih2YXIgdTs7KXt3IT09aHx8MCE9PWYmJjMhPT13Lm5vZGVUeXBlfHwoQT1uK2YpO3chPT1rfHwwIT09bCYmMyE9PXcubm9kZVR5cGV8fChwPW4rbCk7Mz09PXcubm9kZVR5cGUmJihuKz13Lm5vZGVWYWx1ZS5sZW5ndGgpO2lmKG51bGw9PT0odT13LmZpcnN0Q2hpbGQpKWJyZWFrO3o9dzt3PXV9Zm9yKDs7KXtpZih3PT09ZylicmVhayBiO3o9PT1oJiYrK0M9PT1mJiYoQT1uKTt6PT09ayYmKyt4PT09bCYmKHA9bik7aWYobnVsbCE9PSh1PXcubmV4dFNpYmxpbmcpKWJyZWFrO3c9ejt6PXcucGFyZW50Tm9kZX13PXV9aD0tMT09PUF8fC0xPT09cD9udWxsOntzdGFydDpBLGVuZDpwfX1lbHNlIGg9bnVsbDtoPWh8fHtzdGFydDowLGVuZDowfX1lbHNlIGg9bnVsbDtsZj17Zm9jdXNlZEVsZW06ZyxzZWxlY3Rpb25SYW5nZTpofTtmZD0hMTtJaj1udWxsO0pqPSExO1o9ZDtkbyB0cnl7ZWsoKX1jYXRjaCh2YSl7aWYobnVsbD09PVxuWil0aHJvdyBFcnJvcih5KDMzMCkpO1dpKFosdmEpO1o9Wi5uZXh0RWZmZWN0fXdoaWxlKG51bGwhPT1aKTtJaj1udWxsO1o9ZDtkbyB0cnl7Zm9yKGc9YTtudWxsIT09Wjspe3ZhciB0PVouZmxhZ3M7dCYxNiYmcGIoWi5zdGF0ZU5vZGUsXCJcIik7aWYodCYxMjgpe3ZhciBxPVouYWx0ZXJuYXRlO2lmKG51bGwhPT1xKXt2YXIgdj1xLnJlZjtudWxsIT09diYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiB2P3YobnVsbCk6di5jdXJyZW50PW51bGwpfX1zd2l0Y2godCYxMDM4KXtjYXNlIDI6ZmooWik7Wi5mbGFncyY9LTM7YnJlYWs7Y2FzZSA2OmZqKFopO1ouZmxhZ3MmPS0zO2lqKFouYWx0ZXJuYXRlLFopO2JyZWFrO2Nhc2UgMTAyNDpaLmZsYWdzJj0tMTAyNTticmVhaztjYXNlIDEwMjg6Wi5mbGFncyY9LTEwMjU7aWooWi5hbHRlcm5hdGUsWik7YnJlYWs7Y2FzZSA0OmlqKFouYWx0ZXJuYXRlLFopO2JyZWFrO2Nhc2UgODpoPVo7Y2ooZyxoKTt2YXIgSj1oLmFsdGVybmF0ZTtkaihoKTtudWxsIT09XG5KJiZkaihKKX1aPVoubmV4dEVmZmVjdH19Y2F0Y2godmEpe2lmKG51bGw9PT1aKXRocm93IEVycm9yKHkoMzMwKSk7V2koWix2YSk7Wj1aLm5leHRFZmZlY3R9d2hpbGUobnVsbCE9PVopO3Y9bGY7cT1OZSgpO3Q9di5mb2N1c2VkRWxlbTtnPXYuc2VsZWN0aW9uUmFuZ2U7aWYocSE9PXQmJnQmJnQub3duZXJEb2N1bWVudCYmTWUodC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0KSl7bnVsbCE9PWcmJk9lKHQpJiYocT1nLnN0YXJ0LHY9Zy5lbmQsdm9pZCAwPT09diYmKHY9cSksXCJzZWxlY3Rpb25TdGFydFwiaW4gdD8odC5zZWxlY3Rpb25TdGFydD1xLHQuc2VsZWN0aW9uRW5kPU1hdGgubWluKHYsdC52YWx1ZS5sZW5ndGgpKToodj0ocT10Lm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmcS5kZWZhdWx0Vmlld3x8d2luZG93LHYuZ2V0U2VsZWN0aW9uJiYodj12LmdldFNlbGVjdGlvbigpLGg9dC50ZXh0Q29udGVudC5sZW5ndGgsSj1NYXRoLm1pbihnLnN0YXJ0LGgpLGc9dm9pZCAwPT09XG5nLmVuZD9KOk1hdGgubWluKGcuZW5kLGgpLCF2LmV4dGVuZCYmSj5nJiYoaD1nLGc9SixKPWgpLGg9TGUodCxKKSxmPUxlKHQsZyksaCYmZiYmKDEhPT12LnJhbmdlQ291bnR8fHYuYW5jaG9yTm9kZSE9PWgubm9kZXx8di5hbmNob3JPZmZzZXQhPT1oLm9mZnNldHx8di5mb2N1c05vZGUhPT1mLm5vZGV8fHYuZm9jdXNPZmZzZXQhPT1mLm9mZnNldCkmJihxPXEuY3JlYXRlUmFuZ2UoKSxxLnNldFN0YXJ0KGgubm9kZSxoLm9mZnNldCksdi5yZW1vdmVBbGxSYW5nZXMoKSxKPmc/KHYuYWRkUmFuZ2UocSksdi5leHRlbmQoZi5ub2RlLGYub2Zmc2V0KSk6KHEuc2V0RW5kKGYubm9kZSxmLm9mZnNldCksdi5hZGRSYW5nZShxKSkpKSkpO3E9W107Zm9yKHY9dDt2PXYucGFyZW50Tm9kZTspMT09PXYubm9kZVR5cGUmJnEucHVzaCh7ZWxlbWVudDp2LGxlZnQ6di5zY3JvbGxMZWZ0LHRvcDp2LnNjcm9sbFRvcH0pO1wiZnVuY3Rpb25cIj09PXR5cGVvZiB0LmZvY3VzJiZ0LmZvY3VzKCk7Zm9yKHQ9XG4wO3Q8cS5sZW5ndGg7dCsrKXY9cVt0XSx2LmVsZW1lbnQuc2Nyb2xsTGVmdD12LmxlZnQsdi5lbGVtZW50LnNjcm9sbFRvcD12LnRvcH1mZD0hIWtmO2xmPWtmPW51bGw7YS5jdXJyZW50PWM7Wj1kO2RvIHRyeXtmb3IodD1hO251bGwhPT1aOyl7dmFyIEs9Wi5mbGFncztLJjM2JiZZaSh0LFouYWx0ZXJuYXRlLFopO2lmKEsmMTI4KXtxPXZvaWQgMDt2YXIgUT1aLnJlZjtpZihudWxsIT09USl7dmFyIEw9Wi5zdGF0ZU5vZGU7c3dpdGNoKFoudGFnKXtjYXNlIDU6cT1MO2JyZWFrO2RlZmF1bHQ6cT1MfVwiZnVuY3Rpb25cIj09PXR5cGVvZiBRP1EocSk6US5jdXJyZW50PXF9fVo9Wi5uZXh0RWZmZWN0fX1jYXRjaCh2YSl7aWYobnVsbD09PVopdGhyb3cgRXJyb3IoeSgzMzApKTtXaShaLHZhKTtaPVoubmV4dEVmZmVjdH13aGlsZShudWxsIT09Wik7Wj1udWxsOyRmKCk7WD1lfWVsc2UgYS5jdXJyZW50PWM7aWYoeGopeGo9ITEseWo9YSx6aj1iO2Vsc2UgZm9yKFo9ZDtudWxsIT09WjspYj1cbloubmV4dEVmZmVjdCxaLm5leHRFZmZlY3Q9bnVsbCxaLmZsYWdzJjgmJihLPVosSy5zaWJsaW5nPW51bGwsSy5zdGF0ZU5vZGU9bnVsbCksWj1iO2Q9YS5wZW5kaW5nTGFuZXM7MD09PWQmJihUaT1udWxsKTsxPT09ZD9hPT09RWo/RGorKzooRGo9MCxFaj1hKTpEaj0wO2M9Yy5zdGF0ZU5vZGU7aWYoTWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBNZi5vbkNvbW1pdEZpYmVyUm9vdCl0cnl7TWYub25Db21taXRGaWJlclJvb3QoTGYsYyx2b2lkIDAsNjQ9PT0oYy5jdXJyZW50LmZsYWdzJjY0KSl9Y2F0Y2godmEpe31NaihhLE8oKSk7aWYoUWkpdGhyb3cgUWk9ITEsYT1SaSxSaT1udWxsLGE7aWYoMCE9PShYJjgpKXJldHVybiBudWxsO2lnKCk7cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBlaygpe2Zvcig7bnVsbCE9PVo7KXt2YXIgYT1aLmFsdGVybmF0ZTtKanx8bnVsbD09PUlqfHwoMCE9PShaLmZsYWdzJjgpP2RjKFosSWopJiYoSmo9ITApOjEzPT09Wi50YWcmJm1qKGEsWikmJmRjKFosSWopJiYoSmo9ITApKTt2YXIgYj1aLmZsYWdzOzAhPT0oYiYyNTYpJiZYaShhLFopOzA9PT0oYiY1MTIpfHx4anx8KHhqPSEwLGhnKDk3LGZ1bmN0aW9uKCl7T2ooKTtyZXR1cm4gbnVsbH0pKTtaPVoubmV4dEVmZmVjdH19ZnVuY3Rpb24gT2ooKXtpZig5MCE9PXpqKXt2YXIgYT05Nzx6aj85Nzp6ajt6aj05MDtyZXR1cm4gZ2coYSxmayl9cmV0dXJuITF9ZnVuY3Rpb24gJGkoYSxiKXtBai5wdXNoKGIsYSk7eGp8fCh4aj0hMCxoZyg5NyxmdW5jdGlvbigpe09qKCk7cmV0dXJuIG51bGx9KSl9ZnVuY3Rpb24gWmkoYSxiKXtCai5wdXNoKGIsYSk7eGp8fCh4aj0hMCxoZyg5NyxmdW5jdGlvbigpe09qKCk7cmV0dXJuIG51bGx9KSl9XG5mdW5jdGlvbiBmaygpe2lmKG51bGw9PT15ailyZXR1cm4hMTt2YXIgYT15ajt5aj1udWxsO2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMzEpKTt2YXIgYj1YO1h8PTMyO3ZhciBjPUJqO0JqPVtdO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCs9Mil7dmFyIGU9Y1tkXSxmPWNbZCsxXSxnPWUuZGVzdHJveTtlLmRlc3Ryb3k9dm9pZCAwO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnKXRyeXtnKCl9Y2F0Y2goayl7aWYobnVsbD09PWYpdGhyb3cgRXJyb3IoeSgzMzApKTtXaShmLGspfX1jPUFqO0FqPVtdO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKz0yKXtlPWNbZF07Zj1jW2QrMV07dHJ5e3ZhciBoPWUuY3JlYXRlO2UuZGVzdHJveT1oKCl9Y2F0Y2goayl7aWYobnVsbD09PWYpdGhyb3cgRXJyb3IoeSgzMzApKTtXaShmLGspfX1mb3IoaD1hLmN1cnJlbnQuZmlyc3RFZmZlY3Q7bnVsbCE9PWg7KWE9aC5uZXh0RWZmZWN0LGgubmV4dEVmZmVjdD1udWxsLGguZmxhZ3MmOCYmKGguc2libGluZz1cbm51bGwsaC5zdGF0ZU5vZGU9bnVsbCksaD1hO1g9YjtpZygpO3JldHVybiEwfWZ1bmN0aW9uIGdrKGEsYixjKXtiPU1pKGMsYik7Yj1QaShhLGIsMSk7QWcoYSxiKTtiPUhnKCk7YT1LaihhLDEpO251bGwhPT1hJiYoJGMoYSwxLGIpLE1qKGEsYikpfVxuZnVuY3Rpb24gV2koYSxiKXtpZigzPT09YS50YWcpZ2soYSxhLGIpO2Vsc2UgZm9yKHZhciBjPWEucmV0dXJuO251bGwhPT1jOyl7aWYoMz09PWMudGFnKXtnayhjLGEsYik7YnJlYWt9ZWxzZSBpZigxPT09Yy50YWcpe3ZhciBkPWMuc3RhdGVOb2RlO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5jb21wb25lbnREaWRDYXRjaCYmKG51bGw9PT1UaXx8IVRpLmhhcyhkKSkpe2E9TWkoYixhKTt2YXIgZT1TaShjLGEsMSk7QWcoYyxlKTtlPUhnKCk7Yz1LaihjLDEpO2lmKG51bGwhPT1jKSRjKGMsMSxlKSxNaihjLGUpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09VGl8fCFUaS5oYXMoZCkpKXRyeXtkLmNvbXBvbmVudERpZENhdGNoKGIsYSl9Y2F0Y2goZil7fWJyZWFrfX1jPWMucmV0dXJufX1cbmZ1bmN0aW9uIFlqKGEsYixjKXt2YXIgZD1hLnBpbmdDYWNoZTtudWxsIT09ZCYmZC5kZWxldGUoYik7Yj1IZygpO2EucGluZ2VkTGFuZXN8PWEuc3VzcGVuZGVkTGFuZXMmYztVPT09YSYmKFcmYyk9PT1jJiYoND09PVZ8fDM9PT1WJiYoVyY2MjkxNDU2MCk9PT1XJiY1MDA+TygpLWpqP1FqKGEsMCk6dWp8PWMpO01qKGEsYil9ZnVuY3Rpb24gbGooYSxiKXt2YXIgYz1hLnN0YXRlTm9kZTtudWxsIT09YyYmYy5kZWxldGUoYik7Yj0wOzA9PT1iJiYoYj1hLm1vZGUsMD09PShiJjIpP2I9MTowPT09KGImNCk/Yj05OT09PWVnKCk/MToyOigwPT09R2omJihHaj10aiksYj1ZYyg2MjkxNDU2MCZ+R2opLDA9PT1iJiYoYj00MTk0MzA0KSkpO2M9SGcoKTthPUtqKGEsYik7bnVsbCE9PWEmJigkYyhhLGIsYyksTWooYSxjKSl9dmFyIGNrO1xuY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWIubGFuZXM7aWYobnVsbCE9PWEpaWYoYS5tZW1vaXplZFByb3BzIT09Yi5wZW5kaW5nUHJvcHN8fE4uY3VycmVudCl1Zz0hMDtlbHNlIGlmKDAhPT0oYyZkKSl1Zz0wIT09KGEuZmxhZ3MmMTYzODQpPyEwOiExO2Vsc2V7dWc9ITE7c3dpdGNoKGIudGFnKXtjYXNlIDM6cmkoYik7c2goKTticmVhaztjYXNlIDU6Z2goYik7YnJlYWs7Y2FzZSAxOkZmKGIudHlwZSkmJkpmKGIpO2JyZWFrO2Nhc2UgNDplaChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6ZD1iLm1lbW9pemVkUHJvcHMudmFsdWU7dmFyIGU9Yi50eXBlLl9jb250ZXh0O0kobWcsZS5fY3VycmVudFZhbHVlKTtlLl9jdXJyZW50VmFsdWU9ZDticmVhaztjYXNlIDEzOmlmKG51bGwhPT1iLm1lbW9pemVkU3RhdGUpe2lmKDAhPT0oYyZiLmNoaWxkLmNoaWxkTGFuZXMpKXJldHVybiB0aShhLGIsYyk7SShQLFAuY3VycmVudCYxKTtiPWhpKGEsYixjKTtyZXR1cm4gbnVsbCE9PVxuYj9iLnNpYmxpbmc6bnVsbH1JKFAsUC5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6ZD0wIT09KGMmYi5jaGlsZExhbmVzKTtpZigwIT09KGEuZmxhZ3MmNjQpKXtpZihkKXJldHVybiBBaShhLGIsYyk7Yi5mbGFnc3w9NjR9ZT1iLm1lbW9pemVkU3RhdGU7bnVsbCE9PWUmJihlLnJlbmRlcmluZz1udWxsLGUudGFpbD1udWxsLGUubGFzdEVmZmVjdD1udWxsKTtJKFAsUC5jdXJyZW50KTtpZihkKWJyZWFrO2Vsc2UgcmV0dXJuIG51bGw7Y2FzZSAyMzpjYXNlIDI0OnJldHVybiBiLmxhbmVzPTAsbWkoYSxiLGMpfXJldHVybiBoaShhLGIsYyl9ZWxzZSB1Zz0hMTtiLmxhbmVzPTA7c3dpdGNoKGIudGFnKXtjYXNlIDI6ZD1iLnR5cGU7bnVsbCE9PWEmJihhLmFsdGVybmF0ZT1udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5mbGFnc3w9Mik7YT1iLnBlbmRpbmdQcm9wcztlPUVmKGIsTS5jdXJyZW50KTt0ZyhiLGMpO2U9Q2gobnVsbCxiLGQsYSxlLGMpO2IuZmxhZ3N8PTE7aWYoXCJvYmplY3RcIj09PVxudHlwZW9mIGUmJm51bGwhPT1lJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5yZW5kZXImJnZvaWQgMD09PWUuJCR0eXBlb2Ype2IudGFnPTE7Yi5tZW1vaXplZFN0YXRlPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2lmKEZmKGQpKXt2YXIgZj0hMDtKZihiKX1lbHNlIGY9ITE7Yi5tZW1vaXplZFN0YXRlPW51bGwhPT1lLnN0YXRlJiZ2b2lkIDAhPT1lLnN0YXRlP2Uuc3RhdGU6bnVsbDt4ZyhiKTt2YXIgZz1kLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyYmR2coYixkLGcsYSk7ZS51cGRhdGVyPUtnO2Iuc3RhdGVOb2RlPWU7ZS5fcmVhY3RJbnRlcm5hbHM9YjtPZyhiLGQsYSxjKTtiPXFpKG51bGwsYixkLCEwLGYsYyl9ZWxzZSBiLnRhZz0wLGZpKG51bGwsYixlLGMpLGI9Yi5jaGlsZDtyZXR1cm4gYjtjYXNlIDE2OmU9Yi5lbGVtZW50VHlwZTthOntudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmZsYWdzfD0yKTtcbmE9Yi5wZW5kaW5nUHJvcHM7Zj1lLl9pbml0O2U9ZihlLl9wYXlsb2FkKTtiLnR5cGU9ZTtmPWIudGFnPWhrKGUpO2E9bGcoZSxhKTtzd2l0Y2goZil7Y2FzZSAwOmI9bGkobnVsbCxiLGUsYSxjKTticmVhayBhO2Nhc2UgMTpiPXBpKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDExOmI9Z2kobnVsbCxiLGUsYSxjKTticmVhayBhO2Nhc2UgMTQ6Yj1paShudWxsLGIsZSxsZyhlLnR5cGUsYSksZCxjKTticmVhayBhfXRocm93IEVycm9yKHkoMzA2LGUsXCJcIikpO31yZXR1cm4gYjtjYXNlIDA6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmxnKGQsZSksbGkoYSxiLGQsZSxjKTtjYXNlIDE6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmxnKGQsZSkscGkoYSxiLGQsZSxjKTtjYXNlIDM6cmkoYik7ZD1iLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT1hfHxudWxsPT09ZCl0aHJvdyBFcnJvcih5KDI4MikpO1xuZD1iLnBlbmRpbmdQcm9wcztlPWIubWVtb2l6ZWRTdGF0ZTtlPW51bGwhPT1lP2UuZWxlbWVudDpudWxsO3lnKGEsYik7Q2coYixkLG51bGwsYyk7ZD1iLm1lbW9pemVkU3RhdGUuZWxlbWVudDtpZihkPT09ZSlzaCgpLGI9aGkoYSxiLGMpO2Vsc2V7ZT1iLnN0YXRlTm9kZTtpZihmPWUuaHlkcmF0ZSlraD1yZihiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLmZpcnN0Q2hpbGQpLGpoPWIsZj1saD0hMDtpZihmKXthPWUubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YTtpZihudWxsIT1hKWZvcihlPTA7ZTxhLmxlbmd0aDtlKz0yKWY9YVtlXSxmLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PWFbZSsxXSx0aC5wdXNoKGYpO2M9WmcoYixudWxsLGQsYyk7Zm9yKGIuY2hpbGQ9YztjOyljLmZsYWdzPWMuZmxhZ3MmLTN8MTAyNCxjPWMuc2libGluZ31lbHNlIGZpKGEsYixkLGMpLHNoKCk7Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgNTpyZXR1cm4gZ2goYiksbnVsbD09PWEmJlxucGgoYiksZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxmPW51bGwhPT1hP2EubWVtb2l6ZWRQcm9wczpudWxsLGc9ZS5jaGlsZHJlbixuZihkLGUpP2c9bnVsbDpudWxsIT09ZiYmbmYoZCxmKSYmKGIuZmxhZ3N8PTE2KSxvaShhLGIpLGZpKGEsYixnLGMpLGIuY2hpbGQ7Y2FzZSA2OnJldHVybiBudWxsPT09YSYmcGgoYiksbnVsbDtjYXNlIDEzOnJldHVybiB0aShhLGIsYyk7Y2FzZSA0OnJldHVybiBlaChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLGQ9Yi5wZW5kaW5nUHJvcHMsbnVsbD09PWE/Yi5jaGlsZD1ZZyhiLG51bGwsZCxjKTpmaShhLGIsZCxjKSxiLmNoaWxkO2Nhc2UgMTE6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmxnKGQsZSksZ2koYSxiLGQsZSxjKTtjYXNlIDc6cmV0dXJuIGZpKGEsYixiLnBlbmRpbmdQcm9wcyxjKSxiLmNoaWxkO2Nhc2UgODpyZXR1cm4gZmkoYSxiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuLFxuYyksYi5jaGlsZDtjYXNlIDEyOnJldHVybiBmaShhLGIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYyksYi5jaGlsZDtjYXNlIDEwOmE6e2Q9Yi50eXBlLl9jb250ZXh0O2U9Yi5wZW5kaW5nUHJvcHM7Zz1iLm1lbW9pemVkUHJvcHM7Zj1lLnZhbHVlO3ZhciBoPWIudHlwZS5fY29udGV4dDtJKG1nLGguX2N1cnJlbnRWYWx1ZSk7aC5fY3VycmVudFZhbHVlPWY7aWYobnVsbCE9PWcpaWYoaD1nLnZhbHVlLGY9SGUoaCxmKT8wOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHM/ZC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHMoaCxmKToxMDczNzQxODIzKXwwLDA9PT1mKXtpZihnLmNoaWxkcmVuPT09ZS5jaGlsZHJlbiYmIU4uY3VycmVudCl7Yj1oaShhLGIsYyk7YnJlYWsgYX19ZWxzZSBmb3IoaD1iLmNoaWxkLG51bGwhPT1oJiYoaC5yZXR1cm49Yik7bnVsbCE9PWg7KXt2YXIgaz1oLmRlcGVuZGVuY2llcztpZihudWxsIT09ayl7Zz1oLmNoaWxkO2Zvcih2YXIgbD1cbmsuZmlyc3RDb250ZXh0O251bGwhPT1sOyl7aWYobC5jb250ZXh0PT09ZCYmMCE9PShsLm9ic2VydmVkQml0cyZmKSl7MT09PWgudGFnJiYobD16ZygtMSxjJi1jKSxsLnRhZz0yLEFnKGgsbCkpO2gubGFuZXN8PWM7bD1oLmFsdGVybmF0ZTtudWxsIT09bCYmKGwubGFuZXN8PWMpO3NnKGgucmV0dXJuLGMpO2subGFuZXN8PWM7YnJlYWt9bD1sLm5leHR9fWVsc2UgZz0xMD09PWgudGFnP2gudHlwZT09PWIudHlwZT9udWxsOmguY2hpbGQ6aC5jaGlsZDtpZihudWxsIT09ZylnLnJldHVybj1oO2Vsc2UgZm9yKGc9aDtudWxsIT09Zzspe2lmKGc9PT1iKXtnPW51bGw7YnJlYWt9aD1nLnNpYmxpbmc7aWYobnVsbCE9PWgpe2gucmV0dXJuPWcucmV0dXJuO2c9aDticmVha31nPWcucmV0dXJufWg9Z31maShhLGIsZS5jaGlsZHJlbixjKTtiPWIuY2hpbGR9cmV0dXJuIGI7Y2FzZSA5OnJldHVybiBlPWIudHlwZSxmPWIucGVuZGluZ1Byb3BzLGQ9Zi5jaGlsZHJlbix0ZyhiLGMpLGU9dmcoZSxcbmYudW5zdGFibGVfb2JzZXJ2ZWRCaXRzKSxkPWQoZSksYi5mbGFnc3w9MSxmaShhLGIsZCxjKSxiLmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIGU9Yi50eXBlLGY9bGcoZSxiLnBlbmRpbmdQcm9wcyksZj1sZyhlLnR5cGUsZiksaWkoYSxiLGUsZixkLGMpO2Nhc2UgMTU6cmV0dXJuIGtpKGEsYixiLnR5cGUsYi5wZW5kaW5nUHJvcHMsZCxjKTtjYXNlIDE3OnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLG51bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpLGIudGFnPTEsRmYoZCk/KGE9ITAsSmYoYikpOmE9ITEsdGcoYixjKSxNZyhiLGQsZSksT2coYixkLGUsYykscWkobnVsbCxiLGQsITAsYSxjKTtjYXNlIDE5OnJldHVybiBBaShhLGIsYyk7Y2FzZSAyMzpyZXR1cm4gbWkoYSxiLGMpO2Nhc2UgMjQ6cmV0dXJuIG1pKGEsYixjKX10aHJvdyBFcnJvcih5KDE1NixiLnRhZykpO1xufTtmdW5jdGlvbiBpayhhLGIsYyxkKXt0aGlzLnRhZz1hO3RoaXMua2V5PWM7dGhpcy5zaWJsaW5nPXRoaXMuY2hpbGQ9dGhpcy5yZXR1cm49dGhpcy5zdGF0ZU5vZGU9dGhpcy50eXBlPXRoaXMuZWxlbWVudFR5cGU9bnVsbDt0aGlzLmluZGV4PTA7dGhpcy5yZWY9bnVsbDt0aGlzLnBlbmRpbmdQcm9wcz1iO3RoaXMuZGVwZW5kZW5jaWVzPXRoaXMubWVtb2l6ZWRTdGF0ZT10aGlzLnVwZGF0ZVF1ZXVlPXRoaXMubWVtb2l6ZWRQcm9wcz1udWxsO3RoaXMubW9kZT1kO3RoaXMuZmxhZ3M9MDt0aGlzLmxhc3RFZmZlY3Q9dGhpcy5maXJzdEVmZmVjdD10aGlzLm5leHRFZmZlY3Q9bnVsbDt0aGlzLmNoaWxkTGFuZXM9dGhpcy5sYW5lcz0wO3RoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gbmgoYSxiLGMsZCl7cmV0dXJuIG5ldyBpayhhLGIsYyxkKX1mdW5jdGlvbiBqaShhKXthPWEucHJvdG90eXBlO3JldHVybiEoIWF8fCFhLmlzUmVhY3RDb21wb25lbnQpfVxuZnVuY3Rpb24gaGsoYSl7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGppKGEpPzE6MDtpZih2b2lkIDAhPT1hJiZudWxsIT09YSl7YT1hLiQkdHlwZW9mO2lmKGE9PT1BYSlyZXR1cm4gMTE7aWYoYT09PURhKXJldHVybiAxNH1yZXR1cm4gMn1cbmZ1bmN0aW9uIFRnKGEsYil7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbD09PWM/KGM9bmgoYS50YWcsYixhLmtleSxhLm1vZGUpLGMuZWxlbWVudFR5cGU9YS5lbGVtZW50VHlwZSxjLnR5cGU9YS50eXBlLGMuc3RhdGVOb2RlPWEuc3RhdGVOb2RlLGMuYWx0ZXJuYXRlPWEsYS5hbHRlcm5hdGU9Yyk6KGMucGVuZGluZ1Byb3BzPWIsYy50eXBlPWEudHlwZSxjLmZsYWdzPTAsYy5uZXh0RWZmZWN0PW51bGwsYy5maXJzdEVmZmVjdD1udWxsLGMubGFzdEVmZmVjdD1udWxsKTtjLmNoaWxkTGFuZXM9YS5jaGlsZExhbmVzO2MubGFuZXM9YS5sYW5lcztjLmNoaWxkPWEuY2hpbGQ7Yy5tZW1vaXplZFByb3BzPWEubWVtb2l6ZWRQcm9wcztjLm1lbW9pemVkU3RhdGU9YS5tZW1vaXplZFN0YXRlO2MudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZTtiPWEuZGVwZW5kZW5jaWVzO2MuZGVwZW5kZW5jaWVzPW51bGw9PT1iP251bGw6e2xhbmVzOmIubGFuZXMsZmlyc3RDb250ZXh0OmIuZmlyc3RDb250ZXh0fTtcbmMuc2libGluZz1hLnNpYmxpbmc7Yy5pbmRleD1hLmluZGV4O2MucmVmPWEucmVmO3JldHVybiBjfVxuZnVuY3Rpb24gVmcoYSxiLGMsZCxlLGYpe3ZhciBnPTI7ZD1hO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKWppKGEpJiYoZz0xKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlnPTU7ZWxzZSBhOnN3aXRjaChhKXtjYXNlIHVhOnJldHVybiBYZyhjLmNoaWxkcmVuLGUsZixiKTtjYXNlIEhhOmc9ODtlfD0xNjticmVhaztjYXNlIHdhOmc9ODtlfD0xO2JyZWFrO2Nhc2UgeGE6cmV0dXJuIGE9bmgoMTIsYyxiLGV8OCksYS5lbGVtZW50VHlwZT14YSxhLnR5cGU9eGEsYS5sYW5lcz1mLGE7Y2FzZSBCYTpyZXR1cm4gYT1uaCgxMyxjLGIsZSksYS50eXBlPUJhLGEuZWxlbWVudFR5cGU9QmEsYS5sYW5lcz1mLGE7Y2FzZSBDYTpyZXR1cm4gYT1uaCgxOSxjLGIsZSksYS5lbGVtZW50VHlwZT1DYSxhLmxhbmVzPWYsYTtjYXNlIElhOnJldHVybiB2aShjLGUsZixiKTtjYXNlIEphOnJldHVybiBhPW5oKDI0LGMsYixlKSxhLmVsZW1lbnRUeXBlPUphLGEubGFuZXM9ZixhO2RlZmF1bHQ6aWYoXCJvYmplY3RcIj09PVxudHlwZW9mIGEmJm51bGwhPT1hKXN3aXRjaChhLiQkdHlwZW9mKXtjYXNlIHlhOmc9MTA7YnJlYWsgYTtjYXNlIHphOmc9OTticmVhayBhO2Nhc2UgQWE6Zz0xMTticmVhayBhO2Nhc2UgRGE6Zz0xNDticmVhayBhO2Nhc2UgRWE6Zz0xNjtkPW51bGw7YnJlYWsgYTtjYXNlIEZhOmc9MjI7YnJlYWsgYX10aHJvdyBFcnJvcih5KDEzMCxudWxsPT1hP2E6dHlwZW9mIGEsXCJcIikpO31iPW5oKGcsYyxiLGUpO2IuZWxlbWVudFR5cGU9YTtiLnR5cGU9ZDtiLmxhbmVzPWY7cmV0dXJuIGJ9ZnVuY3Rpb24gWGcoYSxiLGMsZCl7YT1uaCg3LGEsZCxiKTthLmxhbmVzPWM7cmV0dXJuIGF9ZnVuY3Rpb24gdmkoYSxiLGMsZCl7YT1uaCgyMyxhLGQsYik7YS5lbGVtZW50VHlwZT1JYTthLmxhbmVzPWM7cmV0dXJuIGF9ZnVuY3Rpb24gVWcoYSxiLGMpe2E9bmgoNixhLG51bGwsYik7YS5sYW5lcz1jO3JldHVybiBhfVxuZnVuY3Rpb24gV2coYSxiLGMpe2I9bmgoNCxudWxsIT09YS5jaGlsZHJlbj9hLmNoaWxkcmVuOltdLGEua2V5LGIpO2IubGFuZXM9YztiLnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzphLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246YS5pbXBsZW1lbnRhdGlvbn07cmV0dXJuIGJ9XG5mdW5jdGlvbiBqayhhLGIsYyl7dGhpcy50YWc9Yjt0aGlzLmNvbnRhaW5lckluZm89YTt0aGlzLmZpbmlzaGVkV29yaz10aGlzLnBpbmdDYWNoZT10aGlzLmN1cnJlbnQ9dGhpcy5wZW5kaW5nQ2hpbGRyZW49bnVsbDt0aGlzLnRpbWVvdXRIYW5kbGU9LTE7dGhpcy5wZW5kaW5nQ29udGV4dD10aGlzLmNvbnRleHQ9bnVsbDt0aGlzLmh5ZHJhdGU9Yzt0aGlzLmNhbGxiYWNrTm9kZT1udWxsO3RoaXMuY2FsbGJhY2tQcmlvcml0eT0wO3RoaXMuZXZlbnRUaW1lcz1aYygwKTt0aGlzLmV4cGlyYXRpb25UaW1lcz1aYygtMSk7dGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wO3RoaXMuZW50YW5nbGVtZW50cz1aYygwKTt0aGlzLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9bnVsbH1cbmZ1bmN0aW9uIGtrKGEsYixjKXt2YXIgZD0zPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDtyZXR1cm57JCR0eXBlb2Y6dGEsa2V5Om51bGw9PWQ/bnVsbDpcIlwiK2QsY2hpbGRyZW46YSxjb250YWluZXJJbmZvOmIsaW1wbGVtZW50YXRpb246Y319XG5mdW5jdGlvbiBsayhhLGIsYyxkKXt2YXIgZT1iLmN1cnJlbnQsZj1IZygpLGc9SWcoZSk7YTppZihjKXtjPWMuX3JlYWN0SW50ZXJuYWxzO2I6e2lmKFpiKGMpIT09Y3x8MSE9PWMudGFnKXRocm93IEVycm9yKHkoMTcwKSk7dmFyIGg9Yztkb3tzd2l0Y2goaC50YWcpe2Nhc2UgMzpoPWguc3RhdGVOb2RlLmNvbnRleHQ7YnJlYWsgYjtjYXNlIDE6aWYoRmYoaC50eXBlKSl7aD1oLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDticmVhayBifX1oPWgucmV0dXJufXdoaWxlKG51bGwhPT1oKTt0aHJvdyBFcnJvcih5KDE3MSkpO31pZigxPT09Yy50YWcpe3ZhciBrPWMudHlwZTtpZihGZihrKSl7Yz1JZihjLGssaCk7YnJlYWsgYX19Yz1ofWVsc2UgYz1DZjtudWxsPT09Yi5jb250ZXh0P2IuY29udGV4dD1jOmIucGVuZGluZ0NvbnRleHQ9YztiPXpnKGYsZyk7Yi5wYXlsb2FkPXtlbGVtZW50OmF9O2Q9dm9pZCAwPT09ZD9udWxsOmQ7bnVsbCE9PVxuZCYmKGIuY2FsbGJhY2s9ZCk7QWcoZSxiKTtKZyhlLGcsZik7cmV0dXJuIGd9ZnVuY3Rpb24gbWsoYSl7YT1hLmN1cnJlbnQ7aWYoIWEuY2hpbGQpcmV0dXJuIG51bGw7c3dpdGNoKGEuY2hpbGQudGFnKXtjYXNlIDU6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlO2RlZmF1bHQ6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlfX1mdW5jdGlvbiBuayhhLGIpe2E9YS5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1hJiZudWxsIT09YS5kZWh5ZHJhdGVkKXt2YXIgYz1hLnJldHJ5TGFuZTthLnJldHJ5TGFuZT0wIT09YyYmYzxiP2M6Yn19ZnVuY3Rpb24gb2soYSxiKXtuayhhLGIpOyhhPWEuYWx0ZXJuYXRlKSYmbmsoYSxiKX1mdW5jdGlvbiBwaygpe3JldHVybiBudWxsfVxuZnVuY3Rpb24gcWsoYSxiLGMpe3ZhciBkPW51bGwhPWMmJm51bGwhPWMuaHlkcmF0aW9uT3B0aW9ucyYmYy5oeWRyYXRpb25PcHRpb25zLm11dGFibGVTb3VyY2VzfHxudWxsO2M9bmV3IGprKGEsYixudWxsIT1jJiYhMD09PWMuaHlkcmF0ZSk7Yj1uaCgzLG51bGwsbnVsbCwyPT09Yj83OjE9PT1iPzM6MCk7Yy5jdXJyZW50PWI7Yi5zdGF0ZU5vZGU9Yzt4ZyhiKTthW2ZmXT1jLmN1cnJlbnQ7Y2YoOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO2lmKGQpZm9yKGE9MDthPGQubGVuZ3RoO2ErKyl7Yj1kW2FdO3ZhciBlPWIuX2dldFZlcnNpb247ZT1lKGIuX3NvdXJjZSk7bnVsbD09Yy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhP2MubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1bYixlXTpjLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChiLGUpfXRoaXMuX2ludGVybmFsUm9vdD1jfVxucWsucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtsayhhLHRoaXMuX2ludGVybmFsUm9vdCxudWxsLG51bGwpfTtxay5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuX2ludGVybmFsUm9vdCxiPWEuY29udGFpbmVySW5mbztsayhudWxsLGEsbnVsbCxmdW5jdGlvbigpe2JbZmZdPW51bGx9KX07ZnVuY3Rpb24gcmsoYSl7cmV0dXJuISghYXx8MSE9PWEubm9kZVR5cGUmJjkhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGUmJig4IT09YS5ub2RlVHlwZXx8XCIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgXCIhPT1hLm5vZGVWYWx1ZSkpfVxuZnVuY3Rpb24gc2soYSxiKXtifHwoYj1hPzk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEuZmlyc3RDaGlsZDpudWxsLGI9ISghYnx8MSE9PWIubm9kZVR5cGV8fCFiLmhhc0F0dHJpYnV0ZShcImRhdGEtcmVhY3Ryb290XCIpKSk7aWYoIWIpZm9yKHZhciBjO2M9YS5sYXN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYyk7cmV0dXJuIG5ldyBxayhhLDAsYj97aHlkcmF0ZTohMH06dm9pZCAwKX1cbmZ1bmN0aW9uIHRrKGEsYixjLGQsZSl7dmFyIGY9Yy5fcmVhY3RSb290Q29udGFpbmVyO2lmKGYpe3ZhciBnPWYuX2ludGVybmFsUm9vdDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZSl7dmFyIGg9ZTtlPWZ1bmN0aW9uKCl7dmFyIGE9bWsoZyk7aC5jYWxsKGEpfX1sayhiLGcsYSxlKX1lbHNle2Y9Yy5fcmVhY3RSb290Q29udGFpbmVyPXNrKGMsZCk7Zz1mLl9pbnRlcm5hbFJvb3Q7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGUpe3ZhciBrPWU7ZT1mdW5jdGlvbigpe3ZhciBhPW1rKGcpO2suY2FsbChhKX19WGooZnVuY3Rpb24oKXtsayhiLGcsYSxlKX0pfXJldHVybiBtayhnKX1lYz1mdW5jdGlvbihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1IZygpO0pnKGEsNCxiKTtvayhhLDQpfX07ZmM9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SGcoKTtKZyhhLDY3MTA4ODY0LGIpO29rKGEsNjcxMDg4NjQpfX07XG5nYz1mdW5jdGlvbihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1IZygpLGM9SWcoYSk7SmcoYSxjLGIpO29rKGEsYyl9fTtoYz1mdW5jdGlvbihhLGIpe3JldHVybiBiKCl9O1xueWI9ZnVuY3Rpb24oYSxiLGMpe3N3aXRjaChiKXtjYXNlIFwiaW5wdXRcIjphYihhLGMpO2I9Yy5uYW1lO2lmKFwicmFkaW9cIj09PWMudHlwZSYmbnVsbCE9Yil7Zm9yKGM9YTtjLnBhcmVudE5vZGU7KWM9Yy5wYXJlbnROb2RlO2M9Yy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbbmFtZT1cIitKU09OLnN0cmluZ2lmeShcIlwiK2IpKyddW3R5cGU9XCJyYWRpb1wiXScpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07aWYoZCE9PWEmJmQuZm9ybT09PWEuZm9ybSl7dmFyIGU9RGIoZCk7aWYoIWUpdGhyb3cgRXJyb3IoeSg5MCkpO1dhKGQpO2FiKGQsZSl9fX1icmVhaztjYXNlIFwidGV4dGFyZWFcIjppYihhLGMpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpiPWMudmFsdWUsbnVsbCE9YiYmZmIoYSwhIWMubXVsdGlwbGUsYiwhMSl9fTtHYj1XajtcbkhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9WDtYfD00O3RyeXtyZXR1cm4gZ2coOTgsYS5iaW5kKG51bGwsYixjLGQsZSkpfWZpbmFsbHl7WD1mLDA9PT1YJiYod2ooKSxpZygpKX19O0liPWZ1bmN0aW9uKCl7MD09PShYJjQ5KSYmKFZqKCksT2ooKSl9O0piPWZ1bmN0aW9uKGEsYil7dmFyIGM9WDtYfD0yO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1g9YywwPT09WCYmKHdqKCksaWcoKSl9fTtmdW5jdGlvbiB1ayhhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsO2lmKCFyayhiKSl0aHJvdyBFcnJvcih5KDIwMCkpO3JldHVybiBrayhhLGIsbnVsbCxjKX12YXIgdms9e0V2ZW50czpbQ2IsdWUsRGIsRWIsRmIsT2ose2N1cnJlbnQ6ITF9XX0sd2s9e2ZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOndjLGJ1bmRsZVR5cGU6MCx2ZXJzaW9uOlwiMTcuMC4yXCIscmVuZGVyZXJQYWNrYWdlTmFtZTpcInJlYWN0LWRvbVwifTtcbnZhciB4az17YnVuZGxlVHlwZTp3ay5idW5kbGVUeXBlLHZlcnNpb246d2sudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOndrLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6d2sucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6cmEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihhKXthPWNjKGEpO3JldHVybiBudWxsPT09YT9udWxsOmEuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTp3ay5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8XG5wayxmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6bnVsbCxzY2hlZHVsZVJlZnJlc2g6bnVsbCxzY2hlZHVsZVJvb3Q6bnVsbCxzZXRSZWZyZXNoSGFuZGxlcjpudWxsLGdldEN1cnJlbnRGaWJlcjpudWxsfTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyl7dmFyIHlrPV9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztpZigheWsuaXNEaXNhYmxlZCYmeWsuc3VwcG9ydHNGaWJlcil0cnl7TGY9eWsuaW5qZWN0KHhrKSxNZj15a31jYXRjaChhKXt9fWV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9dms7ZXhwb3J0cy5jcmVhdGVQb3J0YWw9dWs7XG5leHBvcnRzLmZpbmRET01Ob2RlPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoMT09PWEubm9kZVR5cGUpcmV0dXJuIGE7dmFyIGI9YS5fcmVhY3RJbnRlcm5hbHM7aWYodm9pZCAwPT09Yil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEucmVuZGVyKXRocm93IEVycm9yKHkoMTg4KSk7dGhyb3cgRXJyb3IoeSgyNjgsT2JqZWN0LmtleXMoYSkpKTt9YT1jYyhiKTthPW51bGw9PT1hP251bGw6YS5zdGF0ZU5vZGU7cmV0dXJuIGF9O2V4cG9ydHMuZmx1c2hTeW5jPWZ1bmN0aW9uKGEsYil7dmFyIGM9WDtpZigwIT09KGMmNDgpKXJldHVybiBhKGIpO1h8PTE7dHJ5e2lmKGEpcmV0dXJuIGdnKDk5LGEuYmluZChudWxsLGIpKX1maW5hbGx5e1g9YyxpZygpfX07ZXhwb3J0cy5oeWRyYXRlPWZ1bmN0aW9uKGEsYixjKXtpZighcmsoYikpdGhyb3cgRXJyb3IoeSgyMDApKTtyZXR1cm4gdGsobnVsbCxhLGIsITAsYyl9O1xuZXhwb3J0cy5yZW5kZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKCFyayhiKSl0aHJvdyBFcnJvcih5KDIwMCkpO3JldHVybiB0ayhudWxsLGEsYiwhMSxjKX07ZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlPWZ1bmN0aW9uKGEpe2lmKCFyayhhKSl0aHJvdyBFcnJvcih5KDQwKSk7cmV0dXJuIGEuX3JlYWN0Um9vdENvbnRhaW5lcj8oWGooZnVuY3Rpb24oKXt0ayhudWxsLG51bGwsYSwhMSxmdW5jdGlvbigpe2EuX3JlYWN0Um9vdENvbnRhaW5lcj1udWxsO2FbZmZdPW51bGx9KX0pLCEwKTohMX07ZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1XajtleHBvcnRzLnVuc3RhYmxlX2NyZWF0ZVBvcnRhbD1mdW5jdGlvbihhLGIpe3JldHVybiB1ayhhLGIsMjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwpfTtcbmV4cG9ydHMudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIXJrKGMpKXRocm93IEVycm9yKHkoMjAwKSk7aWYobnVsbD09YXx8dm9pZCAwPT09YS5fcmVhY3RJbnRlcm5hbHMpdGhyb3cgRXJyb3IoeSgzOCkpO3JldHVybiB0ayhhLGIsYywhMSxkKX07ZXhwb3J0cy52ZXJzaW9uPVwiMTcuMC4yXCI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQge0FjdGlvbiwgUmVkdWNlciwgU3RhdGV9IGZyb20gJy4vY3JlYXRlU3RvcmUnO1xuXG5pbnRlcmZhY2UgUmVkdWNlcnNNYXBPYmplY3Q8UyBleHRlbmRzIFN0YXRlID0gYW55LCBBIGV4dGVuZHMgQWN0aW9uID0gYW55PiB7XG4gIFtrZXk6IHN0cmluZ106IFJlZHVjZXI8UywgQT47XG59XG5cbnR5cGUgU3RhdGVGcm9tUmVkdWNlcnNNYXBPYmplY3Q8TT4gPSBNIGV4dGVuZHMgUmVkdWNlcnNNYXBPYmplY3RcbiAgPyB7W1AgaW4ga2V5b2YgTV06IE1bUF0gZXh0ZW5kcyBSZWR1Y2VyPGluZmVyIFMsIGFueT4gPyBTIDogbmV2ZXJ9XG4gIDogbmV2ZXI7XG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VyczxTIGV4dGVuZHMgU3RhdGUsIEEgZXh0ZW5kcyBBY3Rpb24+KHJlZHVjZXJzOiBSZWR1Y2Vyc01hcE9iamVjdCk6IFJlZHVjZXI8UywgQT4ge1xuICBjb25zdCByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgY29uc3QgZmluYWxSZWR1Y2Vyc09iajogUmVkdWNlcnNNYXBPYmplY3QgPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiByZWR1Y2VyS2V5cykge1xuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc09ialtrZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKChzdGF0ZTogU3RhdGVGcm9tUmVkdWNlcnNNYXBPYmplY3Q8dHlwZW9mIHJlZHVjZXJzPiA9IHt9LCBhY3Rpb246IEEpID0+IHtcbiAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG5leHRTdGF0ZTogU3RhdGVGcm9tUmVkdWNlcnNNYXBPYmplY3Q8dHlwZW9mIHJlZHVjZXJzPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmVkdWNlcktleXMpIHtcbiAgICAgIGNvbnN0IHByZXZTdGF0ZUZvcktleSA9IHN0YXRlW2tleV07XG4gICAgICBjb25zdCBuZXh0U3RhdGVGb3JLZXkgPSBmaW5hbFJlZHVjZXJzT2JqW2tleV0ocHJldlN0YXRlRm9yS2V5LCBhY3Rpb24pO1xuICAgICAgbmV4dFN0YXRlW2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZTdGF0ZUZvcktleTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9KSBhcyBhbnkgYXMgUmVkdWNlcjxTLCBBPjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tYmluZVJlZHVjZXJzO1xuIiwiZXhwb3J0IHR5cGUgU3RhdGUgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcbmV4cG9ydCB0eXBlIEFjdGlvbiA9IHtcbiAgdHlwZTogc3RyaW5nO1xuICBwYXlsb2FkOiBhbnk7XG59O1xuXG5leHBvcnQgdHlwZSBSZWR1Y2VyPFMgZXh0ZW5kcyBTdGF0ZSwgQSBleHRlbmRzIEFjdGlvbj4gPSAoczogUywgYTogQSkgPT4gUztcbnR5cGUgTGlzdGVuZXI8UyBleHRlbmRzIFN0YXRlPiA9IChuczogUywgcHM/OiBTKSA9PiB2b2lkO1xudHlwZSBVbnN1YnNjcmliZSA9ICgpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmU8UyBleHRlbmRzIFN0YXRlLCBBIGV4dGVuZHMgQWN0aW9uPiB7XG4gIGRpc3BhdGNoOiAoYTogQSkgPT4gdm9pZDtcbiAgZ2V0U3RhdGU6ICgpID0+IFM7XG4gIHN1YnNjcmliZTogKGxpc3RlbmVyOiBMaXN0ZW5lcjxTPikgPT4gVW5zdWJzY3JpYmU7XG59XG5cbi8qKlxuICog566A5Y2V5a6e546w55qEIFJlZHV4XG4gKiBAcGFyYW0gcHJlbG9hZGVkU3RhdGUg5Yid5aeLIHN0YXRlXG4gKiBAcGFyYW0gcmVkdWNlciByZWR1Y2VyIHB1cmUgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHN0b3JlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlPFMgZXh0ZW5kcyBTdGF0ZSwgQSBleHRlbmRzIEFjdGlvbj4oXG4gIHByZWxvYWRlZFN0YXRlOiBTLFxuICByZWR1Y2VyOiBSZWR1Y2VyPFMsIEE+LFxuKTogU3RvcmU8UmVhZG9ubHk8Uz4sIEE+IHtcbiAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcjxTPltdID0gW107XG4gIGxldCBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcblxuICBjb25zdCBkaXNwYXRjaCA9IChhY3Rpb246IEEpID0+IHtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSByZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICBjb25zdCBwcmV2U3RhdGUgPSBjdXJyZW50U3RhdGU7XG4gICAgY3VycmVudFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgZm9yIChjb25zdCBjYiBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgIGNiKGN1cnJlbnRTdGF0ZSwgcHJldlN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc3Vic2NyaWJlID0gKGxpc3RlbmVyOiBMaXN0ZW5lcjxTPikgPT4ge1xuICAgIGxldCBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGdldFN0YXRlID0gKCkgPT4ge1xuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBkaXNwYXRjaCxcbiAgICBnZXRTdGF0ZSxcbiAgICBzdWJzY3JpYmUsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVN0b3JlO1xuIiwiZXhwb3J0IGludGVyZmFjZSBBcHBTZXR0aW5nIHtcbiAgc2hvdWxkU3BsaXRNZW1vV29yZDogYm9vbGVhbjtcbiAgc2hvdWxkSGlkZUltYWdlVXJsOiBib29sZWFuO1xuICBzaG91bGRVc2VNYXJrZG93blBhcnNlcjogYm9vbGVhbjtcbiAgdXNlVGlueVVuZG9IaXN0b3J5Q2FjaGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGUgZXh0ZW5kcyBBcHBTZXR0aW5nIHtcbiAgbWFya01lbW9JZDogc3RyaW5nO1xuICBlZGl0TWVtb0lkOiBzdHJpbmc7XG4gIGlzTW9iaWxlVmlldzogYm9vbGVhbjtcbiAgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgU2V0TWFya01lbW9JZEFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfTUFSS19NRU1PX0lEJztcbiAgcGF5bG9hZDoge1xuICAgIG1hcmtNZW1vSWQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldEVkaXRNZW1vSWRBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0VESVRfTUVNT19JRCc7XG4gIHBheWxvYWQ6IHtcbiAgICBlZGl0TWVtb0lkOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRNb2JpbGVWaWV3QWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9NT0JJTEVfVklFVyc7XG4gIHBheWxvYWQ6IHtcbiAgICBpc01vYmlsZVZpZXc6IGJvb2xlYW47XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRTaG93U2lkZWJhckFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfU0hPV19TSURFQkFSX0lOX01PQklMRV9WSUVXJztcbiAgcGF5bG9hZDoge1xuICAgIHNob3dTaWRlcmJhckluTW9iaWxlVmlldzogYm9vbGVhbjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldEFwcFNldHRpbmdBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0FQUF9TRVRUSU5HJztcbiAgcGF5bG9hZDogUGFydGlhbDxBcHBTZXR0aW5nPjtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9XG4gIHwgU2V0TW9iaWxlVmlld0FjdGlvblxuICB8IFNldFNob3dTaWRlYmFyQWN0aW9uXG4gIHwgU2V0RWRpdE1lbW9JZEFjdGlvblxuICB8IFNldE1hcmtNZW1vSWRBY3Rpb25cbiAgfCBTZXRBcHBTZXR0aW5nQWN0aW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZTogU3RhdGUsIGFjdGlvbjogQWN0aW9ucykge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnU0VUX01BUktfTUVNT19JRCc6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC5tYXJrTWVtb0lkID09PSBzdGF0ZS5tYXJrTWVtb0lkKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIG1hcmtNZW1vSWQ6IGFjdGlvbi5wYXlsb2FkLm1hcmtNZW1vSWQsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfRURJVF9NRU1PX0lEJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLmVkaXRNZW1vSWQgPT09IHN0YXRlLmVkaXRNZW1vSWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZWRpdE1lbW9JZDogYWN0aW9uLnBheWxvYWQuZWRpdE1lbW9JZCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9NT0JJTEVfVklFVyc6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC5pc01vYmlsZVZpZXcgPT09IHN0YXRlLmlzTW9iaWxlVmlldykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc01vYmlsZVZpZXc6IGFjdGlvbi5wYXlsb2FkLmlzTW9iaWxlVmlldyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9TSE9XX1NJREVCQVJfSU5fTU9CSUxFX1ZJRVcnOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQuc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3ID09PSBzdGF0ZS5zaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3OiBhY3Rpb24ucGF5bG9hZC5zaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfQVBQX1NFVFRJTkcnOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U3RhdGU6IFN0YXRlID0ge1xuICBtYXJrTWVtb0lkOiAnJyxcbiAgZWRpdE1lbW9JZDogJycsXG4gIHNob3VsZFNwbGl0TWVtb1dvcmQ6IHRydWUsXG4gIHNob3VsZEhpZGVJbWFnZVVybDogdHJ1ZSxcbiAgc2hvdWxkVXNlTWFya2Rvd25QYXJzZXI6IHRydWUsXG4gIHVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlOiBmYWxzZSxcbiAgaXNNb2JpbGVWaWV3OiBmYWxzZSxcbiAgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3OiBmYWxzZSxcbn07XG4iLCJleHBvcnQgdHlwZSBTdGF0ZSA9IEFwcExvY2F0aW9uO1xuXG5pbnRlcmZhY2UgU2V0TG9jYXRpb24ge1xuICB0eXBlOiAnU0VUX0xPQ0FUSU9OJztcbiAgcGF5bG9hZDogU3RhdGU7XG59XG5cbmludGVyZmFjZSBTZXRQYXRobmFtZUFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfUEFUSE5BTUUnO1xuICBwYXlsb2FkOiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldFF1ZXJ5IHtcbiAgdHlwZTogJ1NFVF9RVUVSWSc7XG4gIHBheWxvYWQ6IFF1ZXJ5O1xufVxuXG5pbnRlcmZhY2UgU2V0UXVlcnlGaWx0ZXJBY3Rpb24ge1xuICB0eXBlOiAnU0VUX1FVRVJZX0ZJTFRFUic7XG4gIHBheWxvYWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNldFRhZ1F1ZXJ5QWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9UQUdfUVVFUlknO1xuICBwYXlsb2FkOiB7XG4gICAgdGFnOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRGcm9tQW5kVG9RdWVyeUFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfRFVSQVRJT05fUVVFUlknO1xuICBwYXlsb2FkOiB7XG4gICAgZHVyYXRpb246IER1cmF0aW9uIHwgbnVsbDtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldFR5cGVBY3Rpb24ge1xuICB0eXBlOiAnU0VUX1RZUEUnO1xuICBwYXlsb2FkOiB7XG4gICAgdHlwZTogTWVtb1NwZWNUeXBlIHwgJyc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRUZXh0QWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9URVhUJztcbiAgcGF5bG9hZDoge1xuICAgIHRleHQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldEhhc2hBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0hBU0gnO1xuICBwYXlsb2FkOiB7XG4gICAgaGFzaDogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25zID1cbiAgfCBTZXRMb2NhdGlvblxuICB8IFNldFBhdGhuYW1lQWN0aW9uXG4gIHwgU2V0UXVlcnlcbiAgfCBTZXRUYWdRdWVyeUFjdGlvblxuICB8IFNldEZyb21BbmRUb1F1ZXJ5QWN0aW9uXG4gIHwgU2V0VHlwZUFjdGlvblxuICB8IFNldFRleHRBY3Rpb25cbiAgfCBTZXRRdWVyeUZpbHRlckFjdGlvblxuICB8IFNldEhhc2hBY3Rpb247XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25zKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdTRVRfTE9DQVRJT04nOiB7XG4gICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9QQVRITkFNRSc6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC5wYXRobmFtZSA9PT0gc3RhdGUucGF0aG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcGF0aG5hbWU6IGFjdGlvbi5wYXlsb2FkLnBhdGhuYW1lLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX0hBU0gnOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQuaGFzaCA9PT0gc3RhdGUuaGFzaCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBoYXNoOiBhY3Rpb24ucGF5bG9hZC5oYXNoLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX1FVRVJZJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfVEFHX1FVRVJZJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnRhZyA9PT0gc3RhdGUucXVlcnkudGFnKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgdGFnOiBhY3Rpb24ucGF5bG9hZC50YWcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfRFVSQVRJT05fUVVFUlknOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQuZHVyYXRpb24gPT09IHN0YXRlLnF1ZXJ5LmR1cmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgZHVyYXRpb246IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LmR1cmF0aW9uLFxuICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQuZHVyYXRpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9UWVBFJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnR5cGUgPT09IHN0YXRlLnF1ZXJ5LnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICB0eXBlOiBhY3Rpb24ucGF5bG9hZC50eXBlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX1RFWFQnOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQudGV4dCA9PT0gc3RhdGUucXVlcnkudGV4dCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyeToge1xuICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgIHRleHQ6IGFjdGlvbi5wYXlsb2FkLnRleHQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfUVVFUllfRklMVEVSJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkID09PSBzdGF0ZS5xdWVyeS5maWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICBmaWx0ZXI6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFN0YXRlOiBTdGF0ZSA9IHtcbiAgcGF0aG5hbWU6ICcvJyxcbiAgaGFzaDogJycsXG4gIHF1ZXJ5OiB7XG4gICAgdGFnOiAnJyxcbiAgICBkdXJhdGlvbjogbnVsbCxcbiAgICB0eXBlOiAnJyxcbiAgICB0ZXh0OiAnJyxcbiAgICBmaWx0ZXI6ICcnLFxuICB9LFxufTtcbiIsImltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5uYW1lc3BhY2UgdXRpbHMge1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXROb3dUaW1lU3RhbXAoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBwYXJzZUludChtb21lbnQoKS5mb3JtYXQoJ3gnKSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0T1NWZXJzaW9uKCk6ICdXaW5kb3dzJyB8ICdNYWNPUycgfCAnTGludXgnIHwgJ1Vua25vd24nIHtcclxuICAgIGNvbnN0IGFwcFZlcnNpb24gPSBuYXZpZ2F0b3IudXNlckFnZW50O1xyXG4gICAgbGV0IGRldGVjdGVkT1M6ICdXaW5kb3dzJyB8ICdNYWNPUycgfCAnTGludXgnIHwgJ1Vua25vd24nID0gJ1Vua25vd24nO1xyXG5cclxuICAgIGlmIChhcHBWZXJzaW9uLmluZGV4T2YoJ1dpbicpICE9IC0xKSB7XHJcbiAgICAgIGRldGVjdGVkT1MgPSAnV2luZG93cyc7XHJcbiAgICB9IGVsc2UgaWYgKGFwcFZlcnNpb24uaW5kZXhPZignTWFjJykgIT0gLTEpIHtcclxuICAgICAgZGV0ZWN0ZWRPUyA9ICdNYWNPUyc7XHJcbiAgICB9IGVsc2UgaWYgKGFwcFZlcnNpb24uaW5kZXhPZignTGludXgnKSAhPSAtMSkge1xyXG4gICAgICBkZXRlY3RlZE9TID0gJ0xpbnV4JztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGV0ZWN0ZWRPUztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lU3RhbXBCeURhdGUodDogRGF0ZSB8IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBpZiAodHlwZW9mIHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHQgPSB0LnJlcGxhY2VBbGwoJy0nLCAnLycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHQpLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREYXRlU3RhbXBCeURhdGUodDogRGF0ZSB8IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZ2V0VGltZVN0YW1wQnlEYXRlKHQpKTtcclxuICAgIHJldHVybiBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgZC5nZXREYXRlKCkpLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREYXRlU3RyaW5nKHQ6IERhdGUgfCBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGdldFRpbWVTdGFtcEJ5RGF0ZSh0KSk7XHJcblxyXG4gICAgY29uc3QgeWVhciA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG1vbnRoID0gZC5nZXRNb250aCgpICsgMTtcclxuICAgIGNvbnN0IGRhdGUgPSBkLmdldERhdGUoKTtcclxuXHJcbiAgICByZXR1cm4gYCR7eWVhcn0vJHttb250aH0vJHtkYXRlfWA7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0VGltZVN0cmluZyh0OiBEYXRlIHwgbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShnZXRUaW1lU3RhbXBCeURhdGUodCkpO1xyXG5cclxuICAgIGNvbnN0IGhvdXJzID0gZC5nZXRIb3VycygpO1xyXG4gICAgY29uc3QgbWlucyA9IGQuZ2V0TWludXRlcygpO1xyXG5cclxuICAgIGNvbnN0IGhvdXJzU3RyID0gaG91cnMgPCAxMCA/ICcwJyArIGhvdXJzIDogaG91cnM7XHJcbiAgICBjb25zdCBtaW5zU3RyID0gbWlucyA8IDEwID8gJzAnICsgbWlucyA6IG1pbnM7XHJcblxyXG4gICAgcmV0dXJuIGAke2hvdXJzU3RyfToke21pbnNTdHJ9YDtcclxuICB9XHJcblxyXG4gIC8vIEZvciBleGFtcGxlOiAyMDIxLTQtOCAxNzo1MjoxN1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREYXRlVGltZVN0cmluZyh0OiBEYXRlIHwgbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShnZXRUaW1lU3RhbXBCeURhdGUodCkpO1xyXG5cclxuICAgIGNvbnN0IHllYXIgPSBkLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBtb250aCA9IGQuZ2V0TW9udGgoKSArIDE7XHJcbiAgICBjb25zdCBkYXRlID0gZC5nZXREYXRlKCk7XHJcbiAgICBjb25zdCBob3VycyA9IGQuZ2V0SG91cnMoKTtcclxuICAgIGNvbnN0IG1pbnMgPSBkLmdldE1pbnV0ZXMoKTtcclxuICAgIC8vIGNvbnN0IHNlY3MgPSBkLmdldFNlY29uZHMoKTtcclxuXHJcbiAgICBjb25zdCBtb250aFN0ciA9IG1vbnRoIDwgMTAgPyAnMCcgKyBtb250aCA6IG1vbnRoO1xyXG4gICAgY29uc3QgZGF0ZVN0ciA9IGRhdGUgPCAxMCA/ICcwJyArIGRhdGUgOiBkYXRlO1xyXG4gICAgY29uc3QgaG91cnNTdHIgPSBob3VycyA8IDEwID8gJzAnICsgaG91cnMgOiBob3VycztcclxuICAgIGNvbnN0IG1pbnNTdHIgPSBtaW5zIDwgMTAgPyAnMCcgKyBtaW5zIDogbWlucztcclxuICAgIC8vIGNvbnN0IHNlY3NTdHIgPSBzZWNzIDwgMTAgPyBcIjBcIiArIHNlY3MgOiBzZWNzO1xyXG4gICAgY29uc3Qgc2Vjc1N0ciA9ICcwMCc7XHJcblxyXG4gICAgcmV0dXJuIGAke3llYXJ9LyR7bW9udGhTdHJ9LyR7ZGF0ZVN0cn0gJHtob3Vyc1N0cn06JHttaW5zU3RyfToke3NlY3NTdHJ9YDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWR1cGU8VD4oZGF0YTogVFtdKTogVFtdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoZGF0YSkpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGRlZHVwZU9iamVjdFdpdGhJZDxUIGV4dGVuZHMge2lkOiBzdHJpbmd9PihkYXRhOiBUW10pOiBUW10ge1xyXG4gICAgY29uc3QgaWRTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgZCBvZiBkYXRhKSB7XHJcbiAgICAgIGlmICghaWRTZXQuaGFzKGQuaWQpKSB7XHJcbiAgICAgICAgaWRTZXQuYWRkKGQuaWQpO1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZShmbjogRnVuY3Rpb25UeXBlLCBkZWxheTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmICh0aW1lcikge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XHJcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZuLCBkZWxheSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZuLCBkZWxheSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gdGhyb3R0bGUoZm46IEZ1bmN0aW9uVHlwZSwgZGVsYXk6IG51bWJlcikge1xyXG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbGlkID0gZmFsc2U7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGZuKCk7XHJcbiAgICAgICAgdmFsaWQgPSB0cnVlO1xyXG4gICAgICB9LCBkZWxheSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU9iamVjdFRvUGFyYW1zU3RyaW5nKG9iamVjdDogS1ZPYmplY3QpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFyYW1zID0gW107XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgICBjb25zdCB2YWwgPSBvYmplY3Rba2V5XTtcclxuICAgICAgaWYgKHZhbCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgcGFyYW1zLnB1c2goLi4udHJhbnNmb3JtT2JqZWN0VG9QYXJhbXNTdHJpbmcodmFsKS5zcGxpdCgnJicpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcGFyYW1zLnB1c2goYCR7a2V5fT0ke3ZhbH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGFyYW1zLmpvaW4oJyYnKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1QYXJhbXNTdHJpbmdUb09iamVjdChwYXJhbXNTdHJpbmc6IHN0cmluZyk6IEtWT2JqZWN0IHtcclxuICAgIGNvbnN0IG9iamVjdDogS1ZPYmplY3QgPSB7fTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtc1N0cmluZy5zcGxpdCgnJicpO1xyXG5cclxuICAgIGZvciAoY29uc3QgcCBvZiBwYXJhbXMpIHtcclxuICAgICAgY29uc3QgW2tleSwgdmFsXSA9IHAuc3BsaXQoJz0nKTtcclxuICAgICAgaWYgKGtleSAmJiB2YWwpIHtcclxuICAgICAgICBvYmplY3Rba2V5XSA9IHZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZmlsdGVyT2JqZWN0TnVsbEtleXMob2JqZWN0OiBLVk9iamVjdCk6IEtWT2JqZWN0IHtcclxuICAgIGlmICghb2JqZWN0KSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaW5hbE9iamVjdDogS1ZPYmplY3QgPSB7fTtcclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLnNvcnQoKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgIGNvbnN0IHZhbCA9IG9iamVjdFtrZXldO1xyXG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBjb25zdCB0ZW1wID0gZmlsdGVyT2JqZWN0TnVsbEtleXMoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWwpKSk7XHJcbiAgICAgICAgaWYgKHRlbXAgJiYgT2JqZWN0LmtleXModGVtcCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZmluYWxPYmplY3Rba2V5XSA9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICAgIGZpbmFsT2JqZWN0W2tleV0gPSB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZpbmFsT2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlUZXh0VG9DbGlwYm9hcmQodGV4dDogc3RyaW5nKSB7XHJcbiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignQ29weSB0byBjbGlwYm9hcmQgZmFpbGVkLicsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdDb3B5IHRvIGNsaXBib2FyZCBmYWlsZWQsIG1ldGhvZHMgbm90IHN1cHBvcnRzLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldEltYWdlU2l6ZShzcmM6IHN0cmluZyk6IFByb21pc2U8e3dpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyfT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZ0VsID0gbmV3IEltYWdlKCk7XHJcblxyXG4gICAgICBpbWdFbC5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gaW1nRWw7XHJcblxyXG4gICAgICAgIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xyXG4gICAgICAgICAgcmVzb2x2ZSh7d2lkdGgsIGhlaWdodH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKHt3aWR0aDogMCwgaGVpZ2h0OiAwfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaW1nRWwub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICByZXNvbHZlKHt3aWR0aDogMCwgaGVpZ2h0OiAwfSk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpbWdFbC5jbGFzc05hbWUgPSAnaGlkZGVuJztcclxuICAgICAgaW1nRWwuc3JjID0gc3JjO1xyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltZ0VsKTtcclxuICAgICAgaW1nRWwucmVtb3ZlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xyXG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGUge1xuICBtZW1vczogTW9kZWwuTWVtb1tdO1xuICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNldE1lbW9zQWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9NRU1PUyc7XG4gIHBheWxvYWQ6IHtcbiAgICBtZW1vczogTW9kZWwuTWVtb1tdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2V0VGFnc0FjdGlvbiB7XG4gIHR5cGU6ICdTRVRfVEFHUyc7XG4gIHBheWxvYWQ6IHtcbiAgICB0YWdzOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEluc2VydE1lbW9BY3Rpb24ge1xuICB0eXBlOiAnSU5TRVJUX01FTU8nO1xuICBwYXlsb2FkOiB7XG4gICAgbWVtbzogTW9kZWwuTWVtbztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIERlbGV0ZU1lbW9CeUlkQWN0aW9uIHtcbiAgdHlwZTogJ0RFTEVURV9NRU1PX0JZX0lEJztcbiAgcGF5bG9hZDoge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBFZGl0TWVtb0J5SWRBY3Rpb24ge1xuICB0eXBlOiAnRURJVF9NRU1PJztcbiAgcGF5bG9hZDogTW9kZWwuTWVtbztcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9IFNldE1lbW9zQWN0aW9uIHwgU2V0VGFnc0FjdGlvbiB8IEluc2VydE1lbW9BY3Rpb24gfCBEZWxldGVNZW1vQnlJZEFjdGlvbiB8IEVkaXRNZW1vQnlJZEFjdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGU6IFN0YXRlLCBhY3Rpb246IEFjdGlvbnMpOiBTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdTRVRfTUVNT1MnOiB7XG4gICAgICBjb25zdCBtZW1vcyA9IHV0aWxzLmRlZHVwZU9iamVjdFdpdGhJZChcbiAgICAgICAgYWN0aW9uLnBheWxvYWQubWVtb3Muc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICAvLyBjb25zdCBtZW1vcyA9IGFjdGlvbi5wYXlsb2FkLm1lbW9zLnNvcnQoKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5jcmVhdGVkQXQpKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIG1lbW9zOiBbLi4ubWVtb3NdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX1RBR1MnOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgdGFnczogYWN0aW9uLnBheWxvYWQudGFncyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ0lOU0VSVF9NRU1PJzoge1xuICAgICAgY29uc3QgbWVtb3MgPSB1dGlscy5kZWR1cGVPYmplY3RXaXRoSWQoXG4gICAgICAgIFthY3Rpb24ucGF5bG9hZC5tZW1vLCAuLi5zdGF0ZS5tZW1vc10uc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbWVtb3MsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdERUxFVEVfTUVNT19CWV9JRCc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBtZW1vczogWy4uLnN0YXRlLm1lbW9zXS5maWx0ZXIoKG1lbW8pID0+IG1lbW8uaWQgIT09IGFjdGlvbi5wYXlsb2FkLmlkKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ0VESVRfTUVNTyc6IHtcbiAgICAgIGNvbnN0IG1lbW9zID0gc3RhdGUubWVtb3MubWFwKChtKSA9PiB7XG4gICAgICAgIGlmIChtLmlkID09PSBhY3Rpb24ucGF5bG9hZC5pZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBtZW1vcyxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdGF0ZTogU3RhdGUgPSB7XG4gIG1lbW9zOiBbXSxcbiAgdGFnczogW10sXG59O1xuIiwiZXhwb3J0IGludGVyZmFjZSBTdGF0ZSB7XG4gIHVzZXI6IE1vZGVsLlVzZXIgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgU2lnbkluQWN0aW9uIHtcbiAgdHlwZTogJ1NJR05fSU4nO1xuICBwYXlsb2FkOiBTdGF0ZTtcbn1cblxuaW50ZXJmYWNlIFNpZ25PdXRBY3Rpb24ge1xuICB0eXBlOiAnU0lHTl9PVVQnO1xuICBwYXlsb2FkOiBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25zID0gU2lnbkluQWN0aW9uIHwgU2lnbk91dEFjdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGU6IFN0YXRlLCBhY3Rpb246IEFjdGlvbnMpOiBTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdTSUdOX0lOJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcjogYWN0aW9uLnBheWxvYWQudXNlcixcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NJR05fT1VUJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcjogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdGF0ZTogU3RhdGUgPSB7dXNlcjogbnVsbH07XG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGUge1xuICBxdWVyaWVzOiBNb2RlbC5RdWVyeVtdO1xufVxuXG5pbnRlcmZhY2UgU2V0UXVlcmllcyB7XG4gIHR5cGU6ICdTRVRfUVVFUklFUyc7XG4gIHBheWxvYWQ6IHtcbiAgICBxdWVyaWVzOiBNb2RlbC5RdWVyeVtdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgSW5zZXJ0UXVlcnlBY3Rpb24ge1xuICB0eXBlOiAnSU5TRVJUX1FVRVJZJztcbiAgcGF5bG9hZDoge1xuICAgIHF1ZXJ5OiBNb2RlbC5RdWVyeTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIERlbGV0ZVF1ZXJ5QnlJZEFjdGlvbiB7XG4gIHR5cGU6ICdERUxFVEVfUVVFUllfQllfSUQnO1xuICBwYXlsb2FkOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFVwZGF0ZVF1ZXJ5QWN0aW9uIHtcbiAgdHlwZTogJ1VQREFURV9RVUVSWSc7XG4gIHBheWxvYWQ6IE1vZGVsLlF1ZXJ5O1xufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25zID0gU2V0UXVlcmllcyB8IEluc2VydFF1ZXJ5QWN0aW9uIHwgRGVsZXRlUXVlcnlCeUlkQWN0aW9uIHwgVXBkYXRlUXVlcnlBY3Rpb247XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25zKTogU3RhdGUge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnU0VUX1FVRVJJRVMnOiB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gdXRpbHMuZGVkdXBlT2JqZWN0V2l0aElkKFxuICAgICAgICBhY3Rpb24ucGF5bG9hZC5xdWVyaWVzXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5jcmVhdGVkQXQpKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYi5waW5uZWRBdCA/PyAwKSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLnBpbm5lZEF0ID8/IDApKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyaWVzLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnSU5TRVJUX1FVRVJZJzoge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHV0aWxzLmRlZHVwZU9iamVjdFdpdGhJZChcbiAgICAgICAgW2FjdGlvbi5wYXlsb2FkLnF1ZXJ5LCAuLi5zdGF0ZS5xdWVyaWVzXS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PiB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYi5jcmVhdGVkQXQpIC0gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyaWVzLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnREVMRVRFX1FVRVJZX0JZX0lEJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJpZXM6IFsuLi5zdGF0ZS5xdWVyaWVzXS5maWx0ZXIoKHF1ZXJ5KSA9PiBxdWVyeS5pZCAhPT0gYWN0aW9uLnBheWxvYWQuaWQpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnVVBEQVRFX1FVRVJZJzoge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHN0YXRlLnF1ZXJpZXMubWFwKChtKSA9PiB7XG4gICAgICAgIGlmIChtLmlkID09PSBhY3Rpb24ucGF5bG9hZC5pZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyaWVzLFxuICAgICAgfTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFN0YXRlOiBTdGF0ZSA9IHtcbiAgcXVlcmllczogW10sXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgb2JzaWRpYW4gPSByZXF1aXJlKCdvYnNpZGlhbicpO1xuXG5jb25zdCBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NLUREXCI7XG5jb25zdCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCA9IFwiZ2dnZy1bV113d1wiO1xuY29uc3QgREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NXCI7XG5jb25zdCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1bUV1RXCI7XG5jb25zdCBERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWVwiO1xuXG5mdW5jdGlvbiBzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MocGVyaW9kaWNpdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSB3aW5kb3cuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8uW3BlcmlvZGljaXR5XT8uZW5hYmxlZDtcbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBkYWlseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgeyBpbnRlcm5hbFBsdWdpbnMsIHBsdWdpbnMgfSA9IHdpbmRvdy5hcHA7XG4gICAgICAgIGlmIChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJkYWlseVwiKSkge1xuICAgICAgICAgICAgY29uc3QgeyBmb3JtYXQsIGZvbGRlciwgdGVtcGxhdGUgfSA9IHBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy5kYWlseSB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IGZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBmb2xkZXIsIGZvcm1hdCwgdGVtcGxhdGUgfSA9IGludGVybmFsUGx1Z2lucy5nZXRQbHVnaW5CeUlkKFwiZGFpbHktbm90ZXNcIik/Lmluc3RhbmNlPy5vcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIGRhaWx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSB1c2VyIHNldHRpbmdzIGZvciB0aGUgYHdlZWtseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcImNhbGVuZGFyXCIpPy5vcHRpb25zO1xuICAgICAgICBjb25zdCBwZXJpb2RpY05vdGVzU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ud2Vla2x5O1xuICAgICAgICBpZiAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwid2Vla2x5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogcGVyaW9kaWNOb3Rlc1NldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IHBlcmlvZGljTm90ZXNTZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBwZXJpb2RpY05vdGVzU2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGNhbGVuZGFyU2V0dGluZ3MgfHwge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLndlZWtseU5vdGVGb3JtYXQgfHwgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLndlZWtseU5vdGVGb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLndlZWtseU5vdGVUZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHdlZWtseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwibW9udGhseVwiKSAmJlxuICAgICAgICAgICAgcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/Lm1vbnRobHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfTU9OVEhMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIG1vbnRobHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwicXVhcnRlcmx5XCIpICYmXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ucXVhcnRlcmx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHF1YXJ0ZXJseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0WWVhcmx5Tm90ZVNldHRpbmdzKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGx1Z2luTWFuYWdlciA9IHdpbmRvdy5hcHAucGx1Z2lucztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJ5ZWFybHlcIikgJiZcbiAgICAgICAgICAgIHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy55ZWFybHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgZm9sZGVyOiBzZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLnRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmluZm8oXCJObyBjdXN0b20geWVhcmx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuXG4vLyBDcmVkaXQ6IEBjcmVhdGlvbml4L3BhdGguanNcbmZ1bmN0aW9uIGpvaW4oLi4ucGFydFNlZ21lbnRzKSB7XG4gICAgLy8gU3BsaXQgdGhlIGlucHV0cyBpbnRvIGEgbGlzdCBvZiBwYXRoIGNvbW1hbmRzLlxuICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcGFydFNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChwYXJ0U2VnbWVudHNbaV0uc3BsaXQoXCIvXCIpKTtcbiAgICB9XG4gICAgLy8gSW50ZXJwcmV0IHRoZSBwYXRoIGNvbW1hbmRzIHRvIGdldCB0aGUgbmV3IHJlc29sdmVkIHBhdGguXG4gICAgY29uc3QgbmV3UGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzXG4gICAgICAgIC8vIEFsc28gcmVtb3ZlIFwiLlwiIHNlZ21lbnRzXG4gICAgICAgIGlmICghcGFydCB8fCBwYXJ0ID09PSBcIi5cIilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAvLyBQdXNoIG5ldyBwYXRoIHNlZ21lbnRzLlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH1cbiAgICAvLyBQcmVzZXJ2ZSB0aGUgaW5pdGlhbCBzbGFzaCBpZiB0aGVyZSB3YXMgb25lLlxuICAgIGlmIChwYXJ0c1swXSA9PT0gXCJcIilcbiAgICAgICAgbmV3UGFydHMudW5zaGlmdChcIlwiKTtcbiAgICAvLyBUdXJuIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgcGF0aC5cbiAgICByZXR1cm4gbmV3UGFydHMuam9pbihcIi9cIik7XG59XG5mdW5jdGlvbiBiYXNlbmFtZShmdWxsUGF0aCkge1xuICAgIGxldCBiYXNlID0gZnVsbFBhdGguc3Vic3RyaW5nKGZ1bGxQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuICAgIGlmIChiYXNlLmxhc3RJbmRleE9mKFwiLlwiKSAhPSAtMSlcbiAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGJhc2UubGFzdEluZGV4T2YoXCIuXCIpKTtcbiAgICByZXR1cm4gYmFzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUZvbGRlckV4aXN0cyhwYXRoKSB7XG4gICAgY29uc3QgZGlycyA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGRpcnMucG9wKCk7IC8vIHJlbW92ZSBiYXNlbmFtZVxuICAgIGlmIChkaXJzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkaXIgPSBqb2luKC4uLmRpcnMpO1xuICAgICAgICBpZiAoIXdpbmRvdy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGRpcikpIHtcbiAgICAgICAgICAgIGF3YWl0IHdpbmRvdy5hcHAudmF1bHQuY3JlYXRlRm9sZGVyKGRpcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBnZXROb3RlUGF0aChkaXJlY3RvcnksIGZpbGVuYW1lKSB7XG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5tZFwiKSkge1xuICAgICAgICBmaWxlbmFtZSArPSBcIi5tZFwiO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gb2JzaWRpYW4ubm9ybWFsaXplUGF0aChqb2luKGRpcmVjdG9yeSwgZmlsZW5hbWUpKTtcbiAgICBhd2FpdCBlbnN1cmVGb2xkZXJFeGlzdHMocGF0aCk7XG4gICAgcmV0dXJuIHBhdGg7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpIHtcbiAgICBjb25zdCB7IG1ldGFkYXRhQ2FjaGUsIHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgodGVtcGxhdGUpO1xuICAgIGlmICh0ZW1wbGF0ZVBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1wiXCIsIG51bGxdKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0ZW1wbGF0ZVBhdGgsIFwiXCIpO1xuICAgICAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IHZhdWx0LmNhY2hlZFJlYWQodGVtcGxhdGVGaWxlKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgSUZvbGRJbmZvID0gd2luZG93LmFwcC5mb2xkTWFuYWdlci5sb2FkKHRlbXBsYXRlRmlsZSk7XG4gICAgICAgIHJldHVybiBbY29udGVudHMsIElGb2xkSW5mb107XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGUgJyR7dGVtcGxhdGVQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGVcIik7XG4gICAgICAgIHJldHVybiBbXCJcIiwgbnVsbF07XG4gICAgfVxufVxuXG4vKipcbiAqIGRhdGVVSUQgaXMgYSB3YXkgb2Ygd2Vla2x5IGlkZW50aWZ5aW5nIGRhaWx5L3dlZWtseS9tb250aGx5IG5vdGVzLlxuICogVGhleSBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgZ3JhbnVsYXJpdHkgdG8gYXZvaWQgYW1iaWd1aXR5LlxuICovXG5mdW5jdGlvbiBnZXREYXRlVUlEKGRhdGUsIGdyYW51bGFyaXR5ID0gXCJkYXlcIikge1xuICAgIGNvbnN0IHRzID0gZGF0ZS5jbG9uZSgpLnN0YXJ0T2YoZ3JhbnVsYXJpdHkpLmZvcm1hdCgpO1xuICAgIHJldHVybiBgJHtncmFudWxhcml0eX0tJHt0c31gO1xufVxuZnVuY3Rpb24gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9cXFtbXlxcXV0qXFxdL2csIFwiXCIpOyAvLyByZW1vdmUgZXZlcnl0aGluZyB3aXRoaW4gYnJhY2tldHNcbn1cbi8qKlxuICogWFhYOiBXaGVuIHBhcnNpbmcgZGF0ZXMgdGhhdCBjb250YWluIGJvdGggd2VlayBudW1iZXJzIGFuZCBtb250aHMsXG4gKiBNb21lbnQgY2hvc2VzIHRvIGlnbm9yZSB0aGUgd2VlayBudW1iZXJzLiBGb3IgdGhlIHdlZWsgZGF0ZVVJRCwgd2VcbiAqIHdhbnQgdGhlIG9wcG9zaXRlIGJlaGF2aW9yLiBTdHJpcCB0aGUgTU1NIGZyb20gdGhlIGZvcm1hdCB0byBwYXRjaC5cbiAqL1xuZnVuY3Rpb24gaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkge1xuICAgIGlmIChncmFudWxhcml0eSA9PT0gXCJ3ZWVrXCIpIHtcbiAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICByZXR1cm4gKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSAmJlxuICAgICAgICAgICAgKC9NezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpIHx8IC9EezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tRmlsZShmaWxlLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGUuYmFzZW5hbWUsIGdyYW51bGFyaXR5KTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tUGF0aChwYXRoLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGJhc2VuYW1lKHBhdGgpLCBncmFudWxhcml0eSk7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGVuYW1lLCBncmFudWxhcml0eSkge1xuICAgIGNvbnN0IGdldFNldHRpbmdzID0ge1xuICAgICAgICBkYXk6IGdldERhaWx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB3ZWVrOiBnZXRXZWVrbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIG1vbnRoOiBnZXRNb250aGx5Tm90ZVNldHRpbmdzLFxuICAgICAgICBxdWFydGVyOiBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHllYXI6IGdldFllYXJseU5vdGVTZXR0aW5ncyxcbiAgICB9O1xuICAgIGNvbnN0IGZvcm1hdCA9IGdldFNldHRpbmdzW2dyYW51bGFyaXR5XSgpLmZvcm1hdC5zcGxpdChcIi9cIikucG9wKCk7XG4gICAgY29uc3Qgbm90ZURhdGUgPSB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBmb3JtYXQsIHRydWUpO1xuICAgIGlmICghbm90ZURhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkpIHtcbiAgICAgICAgaWYgKGdyYW51bGFyaXR5ID09PSBcIndlZWtcIikge1xuICAgICAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICAgICAgaWYgKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBcbiAgICAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgY29udGFpbnMgd2VlaywgcmVtb3ZlIGRheSAmIG1vbnRoIGZvcm1hdHRpbmdcbiAgICAgICAgICAgICAgICBmb3JtYXQucmVwbGFjZSgvTXsxLDR9L2csIFwiXCIpLnJlcGxhY2UoL0R7MSw0fS9nLCBcIlwiKSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RlRGF0ZTtcbn1cblxuY2xhc3MgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBkYWlseS1ub3RlcyBwbHVnaW5cbiAqIHNvIGl0IHdpbGwgcmVwbGFjZSB7e2RhdGV9fSwge3t0aXRsZX19LCBhbmQge3t0aW1lfX0gd2l0aCB0aGVcbiAqIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gKlxuICogTm90ZTogaXQgaGFzIGFuIGFkZGVkIGJvbnVzIHRoYXQgaXQncyBub3QgJ3RvZGF5JyBzcGVjaWZpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGFpbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCBhcHAgPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcbiAgICBjb25zdCBtb21lbnQgPSB3aW5kb3cubW9tZW50O1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIG1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBtb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnllc3RlcmRheVxccyp9fS9naSwgZGF0ZS5jbG9uZSgpLnN1YnRyYWN0KDEsIFwiZGF5XCIpLmZvcm1hdChmb3JtYXQpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRvbW9ycm93XFxzKn19L2dpLCBkYXRlLmNsb25lKCkuYWRkKDEsIFwiZFwiKS5mb3JtYXQoZm9ybWF0KSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBhcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcykge1xuICAgIHJldHVybiBkYWlseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJkYXlcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxEYWlseU5vdGVzKCkge1xuICAgIC8qKlxuICAgICAqIEZpbmQgYWxsIGRhaWx5IG5vdGVzIGluIHRoZSBkYWlseSBub3RlIGZvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldERhaWx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgZGFpbHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghZGFpbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIGRhaWx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgY29uc3QgZGFpbHlOb3RlcyA9IHt9O1xuICAgIG9ic2lkaWFuLlZhdWx0LnJlY3Vyc2VDaGlsZHJlbihkYWlseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwiZGF5XCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBkYWlseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYWlseU5vdGVzO1xufVxuXG5jbGFzcyBXZWVrbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbmZ1bmN0aW9uIGdldERheXNPZldlZWsoKSB7XG4gICAgY29uc3QgeyBtb21lbnQgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGxldCB3ZWVrU3RhcnQgPSBtb21lbnQubG9jYWxlRGF0YSgpLl93ZWVrLmRvdztcbiAgICBjb25zdCBkYXlzT2ZXZWVrID0gW1xuICAgICAgICBcInN1bmRheVwiLFxuICAgICAgICBcIm1vbmRheVwiLFxuICAgICAgICBcInR1ZXNkYXlcIixcbiAgICAgICAgXCJ3ZWRuZXNkYXlcIixcbiAgICAgICAgXCJ0aHVyc2RheVwiLFxuICAgICAgICBcImZyaWRheVwiLFxuICAgICAgICBcInNhdHVyZGF5XCIsXG4gICAgXTtcbiAgICB3aGlsZSAod2Vla1N0YXJ0KSB7XG4gICAgICAgIGRheXNPZldlZWsucHVzaChkYXlzT2ZXZWVrLnNoaWZ0KCkpO1xuICAgICAgICB3ZWVrU3RhcnQtLTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXNPZldlZWs7XG59XG5mdW5jdGlvbiBnZXREYXlPZldlZWtOdW1lcmljYWxWYWx1ZShkYXlPZldlZWtOYW1lKSB7XG4gICAgcmV0dXJuIGdldERheXNPZldlZWsoKS5pbmRleE9mKGRheU9mV2Vla05hbWUudG9Mb3dlckNhc2UoKSk7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVXZWVrbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRXZWVrbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSlcXHMqOiguKj8pfX0vZ2ksIChfLCBkYXlPZldlZWssIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gZ2V0RGF5T2ZXZWVrTnVtZXJpY2FsVmFsdWUoZGF5T2ZXZWVrKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRlLndlZWtkYXkoZGF5KS5mb3JtYXQobW9tZW50Rm9ybWF0LnRyaW0oKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFdlZWtseU5vdGUoZGF0ZSwgd2Vla2x5Tm90ZXMpIHtcbiAgICByZXR1cm4gd2Vla2x5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxXZWVrbHlOb3RlcygpIHtcbiAgICBjb25zdCB3ZWVrbHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gd2Vla2x5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFdlZWtseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHdlZWtseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF3ZWVrbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgV2Vla2x5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB3ZWVrbHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4od2Vla2x5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIik7XG4gICAgICAgICAgICAgICAgd2Vla2x5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdlZWtseU5vdGVzO1xufVxuXG5jbGFzcyBNb250aGx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vbnRobHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqZGF0ZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB3aW5kb3cuYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGUoZGF0ZSwgbW9udGhseU5vdGVzKSB7XG4gICAgcmV0dXJuIG1vbnRobHlOb3Rlc1tnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxNb250aGx5Tm90ZXMoKSB7XG4gICAgY29uc3QgbW9udGhseU5vdGVzID0ge307XG4gICAgaWYgKCFhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gbW9udGhseU5vdGVzO1xuICAgIH1cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgbW9udGhseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFtb250aGx5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1vbnRobHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIG1vbnRobHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4obW9udGhseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgbW9udGhseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtb250aGx5Tm90ZXM7XG59XG5cbmNsYXNzIFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVRdWFydGVybHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRRdWFydGVybHlOb3RlKGRhdGUsIHF1YXJ0ZXJseSkge1xuICAgIHJldHVybiBxdWFydGVybHlbZ2V0RGF0ZVVJRChkYXRlLCBcInF1YXJ0ZXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxRdWFydGVybHlOb3RlcygpIHtcbiAgICBjb25zdCBxdWFydGVybHkgPSB7fTtcbiAgICBpZiAoIWFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHF1YXJ0ZXJseTtcbiAgICB9XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgcXVhcnRlcmx5Rm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFxdWFydGVybHlGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgcXVhcnRlcmx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKHF1YXJ0ZXJseUZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcInF1YXJ0ZXJcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwicXVhcnRlclwiKTtcbiAgICAgICAgICAgICAgICBxdWFydGVybHlbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHF1YXJ0ZXJseTtcbn1cblxuY2xhc3MgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVllYXJseU5vdGUoZGF0ZSkge1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgZm9ybWF0LCBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihkYXRlfHRpbWUpXFxzKigoWystXVxcZCspKFt5cW13ZGhzXSkpP1xccyooOi4rPyk/fX0vZ2ksIChfLCBfdGltZU9yRGF0ZSwgY2FsYywgdGltZURlbHRhLCB1bml0LCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHdpbmRvdy5tb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFllYXJseU5vdGUoZGF0ZSwgeWVhcmx5Tm90ZXMpIHtcbiAgICByZXR1cm4geWVhcmx5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxZZWFybHlOb3RlcygpIHtcbiAgICBjb25zdCB5ZWFybHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4geWVhcmx5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHllYXJseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF5ZWFybHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB5ZWFybHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4oeWVhcmx5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgeWVhcmx5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHllYXJseU5vdGVzO1xufVxuXG5mdW5jdGlvbiBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBkYWlseU5vdGVzUGx1Z2luID0gYXBwLmludGVybmFsUGx1Z2lucy5wbHVnaW5zW1wiZGFpbHktbm90ZXNcIl07XG4gICAgaWYgKGRhaWx5Tm90ZXNQbHVnaW4gJiYgZGFpbHlOb3Rlc1BsdWdpbi5lbmFibGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5kYWlseT8uZW5hYmxlZDtcbn1cbi8qKlxuICogWFhYOiBcIldlZWtseSBOb3Rlc1wiIGxpdmUgaW4gZWl0aGVyIHRoZSBDYWxlbmRhciBwbHVnaW4gb3IgdGhlIHBlcmlvZGljLW5vdGVzIHBsdWdpbi5cbiAqIENoZWNrIGJvdGggdW50aWwgdGhlIHdlZWtseSBub3RlcyBmZWF0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgQ2FsZW5kYXIgcGx1Z2luLlxuICovXG5mdW5jdGlvbiBhcHBIYXNXZWVrbHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKGFwcC5wbHVnaW5zLmdldFBsdWdpbihcImNhbGVuZGFyXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy53ZWVrbHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5tb250aGx5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5xdWFydGVybHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNZZWFybHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGVyaW9kaWNOb3RlcyA9IGFwcC5wbHVnaW5zLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpO1xuICAgIHJldHVybiBwZXJpb2RpY05vdGVzICYmIHBlcmlvZGljTm90ZXMuc2V0dGluZ3M/LnllYXJseT8uZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGdldFBlcmlvZGljTm90ZVNldHRpbmdzKGdyYW51bGFyaXR5KSB7XG4gICAgY29uc3QgZ2V0U2V0dGluZ3MgPSB7XG4gICAgICAgIGRheTogZ2V0RGFpbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHdlZWs6IGdldFdlZWtseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgbW9udGg6IGdldE1vbnRobHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHF1YXJ0ZXI6IGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgeWVhcjogZ2V0WWVhcmx5Tm90ZVNldHRpbmdzLFxuICAgIH1bZ3JhbnVsYXJpdHldO1xuICAgIHJldHVybiBnZXRTZXR0aW5ncygpO1xufVxuZnVuY3Rpb24gY3JlYXRlUGVyaW9kaWNOb3RlKGdyYW51bGFyaXR5LCBkYXRlKSB7XG4gICAgY29uc3QgY3JlYXRlRm4gPSB7XG4gICAgICAgIGRheTogY3JlYXRlRGFpbHlOb3RlLFxuICAgICAgICBtb250aDogY3JlYXRlTW9udGhseU5vdGUsXG4gICAgICAgIHdlZWs6IGNyZWF0ZVdlZWtseU5vdGUsXG4gICAgfTtcbiAgICByZXR1cm4gY3JlYXRlRm5bZ3JhbnVsYXJpdHldKGRhdGUpO1xufVxuXG5leHBvcnRzLkRFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfUVVBUlRFUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9RVUFSVEVSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFUID0gREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9ZRUFSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLmFwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1dlZWtseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1llYXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmNyZWF0ZURhaWx5Tm90ZSA9IGNyZWF0ZURhaWx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlTW9udGhseU5vdGUgPSBjcmVhdGVNb250aGx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlUGVyaW9kaWNOb3RlID0gY3JlYXRlUGVyaW9kaWNOb3RlO1xuZXhwb3J0cy5jcmVhdGVRdWFydGVybHlOb3RlID0gY3JlYXRlUXVhcnRlcmx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlV2Vla2x5Tm90ZSA9IGNyZWF0ZVdlZWtseU5vdGU7XG5leHBvcnRzLmNyZWF0ZVllYXJseU5vdGUgPSBjcmVhdGVZZWFybHlOb3RlO1xuZXhwb3J0cy5nZXRBbGxEYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsTW9udGhseU5vdGVzID0gZ2V0QWxsTW9udGhseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxRdWFydGVybHlOb3RlcyA9IGdldEFsbFF1YXJ0ZXJseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxXZWVrbHlOb3RlcyA9IGdldEFsbFdlZWtseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxZZWFybHlOb3RlcyA9IGdldEFsbFllYXJseU5vdGVzO1xuZXhwb3J0cy5nZXREYWlseU5vdGUgPSBnZXREYWlseU5vdGU7XG5leHBvcnRzLmdldERhaWx5Tm90ZVNldHRpbmdzID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldERhdGVGcm9tRmlsZSA9IGdldERhdGVGcm9tRmlsZTtcbmV4cG9ydHMuZ2V0RGF0ZUZyb21QYXRoID0gZ2V0RGF0ZUZyb21QYXRoO1xuZXhwb3J0cy5nZXREYXRlVUlEID0gZ2V0RGF0ZVVJRDtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGUgPSBnZXRNb250aGx5Tm90ZTtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGVTZXR0aW5ncyA9IGdldE1vbnRobHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFBlcmlvZGljTm90ZVNldHRpbmdzID0gZ2V0UGVyaW9kaWNOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFF1YXJ0ZXJseU5vdGUgPSBnZXRRdWFydGVybHlOb3RlO1xuZXhwb3J0cy5nZXRRdWFydGVybHlOb3RlU2V0dGluZ3MgPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mbztcbmV4cG9ydHMuZ2V0V2Vla2x5Tm90ZSA9IGdldFdlZWtseU5vdGU7XG5leHBvcnRzLmdldFdlZWtseU5vdGVTZXR0aW5ncyA9IGdldFdlZWtseU5vdGVTZXR0aW5ncztcbmV4cG9ydHMuZ2V0WWVhcmx5Tm90ZSA9IGdldFllYXJseU5vdGU7XG5leHBvcnRzLmdldFllYXJseU5vdGVTZXR0aW5ncyA9IGdldFllYXJseU5vdGVTZXR0aW5ncztcbiIsImltcG9ydCB7QXBwLCBURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtnZXRBbGxEYWlseU5vdGVzfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlIHtcbiAgZGFpbHlOb3RlczogUmVjb3JkPHN0cmluZywgVEZpbGU+O1xuICBhcHA6IEFwcDtcbn1cblxuaW50ZXJmYWNlIFNldERhaWx5Tm90ZXNBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0RBSUxZTk9URVMnO1xuICBwYXlsb2FkOiB7XG4gICAgZGFpbHlOb3RlczogUmVjb3JkPHN0cmluZywgVEZpbGU+O1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2V0T2JzaWRpYW5BcHBBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0FQUCc7XG4gIHBheWxvYWQ6IHtcbiAgICBhcHA6IEFwcDtcbiAgfTtcbn1cblxuLy8gaW50ZXJmYWNlIEluc2VydERhaWx5Tm90ZUFjdGlvbiB7XG4vLyAgIHR5cGU6IFwiSU5TRVJUX0RBSUxZTk9URVwiO1xuLy8gICBwYXlsb2FkOiB7XG4vLyAgICAgZGFpbHlOb3RlOiBURmlsZTtcbi8vICAgfTtcbi8vIH1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9IFNldERhaWx5Tm90ZXNBY3Rpb24gfCBTZXRPYnNpZGlhbkFwcEFjdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGU6IFN0YXRlLCBhY3Rpb246IEFjdGlvbnMpOiBTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdTRVRfREFJTFlOT1RFUyc6IHtcbiAgICAgIGNvbnN0IGRhaWx5Tm90ZXMgPSBnZXRBbGxEYWlseU5vdGVzKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBkYWlseU5vdGVzOiBkYWlseU5vdGVzLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX0FQUCc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBhcHA6IGFjdGlvbi5wYXlsb2FkLmFwcCxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdGF0ZTogU3RhdGUgPSB7XG4gIGRhaWx5Tm90ZXM6IG51bGwsXG4gIGFwcDogbnVsbCxcbn07XG4iLCJpbXBvcnQgY29tYmluZVJlZHVjZXJzIGZyb20gJy4uL2xhYnMvY29tYmluZVJlZHVjZXJzJztcbmltcG9ydCBjcmVhdGVTdG9yZSBmcm9tICcuLi9sYWJzL2NyZWF0ZVN0b3JlJztcbmltcG9ydCAqIGFzIGdsb2JhbFN0b3JlIGZyb20gJy4vZ2xvYmFsU3RhdGVTdG9yZSc7XG5pbXBvcnQgKiBhcyBsb2NhdGlvblN0b3JlIGZyb20gJy4vbG9jYXRpb25TdG9yZSc7XG5pbXBvcnQgKiBhcyBtZW1vU3RvcmUgZnJvbSAnLi9tZW1vU3RvcmUnO1xuaW1wb3J0ICogYXMgdXNlclN0b3JlIGZyb20gJy4vdXNlclN0b3JlJztcbmltcG9ydCAqIGFzIHF1ZXJ5U3RvcmUgZnJvbSAnLi9xdWVyeVN0b3JlJztcbmltcG9ydCAqIGFzIGRhaWx5Tm90ZXNTdG9yZSBmcm9tICcuL2RhaWx5Tm90ZXNTdG9yZSc7XG5cbmludGVyZmFjZSBBcHBTdGF0ZSB7XG4gIGdsb2JhbFN0YXRlOiBnbG9iYWxTdG9yZS5TdGF0ZTtcbiAgbG9jYXRpb25TdGF0ZTogbG9jYXRpb25TdG9yZS5TdGF0ZTtcbiAgbWVtb1N0YXRlOiBtZW1vU3RvcmUuU3RhdGU7XG4gIHVzZXJTdGF0ZTogdXNlclN0b3JlLlN0YXRlO1xuICBxdWVyeVN0YXRlOiBxdWVyeVN0b3JlLlN0YXRlO1xuICBkYWlseU5vdGVzU3RhdGU6IGRhaWx5Tm90ZXNTdG9yZS5TdGF0ZTtcbn1cblxudHlwZSBBcHBTdGF0ZUFjdGlvbnMgPVxuICB8IGdsb2JhbFN0b3JlLkFjdGlvbnNcbiAgfCBsb2NhdGlvblN0b3JlLkFjdGlvbnNcbiAgfCBtZW1vU3RvcmUuQWN0aW9uc1xuICB8IHVzZXJTdG9yZS5BY3Rpb25zXG4gIHwgcXVlcnlTdG9yZS5BY3Rpb25zXG4gIHwgZGFpbHlOb3Rlc1N0b3JlLkFjdGlvbnM7XG5cbmNvbnN0IGFwcFN0b3JlID0gY3JlYXRlU3RvcmU8QXBwU3RhdGUsIEFwcFN0YXRlQWN0aW9ucz4oXG4gIHtcbiAgICBnbG9iYWxTdGF0ZTogZ2xvYmFsU3RvcmUuZGVmYXVsdFN0YXRlLFxuICAgIGxvY2F0aW9uU3RhdGU6IGxvY2F0aW9uU3RvcmUuZGVmYXVsdFN0YXRlLFxuICAgIG1lbW9TdGF0ZTogbWVtb1N0b3JlLmRlZmF1bHRTdGF0ZSxcbiAgICB1c2VyU3RhdGU6IHVzZXJTdG9yZS5kZWZhdWx0U3RhdGUsXG4gICAgcXVlcnlTdGF0ZTogcXVlcnlTdG9yZS5kZWZhdWx0U3RhdGUsXG4gICAgZGFpbHlOb3Rlc1N0YXRlOiBkYWlseU5vdGVzU3RvcmUuZGVmYXVsdFN0YXRlLFxuICB9LFxuICBjb21iaW5lUmVkdWNlcnM8QXBwU3RhdGUsIEFwcFN0YXRlQWN0aW9ucz4oe1xuICAgIGdsb2JhbFN0YXRlOiBnbG9iYWxTdG9yZS5yZWR1Y2VyLFxuICAgIGxvY2F0aW9uU3RhdGU6IGxvY2F0aW9uU3RvcmUucmVkdWNlcixcbiAgICBtZW1vU3RhdGU6IG1lbW9TdG9yZS5yZWR1Y2VyLFxuICAgIHVzZXJTdGF0ZTogdXNlclN0b3JlLnJlZHVjZXIsXG4gICAgcXVlcnlTdGF0ZTogcXVlcnlTdG9yZS5yZWR1Y2VyLFxuICAgIGRhaWx5Tm90ZXNTdGF0ZTogZGFpbHlOb3Rlc1N0b3JlLnJlZHVjZXIsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwU3RvcmU7XG4iLCJpbXBvcnQge2NyZWF0ZUNvbnRleHR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuL2FwcFN0b3JlJztcblxuY29uc3QgYXBwQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoYXBwU3RvcmUuZ2V0U3RhdGUoKSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFwcENvbnRleHQ7XG4iLCIvLyBpbXBvcnQgeyBtb21lbnQgfSBmcm9tICdvYnNpZGlhbic7XG4vLyBpbXBvcnQgdXNlclNlcnZpY2UgZnJvbSBcIi4vdXNlclNlcnZpY2VcIjtcbi8vIGltcG9ydCBhcGkgZnJvbSBcIi4uL2hlbHBlcnMvYXBpXCI7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcbmltcG9ydCB7Z2V0QWxsRGFpbHlOb3RlcywgZ2V0RGFpbHlOb3RlfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuaW1wb3J0IHtBcHAsIFRGaWxlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge01vbWVudH0gZnJvbSAnX29ic2lkaWFuQDAuMTMuMTFAb2JzaWRpYW4vbm9kZV9tb2R1bGVzL21vbWVudCc7XG4vLyBpbXBvcnQgeyBNb21lbnR9ICBmcm9tIFwib2JzaWRpYW5cIjtcblxuY2xhc3MgRGFpbHlOb3Rlc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlO1xuICB9XG5cbiAgcHVibGljIGdldEFwcChhcHA6IEFwcCkge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfQVBQJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgYXBwLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gYXBwO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE15QWxsRGFpbHlOb3RlcygpIHtcbiAgICBjb25zdCBkYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcygpO1xuXG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9EQUlMWU5PVEVTJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgZGFpbHlOb3RlcyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhaWx5Tm90ZXM7XG4gIH1cblxuICAvLyBwdWJsaWMgcHVzaERhaWx5Tm90ZShkYWlseU5vdGU6IFRGaWxlKSB7XG4gIC8vICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAvLyAgICAgdHlwZTogXCJJTlNFUlRfREFJTFlOT1RFXCIsXG4gIC8vICAgICBwYXlsb2FkOiB7XG4gIC8vICAgICAgIG1lbW86IHtcbiAgLy8gICAgICAgICAuLi5tZW1vLFxuICAvLyAgICAgICB9LFxuICAvLyAgICAgfSxcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREYWlseU5vdGVCeU1lbW8oZGF0ZTogTW9tZW50KTogUHJvbWlzZTxURmlsZT4ge1xuICAgIGNvbnN0IHtkYWlseU5vdGVzfSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBkYWlseU5vdGUgPSBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcyk7XG4gICAgcmV0dXJuIGRhaWx5Tm90ZTtcbiAgfVxufVxuXG5jb25zdCBkYWlseU5vdGVzU2VydmljZSA9IG5ldyBEYWlseU5vdGVzU2VydmljZSgpO1xuXG5leHBvcnQgZGVmYXVsdCBkYWlseU5vdGVzU2VydmljZTtcbiIsImltcG9ydCB7SW5wdXRBY3Rpb259IGZyb20gJ3RpbnktdW5kbyc7XG5cbi8qKlxuICogRGVmaW5lIHN0b3JhZ2UgZGF0YSB0eXBlXG4gKi9cbmludGVyZmFjZSBTdG9yYWdlRGF0YSB7XG4gIC8vIOe8lui+keWZqOi+k+WFpee8k+WtmOWGheWuuVxuICBlZGl0b3JDb250ZW50Q2FjaGU6IHN0cmluZztcbiAgLy8g5YiG6K+N5byA5YWzXG4gIHNob3VsZFNwbGl0TWVtb1dvcmQ6IGJvb2xlYW47XG4gIC8vIOaYr+WQpumakOiXj+WbvueJh+mTvuaOpeWcsOWdgFxuICBzaG91bGRIaWRlSW1hZ2VVcmw6IGJvb2xlYW47XG4gIC8vIG1hcmtkb3duIOino+aekOW8gOWFs1xuICBzaG91bGRVc2VNYXJrZG93blBhcnNlcjogYm9vbGVhbjtcblxuICAvLyBFZGl0b3Igc2V0dGluZ1xuICB1c2VUaW55VW5kb0hpc3RvcnlDYWNoZTogYm9vbGVhbjtcblxuICAvLyB0aW55IHVuZG8gYWN0aW9ucyBjYWNoZVxuICB0aW55VW5kb0FjdGlvbnNDYWNoZTogSW5wdXRBY3Rpb25bXTtcbiAgLy8gdGlueSB1bmRvIGluZGV4IGNhY2hlXG4gIHRpbnlVbmRvSW5kZXhDYWNoZTogbnVtYmVyO1xufVxuXG50eXBlIFN0b3JhZ2VLZXkgPSBrZXlvZiBTdG9yYWdlRGF0YTtcblxuLyoqXG4gKiBzdG9yYWdlIGhlbHBlclxuICovXG5leHBvcnQgbmFtZXNwYWNlIHN0b3JhZ2Uge1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0KGtleXM6IFN0b3JhZ2VLZXlbXSk6IFBhcnRpYWw8U3RvcmFnZURhdGE+IHtcbiAgICBjb25zdCBkYXRhOiBQYXJ0aWFsPFN0b3JhZ2VEYXRhPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RyaW5naWZ5VmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICBpZiAoc3RyaW5naWZ5VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSBKU09OLnBhcnNlKHN0cmluZ2lmeVZhbHVlKTtcbiAgICAgICAgICBkYXRhW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignR2V0IHN0b3JhZ2UgZmFpbGVkIGluICcsIGtleSwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHNldChkYXRhOiBQYXJ0aWFsPFN0b3JhZ2VEYXRhPikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ2lmeVZhbHVlID0gSlNPTi5zdHJpbmdpZnkoZGF0YVtrZXkgYXMgU3RvcmFnZUtleV0pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHN0cmluZ2lmeVZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU2F2ZSBzdG9yYWdlIGZhaWxlZCBpbiAnLCBrZXksIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVtb3ZlKGtleXM6IFN0b3JhZ2VLZXlbXSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlbW92ZSBzdG9yYWdlIGZhaWxlZCBpbiAnLCBrZXksIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW1pdFN0b3JhZ2VDaGFuZ2VkRXZlbnQoKSB7XG4gICAgY29uc3QgaWZyYW1lRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICBpZnJhbWVFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lRWwpO1xuXG4gICAgaWZyYW1lRWwuY29udGVudFdpbmRvdz8ubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3QnLCBEYXRlLm5vdygpLnRvU3RyaW5nKCkpO1xuICAgIGlmcmFtZUVsLnJlbW92ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQge3N0b3JhZ2V9IGZyb20gJy4uL2hlbHBlcnMvc3RvcmFnZSc7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcbmltcG9ydCB7QXBwU2V0dGluZ30gZnJvbSAnLi4vc3RvcmVzL2dsb2JhbFN0YXRlU3RvcmUnO1xuXG5jbGFzcyBHbG9iYWxTdGF0ZVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBjYWNoZWRTZXR0aW5nID0gc3RvcmFnZS5nZXQoW1xuICAgICAgJ3Nob3VsZFNwbGl0TWVtb1dvcmQnLFxuICAgICAgJ3Nob3VsZEhpZGVJbWFnZVVybCcsXG4gICAgICAnc2hvdWxkVXNlTWFya2Rvd25QYXJzZXInLFxuICAgICAgJ3VzZVRpbnlVbmRvSGlzdG9yeUNhY2hlJyxcbiAgICBdKTtcbiAgICBjb25zdCBkZWZhdWx0QXBwU2V0dGluZyA9IHtcbiAgICAgIHNob3VsZFNwbGl0TWVtb1dvcmQ6IGNhY2hlZFNldHRpbmcuc2hvdWxkU3BsaXRNZW1vV29yZCA/PyB0cnVlLFxuICAgICAgc2hvdWxkSGlkZUltYWdlVXJsOiBjYWNoZWRTZXR0aW5nLnNob3VsZEhpZGVJbWFnZVVybCA/PyB0cnVlLFxuICAgICAgc2hvdWxkVXNlTWFya2Rvd25QYXJzZXI6IGNhY2hlZFNldHRpbmcuc2hvdWxkVXNlTWFya2Rvd25QYXJzZXIgPz8gdHJ1ZSxcbiAgICAgIHVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlOiBjYWNoZWRTZXR0aW5nLnVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlID8/IGZhbHNlLFxuICAgIH07XG5cbiAgICB0aGlzLnNldEFwcFNldHRpbmcoZGVmYXVsdEFwcFNldHRpbmcpO1xuICB9XG5cbiAgcHVibGljIGdldFN0YXRlID0gKCkgPT4ge1xuICAgIHJldHVybiBhcHBTdG9yZS5nZXRTdGF0ZSgpLmdsb2JhbFN0YXRlO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRFZGl0TWVtb0lkID0gKGVkaXRNZW1vSWQ6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfRURJVF9NRU1PX0lEJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgZWRpdE1lbW9JZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcHVibGljIHNldE1hcmtNZW1vSWQgPSAobWFya01lbW9JZDogc3RyaW5nKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9NQVJLX01FTU9fSUQnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBtYXJrTWVtb0lkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgc2V0SXNNb2JpbGVWaWV3ID0gKGlzTW9iaWxlVmlldzogYm9vbGVhbikgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfTU9CSUxFX1ZJRVcnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBpc01vYmlsZVZpZXcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcgPSAoc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3OiBib29sZWFuKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9TSE9XX1NJREVCQVJfSU5fTU9CSUxFX1ZJRVcnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBzaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRBcHBTZXR0aW5nID0gKGFwcFNldHRpbmc6IFBhcnRpYWw8QXBwU2V0dGluZz4pID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX0FQUF9TRVRUSU5HJyxcbiAgICAgIHBheWxvYWQ6IGFwcFNldHRpbmcsXG4gICAgfSk7XG4gICAgc3RvcmFnZS5zZXQoYXBwU2V0dGluZyk7XG4gIH07XG59XG5cbmNvbnN0IGdsb2JhbFN0YXRlU2VydmljZSA9IG5ldyBHbG9iYWxTdGF0ZVNlcnZpY2UoKTtcblxuZXhwb3J0IGRlZmF1bHQgZ2xvYmFsU3RhdGVTZXJ2aWNlO1xuIiwiLy8gaW1wb3J0IHV0aWxzIGZyb20gXCIuLi9oZWxwZXJzL3V0aWxzXCI7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcblxuLy8gY29uc3QgdXBkYXRlTG9jYXRpb25VcmwgPSAobWV0aG9kOiBcInJlcGxhY2VcIiB8IFwicHVzaFwiID0gXCJyZXBsYWNlXCIpID0+IHtcbi8vICAgY29uc3QgeyBxdWVyeSwgcGF0aG5hbWUsIGhhc2ggfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkubG9jYXRpb25TdGF0ZTtcbi8vICAgbGV0IHF1ZXJ5U3RyaW5nID0gdXRpbHMudHJhbnNmb3JtT2JqZWN0VG9QYXJhbXNTdHJpbmcocXVlcnkpO1xuLy8gICBpZiAocXVlcnlTdHJpbmcpIHtcbi8vICAgICBxdWVyeVN0cmluZyA9IFwiP1wiICsgcXVlcnlTdHJpbmc7XG4vLyAgIH0gZWxzZSB7XG4vLyAgICAgcXVlcnlTdHJpbmcgPSBcIlwiO1xuLy8gICB9XG5cbi8vICAgaWYgKG1ldGhvZCA9PT0gXCJyZXBsYWNlXCIpIHtcbi8vICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgXCJcIiwgcGF0aG5hbWUgKyBoYXNoICsgcXVlcnlTdHJpbmcpO1xuLy8gICB9IGVsc2Uge1xuLy8gICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBcIlwiLCBwYXRobmFtZSArIGhhc2ggKyBxdWVyeVN0cmluZyk7XG4vLyAgIH1cbi8vIH07XG5cbmNsYXNzIExvY2F0aW9uU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudXBkYXRlU3RhdGVXaXRoTG9jYXRpb24oKTtcbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVXaXRoTG9jYXRpb24oKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVN0YXRlV2l0aExvY2F0aW9uID0gKCkgPT4ge1xuICAgIGNvbnN0IHtwYXRobmFtZSwgc2VhcmNoLCBoYXNofSA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCk7XG4gICAgY29uc3Qgc3RhdGU6IEFwcExvY2F0aW9uID0ge1xuICAgICAgcGF0aG5hbWU6ICcvJyxcbiAgICAgIGhhc2g6ICcnLFxuICAgICAgcXVlcnk6IHtcbiAgICAgICAgdGFnOiAnJyxcbiAgICAgICAgZHVyYXRpb246IG51bGwsXG4gICAgICAgIHRleHQ6ICcnLFxuICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgZmlsdGVyOiAnJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBzdGF0ZS5xdWVyeS50YWcgPSB1cmxQYXJhbXMuZ2V0KCd0YWcnKSA/PyAnJztcbiAgICBzdGF0ZS5xdWVyeS50eXBlID0gKHVybFBhcmFtcy5nZXQoJ3R5cGUnKSA/PyAnJykgYXMgTWVtb1NwZWNUeXBlO1xuICAgIHN0YXRlLnF1ZXJ5LnRleHQgPSB1cmxQYXJhbXMuZ2V0KCd0ZXh0JykgPz8gJyc7XG4gICAgc3RhdGUucXVlcnkuZmlsdGVyID0gdXJsUGFyYW1zLmdldCgnZmlsdGVyJykgPz8gJyc7XG4gICAgY29uc3QgZnJvbSA9IHBhcnNlSW50KHVybFBhcmFtcy5nZXQoJ2Zyb20nKSA/PyAnMCcpO1xuICAgIGNvbnN0IHRvID0gcGFyc2VJbnQodXJsUGFyYW1zLmdldCgndG8nKSA/PyAnMCcpO1xuICAgIGlmICh0byA+IGZyb20gJiYgdG8gIT09IDApIHtcbiAgICAgIHN0YXRlLnF1ZXJ5LmR1cmF0aW9uID0ge1xuICAgICAgICBmcm9tLFxuICAgICAgICB0byxcbiAgICAgIH07XG4gICAgfVxuICAgIHN0YXRlLmhhc2ggPSBoYXNoO1xuICAgIHN0YXRlLnBhdGhuYW1lID0gdGhpcy5nZXRWYWxpZFBhdGhuYW1lKHBhdGhuYW1lKTtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX0xPQ0FUSU9OJyxcbiAgICAgIHBheWxvYWQ6IHN0YXRlLFxuICAgIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBnZXRTdGF0ZSA9ICgpID0+IHtcbiAgICByZXR1cm4gYXBwU3RvcmUuZ2V0U3RhdGUoKS5sb2NhdGlvblN0YXRlO1xuICB9O1xuXG4gIHB1YmxpYyBjbGVhclF1ZXJ5ID0gKCkgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUVVFUlknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICB0YWc6ICcnLFxuICAgICAgICBkdXJhdGlvbjogbnVsbCxcbiAgICAgICAgdGV4dDogJycsXG4gICAgICAgIHR5cGU6ICcnLFxuICAgICAgICBmaWx0ZXI6ICcnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUxvY2F0aW9uVXJsKCk7XG4gIH07XG5cbiAgcHVibGljIHNldFF1ZXJ5ID0gKHF1ZXJ5OiBRdWVyeSkgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUVVFUlknLFxuICAgICAgcGF5bG9hZDogcXVlcnksXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRIYXNoID0gKGhhc2g6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfSEFTSCcsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGhhc2gsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoKTtcbiAgfTtcblxuICBwdWJsaWMgc2V0UGF0aG5hbWUgPSAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUEFUSE5BTUUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBwdXNoSGlzdG9yeSA9IChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9QQVRITkFNRScsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUxvY2F0aW9uVXJsKFwicHVzaFwiKTtcbiAgfTtcblxuICBwdWJsaWMgcmVwbGFjZUhpc3RvcnkgPSAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUEFUSE5BTUUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybChcInJlcGxhY2VcIik7XG4gIH07XG5cbiAgcHVibGljIHNldE1lbW9UeXBlUXVlcnkgPSAodHlwZTogTWVtb1NwZWNUeXBlIHwgJycgPSAnJykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfVFlQRScsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHR5cGUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoKTtcbiAgfTtcblxuICBwdWJsaWMgc2V0TWVtb0ZpbHRlciA9IChmaWx0ZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9RVUVSWV9GSUxURVInLFxuICAgICAgcGF5bG9hZDogZmlsdGVySWQsXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRUZXh0UXVlcnkgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9URVhUJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgdGV4dCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRUYWdRdWVyeSA9ICh0YWc6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfVEFHX1FVRVJZJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgdGFnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUxvY2F0aW9uVXJsKCk7XG4gIH07XG5cbiAgcHVibGljIHNldEZyb21BbmRUb1F1ZXJ5ID0gKGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfRFVSQVRJT05fUVVFUlknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBkdXJhdGlvbjoge2Zyb20sIHRvfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBnZXRWYWxpZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcpOiBBcHBSb3V0ZXIgPT4ge1xuICAgIGlmIChbJy8nLCAnL3JlY3ljbGUnLCAnL3NldHRpbmcnXS5pbmNsdWRlcyhwYXRobmFtZSkpIHtcbiAgICAgIHJldHVybiBwYXRobmFtZSBhcyBBcHBSb3V0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnLyc7XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBsb2NhdGlvblNlcnZpY2UgPSBuZXcgTG9jYXRpb25TZXJ2aWNlKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGxvY2F0aW9uU2VydmljZTtcbiIsImltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge2dldERhaWx5Tm90ZSwgZ2V0RGFpbHlOb3RlU2V0dGluZ3N9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XG4vLyBpbXBvcnQgYXBwU3RvcmUgZnJvbSBcIi4uL3N0b3Jlcy9hcHBTdG9yZVwiO1xuaW1wb3J0IGRhaWx5Tm90ZXNTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2RhaWx5Tm90ZXNTZXJ2aWNlJztcbmltcG9ydCB7VEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hhbmdlTWVtbyhcbiAgbWVtb2lkOiBzdHJpbmcsXG4gIG9yaWdpbmFsQ29udGVudDogc3RyaW5nLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG1lbW9UeXBlOiBzdHJpbmcsXG4pOiBQcm9taXNlPE1vZGVsLk1lbW8+IHtcbiAgY29uc3Qge2RhaWx5Tm90ZXN9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgY29uc3QgdGltZVN0cmluZyA9IG1lbW9pZC5zbGljZSgwLCAxMSkgKyAnMDAnO1xuICBjb25zdCBpZFN0cmluZyA9IHBhcnNlSW50KG1lbW9pZC5zbGljZSgxNCkpO1xuICBjb25zdCBjaGFuZ2VEYXRlID0gbW9tZW50KHRpbWVTdHJpbmcsICdZWVlZTU1EREhIbW1TUycpO1xuICBjb25zdCBkYWlseU5vdGUgPSBnZXREYWlseU5vdGUoY2hhbmdlRGF0ZSwgZGFpbHlOb3Rlcyk7XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgdmF1bHQucmVhZChkYWlseU5vdGUpO1xuICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50KTtcbiAgY29uc3QgcmVtb3ZlRW50ZXIgPSBjb250ZW50LnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuICBjb25zdCBvcmlnaW5hbExpbmUgPSBmaWxlTGluZXNbaWRTdHJpbmddO1xuICBjb25zdCBuZXdMaW5lID0gZmlsZUxpbmVzW2lkU3RyaW5nXS5yZXBsYWNlKG9yaWdpbmFsQ29udGVudCwgcmVtb3ZlRW50ZXIpO1xuICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGZpbGVDb250ZW50LnJlcGxhY2Uob3JpZ2luYWxMaW5lLCBuZXdMaW5lKTtcbiAgYXdhaXQgdmF1bHQubW9kaWZ5KGRhaWx5Tm90ZSwgbmV3RmlsZUNvbnRlbnQpO1xuICByZXR1cm4ge1xuICAgIGlkOiBtZW1vaWQsXG4gICAgY29udGVudDogcmVtb3ZlRW50ZXIsXG4gICAgZGVsZXRlZEF0OiAnJyxcbiAgICBjcmVhdGVkQXQ6IGNoYW5nZURhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOlNTJyksXG4gICAgdXBkYXRlZEF0OiBjaGFuZ2VEYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpTUycpLFxuICAgIG1lbW9UeXBlOiBtZW1vVHlwZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGUobWVtb2lkOiBzdHJpbmcpOiBURmlsZSB7XG4gIGNvbnN0IHtkYWlseU5vdGVzfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG4gIGNvbnN0IHRpbWVTdHJpbmcgPSBtZW1vaWQuc2xpY2UoMCwgMTMpO1xuICBjb25zdCBjaGFuZ2VEYXRlID0gbW9tZW50KHRpbWVTdHJpbmcsICdZWVlZTU1EREhIbW1TUycpO1xuICBjb25zdCBkYWlseU5vdGUgPSBnZXREYWlseU5vdGUoY2hhbmdlRGF0ZSwgZGFpbHlOb3Rlcyk7XG4gIHJldHVybiBkYWlseU5vdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYWlseU5vdGVQYXRoKCk6IHN0cmluZyB7XG4gIGNvbnN0IGRhaWx5Tm90ZXNTZXR0aW5nID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKTtcbiAgY29uc3QgZGFpbHlOb3RlUGF0aCA9IGRhaWx5Tm90ZXNTZXR0aW5nLmZvbGRlcjtcbiAgcmV0dXJuIGRhaWx5Tm90ZVBhdGg7XG59XG5cbmNvbnN0IGdldEFsbExpbmVzRnJvbUZpbGUgPSAoY2FjaGU6IHN0cmluZykgPT4gY2FjaGUuc3BsaXQoL1xccj9cXG4vKTtcbiIsImltcG9ydCB7Z2V0RGFpbHlOb3RlUGF0aH0gZnJvbSAnLi9vYlVwZGF0ZU1lbW8nO1xuaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5leHBvcnQgY29uc3QgZmluZFF1ZXJ5ID0gYXN5bmMgKCk6IFByb21pc2U8YW55W10+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICBjb25zdCBxdWVyeUxpc3QgPSBbXTtcblxuICBjb25zdCBmaWxlUGF0aCA9IGdldERhaWx5Tm90ZVBhdGgoKTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL3F1ZXJ5Lm1kJztcblxuICBjb25zdCBxdWVyeUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuICBpZiAocXVlcnlGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKHF1ZXJ5RmlsZSk7XG4gICAgY29uc3QgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudHMpO1xuICAgIGlmIChmaWxlTGluZXMgJiYgZmlsZUxpbmVzLmxlbmd0aCAhPSAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZmlsZUxpbmVzW2ldID09PSAnJykgY29udGludWU7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWREYXRlU3RyaW5nID0gZ2V0Q3JlYXRlZERhdGVGcm9tTGluZShmaWxlTGluZXNbaV0pO1xuICAgICAgICBjb25zdCBjcmVhdGVkRGF0ZSA9IG1vbWVudChjcmVhdGVkRGF0ZVN0cmluZywgJ1lZWVlNTURESEhtbXNzJykuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRlID0gY3JlYXRlZERhdGU7XG4gICAgICAgIGNvbnN0IGlkID0gY3JlYXRlZERhdGVTdHJpbmcgKyBnZXRJREZyb21MaW5lKGZpbGVMaW5lc1tpXSk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5c3RyaW5nID0gZ2V0U3RyaW5nRnJvbUxpbmUoZmlsZUxpbmVzW2ldKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSBnZXRUaXRsZUZyb21MaW5lKGZpbGVMaW5lc1tpXSk7XG4gICAgICAgIGxldCBwaW5uZWREYXRlO1xuXG4gICAgICAgIGlmICgvXiguKylwaW5uZWRBdCguKykkLy50ZXN0KGZpbGVMaW5lc1tpXSkpIHtcbiAgICAgICAgICBwaW5uZWREYXRlID0gbW9tZW50KGdldFBpbm5lZERhdGVGcm9tTGluZShmaWxlTGluZXNbaV0pLCAnWVlZWU1NRERISG1tc3MnKTtcbiAgICAgICAgICBxdWVyeUxpc3QucHVzaCh7XG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWREYXRlLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgcGlubmVkQXQ6IHBpbm5lZERhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXG4gICAgICAgICAgICBxdWVyeXN0cmluZzogcXVlcnlzdHJpbmcsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWREYXRlLFxuICAgICAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgvXiguKylcXFtcXF0oLispPyQvLnRlc3QoZmlsZUxpbmVzW2ldKSkge1xuICAgICAgICAgIHF1ZXJ5TGlzdC5wdXNoKHtcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZERhdGUsXG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBwaW5uZWRBdDogJycsXG4gICAgICAgICAgICBxdWVyeXN0cmluZzogJycsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWREYXRlLFxuICAgICAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVyeUxpc3QucHVzaCh7XG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWREYXRlLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgcGlubmVkQXQ6ICcnLFxuICAgICAgICAgICAgcXVlcnlzdHJpbmc6IHF1ZXJ5c3RyaW5nLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgICAgIHVzZXJJZDogJycsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcXVlcnlMaXN0O1xufTtcblxuY29uc3QgZ2V0QWxsTGluZXNGcm9tRmlsZSA9IChjYWNoZTogc3RyaW5nKSA9PiBjYWNoZS5zcGxpdCgvXFxyP1xcbi8pO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldENyZWF0ZWREYXRlRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9PiAvXihcXGR7MTR9KS8uZXhlYyhsaW5lKT8uWzFdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldElERnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9PiAvXihcXGR7MTR9KShcXGR7MSx9KVxccy8uZXhlYyhsaW5lKT8uWzJdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldFN0cmluZ0Zyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT4gL14oXFxkezE0fSkoXFxkezEsfSlcXHMoLispXFxzKFxcWyguKyk/XFxdKS8uZXhlYyhsaW5lKT8uWzRdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldFRpdGxlRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9PiAvXihcXGR7MTR9KShcXGR7MSx9KVxccyguKylcXHMoXFxbKC4rKVxcXSkvLmV4ZWMobGluZSk/LlszXTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBnZXRQaW5uZWREYXRlRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9Pi9eKFxcZHsxNH0pKFxcZHsxLH0pXFxzKC4rKVxccyhcXFsoLispXFxdKVxccyhwaW5uZWRBdFxcOiAoXFxkezE0fSkpLy5leGVjKGxpbmUpPy5bN107XG4iLCJpbXBvcnQge2dldERhaWx5Tm90ZVBhdGh9IGZyb20gJy4vb2JVcGRhdGVNZW1vJztcbmltcG9ydCB7VEZpbGUsIG5vcm1hbGl6ZVBhdGgsIE5vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlT2JzaWRpYW5RdWVyeSA9IGFzeW5jICh0aXRsZTogc3RyaW5nLCBxdWVyeXN0cmluZzogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICBjb25zdCBmaWxlUGF0aCA9IGdldERhaWx5Tm90ZVBhdGgoKTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL3F1ZXJ5Lm1kJztcblxuICBjb25zdCBxdWVyeUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuXG4gIGlmIChxdWVyeUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQocXVlcnlGaWxlKTtcbiAgICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xuICAgIGNvbnN0IGNyZWF0ZWREYXRlID0gZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICBjb25zdCB1cGRhdGVkRGF0ZSA9IGNyZWF0ZWREYXRlO1xuICAgIC8vIGNvbnN0IGxpbmVOdW0gPSBmaWxlTGluZXMubGVuZ3RoICsgMTtcbiAgICAvLyBsZXQgbGluZU51bTtcbiAgICBsZXQgbGluZU51bTtcbiAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMSAmJiBmaWxlTGluZXNbMF0gPT09ICcnKSB7XG4gICAgICBsaW5lTnVtID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZU51bSA9IGZpbGVMaW5lcy5sZW5ndGggKyAxO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGRhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpICsgbGluZU51bTtcblxuICAgIGF3YWl0IGNyZWF0ZVF1ZXJ5SW5GaWxlKHF1ZXJ5RmlsZSwgZmlsZUNvbnRlbnRzLCBpZCwgdGl0bGUsIHF1ZXJ5c3RyaW5nKTtcblxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZERhdGUsXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgcGlubmVkQXQ6ICcnLFxuICAgICAgICBxdWVyeXN0cmluZzogcXVlcnlzdHJpbmcsXG4gICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgdXBkYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBxdWVyeUZpbGVQYXRoID0gbm9ybWFsaXplUGF0aChhYnNvbHV0ZVBhdGgpO1xuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBjcmVhdGVRdWVyeUZpbGUocXVlcnlGaWxlUGF0aCk7XG4gICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChmaWxlKTtcbiAgICBjb25zdCBkYXRlID0gbW9tZW50KCk7XG4gICAgY29uc3QgY3JlYXRlZERhdGUgPSBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgIGNvbnN0IHVwZGF0ZWREYXRlID0gY3JlYXRlZERhdGU7XG4gICAgY29uc3QgaWQgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKSArIDE7XG5cbiAgICBhd2FpdCBjcmVhdGVRdWVyeUluRmlsZShmaWxlLCBmaWxlQ29udGVudHMsIGlkLCB0aXRsZSwgcXVlcnlzdHJpbmcpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgY3JlYXRlZEF0OiBjcmVhdGVkRGF0ZSxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBwaW5uZWRBdDogJycsXG4gICAgICAgIHF1ZXJ5c3RyaW5nOiBxdWVyeXN0cmluZyxcbiAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWREYXRlLFxuICAgICAgICB1c2VySWQ6ICcnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUXVlcnlJbkZpbGUgPSBhc3luYyAoXG4gIGZpbGU6IFRGaWxlLFxuICBmaWxlQ29udGVudDogc3RyaW5nLFxuICBpZDogc3RyaW5nLFxuICB0aXRsZTogc3RyaW5nLFxuICBxdWVyeVN0cmluZzogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgbGV0IG5ld0NvbnRlbnQ7XG4gIGlmIChmaWxlQ29udGVudCA9PT0gJycpIHtcbiAgICBuZXdDb250ZW50ID0gaWQgKyAnICcgKyB0aXRsZSArICcgJyArIHF1ZXJ5U3RyaW5nO1xuICB9IGVsc2Uge1xuICAgIG5ld0NvbnRlbnQgPSBmaWxlQ29udGVudCArICdcXG4nICsgaWQgKyAnICcgKyB0aXRsZSArICcgJyArIHF1ZXJ5U3RyaW5nO1xuICB9XG5cbiAgYXdhaXQgdmF1bHQubW9kaWZ5KGZpbGUsIG5ld0NvbnRlbnQpO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVF1ZXJ5RmlsZSA9IGFzeW5jIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGaWxlPiA9PiB7XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke3BhdGh9J2AsIGVycik7XG4gICAgbmV3IE5vdGljZSgnVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS4nKTtcbiAgfVxufTtcblxuY29uc3QgZ2V0QWxsTGluZXNGcm9tRmlsZSA9IChjYWNoZTogc3RyaW5nKSA9PiBjYWNoZS5zcGxpdCgvXFxyP1xcbi8pO1xuIiwiaW1wb3J0IHtub3JtYWxpemVQYXRoLCBURm9sZGVyLCBURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtnZXRBbGxEYWlseU5vdGVzLCBnZXREYWlseU5vdGVTZXR0aW5ncywgZ2V0RGF0ZUZyb21GaWxlfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge1Byb2Nlc3NFbnRyaWVzQmVsb3d9IGZyb20gJy4uL21lbW9zJztcbmltcG9ydCB7RGVmYXVsdE1lbW9Db21wb3NpdGlvbn0gZnJvbSAnLi4vbWVtb3MnO1xuXG5leHBvcnQgY2xhc3MgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZW1haW5pbmdNZW1vcyhub3RlOiBURmlsZSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmICghbm90ZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGxldCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKG5vdGUpO1xuICBsZXQgcmVnZXhNYXRjaDtcbiAgaWYgKFxuICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycgJiZcbiAgICAve1RJTUV9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKSAmJlxuICAgIC97Q09OVEVOVH0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pXG4gICkge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhNYXRjaCA9ICcoLXxcXFxcKikgKFxcXFxbKC57MX0pXFxcXF1cXFxccyk/JyArXG4gICAgICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uLnJlcGxhY2UoL3tUSU1FfS9nLCAnKChcXFxcPHRpbWVcXFxcPik/XFxcXGR7MSwyfTpcXFxcZHsyfSk/JykucmVwbGFjZSgvIHtDT05URU5UfS9nLCAnJyk7XG4gIH0gZWxzZSB7XG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZWdleE1hdGNoID0gJygtfFxcXFwqKSAoXFxcXFsoLnsxfSlcXFxcXVxcXFxzKT8oKFxcXFw8dGltZVxcXFw+KT9cXFxcZHsxLDJ9XFxcXDpcXFxcZHsyfSk/JztcbiAgfVxuICBjb25zdCByZWdleE1hdGNoUmUgPSBuZXcgUmVnRXhwKHJlZ2V4TWF0Y2gsICdnJyk7XG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGNvbnN0IG1hdGNoTGVuZ3RoID0gKGZpbGVDb250ZW50cy5tYXRjaChyZWdleE1hdGNoUmUpIHx8IFtdKS5sZW5ndGg7XG4gIC8vIGNvbnN0IG1hdGNoTGVuZ3RoID0gKGZpbGVDb250ZW50cy5tYXRjaCgvKC18XFwqKSAoXFxbIFxcXVxccyk/KChcXDx0aW1lXFw+KT9cXGR7MSwyfVxcOlxcZHsyfSk/L2cpIHx8IFtdKS5sZW5ndGg7XG4gIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChQcm9jZXNzRW50cmllc0JlbG93LnJlcGxhY2UoLyhbLj8qK14kW1xcXVxcXFwoKXt9fC1dKS9nLCAnXFxcXCQxJyksICdnJyk7XG4gIGNvbnN0IHByb2Nlc3NFbnRyaWVzSGVhZGVyID0gKGZpbGVDb250ZW50cy5tYXRjaChyZSkgfHwgW10pLmxlbmd0aDtcbiAgZmlsZUNvbnRlbnRzID0gbnVsbDtcbiAgaWYgKHByb2Nlc3NFbnRyaWVzSGVhZGVyKSB7XG4gICAgcmV0dXJuIG1hdGNoTGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TWVtb3NGcm9tRGFpbHlOb3RlKGRhaWx5Tm90ZTogVEZpbGUgfCBudWxsLCBkYWlseUV2ZW50czogYW55W10pOiBQcm9taXNlPGFueVtdPiB7XG4gIGlmICghZGFpbHlOb3RlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGNvbnN0IE1lbW9zID0gYXdhaXQgZ2V0UmVtYWluaW5nTWVtb3MoZGFpbHlOb3RlKTtcblxuICBpZiAoTWVtb3MpIHtcbiAgICBsZXQgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChkYWlseU5vdGUpO1xuICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gZ2V0RGF0ZUZyb21GaWxlKGRhaWx5Tm90ZSwgJ2RheScpO1xuICAgIGNvbnN0IGVuZERhdGUgPSBnZXREYXRlRnJvbUZpbGUoZGFpbHlOb3RlLCAnZGF5Jyk7XG4gICAgbGV0IHByb2Nlc3NIZWFkZXJGb3VuZCA9IGZhbHNlO1xuICAgIGxldCBtZW1vVHlwZTogc3RyaW5nO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZUxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaW5lID0gZmlsZUxpbmVzW2ldO1xuICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChwcm9jZXNzSGVhZGVyRm91bmQgPT0gZmFsc2UgJiYgbGluZUNvbnRhaW5zUGFyc2VCZWxvd1Rva2VuKGxpbmUpKSB7XG4gICAgICAgIHByb2Nlc3NIZWFkZXJGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzc0hlYWRlckZvdW5kID09IHRydWUgJiYgIWxpbmVDb250YWluc1BhcnNlQmVsb3dUb2tlbihsaW5lKSAmJiAvXiN7MSx9IC9nLnRlc3QobGluZSkpIHtcbiAgICAgICAgcHJvY2Vzc0hlYWRlckZvdW5kID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChsaW5lQ29udGFpbnNUaW1lKGxpbmUpICYmIHByb2Nlc3NIZWFkZXJGb3VuZCkge1xuICAgICAgICBjb25zdCBob3VyVGV4dCA9IGV4dHJhY3RIb3VyRnJvbUJ1bGxldExpbmUobGluZSk7XG4gICAgICAgIGNvbnN0IG1pblRleHQgPSBleHRyYWN0TWluRnJvbUJ1bGxldExpbmUobGluZSk7XG4gICAgICAgIHN0YXJ0RGF0ZS5ob3VycyhwYXJzZUludChob3VyVGV4dCkpO1xuICAgICAgICBzdGFydERhdGUubWludXRlcyhwYXJzZUludChtaW5UZXh0KSk7XG4gICAgICAgIGVuZERhdGUuaG91cnMocGFyc2VJbnQoaG91clRleHQpKTtcbiAgICAgICAgaWYgKHBhcnNlSW50KGhvdXJUZXh0KSA+IDIyKSB7XG4gICAgICAgICAgZW5kRGF0ZS5taW51dGVzKHBhcnNlSW50KG1pblRleHQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmREYXRlLm1pbnV0ZXMocGFyc2VJbnQobWluVGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgvXlxccypbLSpdXFxzKFxcWyguezF9KVxcXSlcXHMvZy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgY29uc3QgbWVtb1Rhc2tUeXBlID0gZXh0cmFjdE1lbW9UYXNrVHlwZUZyb21MaW5lKGxpbmUpO1xuICAgICAgICAgIGlmIChtZW1vVGFza1R5cGUgPT09ICcgJykge1xuICAgICAgICAgICAgbWVtb1R5cGUgPSAnVEFTSy1UT0RPJztcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lbW9UYXNrVHlwZSA9PT0gJ3gnIHx8IG1lbW9UYXNrVHlwZSA9PT0gJ1gnKSB7XG4gICAgICAgICAgICBtZW1vVHlwZSA9ICdUQVNLLURPTkUnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZW1vVHlwZSA9ICdUQVNLLScgKyBtZW1vVGFza1R5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lbW9UeXBlID0gJ0pPVVJOQUwnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhd1RleHQgPSBleHRyYWN0VGV4dEZyb21Ub2RvTGluZShsaW5lKTtcbiAgICAgICAgaWYocmF3VGV4dCAhPT0gJycpIHtcbiAgICAgICAgICBkYWlseUV2ZW50cy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBzdGFydERhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW1TUycpICsgaSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHJhd1RleHQsXG4gICAgICAgICAgICB1c2VyX2lkOiAxLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBzdGFydERhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOlNTJyksXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IGVuZERhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOlNTJyksXG4gICAgICAgICAgICBtZW1vVHlwZTogbWVtb1R5cGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZmlsZUxpbmVzID0gbnVsbDtcbiAgICBmaWxlQ29udGVudHMgPSBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNZW1vcygpOiBQcm9taXNlPGFueVtdPiB7XG4gIGNvbnN0IGV2ZW50czogYW55W10gfCBQcm9taXNlTGlrZTxhbnlbXT4gPSBbXTtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgY29uc3Qge2ZvbGRlcn0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuXG4gIGNvbnN0IGRhaWx5Tm90ZXNGb2xkZXIgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgobm9ybWFsaXplUGF0aChmb2xkZXIpKSBhcyBURm9sZGVyO1xuXG4gIGlmICghZGFpbHlOb3Rlc0ZvbGRlcikge1xuICAgIHRocm93IG5ldyBEYWlseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKCdGYWlsZWQgdG8gZmluZCBkYWlseSBub3RlcyBmb2xkZXInKTtcbiAgfVxuXG4gIGNvbnN0IGRhaWx5Tm90ZXMgPSBnZXRBbGxEYWlseU5vdGVzKCk7XG5cbiAgZm9yIChjb25zdCBzdHJpbmcgaW4gZGFpbHlOb3Rlcykge1xuICAgIGlmIChkYWlseU5vdGVzW3N0cmluZ10gaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgYXdhaXQgZ2V0TWVtb3NGcm9tRGFpbHlOb3RlKGRhaWx5Tm90ZXNbc3RyaW5nXSwgZXZlbnRzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXZlbnRzO1xufVxuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4vLyBjb25zdCBsaW5lSXNWYWxpZFRvZG8gPSAobGluZTogc3RyaW5nKSA9PiB7XG4vLyAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuLy8gICByZXR1cm4gL15cXHMqW1xcLVxcKl1cXHNcXFsoXFxzfHh8WHxcXFxcfFxcLXxcXD58RHxcXD98XFwvfFxcK3xSfFxcIXxpfEJ8UHxDKVxcXVxccz9cXHMqXFxTLy50ZXN0KGxpbmUpXG4vLyB9XG5jb25zdCBsaW5lQ29udGFpbnNUaW1lID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICBsZXQgcmVnZXhNYXRjaDtcbiAgaWYgKFxuICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycgJiZcbiAgICAve1RJTUV9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKSAmJlxuICAgIC97Q09OVEVOVH0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pXG4gICkge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhNYXRjaCA9ICdeXFxcXHMqKC18XFxcXCopXFxcXHMoXFxcXFsoLnsxfSlcXFxcXVxcXFxzKT8nICtcbiAgICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24ucmVwbGFjZSgve1RJTUV9L2csICcoXFxcXDx0aW1lXFxcXD4pP1xcXFxkezEsMn06XFxcXGR7Mn0oXFxcXDxcXFxcL3RpbWVcXFxcPik/JykucmVwbGFjZShcbiAgICAgICAgL3tDT05URU5UfS9nLFxuICAgICAgICAnKC4qKSQnLFxuICAgICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHJlZ2V4TWF0Y2ggPSAnXlxcXFxzKigtfFxcXFwqKVxcXFxzKFxcXFxbKC57MX0pXFxcXF1cXFxccyk/KFxcXFw8dGltZVxcXFw+KT9cXFxcZHsxLDJ9XFxcXDpcXFxcZHsyfSguKikkJztcbiAgfVxuICBjb25zdCByZWdleE1hdGNoUmUgPSBuZXcgUmVnRXhwKHJlZ2V4TWF0Y2gsICcnKTtcbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgcmV0dXJuIHJlZ2V4TWF0Y2hSZS50ZXN0KGxpbmUpO1xuICAvLyBUaGUgYmVsb3cgbGluZSBleGNsdWRlcyBlbnRyaWVzIHdpdGggYSAnOicgYWZ0ZXIgdGhlIHRpbWUgYXMgSSB3YXMgaGF2aW5nIGlzc3VlcyB3aXRoIG15IGNhbGVuZGFyXG4gIC8vIGJlaW5nIHB1bGxlZCBpbi4gT25jZSBtYWRlIGNvbmZpZ3VyYWJsZSB3aWxsIGJlIHNpbXBsZXIgdG8gbWFuYWdlLlxuICAvLyByZXR1cm4gL15cXHMqW1xcLVxcKl1cXHMoXFxbKFxcc3x4fFh8XFxcXHxcXC18XFw+fER8XFw/fFxcL3xcXCt8UnxcXCF8aXxCfFB8QylcXF1cXHMpPyhcXDx0aW1lXFw+KT9cXGR7MSwyfVxcOlxcZHsyfVteOl0oLiopJC8udGVzdChsaW5lKTtcbn07XG5cbmNvbnN0IGxpbmVDb250YWluc1BhcnNlQmVsb3dUb2tlbiA9IChsaW5lOiBzdHJpbmcpID0+IHtcbiAgaWYgKFByb2Nlc3NFbnRyaWVzQmVsb3cgPT09ICcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKFByb2Nlc3NFbnRyaWVzQmVsb3cucmVwbGFjZSgvKFsuPyorXiRbXFxdXFxcXCgpe318LV0pL2csICdcXFxcJDEnKSwgJycpO1xuICByZXR1cm4gcmUudGVzdChsaW5lKTtcbn07XG5cbmNvbnN0IGV4dHJhY3RUZXh0RnJvbVRvZG9MaW5lID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICBsZXQgcmVnZXhNYXRjaDtcbiAgaWYgKFxuICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycgJiZcbiAgICAve1RJTUV9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKSAmJlxuICAgIC97Q09OVEVOVH0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pXG4gICkge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhNYXRjaCA9ICdeXFxcXHMqW1xcXFwtXFxcXCpdXFxcXHMoXFxcXFsoLnsxfSlcXFxcXVxcXFxzPyk/JyArXG4gICAgICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uLnJlcGxhY2UoL3tUSU1FfS9nLCAnKFxcXFw8dGltZVxcXFw+KT8oKFxcXFxkezEsMn0pXFxcXDooXFxcXGR7Mn0pKT8oXFxcXDxcXFxcL3RpbWVcXFxcPik/JykucmVwbGFjZShcbiAgICAgICAgL3tDT05URU5UfS9nLFxuICAgICAgICAnKC4qKSQnLFxuICAgICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHJlZ2V4TWF0Y2ggPSAnXlxcXFxzKltcXFxcLVxcXFwqXVxcXFxzKFxcXFxbKC57MX0pXFxcXF1cXFxccz8pPyhcXFxcPHRpbWVcXFxcPik/KChcXFxcZHsxLDJ9KVxcXFw6KFxcXFxkezJ9KSk/KFxcXFw8XFxcXC90aW1lXFxcXD4pP1xcXFxzPyguKikkJztcbiAgfVxuICBjb25zdCByZWdleE1hdGNoUmUgPSBuZXcgUmVnRXhwKHJlZ2V4TWF0Y2gsICcnKTtcbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgcmV0dXJuIHJlZ2V4TWF0Y2hSZS5leGVjKGxpbmUpPy5bOF07XG4gIC8vIHJldHVybiAvXlxccypbXFwtXFwqXVxccyhcXFsoLnsxfSlcXF1cXHM/KT8oXFw8dGltZVxcPik/KChcXGR7MSwyfSlcXDooXFxkezJ9KSk/KFxcPFxcL3RpbWVcXD4pP1xccz8oLiopJC8uZXhlYyhsaW5lKT8uWzhdO1xufTtcblxuY29uc3QgZXh0cmFjdEhvdXJGcm9tQnVsbGV0TGluZSA9IChsaW5lOiBzdHJpbmcpID0+IHtcbiAgbGV0IHJlZ2V4SG91ck1hdGNoO1xuICBpZiAoXG4gICAgRGVmYXVsdE1lbW9Db21wb3NpdGlvbiAhPSAnJyAmJlxuICAgIC97VElNRX0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pICYmXG4gICAgL3tDT05URU5UfS9nLnRlc3QoRGVmYXVsdE1lbW9Db21wb3NpdGlvbilcbiAgKSB7XG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZWdleEhvdXJNYXRjaCA9ICdeXFxcXHMqW1xcXFwtXFxcXCpdXFxcXHMoXFxcXFsoLnsxfSlcXFxcXVxcXFxzPyk/JyArXG4gICAgICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uLnJlcGxhY2UoL3tUSU1FfS9nLCAnKFxcXFw8dGltZVxcXFw+KT8oXFxcXGR7MSwyfSlcXFxcOihcXFxcZHsyfSkoXFxcXDxcXFxcL3RpbWVcXFxcPik/JykucmVwbGFjZShcbiAgICAgICAgL3tDT05URU5UfS9nLFxuICAgICAgICAnKC4qKSQnLFxuICAgICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHJlZ2V4SG91ck1hdGNoID0gJ15cXFxccypbXFxcXC1cXFxcKl1cXFxccyhcXFxcWyguezF9KVxcXFxdXFxcXHM/KT8oXFxcXDx0aW1lXFxcXD4pPyhcXFxcZHsxLDJ9KVxcXFw6KFxcXFxkezJ9KSguKikkJztcbiAgfVxuICBjb25zdCByZWdleE1hdGNoUmUgPSBuZXcgUmVnRXhwKHJlZ2V4SG91ck1hdGNoLCAnJyk7XG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIHJldHVybiByZWdleE1hdGNoUmUuZXhlYyhsaW5lKT8uWzRdO1xufTtcblxuY29uc3QgZXh0cmFjdE1pbkZyb21CdWxsZXRMaW5lID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICBsZXQgcmVnZXhIb3VyTWF0Y2g7XG4gIGlmIChcbiAgICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uICE9ICcnICYmXG4gICAgL3tUSU1FfS9nLnRlc3QoRGVmYXVsdE1lbW9Db21wb3NpdGlvbikgJiZcbiAgICAve0NPTlRFTlR9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKVxuICApIHtcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHJlZ2V4SG91ck1hdGNoID0gJ15cXFxccypbXFxcXC1cXFxcKl1cXFxccyhcXFxcWyguezF9KVxcXFxdXFxcXHM/KT8nICtcbiAgICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24ucmVwbGFjZSgve1RJTUV9L2csICcoXFxcXDx0aW1lXFxcXD4pPyhcXFxcZHsxLDJ9KVxcXFw6KFxcXFxkezJ9KShcXFxcPFxcXFwvdGltZVxcXFw+KT8nKS5yZXBsYWNlKFxuICAgICAgICAve0NPTlRFTlR9L2csXG4gICAgICAgICcoLiopJCcsXG4gICAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhIb3VyTWF0Y2ggPSAnXlxcXFxzKltcXFxcLVxcXFwqXVxcXFxzKFxcXFxbKC57MX0pXFxcXF1cXFxccz8pPyhcXFxcPHRpbWVcXFxcPik/KFxcXFxkezEsMn0pXFxcXDooXFxcXGR7Mn0pKC4qKSQnO1xuICB9XG4gIGNvbnN0IHJlZ2V4TWF0Y2hSZSA9IG5ldyBSZWdFeHAocmVnZXhIb3VyTWF0Y2gsICcnKTtcbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgcmV0dXJuIHJlZ2V4TWF0Y2hSZS5leGVjKGxpbmUpPy5bNV07XG4gIC8vIC9eXFxzKltcXC1cXCpdXFxzKFxcWyguezF9KVxcXVxccz8pPyhcXDx0aW1lXFw+KT8oXFxkezEsMn0pXFw6KFxcZHsyfSkoLiopJC8uZXhlYyhsaW5lKT8uWzVdO1xufTtcblxuY29uc3QgZXh0cmFjdE1lbW9UYXNrVHlwZUZyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgL15cXHMqW1xcLVxcKl1cXHMoXFxbKC57MX0pXFxdKVxccyguKikkLy5leGVjKGxpbmUpPy5bMl07XG4vLyBUaGUgYmVsb3cgbGluZSBleGNsdWRlcyBlbnRyaWVzIHdpdGggYSAnOicgYWZ0ZXIgdGhlIHRpbWUgYXMgSSB3YXMgaGF2aW5nIGlzc3VlcyB3aXRoIG15IGNhbGVuZGFyXG4vLyBiZWluZyBwdWxsZWQgaW4uIE9uY2UgbWFkZSBjb25maWd1cmFibGUgd2lsbCBiZSBzaW1wbGVyIHRvIG1hbmFnZS5cbi8vIHJldHVybiAvXlxccypbXFwtXFwqXVxccyhcXFsoXFxzfHh8WHxcXFxcfFxcLXxcXD58RHxcXD98XFwvfFxcK3xSfFxcIXxpfEJ8UHxDKVxcXVxccyk/KFxcPHRpbWVcXD4pP1xcZHsxLDJ9XFw6XFxkezJ9W146XSguKikkLy50ZXN0KGxpbmUpO1xuIiwiaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7VEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0IHtnZXREYWlseU5vdGVQYXRofSBmcm9tICcuL29iVXBkYXRlTWVtbyc7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVPYnNpZGlhblF1ZXJ5ID0gYXN5bmMgKHF1ZXJ5SWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgcXVlcnlTdHJpbmc6IHN0cmluZyk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHttZXRhZGF0YUNhY2hlLCB2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG5cbiAgY29uc3QgcXVlcnlGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcblxuICBpZiAocXVlcnlGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKHF1ZXJ5RmlsZSk7XG4gICAgY29uc3QgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudHMpO1xuXG4gICAgbGV0IGxpbmVJRDtcblxuICAgIGlmICgvXlxcZHsxLDN9JC8udGVzdChxdWVyeUlkKSkge1xuICAgICAgbGluZUlEID0gcXVlcnlJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZUlEID0gZ2V0SURGcm9tTGluZShxdWVyeUlkKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQobGluZUlEKSAtIDE7XG5cbiAgICBpZiAoZmlsZUxpbmVzICYmIGZpbGVMaW5lcy5sZW5ndGggIT0gMCkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGZpbGVMaW5lc1tsaW5lTnVtXTtcblxuICAgICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xuICAgICAgY29uc3QgdXBkYXRlZERhdGVTdHJpbmcgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRlID0gZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICAgIGNvbnN0IG5ld0xpbmVOdW0gPSBsaW5lTnVtICsgMTtcbiAgICAgIGNvbnN0IGlkID0gdXBkYXRlZERhdGVTdHJpbmcgKyBuZXdMaW5lTnVtO1xuICAgICAgaWYgKC9eKC4rKXBpbm5lZEF0KC4rKSQvLnRlc3Qob2xkQ29udGVudCkpIHtcbiAgICAgICAgY29uc3QgcGlubmVkU3RyaW5nID0gZ2V0UGlubmVkU3RyaW5nRnJvbUxpbmUob2xkQ29udGVudCk7XG4gICAgICAgIGNvbnN0IHBpbm5lZERhdGVTdHJpbmcgPSBnZXRQaW5uZWREYXRlRnJvbUxpbmUob2xkQ29udGVudCk7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBpZCArICcgJyArIHRpdGxlICsgJyAnICsgcXVlcnlTdHJpbmcgKyAnICcgKyBwaW5uZWRTdHJpbmc7XG4gICAgICAgIGNvbnN0IHBpbm5lZEF0RGF0ZSA9IG1vbWVudChwaW5uZWREYXRlU3RyaW5nLCAnWVlZWU1NRERISG1tc3MnKS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICAgICAgY29uc3QgbmV3RmlsZUNvbnRlbnRzID0gZmlsZUNvbnRlbnRzLnJlcGxhY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCk7XG5cbiAgICAgICAgYXdhaXQgdmF1bHQubW9kaWZ5KHF1ZXJ5RmlsZSwgbmV3RmlsZUNvbnRlbnRzKTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogdXBkYXRlZERhdGUsXG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBwaW5uZWRBdDogcGlubmVkQXREYXRlLFxuICAgICAgICAgICAgcXVlcnlzdHJpbmc6IHF1ZXJ5U3RyaW5nLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgICAgIHVzZXJJZDogJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBpZCArICcgJyArIHRpdGxlICsgJyAnICsgcXVlcnlTdHJpbmc7XG5cbiAgICAgICAgY29uc3QgbmV3RmlsZUNvbnRlbnRzID0gZmlsZUNvbnRlbnRzLnJlcGxhY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCk7XG5cbiAgICAgICAgYXdhaXQgdmF1bHQubW9kaWZ5KHF1ZXJ5RmlsZSwgbmV3RmlsZUNvbnRlbnRzKTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogdXBkYXRlZERhdGUsXG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBwaW5uZWRBdDogJycsXG4gICAgICAgICAgICBxdWVyeXN0cmluZzogcXVlcnlTdHJpbmcsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWREYXRlLFxuICAgICAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZ2V0QWxsTGluZXNGcm9tRmlsZSA9IChjYWNoZTogc3RyaW5nKSA9PiBjYWNoZS5zcGxpdCgvXFxyP1xcbi8pO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldElERnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9PiAvXihcXGR7MTR9KShcXGR7MSx9KS8uZXhlYyhsaW5lKT8uWzJdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldFBpbm5lZFN0cmluZ0Zyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT4vXihcXGR7MTR9KShcXGR7MSx9KVxccyguKylcXHMoXFxbKC4rKVxcXSlcXHMocGlubmVkQXRcXDogKFxcZHsxNH0pXFxkKykvLmV4ZWMobGluZSk/Lls2XTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBnZXRQaW5uZWREYXRlRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9Pi9eKFxcZHsxNH0pKFxcZHsxLH0pXFxzKC4rKVxccyhcXFsoLispXFxdKVxccyhwaW5uZWRBdFxcOiAoXFxkezE0fSlcXGQrKS8uZXhlYyhsaW5lKT8uWzddO1xuIiwiaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHtjcmVhdGVEYWlseU5vdGUsIGdldEFsbERhaWx5Tm90ZXMsIGdldERhaWx5Tm90ZX0gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcclxuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XHJcbmltcG9ydCB7SW5zZXJ0QWZ0ZXJ9IGZyb20gJy4uL21lbW9zJztcclxuaW1wb3J0IHtkYWlseU5vdGVzU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5pbXBvcnQge0RlZmF1bHRNZW1vQ29tcG9zaXRpb259IGZyb20gJy4uL21lbW9zJztcclxuXHJcbmludGVyZmFjZSBNQ29udGVudCB7XHJcbiAgY29udGVudDogc3RyaW5nO1xyXG4gIHBvc051bT86IG51bWJlcjtcclxufVxyXG5cclxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzExNTE1MC9ob3ctdG8tZXNjYXBlLXJlZ3VsYXItZXhwcmVzc2lvbi1zcGVjaWFsLWNoYXJhY3RlcnMtdXNpbmctamF2YXNjcmlwdFxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHRleHQ6IGFueSkge1xyXG4gIHJldHVybiBhd2FpdCB0ZXh0LnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJyk7XHJcbn1cclxuXHJcbi8vY3JlZGl0IHRvIGNoaG91bWFubiwgb3JpZ2luYWwgY29kZSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vY2hob3VtYW5uL3F1aWNrYWRkL2Jsb2IvNzUzNmExMjA3MDFhNjI2ZWYwMTBkYjU2N2NlYTdjZjMwMThlNmM4Mi9zcmMvdXRpbGl0eS50cyNMMTMwXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lc0luU3RyaW5nKGlucHV0OiBzdHJpbmcpIHtcclxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcclxuICBsZXQgdGVtcFN0cmluZyA9IGlucHV0O1xyXG5cclxuICB3aGlsZSAodGVtcFN0cmluZy5jb250YWlucygnXFxuJykpIHtcclxuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IHRlbXBTdHJpbmcuaW5kZXhPZignXFxuJyk7XHJcbiAgICBsaW5lcy5wdXNoKHRlbXBTdHJpbmcuc2xpY2UoMCwgbGluZUVuZEluZGV4KSk7XHJcbiAgICB0ZW1wU3RyaW5nID0gdGVtcFN0cmluZy5zbGljZShsaW5lRW5kSW5kZXggKyAxKTtcclxuICB9XHJcblxyXG4gIGxpbmVzLnB1c2godGVtcFN0cmluZyk7XHJcblxyXG4gIHJldHVybiBsaW5lcztcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JJbnNlcnQoTWVtb0NvbnRlbnQ6IHN0cmluZywgaXNMaXN0OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XHJcbiAgLy8gY29uc3QgcGx1Z2luID0gd2luZG93LnBsdWdpbjtcclxuICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gIGNvbnN0IHJlbW92ZUVudGVyID0gTWVtb0NvbnRlbnQucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XHJcbiAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xyXG4gIGNvbnN0IHRpbWVIb3VyID0gZGF0ZS5mb3JtYXQoJ0hIJyk7XHJcbiAgY29uc3QgdGltZU1pbnV0ZSA9IGRhdGUuZm9ybWF0KCdtbScpO1xyXG4gIGxldCBuZXdFdmVudDtcclxuICBsZXQgbGluZU51bTtcclxuICBjb25zdCB0aW1lVGV4dCA9IFN0cmluZyh0aW1lSG91cikgKyBgOmAgKyBTdHJpbmcodGltZU1pbnV0ZSk7XHJcblxyXG4gIGlmIChpc0xpc3QgJiYgRGVmYXVsdE1lbW9Db21wb3NpdGlvbiA9PT0gJycpIHtcclxuICAgIG5ld0V2ZW50ID0gYC0gWyBdIGAgKyBTdHJpbmcodGltZUhvdXIpICsgYDpgICsgU3RyaW5nKHRpbWVNaW51dGUpICsgYCBgICsgcmVtb3ZlRW50ZXI7XHJcbiAgfSBlbHNlIGlmICghaXNMaXN0ICYmIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gPT09ICcnKSB7XHJcbiAgICBuZXdFdmVudCA9IGAtIGAgKyBTdHJpbmcodGltZUhvdXIpICsgYDpgICsgU3RyaW5nKHRpbWVNaW51dGUpICsgYCBgICsgcmVtb3ZlRW50ZXI7XHJcbiAgfVxyXG5cclxuICBpZiAoaXNMaXN0ICYmIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycpIHtcclxuICAgIG5ld0V2ZW50ID0gYC0gWyBdIGAgKyBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uLnJlcGxhY2UoL3tUSU1FfS9nLCB0aW1lVGV4dCkucmVwbGFjZSgve0NPTlRFTlR9L2csIHJlbW92ZUVudGVyKTtcclxuICB9IGVsc2UgaWYgKCFpc0xpc3QgJiYgRGVmYXVsdE1lbW9Db21wb3NpdGlvbiAhPSAnJykge1xyXG4gICAgbmV3RXZlbnQgPSBgLSBgICsgRGVmYXVsdE1lbW9Db21wb3NpdGlvbi5yZXBsYWNlKC97VElNRX0vZywgdGltZVRleHQpLnJlcGxhY2UoL3tDT05URU5UfS9nLCByZW1vdmVFbnRlcik7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkYWlseU5vdGVzID0gYXdhaXQgZ2V0QWxsRGFpbHlOb3RlcygpO1xyXG4gIGNvbnN0IGV4aXN0aW5nRmlsZSA9IGdldERhaWx5Tm90ZShkYXRlLCBkYWlseU5vdGVzKTtcclxuICBpZiAoIWV4aXN0aW5nRmlsZSkge1xyXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IGNyZWF0ZURhaWx5Tm90ZShkYXRlKTtcclxuICAgIGF3YWl0IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldE15QWxsRGFpbHlOb3RlcygpO1xyXG4gICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChmaWxlKTtcclxuICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gYXdhaXQgaW5zZXJ0QWZ0ZXJIYW5kbGVyKEluc2VydEFmdGVyLCBuZXdFdmVudCwgZmlsZUNvbnRlbnRzKTtcclxuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdGaWxlQ29udGVudC5jb250ZW50KTtcclxuICAgIGlmIChuZXdGaWxlQ29udGVudC5wb3NOdW0gPT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IGFsbExpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShuZXdGaWxlQ29udGVudC5jb250ZW50KTtcclxuICAgICAgbGluZU51bSA9IGFsbExpbmVzLmxlbmd0aCArIDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsaW5lTnVtID0gbmV3RmlsZUNvbnRlbnQucG9zTnVtICsgMTtcclxuICAgIH1cclxuICAgIGlmIChpc0xpc3QpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogZGF0ZS5mb3JtYXQoJ1lZWVlNTURESEhtbScpICsgJzAwJyArIGxpbmVOdW0sXHJcbiAgICAgICAgY29udGVudDogTWVtb0NvbnRlbnQsXHJcbiAgICAgICAgZGVsZXRlZEF0OiAnJyxcclxuICAgICAgICBjcmVhdGVkQXQ6IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXHJcbiAgICAgICAgdXBkYXRlZEF0OiBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxyXG4gICAgICAgIG1lbW9UeXBlOiAnVEFTSy1UT0RPJyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaWQ6IGRhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW0nKSArICcwMCcgKyBsaW5lTnVtLFxyXG4gICAgICAgIGNvbnRlbnQ6IE1lbW9Db250ZW50LFxyXG4gICAgICAgIGRlbGV0ZWRBdDogJycsXHJcbiAgICAgICAgY3JlYXRlZEF0OiBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxyXG4gICAgICAgIHVwZGF0ZWRBdDogZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKSxcclxuICAgICAgICBtZW1vVHlwZTogJ0pPVVJOQUwnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKGV4aXN0aW5nRmlsZSk7XHJcbiAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGF3YWl0IGluc2VydEFmdGVySGFuZGxlcihJbnNlcnRBZnRlciwgbmV3RXZlbnQsIGZpbGVDb250ZW50cyk7XHJcbiAgICBhd2FpdCB2YXVsdC5tb2RpZnkoZXhpc3RpbmdGaWxlLCBuZXdGaWxlQ29udGVudC5jb250ZW50KTtcclxuICAgIGlmIChuZXdGaWxlQ29udGVudC5wb3NOdW0gPT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IGFsbExpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShuZXdGaWxlQ29udGVudC5jb250ZW50KTtcclxuICAgICAgbGluZU51bSA9IGFsbExpbmVzLmxlbmd0aCArIDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsaW5lTnVtID0gbmV3RmlsZUNvbnRlbnQucG9zTnVtICsgMTtcclxuICAgIH1cclxuICAgIGlmIChpc0xpc3QpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogZGF0ZS5mb3JtYXQoJ1lZWVlNTURESEhtbScpICsgJzAwJyArIGxpbmVOdW0sXHJcbiAgICAgICAgY29udGVudDogTWVtb0NvbnRlbnQsXHJcbiAgICAgICAgZGVsZXRlZEF0OiAnJyxcclxuICAgICAgICBjcmVhdGVkQXQ6IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXHJcbiAgICAgICAgdXBkYXRlZEF0OiBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxyXG4gICAgICAgIG1lbW9UeXBlOiAnVE9ETy1CbGFuaycsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkOiBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tJykgKyAnMDAnICsgbGluZU51bSxcclxuICAgICAgICBjb250ZW50OiBNZW1vQ29udGVudCxcclxuICAgICAgICBkZWxldGVkQXQ6ICcnLFxyXG4gICAgICAgIGNyZWF0ZWRBdDogZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKSxcclxuICAgICAgICB1cGRhdGVkQXQ6IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXHJcbiAgICAgICAgbWVtb1R5cGU6ICdKT1VSTkFMJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vY3JlZGl0IHRvIGNoaG91bWFubiwgb3JpZ2luYWwgY29kZSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vY2hob3VtYW5uL3F1aWNrYWRkXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNlcnRBZnRlckhhbmRsZXIodGFyZ2V0U3RyaW5nOiBzdHJpbmcsIGZvcm1hdHRlZDogc3RyaW5nLCBmaWxlQ29udGVudDogc3RyaW5nKSB7XHJcbiAgLy8gY29uc3QgdGFyZ2V0U3RyaW5nOiBzdHJpbmcgPSBwbHVnaW4uc2V0dGluZ3MuSW5zZXJ0QWZ0ZXI7XHJcbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICBjb25zdCB0YXJnZXRSZWdleCA9IG5ldyBSZWdFeHAoYFxccyoke2F3YWl0IGVzY2FwZVJlZ0V4cCh0YXJnZXRTdHJpbmcpfVxccypgKTtcclxuICBjb25zdCBmaWxlQ29udGVudExpbmVzOiBzdHJpbmdbXSA9IGdldExpbmVzSW5TdHJpbmcoZmlsZUNvbnRlbnQpO1xyXG5cclxuICBjb25zdCB0YXJnZXRQb3NpdGlvbiA9IGZpbGVDb250ZW50TGluZXMuZmluZEluZGV4KChsaW5lKSA9PiB0YXJnZXRSZWdleC50ZXN0KGxpbmUpKTtcclxuICBjb25zdCB0YXJnZXROb3RGb3VuZCA9IHRhcmdldFBvc2l0aW9uID09PSAtMTtcclxuICBpZiAodGFyZ2V0Tm90Rm91bmQpIHtcclxuICAgIC8vIGlmICh0aGlzLmNob2ljZS5pbnNlcnRBZnRlcj8uY3JlYXRlSWZOb3RGb3VuZCkge1xyXG4gICAgLy8gICAgIHJldHVybiBhd2FpdCBjcmVhdGVJbnNlcnRBZnRlcklmTm90Rm91bmQoZm9ybWF0dGVkKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZygndW5hYmxlIHRvIGZpbmQgaW5zZXJ0IGFmdGVyIGxpbmUgaW4gZmlsZS4nKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5leHRIZWFkZXJQb3NpdGlvbkFmdGVyVGFyZ2V0UG9zaXRpb24gPSBmaWxlQ29udGVudExpbmVzXHJcbiAgICAuc2xpY2UodGFyZ2V0UG9zaXRpb24gKyAxKVxyXG4gICAgLmZpbmRJbmRleCgobGluZSkgPT4gL14jKyB8LS0tLy50ZXN0KGxpbmUpKTtcclxuICBjb25zdCBmb3VuZE5leHRIZWFkZXIgPSBuZXh0SGVhZGVyUG9zaXRpb25BZnRlclRhcmdldFBvc2l0aW9uICE9PSAtMTtcclxuXHJcbiAgaWYgKGZvdW5kTmV4dEhlYWRlcikge1xyXG4gICAgbGV0IGVuZE9mU2VjdGlvbkluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IG5leHRIZWFkZXJQb3NpdGlvbkFmdGVyVGFyZ2V0UG9zaXRpb24gKyB0YXJnZXRQb3NpdGlvbjsgaSA+IHRhcmdldFBvc2l0aW9uOyBpLS0pIHtcclxuICAgICAgY29uc3QgbGluZUlzTmV3bGluZTogYm9vbGVhbiA9IC9eW1xcc1xcbiBdKiQvLnRlc3QoZmlsZUNvbnRlbnRMaW5lc1tpXSk7XHJcbiAgICAgIGlmICghbGluZUlzTmV3bGluZSkge1xyXG4gICAgICAgIGVuZE9mU2VjdGlvbkluZGV4ID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghZW5kT2ZTZWN0aW9uSW5kZXgpIGVuZE9mU2VjdGlvbkluZGV4ID0gdGFyZ2V0UG9zaXRpb247XHJcblxyXG4gICAgcmV0dXJuIGF3YWl0IGluc2VydFRleHRBZnRlclBvc2l0aW9uSW5Cb2R5KGZvcm1hdHRlZCwgZmlsZUNvbnRlbnQsIGVuZE9mU2VjdGlvbkluZGV4LCBmb3VuZE5leHRIZWFkZXIpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gYXdhaXQgaW5zZXJ0VGV4dEFmdGVyUG9zaXRpb25JbkJvZHkoZm9ybWF0dGVkLCBmaWxlQ29udGVudCwgZmlsZUNvbnRlbnRMaW5lcy5sZW5ndGggLSAxLCBmb3VuZE5leHRIZWFkZXIpO1xyXG4gIH1cclxuICAvLyByZXR1cm4gaW5zZXJ0VGV4dEFmdGVyUG9zaXRpb25JbkJvZHkoZm9ybWF0dGVkLCBmaWxlQ29udGVudCwgdGFyZ2V0UG9zaXRpb24pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0VGV4dEFmdGVyUG9zaXRpb25JbkJvZHkoXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIGJvZHk6IHN0cmluZyxcclxuICBwb3M6IG51bWJlcixcclxuICBmb3VuZD86IGJvb2xlYW4sXHJcbik6IFByb21pc2U8TUNvbnRlbnQ+IHtcclxuICBpZiAocG9zID09PSAtMSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY29udGVudDogYCR7Ym9keX1cXG4ke3RleHR9YCxcclxuICAgICAgcG9zTnVtOiAtMSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBzcGxpdENvbnRlbnQgPSBib2R5LnNwbGl0KCdcXG4nKTtcclxuXHJcbiAgaWYgKGZvdW5kKSB7XHJcbiAgICBjb25zdCBwcmUgPSBzcGxpdENvbnRlbnQuc2xpY2UoMCwgcG9zICsgMSkuam9pbignXFxuJyk7XHJcbiAgICBjb25zdCBwb3N0ID0gc3BsaXRDb250ZW50LnNsaWNlKHBvcyArIDEpLmpvaW4oJ1xcbicpO1xyXG4gICAgLy8gcmV0dXJuIGAke3ByZX1cXG4ke3RleHR9XFxuJHtwb3N0fWA7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjb250ZW50OiBgJHtwcmV9XFxuJHt0ZXh0fVxcbiR7cG9zdH1gLFxyXG4gICAgICBwb3NOdW06IHBvcyxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHByZSA9IHNwbGl0Q29udGVudC5zbGljZSgwLCBwb3MgKyAxKS5qb2luKCdcXG4nKTtcclxuICAgIGNvbnN0IHBvc3QgPSBzcGxpdENvbnRlbnQuc2xpY2UocG9zICsgMSkuam9pbignXFxuJyk7XHJcbiAgICBpZiAoL1tcXHNcXFNdKj8vZy50ZXN0KHBvc3QpKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgY29udGVudDogYCR7cHJlfVxcbiR7dGV4dH1gLFxyXG4gICAgICAgIHBvc051bTogcG9zLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjb250ZW50OiBgJHtwcmV9JHt0ZXh0fVxcbiR7cG9zdH1gLFxyXG4gICAgICAgIHBvc051bTogcG9zLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgLy8gcmV0dXJuIGAke3ByZX0ke3RleHR9XFxuJHtwb3N0fWA7XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XHJcbiIsImltcG9ydCB7Z2V0RGFpbHlOb3RlUGF0aH0gZnJvbSAnLi9vYlVwZGF0ZU1lbW8nO1xuaW1wb3J0IHtURmlsZSwgbm9ybWFsaXplUGF0aCwgTm90aWNlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge2NyZWF0ZURhaWx5Tm90ZSwgZ2V0QWxsRGFpbHlOb3RlcywgZ2V0RGFpbHlOb3RlfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuaW1wb3J0IHtpbnNlcnRBZnRlckhhbmRsZXJ9IGZyb20gJy4vb2JDcmVhdGVNZW1vJztcbmltcG9ydCB7SW5zZXJ0QWZ0ZXJ9IGZyb20gJy4uL21lbW9zJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVEZWxldGVkTWVtbyhkZWxldGVkTWVtb2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XG4gIGNvbnN0IHt2YXVsdCwgbWV0YWRhdGFDYWNoZX0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGlmICgvXFxkezE0LH0vLnRlc3QoZGVsZXRlZE1lbW9pZCkpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGdldERhaWx5Tm90ZVBhdGgoKTtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCArICcvZGVsZXRlLm1kJztcbiAgICBjb25zdCBkZWxldGVGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChkZWxldGVGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgIGxldCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKGRlbGV0ZUZpbGUpO1xuICAgICAgbGV0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnRzKTtcbiAgICAgIGlmIChmaWxlTGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpbmVOdW0gPSBwYXJzZUludChkZWxldGVkTWVtb2lkLnNsaWNlKDE0KSk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBmaWxlTGluZXNbbGluZU51bSAtIDFdO1xuICAgICAgICBjb25zdCBuZXdEZWxldGVmaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZShsaW5lLCAnJyk7XG4gICAgICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShkZWxldGVGaWxlLCBuZXdEZWxldGVmaWxlQ29udGVudHMpO1xuICAgICAgICBpZiAoL14tICguKykkLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgY29uc3QgaWQgPSBleHRyYWN0SURmcm9tVGV4dChsaW5lKTtcbiAgICAgICAgICBjb25zdCBkYXRlID0gbW9tZW50KGlkLCAnWVlZWU1NRERISG1tc3MnKTtcbiAgICAgICAgICBjb25zdCB0aW1lSG91ciA9IGRhdGUuZm9ybWF0KCdISCcpO1xuICAgICAgICAgIGNvbnN0IHRpbWVNaW51dGUgPSBkYXRlLmZvcm1hdCgnbW0nKTtcblxuICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gYC0gYCArIFN0cmluZyh0aW1lSG91cikgKyBgOmAgKyBTdHJpbmcodGltZU1pbnV0ZSkgKyBgIGAgKyBleHRyYWN0Q29udGVudGZyb21UZXh0KGxpbmUpO1xuICAgICAgICAgIGNvbnN0IGRhaWx5Tm90ZXMgPSBhd2FpdCBnZXRBbGxEYWlseU5vdGVzKCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdGaWxlID0gZ2V0RGFpbHlOb3RlKGRhdGUsIGRhaWx5Tm90ZXMpO1xuICAgICAgICAgIGlmICghZXhpc3RpbmdGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgY3JlYXRlRGFpbHlOb3RlKGRhdGUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gYXdhaXQgaW5zZXJ0QWZ0ZXJIYW5kbGVyKEluc2VydEFmdGVyLCBuZXdFdmVudCwgZmlsZUNvbnRlbnRzKTtcbiAgICAgICAgICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdGaWxlQ29udGVudC5jb250ZW50KTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZWxldGVkQXQ6ICcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChleGlzdGluZ0ZpbGUpO1xuICAgICAgICAgICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSBhd2FpdCBpbnNlcnRBZnRlckhhbmRsZXIoSW5zZXJ0QWZ0ZXIsIG5ld0V2ZW50LCBmaWxlQ29udGVudHMpO1xuICAgICAgICAgICAgYXdhaXQgdmF1bHQubW9kaWZ5KGV4aXN0aW5nRmlsZSwgbmV3RmlsZUNvbnRlbnQuY29udGVudCk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVsZXRlZEF0OiAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbGVMaW5lcyA9IG51bGw7XG4gICAgICAgIGZpbGVDb250ZW50cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVGb3JldmVyKGRlbGV0ZWRNZW1vaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7dmF1bHQsIG1ldGFkYXRhQ2FjaGV9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBpZiAoL1xcZHsxNCx9Ly50ZXN0KGRlbGV0ZWRNZW1vaWQpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL2RlbGV0ZS5tZCc7XG4gICAgY29uc3QgZGVsZXRlRmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XG5cbiAgICBpZiAoZGVsZXRlRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICBsZXQgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChkZWxldGVGaWxlKTtcbiAgICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQoZGVsZXRlZE1lbW9pZC5zbGljZSgxNCkpO1xuICAgICAgICBjb25zdCBsaW5lID0gZmlsZUxpbmVzW2xpbmVOdW0gLSAxXTtcbiAgICAgICAgaWYgKC9eLSAoLispJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgIC8vIGNvbnN0IGlkID0gZXh0cmFjdElEZnJvbVRleHQoZmlsZUxpbmVzW2ldKTtcbiAgICAgICAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGZpbGVDb250ZW50cy5yZXBsYWNlKGxpbmUsICcnKTtcbiAgICAgICAgICBhd2FpdCB2YXVsdC5tb2RpZnkoZGVsZXRlRmlsZSwgbmV3RmlsZUNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmaWxlTGluZXMgPSBudWxsO1xuICAgICAgZmlsZUNvbnRlbnRzID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgLy8gcmV0dXJuIGRlbGV0ZWRNZW1vcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERlbGV0ZWRNZW1vcygpOiBQcm9taXNlPGFueVtdPiB7XG4gIGNvbnN0IHt2YXVsdCwgbWV0YWRhdGFDYWNoZX0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9kZWxldGUubWQnO1xuICBjb25zdCBkZWxldGVkTWVtb3M6IGFueVtdIHwgUHJvbWlzZUxpa2U8YW55W10+ID0gW107XG4gIGNvbnN0IGRlbGV0ZUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuICBpZiAoZGVsZXRlRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgbGV0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZGVsZXRlRmlsZSk7XG4gICAgbGV0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnRzKTtcbiAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGRlbGV0ZWRNZW1vcztcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tpXTtcbiAgICAgICAgaWYgKCEvLSAvLnRlc3QobGluZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBpZCA9IGV4dHJhY3RJRGZyb21UZXh0KGxpbmUpO1xuICAgICAgICAgIGNvbnN0IHRpbWVTdHJpbmcgPSBpZC5zbGljZSgwLCAxMyk7XG4gICAgICAgICAgLy8gY29uc3QgaWRTdHJpbmcgPSBwYXJzZUludChpZC5zbGljZSgxNCkpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWREYXRlID0gbW9tZW50KHRpbWVTdHJpbmcsICdZWVlZTU1EREhIbW1zcycpO1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZWREYXRlSUQgPSBleHRyYWN0RGVsZXRlRGF0ZWZyb21UZXh0KGZpbGVMaW5lc1tpXSk7XG4gICAgICAgICAgY29uc3QgZGVsZXRlZERhdGUgPSBtb21lbnQoZGVsZXRlZERhdGVJRC5zbGljZSgwLCAxMyksICdZWVlZTU1EREhIbW1zcycpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBleHRyYWN0Q29udGVudGZyb21UZXh0KGZpbGVMaW5lc1tpXSk7XG4gICAgICAgICAgZGVsZXRlZE1lbW9zLnB1c2goe1xuICAgICAgICAgICAgaWQ6IGRlbGV0ZWREYXRlSUQsXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgICAgICAgdXNlcl9pZDogMSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZERhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOlNTJyksXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IGNyZWF0ZWREYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpTUycpLFxuICAgICAgICAgICAgZGVsZXRlZEF0OiBkZWxldGVkRGF0ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZpbGVMaW5lcyA9IG51bGw7XG4gICAgZmlsZUNvbnRlbnRzID0gbnVsbDtcbiAgfVxuICByZXR1cm4gZGVsZXRlZE1lbW9zO1xufVxuXG5leHBvcnQgY29uc3Qgc2VuZE1lbW9Ub0RlbGV0ZSA9IGFzeW5jIChtZW1vQ29udGVudDogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICBjb25zdCBmaWxlUGF0aCA9IGdldERhaWx5Tm90ZVBhdGgoKTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL2RlbGV0ZS5tZCc7XG5cbiAgY29uc3QgZGVsZXRlRmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XG5cbiAgaWYgKGRlbGV0ZUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZGVsZXRlRmlsZSk7XG4gICAgY29uc3QgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudHMpO1xuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQoKTtcbiAgICBjb25zdCBkZWxldGVEYXRlID0gZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICBsZXQgbGluZU51bTtcbiAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMSAmJiBmaWxlTGluZXNbMF0gPT09ICcnKSB7XG4gICAgICBsaW5lTnVtID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZU51bSA9IGZpbGVMaW5lcy5sZW5ndGggKyAxO1xuICAgIH1cbiAgICBjb25zdCBkZWxldGVEYXRlSUQgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKSArIGxpbmVOdW07XG5cbiAgICBhd2FpdCBjcmVhdGVEZWxldGVNZW1vSW5GaWxlKGRlbGV0ZUZpbGUsIGZpbGVDb250ZW50cywgbWVtb0NvbnRlbnQsIGRlbGV0ZURhdGVJRCk7XG5cbiAgICByZXR1cm4gZGVsZXRlRGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWxldGVGaWxlUGF0aCA9IG5vcm1hbGl6ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgY3JlYXRlZGVsZXRlRmlsZShkZWxldGVGaWxlUGF0aCk7XG4gICAgLy8gY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChkZWxldGVGaWxlKTtcbiAgICAvLyBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xuICAgIGNvbnN0IGRlbGV0ZURhdGUgPSBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgIGNvbnN0IGxpbmVOdW0gPSAxO1xuICAgIGNvbnN0IGRlbGV0ZURhdGVJRCA9IGRhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpICsgbGluZU51bTtcblxuICAgIGF3YWl0IGNyZWF0ZURlbGV0ZU1lbW9JbkZpbGUoZmlsZSwgJycsIG1lbW9Db250ZW50LCBkZWxldGVEYXRlSUQpO1xuXG4gICAgcmV0dXJuIGRlbGV0ZURhdGU7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVEZWxldGVNZW1vSW5GaWxlID0gYXN5bmMgKFxuICBmaWxlOiBURmlsZSxcbiAgZmlsZUNvbnRlbnQ6IHN0cmluZyxcbiAgbWVtb0NvbnRlbnQ6IHN0cmluZyxcbiAgZGVsZXRlRGF0ZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgbGV0IG5ld0NvbnRlbnQ7XG4gIGlmIChmaWxlQ29udGVudCA9PT0gJycpIHtcbiAgICBuZXdDb250ZW50ID0gbWVtb0NvbnRlbnQgKyAnIGRlbGV0ZWRBdDogJyArIGRlbGV0ZURhdGU7XG4gIH0gZWxzZSB7XG4gICAgbmV3Q29udGVudCA9IGZpbGVDb250ZW50ICsgJ1xcbicgKyBtZW1vQ29udGVudCArICcgZGVsZXRlZEF0OiAnICsgZGVsZXRlRGF0ZTtcbiAgfVxuXG4gIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVkZWxldGVGaWxlID0gYXN5bmMgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8VEZpbGU+ID0+IHtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICB0cnkge1xuICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKHBhdGgsICcnKTtcbiAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7cGF0aH0nYCwgZXJyKTtcbiAgICBuZXcgTm90aWNlKCdVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLicpO1xuICB9XG59O1xuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuY29uc3QgZXh0cmFjdElEZnJvbVRleHQgPSAobGluZTogc3RyaW5nKSA9PiAvXi0gKFxcZHsxNH0pKFxcZCspXFxzKC4rKVxccyhkZWxldGVkQXQ6ICkoLispJC8uZXhlYyhsaW5lKT8uWzFdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGV4dHJhY3RDb250ZW50ZnJvbVRleHQgPSAobGluZTogc3RyaW5nKSA9PiAvXi0gKFxcZCspXFxzKC4rKVxccyhkZWxldGVkQXQ6ICkoLispJC8uZXhlYyhsaW5lKT8uWzJdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGV4dHJhY3REZWxldGVEYXRlZnJvbVRleHQgPSAobGluZTogc3RyaW5nKSA9PiAvXi0gKFxcZCspXFxzKC4rKVxccyhkZWxldGVkQXQ6ICkoLispJC8uZXhlYyhsaW5lKT8uWzRdO1xuLy8gY29uc3QgZXh0cmFjdE1lbW9UYXNrVHlwZUZyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT5cbi8vICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbi8vICAgL15cXHMqW1xcLVxcKl1cXHMoXFxbKC57MX0pXFxdKVxccyguKikkLy5leGVjKGxpbmUpPy5bMl07XG4iLCJpbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtnZXREYWlseU5vdGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XG5pbXBvcnQge0RlZmF1bHRNZW1vQ29tcG9zaXRpb259IGZyb20gJy4uL21lbW9zJztcbi8vIGltcG9ydCBhcHBTdG9yZSBmcm9tIFwiLi4vc3RvcmVzL2FwcFN0b3JlXCI7XG5pbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xuLy8gaW1wb3J0IHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0IHtzZW5kTWVtb1RvRGVsZXRlfSBmcm9tICcuL29iRGVsZXRlTWVtbyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvYkhpZGVNZW1vKG1lbW9pZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XG4gIGNvbnN0IHtkYWlseU5vdGVzfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG4gIGlmICgvXFxkezE0LH0vLnRlc3QobWVtb2lkKSkge1xuICAgIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gICAgY29uc3QgdGltZVN0cmluZyA9IG1lbW9pZC5zbGljZSgwLCAxMyk7XG4gICAgY29uc3QgaWRTdHJpbmcgPSBwYXJzZUludChtZW1vaWQuc2xpY2UoMTQpKTtcbiAgICBjb25zdCBjaGFuZ2VEYXRlID0gbW9tZW50KHRpbWVTdHJpbmcsICdZWVlZTU1EREhIbW1TUycpO1xuICAgIGNvbnN0IGRhaWx5Tm90ZSA9IGdldERhaWx5Tm90ZShjaGFuZ2VEYXRlLCBkYWlseU5vdGVzKTtcbiAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHZhdWx0LnJlYWQoZGFpbHlOb3RlKTtcbiAgICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50KTtcbiAgICBjb25zdCBjb250ZW50ID0gZXh0cmFjdENvbnRlbnRmcm9tVGV4dChmaWxlTGluZXNbaWRTdHJpbmddKTtcbiAgICBjb25zdCBvcmlnaW5hbExpbmUgPSAnLSAnICsgbWVtb2lkICsgJyAnICsgY29udGVudDtcbiAgICBjb25zdCBuZXdMaW5lID0gZmlsZUxpbmVzW2lkU3RyaW5nXTtcbiAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGZpbGVDb250ZW50LnJlcGxhY2UobmV3TGluZSwgJycpO1xuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShkYWlseU5vdGUsIG5ld0ZpbGVDb250ZW50KTtcbiAgICBjb25zdCBkZWxldGVEYXRlID0gYXdhaXQgc2VuZE1lbW9Ub0RlbGV0ZShvcmlnaW5hbExpbmUpO1xuICAgIHJldHVybiBkZWxldGVEYXRlO1xuICB9XG59XG5cbmNvbnN0IGdldEFsbExpbmVzRnJvbUZpbGUgPSAoY2FjaGU6IHN0cmluZykgPT4gY2FjaGUuc3BsaXQoL1xccj9cXG4vKTtcbmNvbnN0IGV4dHJhY3RDb250ZW50ZnJvbVRleHQgPSAobGluZTogc3RyaW5nKSA9PiB7XG4gIGxldCByZWdleE1hdGNoO1xuICBpZiAoXG4gICAgRGVmYXVsdE1lbW9Db21wb3NpdGlvbiAhPSAnJyAmJlxuICAgIC97VElNRX0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pICYmXG4gICAgL3tDT05URU5UfS9nLnRlc3QoRGVmYXVsdE1lbW9Db21wb3NpdGlvbilcbiAgKSB7XG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZWdleE1hdGNoID0gJ15cXFxccypbXFxcXC1cXFxcKl1cXFxccyhcXFxcWyguezF9KVxcXFxdXFxcXHM/KT8nICtcbiAgICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24ucmVwbGFjZSgve1RJTUV9L2csICcoXFxcXDx0aW1lXFxcXD4pPygoXFxcXGR7MSwyfSlcXFxcOihcXFxcZHsyfSkpPyhcXFxcPFxcXFwvdGltZVxcXFw+KT8nKS5yZXBsYWNlKFxuICAgICAgICAve0NPTlRFTlR9L2csXG4gICAgICAgICcoLiopJCcsXG4gICAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhNYXRjaCA9ICdeXFxcXHMqW1xcXFwtXFxcXCpdXFxcXHMoXFxcXFsoLnsxfSlcXFxcXVxcXFxzPyk/KFxcXFw8dGltZVxcXFw+KT8oKFxcXFxkezEsMn0pXFxcXDooXFxcXGR7Mn0pKT8oXFxcXDxcXFxcL3RpbWVcXFxcPik/XFxcXHM/KC4qKSQnO1xuICB9XG4gIGNvbnN0IHJlZ2V4TWF0Y2hSZSA9IG5ldyBSZWdFeHAocmVnZXhNYXRjaCwgJycpO1xuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICByZXR1cm4gcmVnZXhNYXRjaFJlLmV4ZWMobGluZSk/Lls4XTtcbiAgLy8gcmV0dXJuIC9eXFxzKltcXC1cXCpdXFxzKFxcWyguezF9KVxcXVxccz8pPyhcXDx0aW1lXFw+KT8oKFxcZHsxLDJ9KVxcOihcXGR7Mn0pKT8oXFw8XFwvdGltZVxcPik/XFxzPyguKikkLy5leGVjKGxpbmUpPy5bOF07XG59O1xuIiwiaW1wb3J0IHtnZXREYWlseU5vdGVQYXRofSBmcm9tICcuL29iVXBkYXRlTWVtbyc7XG5pbXBvcnQge1RGaWxlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVF1ZXJ5Rm9yZXZlcihxdWVyeUlEOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge3ZhdWx0LCBtZXRhZGF0YUNhY2hlfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgaWYgKC9cXGR7MTQsfS8udGVzdChxdWVyeUlEKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG4gICAgY29uc3QgcXVlcnlGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChxdWVyeUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgbGV0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQocXVlcnlGaWxlKTtcbiAgICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQocXVlcnlJRC5zbGljZSgxNCkpO1xuICAgICAgICBjb25zdCBsaW5lID0gZmlsZUxpbmVzW2xpbmVOdW0gLSAxXTtcbiAgICAgICAgaWYgKC9eXFxkezE0LH0oLispJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgIC8vIGNvbnN0IGlkID0gZXh0cmFjdElEZnJvbVRleHQoZmlsZUxpbmVzW2ldKTtcbiAgICAgICAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGZpbGVDb250ZW50cy5yZXBsYWNlKGxpbmUsICcnKTtcbiAgICAgICAgICBhd2FpdCB2YXVsdC5tb2RpZnkocXVlcnlGaWxlLCBuZXdGaWxlQ29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZpbGVMaW5lcyA9IG51bGw7XG4gICAgICBmaWxlQ29udGVudHMgPSBudWxsO1xuICAgIH1cbiAgfVxuICAvLyByZXR1cm4gZGVsZXRlZE1lbW9zO1xufVxuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4iLCJpbXBvcnQge2dldERhaWx5Tm90ZVBhdGh9IGZyb20gJy4vb2JVcGRhdGVNZW1vJztcbmltcG9ydCB7VEZpbGUsIE5vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5leHBvcnQgY29uc3QgcGluUXVlcnlJbkZpbGUgPSBhc3luYyAocXVlcnlJRDogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgaWYgKC9cXGR7MTQsfS8udGVzdChxdWVyeUlEKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG5cbiAgICBjb25zdCBxdWVyeUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuXG4gICAgaWYgKHF1ZXJ5RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKHF1ZXJ5RmlsZSk7XG4gICAgICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KCk7XG4gICAgICBjb25zdCBvcmlnaW5hbExpbmVOdW0gPSBwYXJzZUludChxdWVyeUlELnNsaWNlKDE0KSk7XG4gICAgICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBmaWxlTGluZXNbb3JpZ2luYWxMaW5lTnVtIC0gMV07XG4gICAgICBjb25zdCBwaW5uZWRBdERhdGUgPSBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgICAgbGV0IGxpbmVOdW07XG4gICAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMSAmJiBmaWxlTGluZXNbMF0gPT09ICcnKSB7XG4gICAgICAgIGxpbmVOdW0gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZU51bSA9IGZpbGVMaW5lcy5sZW5ndGggKyAxO1xuICAgICAgfVxuICAgICAgY29uc3QgcGlubmVkQXREYXRlSUQgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKSArIGxpbmVOdW07XG4gICAgICBjb25zdCBuZXdRdWVyeSA9IG9yaWdpbmFsQ29udGVudCArICcgcGlubmVkQXQ6ICcgKyBwaW5uZWRBdERhdGVJRDtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBmaWxlQ29udGVudHMucmVwbGFjZShvcmlnaW5hbENvbnRlbnQsIG5ld1F1ZXJ5KTtcbiAgICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShxdWVyeUZpbGUsIG5ld0NvbnRlbnQpO1xuICAgICAgLy8gYXdhaXQgY3JlYXRlRGVsZXRlTWVtb0luRmlsZShxdWVyeUZpbGUsIGZpbGVDb250ZW50cyAsIG9yaWdpbmFsQ29udGVudCAsIHBpbm5lZEF0RGF0ZUlEKTtcbiAgICAgIHJldHVybiBwaW5uZWRBdERhdGU7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdW5waW5RdWVyeUluRmlsZSA9IGFzeW5jIChxdWVyeUlEOiBzdHJpbmcpOiBQcm9taXNlPGFueT4gPT4ge1xuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCArICcvcXVlcnkubWQnO1xuXG4gIGNvbnN0IHF1ZXJ5RmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XG5cbiAgaWYgKHF1ZXJ5RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChxdWVyeUZpbGUpO1xuICAgIGNvbnN0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnRzKTtcbiAgICBjb25zdCBvcmlnaW5hbExpbmVOdW0gPSBwYXJzZUludChxdWVyeUlELnNsaWNlKDE0KSk7XG4gICAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZmlsZUxpbmVzW29yaWdpbmFsTGluZU51bSAtIDFdO1xuICAgIGNvbnN0IHBpbm5lZEF0U3RyaW5nID0gZXh0cmFjdFBpbm5lZEF0ZnJvbVRleHQob3JpZ2luYWxDb250ZW50KTtcbiAgICBjb25zdCBuZXdGaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZShwaW5uZWRBdFN0cmluZywgJycpO1xuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShxdWVyeUZpbGUsIG5ld0ZpbGVDb250ZW50cyk7XG4gIH1cbiAgcmV0dXJuO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURlbGV0ZU1lbW9JbkZpbGUgPSBhc3luYyAoXG4gIGZpbGU6IFRGaWxlLFxuICBmaWxlQ29udGVudDogc3RyaW5nLFxuICBtZW1vQ29udGVudDogc3RyaW5nLFxuICBwaW5uZWRBdERhdGVJRDogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgbGV0IG5ld0NvbnRlbnQ7XG4gIGlmIChmaWxlQ29udGVudCA9PT0gJycpIHtcbiAgICBuZXdDb250ZW50ID0gbWVtb0NvbnRlbnQgKyAnIHBpbm5lZEF0OiAnICsgcGlubmVkQXREYXRlSUQ7XG4gIH0gZWxzZSB7XG4gICAgbmV3Q29udGVudCA9IGZpbGVDb250ZW50ICsgJ1xcbicgKyBtZW1vQ29udGVudCArICcgcGlubmVkQXQ6ICcgKyBwaW5uZWRBdERhdGVJRDtcbiAgfVxuXG4gIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVxdWVyeUZpbGUgPSBhc3luYyAocGF0aDogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4gPT4ge1xuICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUocGF0aCwgJycpO1xuICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtwYXRofSdgLCBlcnIpO1xuICAgIG5ldyBOb3RpY2UoJ1VuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuJyk7XG4gIH1cbn07XG5cbmNvbnN0IGdldEFsbExpbmVzRnJvbUZpbGUgPSAoY2FjaGU6IHN0cmluZykgPT4gY2FjaGUuc3BsaXQoL1xccj9cXG4vKTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBleHRyYWN0UGlubmVkQXRmcm9tVGV4dCA9IChsaW5lOiBzdHJpbmcpID0+L14oXFxkezE0fSkoXFxkezEsfSlcXHMoLispXFxzKFxcWyguKylcXF0pKFxcc3Bpbm5lZEF0XFw6IChcXGR7MTQsfSkpJC8uZXhlYyhsaW5lKT8uWzZdO1xuIiwiLy8gaW1wb3J0IHV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7ZmluZFF1ZXJ5fSBmcm9tICcuLi9vYkNvbXBvbmVudHMvb2JHZXRRdWVyaWVzJztcbmltcG9ydCB7Y3JlYXRlT2JzaWRpYW5RdWVyeX0gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iQ3JlYXRlUXVlcnknO1xuaW1wb3J0IHtnZXRNZW1vc30gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iR2V0TWVtb3MnO1xuaW1wb3J0IHt1cGRhdGVPYnNpZGlhblF1ZXJ5fSBmcm9tICcuLi9vYkNvbXBvbmVudHMvb2JVcGRhdGVRdWVyeSc7XG5pbXBvcnQge29iSGlkZU1lbW99IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkhpZGVNZW1vJztcbmltcG9ydCB7ZGVsZXRlRm9yZXZlciwgZ2V0RGVsZXRlZE1lbW9zLCByZXN0b3JlRGVsZXRlZE1lbW99IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkRlbGV0ZU1lbW8nO1xuaW1wb3J0IHtkZWxldGVRdWVyeUZvcmV2ZXJ9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkRlbGV0ZVF1ZXJ5JztcbmltcG9ydCB7cGluUXVlcnlJbkZpbGUsIHVucGluUXVlcnlJbkZpbGV9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYlBpblF1ZXJ5JztcblxuLy8gdHlwZSBSZXNwb25zZVR5cGU8VCA9IHVua25vd24+ID0ge1xuLy8gICBzdWNjZWVkOiBib29sZWFuO1xuLy8gICBtZXNzYWdlOiBzdHJpbmc7XG4vLyAgIGRhdGE6IFQ7XG4vLyB9O1xuXG4vLyB0eXBlIFJlcXVlc3RDb25maWcgPSB7XG4vLyAgIG1ldGhvZDogc3RyaW5nO1xuLy8gICB1cmw6IHN0cmluZztcbi8vICAgZGF0YT86IGFueTtcbi8vICAgZGF0YVR5cGU/OiBcImpzb25cIiB8IFwiZmlsZVwiO1xuLy8gfTtcblxuLy8gYXN5bmMgZnVuY3Rpb24gcmVxdWVzdDxUPihjb25maWc6IFJlcXVlc3RDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlVHlwZTxUPj4ge1xuLy8gICBjb25zdCB7IG1ldGhvZCwgdXJsLCBkYXRhLCBkYXRhVHlwZSB9ID0gY29uZmlnO1xuLy8gICBjb25zdCByZXF1ZXN0Q29uZmlnOiBSZXF1ZXN0SW5pdCA9IHtcbi8vICAgICBtZXRob2QsXG4vLyAgIH07XG5cbi8vICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuLy8gICAgIGlmIChkYXRhVHlwZSA9PT0gXCJmaWxlXCIpIHtcbi8vICAgICAgIHJlcXVlc3RDb25maWcuYm9keSA9IGRhdGE7XG4vLyAgICAgfSBlbHNlIHtcbi8vICAgICAgIHJlcXVlc3RDb25maWcuaGVhZGVycyA9IHtcbi8vICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4vLyAgICAgICB9O1xuLy8gICAgICAgcmVxdWVzdENvbmZpZy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4vLyAgICAgfVxuLy8gICB9XG5cbi8vICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHJlcXVlc3RDb25maWcpO1xuLy8gICBjb25zdCByZXNwb25zZURhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSZXNwb25zZVR5cGU8VD47XG5cbi8vICAgaWYgKCFyZXNwb25zZURhdGEuc3VjY2VlZCkge1xuLy8gICAgIHRocm93IHJlc3BvbnNlRGF0YTtcbi8vICAgfVxuXG4vLyAgIHJldHVybiByZXNwb25zZURhdGE7XG4vLyB9XG5cbm5hbWVzcGFjZSBhcGkge1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0VXNlckluZm8oKSB7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Q8TW9kZWwuVXNlcj4oe1xuICAgIC8vICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIC8vICAgdXJsOiBcIi9hcGkvdXNlci9tZVwiLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNpZ25pbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIHJlcXVlc3Qoe1xuICAvLyAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgLy8gICAgIHVybDogXCIvYXBpL2F1dGgvc2lnbmluXCIsXG4gIC8vICAgICBkYXRhOiB7IHVzZXJuYW1lLCBwYXNzd29yZCB9LFxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNpZ251cCh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIHJlcXVlc3Qoe1xuICAvLyAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgLy8gICAgIHVybDogXCIvYXBpL2F1dGgvc2lnbnVwXCIsXG4gIC8vICAgICBkYXRhOiB7IHVzZXJuYW1lLCBwYXNzd29yZCB9LFxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNpZ25vdXQoKSB7XG4gIC8vICAgcmV0dXJuIHJlcXVlc3Qoe1xuICAvLyAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgLy8gICAgIHVybDogXCIvYXBpL2F1dGgvc2lnbm91dFwiLFxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVXNlcm5hbWVVc2FibGUodXNlcm5hbWU6IHN0cmluZykge1xuICAgIC8vIHJldHVybiByZXF1ZXN0PGJvb2xlYW4+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgLy8gICB1cmw6IFwiL2FwaS91c2VyL2NoZWNrdXNlcm5hbWVcIixcbiAgICAvLyAgIGRhdGE6IHsgdXNlcm5hbWUgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGVja1Bhc3N3b3JkVmFsaWQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgIC8vIHJldHVybiByZXF1ZXN0PGJvb2xlYW4+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgLy8gICB1cmw6IFwiL2FwaS91c2VyL3ZhbGlkcGFzc3dvcmRcIixcbiAgICAvLyAgIGRhdGE6IHsgcGFzc3dvcmQgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiB1cGRhdGVVc2VyaW5mbyh1c2VyaW5mbzogUGFydGlhbDx7dXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZzsgZ2l0aHViTmFtZTogc3RyaW5nfT4pIHtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAvLyAgIHVybDogXCIvYXBpL3VzZXIvbWVcIixcbiAgICAvLyAgIGRhdGE6IHVzZXJpbmZvLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE15TWVtb3MoKSB7XG4gICAgcmV0dXJuIGF3YWl0IGdldE1lbW9zKCk7XG5cbiAgICAvLyByZXR1cm4gcmVxdWVzdDxNb2RlbC5NZW1vW10+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAvLyAgIHVybDogXCIvYXBpL21lbW8vYWxsXCIsXG4gICAgLy8gfSk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZ2V0TXlEZWxldGVkTWVtb3MoKSB7XG4gICAgcmV0dXJuIGdldERlbGV0ZWRNZW1vcygpO1xuICAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLk1lbW9bXT4oe1xuICAgIC8vICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIC8vICAgdXJsOiBcIi9hcGkvbWVtby9hbGw/ZGVsZXRlZD10cnVlXCIsXG4gICAgLy8gfSk7XG4gIH1cblxuICAvLyBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVtbyhjb250ZW50OiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gY3JlYXRlTWVtb3MoY29udGVudCk7XG4gIC8vICAgLy8gcmV0dXJuIHJlcXVlc3Q8TW9kZWwuTWVtbz4oe1xuICAvLyAgIC8vICAgbWV0aG9kOiBcIlBVVFwiLFxuICAvLyAgIC8vICAgdXJsOiBcIi9hcGkvbWVtby9cIixcbiAgLy8gICAvLyAgIGRhdGE6IHsgY29udGVudCB9LFxuICAvLyAgIC8vIH0pO1xuICAvLyB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU1lbW8obWVtb0lkOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykge1xuICAvLyAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLk1lbW8+KHtcbiAgLy8gICAvLyAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAvLyAgIC8vICAgdXJsOiBgL2FwaS9tZW1vLyR7bWVtb0lkfWAsXG4gIC8vICAgLy8gICBkYXRhOiB7IGNvbnRlbnQgfSxcbiAgLy8gICAvLyB9KTtcbiAgLy8gfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBoaWRlTWVtbyhtZW1vSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBvYkhpZGVNZW1vKG1lbW9JZCk7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Qoe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL21lbW8vJHttZW1vSWR9YCxcbiAgICAvLyAgIGRhdGE6IHtcbiAgICAvLyAgICAgZGVsZXRlZEF0OiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhEYXRlLm5vdygpKSxcbiAgICAvLyAgIH0sXG4gICAgLy8gfSk7XG4gIH1cblxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBleHBvcnQgZnVuY3Rpb24gcmVzdG9yZU1lbW8obWVtb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVzdG9yZURlbGV0ZWRNZW1vKG1lbW9JZCk7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Qoe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL21lbW8vJHttZW1vSWR9YCxcbiAgICAvLyAgIGRhdGE6IHtcbiAgICAvLyAgICAgZGVsZXRlZEF0OiBcIlwiLFxuICAgIC8vICAgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWxldGVNZW1vKG1lbW9JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlbGV0ZUZvcmV2ZXIobWVtb0lkKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL21lbW8vJHttZW1vSWR9YCxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNeVF1ZXJpZXMoKSB7XG4gICAgcmV0dXJuIGZpbmRRdWVyeSgpO1xuICAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLlF1ZXJ5W10+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAvLyAgIHVybDogXCIvYXBpL3F1ZXJ5L2FsbFwiLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5KHRpdGxlOiBzdHJpbmcsIHF1ZXJ5c3RyaW5nOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlT2JzaWRpYW5RdWVyeSh0aXRsZSwgcXVlcnlzdHJpbmcpO1xuICAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLlF1ZXJ5Pih7XG4gICAgLy8gICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgLy8gICB1cmw6IFwiL2FwaS9xdWVyeS9cIixcbiAgICAvLyAgIGRhdGE6IHsgdGl0bGUsIHF1ZXJ5c3RyaW5nIH0sXG4gICAgLy8gfSk7XG4gIH1cblxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBleHBvcnQgZnVuY3Rpb24gdXBkYXRlUXVlcnkocXVlcnlJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBxdWVyeXN0cmluZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU9ic2lkaWFuUXVlcnkocXVlcnlJZCwgdGl0bGUsIHF1ZXJ5c3RyaW5nKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdDxNb2RlbC5RdWVyeT4oe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL3F1ZXJ5LyR7cXVlcnlJZH1gLFxuICAgIC8vICAgZGF0YTogeyB0aXRsZSwgcXVlcnlzdHJpbmcgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWxldGVRdWVyeUJ5SWQocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlbGV0ZVF1ZXJ5Rm9yZXZlcihxdWVyeUlkKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL3F1ZXJ5LyR7cXVlcnlJZH1gLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIHBpblF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwaW5RdWVyeUluRmlsZShxdWVyeUlkKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAvLyAgIHVybDogYC9hcGkvcXVlcnkvJHtxdWVyeUlkfWAsXG4gICAgLy8gICBkYXRhOiB7IHBpbm5lZEF0OiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhEYXRlLm5vdygpKSB9LFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIHVucGluUXVlcnkocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVucGluUXVlcnlJbkZpbGUocXVlcnlJZCk7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Qoe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL3F1ZXJ5LyR7cXVlcnlJZH1gLFxuICAgIC8vICAgZGF0YTogeyBwaW5uZWRBdDogXCJcIiB9LFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZEZpbGUoZm9ybURhdGE6IEZvcm1EYXRhKSB7XG4gIC8vICAgLy8gcmV0dXJuIHJlcXVlc3Q8TW9kZWwuUmVzb3VyY2U+KHtcbiAgLy8gICAvLyAgIG1ldGhvZDogXCJQVVRcIixcbiAgLy8gICAvLyAgIHVybDogXCIvYXBpL3Jlc291cmNlL1wiLFxuICAvLyAgIC8vICAgZGF0YTogZm9ybURhdGEsXG4gIC8vICAgLy8gICBkYXRhVHlwZTogXCJmaWxlXCIsXG4gIC8vICAgLy8gfSk7XG4gIC8vIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYXBpO1xuIiwiLy8g56e75Yqo56uv5qC35byP6YCC6YWN6aKd5aSW57G75ZCNXHJcbmV4cG9ydCBjb25zdCBTSE9XX1NJREVSQkFSX01PQklMRV9DTEFTU05BTUUgPSAnbW9iaWxlLXNob3ctc2lkZWJhcic7XHJcblxyXG4vLyDpu5jorqTliqjnlLvmjIHnu63ml7bplb9cclxuZXhwb3J0IGNvbnN0IEFOSU1BVElPTl9EVVJBVElPTiA9IDIwMDtcclxuXHJcbi8vIHRvYXN0IOWKqOeUu+aMgee7reaXtumVv1xyXG5leHBvcnQgY29uc3QgVE9BU1RfQU5JTUFUSU9OX0RVUkFUSU9OID0gNDAwO1xyXG5cclxuLy8g5LiA5aSp55qE5q+r56eS5pWwXHJcbmV4cG9ydCBjb25zdCBEQUlMWV9USU1FU1RBTVAgPSAzNjAwICogMjQgKiAxMDAwO1xyXG5cclxuLy8g5qCH562+IOato+WImVxyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgVEFHX1JFRyA9IC9cXHMjKFtcXHB7TGV0dGVyfVxccHtFbW9qaV9QcmVzZW50YXRpb259XFxwe051bWJlcn1cXC9fLV0rKS9ndTtcclxuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuZXhwb3J0IGNvbnN0IEZJUlNUX1RBR19SRUcgPSAvKDxwPnw8YnI+KSMoW1xccHtMZXR0ZXJ9XFxwe0Vtb2ppX1ByZXNlbnRhdGlvbn1cXHB7TnVtYmVyfVxcL18tXSspL2d1O1xyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgTk9QX0ZJUlNUX1RBR19SRUcgPSAvXiMoW1xccHtMZXR0ZXJ9XFxwe0Vtb2ppX1ByZXNlbnRhdGlvbn1cXHB7TnVtYmVyfVxcL18tXSspL2d1O1xyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgQUxMX1RBR19SRUcgPSAvKFtcXHB7TGV0dGVyfVxccHtFbW9qaV9QcmVzZW50YXRpb259XFxwe051bWJlcn1cXC9fLV0rKS91O1xyXG5cclxuLy8gVVJMIOato+WImVxyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgTElOS19SRUcgPSAvKFxcc3zvvJp8PnxeKSgoaHR0cHxmdHB8aHR0cHMpOlxcL1xcLyhbXFx3Xy1dKyg/Oig/OlxcLltcXHdfLV0rKSspKShbXFx3LixAP149JSY6XFwvfisjLV0qW1xcd0A/Xj0lJlxcL34rIy1dKSkvZztcclxuXHJcbi8vIGV4cG9ydCBjb25zdCBDSEVDS19MSU5LX1JFRyA9IC8oXFwoKFxccyopKShodHRwfGZ0cHxodHRwcyk6XFwvXFwvKFtcXHdfLV0rKD86KD86XFwuW1xcd18tXSspKykpKFtcXHcuLEA/Xj0lJjpcXC9+KyMtXSpbXFx3QD9ePSUmXFwvfisjLV0pL2c7XHJcbi8vIGV4cG9ydCBjb25zdCBMSU5LX1JFRyA9IC8oaHR0cHM/OlxcL1xcL1teXFxzPFxcXFwqPiddKykvZztcclxuXHJcbi8vIE1BUktET1dOIFVSTCDmraPliJlcclxuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuZXhwb3J0IGNvbnN0IE1EX0xJTktfUkVHID0gL1xcWyhbXFxzXFxTXSo/KVxcXVxcKChbXFxzXFxTXSo/KVxcKS9ndTtcclxuXHJcbi8vIOWbvueJhyDmraPliJlcclxuZXhwb3J0IGNvbnN0IElNQUdFX1VSTF9SRUcgPSAvKFteXFxzPFxcXFwqPiddK1xcLihqcGVnfGpwZ3xnaWZ8cG5nfHN2ZykpKFxcXVxcXSk/KFxcKSk/L2c7XHJcblxyXG4vLyBNYXJrZG93biDlhoXpg6jlm77niYfmraPliJlcclxuLy8gR3JvdXAgMSDkuLrlm77niYdcclxuLy8gR3JvdXAgMiDkuLrnvKnmlL7mr5TkvotcclxuZXhwb3J0IGNvbnN0IE1BUktET1dOX1VSTF9SRUcgPSAvKCFcXFsoW15cXF1dKikoXFx8KT8oLio/KVxcXVxcKCguKj8pKFwiKD86LipbXlwiXSlcIik/XFxzKlxcKSkvZztcclxuXHJcbi8vIOajgOa1i+aYr+WQpuS4uuWklumDqOWbvueJh1xyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgTUFSS0RPV05fV0VCX1VSTF9SRUcgPSAvKFxcc3zvvJp8XikoaHR0cFtzXT86XFwvXFwvKShbXlxcL1xcc10rXFwvKShcXFMqPykoanBlZ3xqcGd8Z2lmfHBuZ3xzdmd8Ym1wfHdlcGcpKD8hXFwpKS9nO1xyXG5cclxuLy8gV2lraSDlm77niYfmraPliJlcclxuLy8gR3JvdXAgMSDkuLrlm77niYdcclxuLy8gR3JvdXAgNSDkuLrnvKnmlL7mr5TkvotcclxuZXhwb3J0IGNvbnN0IFdJS0lfSU1BR0VfVVJMX1JFRyA9IC8hXFxbXFxbKCguKj8pXFwuKGpwZWd8anBnfGdpZnxwbmd8c3ZnfGJtcHx3ZXBnKSk/KFxcfCk/KC4qPylcXF1cXF0vZztcclxuXHJcbi8vIG1lbW8g5YWz6IGU5q2j5YiZXHJcbmV4cG9ydCBjb25zdCBNRU1PX0xJTktfUkVHID0gL1xcW0AoLis/KVxcXVxcKCguKz8pXFwpL2c7XHJcblxyXG4vLyBJbnRlcm5hbFxyXG4iLCJpbXBvcnQgYXBpIGZyb20gJy4uL2hlbHBlcnMvYXBpJztcclxuaW1wb3J0IHtGSVJTVF9UQUdfUkVHLCBOT1BfRklSU1RfVEFHX1JFRywgVEFHX1JFR30gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xyXG5pbXBvcnQge3dhaXRGb3JJbnNlcnR9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkNyZWF0ZU1lbW8nO1xyXG5pbXBvcnQge2NoYW5nZU1lbW99IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYlVwZGF0ZU1lbW8nO1xyXG4vLyBpbXBvcnQgdXNlclNlcnZpY2UgZnJvbSBcIi4vdXNlclNlcnZpY2VcIjtcclxuXHJcbmNsYXNzIE1lbW9TZXJ2aWNlIHtcclxuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGdldFN0YXRlKCkge1xyXG4gICAgcmV0dXJuIGFwcFN0b3JlLmdldFN0YXRlKCkubWVtb1N0YXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGZldGNoQWxsTWVtb3MoKSB7XHJcbiAgICAvLyBpZiAoIXVzZXJTZXJ2aWNlLmdldFN0YXRlKCkudXNlcikge1xyXG4gICAgLy8gICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcGkuZ2V0TXlNZW1vcygpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwaS5nZXRNeU1lbW9zKCk7XHJcbiAgICBjb25zdCBtZW1vcyA9IFtdIGFzIGFueVtdO1xyXG4gICAgZm9yIChjb25zdCBtIG9mIGRhdGEpIHtcclxuICAgICAgbWVtb3MucHVzaChtKTtcclxuICAgIH1cclxuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcclxuICAgICAgdHlwZTogJ1NFVF9NRU1PUycsXHJcbiAgICAgIHBheWxvYWQ6IHtcclxuICAgICAgICBtZW1vcyxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWVtb3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZmV0Y2hEZWxldGVkTWVtb3MoKSB7XHJcbiAgICAvLyBpZiAoIXVzZXJTZXJ2aWNlLmdldFN0YXRlKCkudXNlcikge1xyXG4gICAgLy8gICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwaS5nZXRNeURlbGV0ZWRNZW1vcygpO1xyXG4gICAgZGF0YS5zb3J0KFxyXG4gICAgICAoYToge2RlbGV0ZWRBdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZX0sIGI6IHtkZWxldGVkQXQ6IHN0cmluZyB8IG51bWJlciB8IERhdGV9KSA9PlxyXG4gICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmRlbGV0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5kZWxldGVkQXQpLFxyXG4gICAgKTtcclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHB1c2hNZW1vKG1lbW86IE1vZGVsLk1lbW8pIHtcclxuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcclxuICAgICAgdHlwZTogJ0lOU0VSVF9NRU1PJyxcclxuICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgIG1lbW86IHtcclxuICAgICAgICAgIC4uLm1lbW8sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE1lbW9CeUlkKGlkOiBzdHJpbmcpIHtcclxuICAgIGZvciAoY29uc3QgbSBvZiB0aGlzLmdldFN0YXRlKCkubWVtb3MpIHtcclxuICAgICAgaWYgKG0uaWQgPT09IGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIG07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBoaWRlTWVtb0J5SWQoaWQ6IHN0cmluZykge1xyXG4gICAgYXdhaXQgYXBpLmhpZGVNZW1vKGlkKTtcclxuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcclxuICAgICAgdHlwZTogJ0RFTEVURV9NRU1PX0JZX0lEJyxcclxuICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgIGlkOiBpZCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHJlc3RvcmVNZW1vQnlJZChpZDogc3RyaW5nKSB7XHJcbiAgICBhd2FpdCBhcGkucmVzdG9yZU1lbW8oaWQpO1xyXG4gICAgLy8gbWVtb1NlcnZpY2UuY2xlYXJNZW1vcygpO1xyXG4gICAgLy8gbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZU1lbW9CeUlkKGlkOiBzdHJpbmcpIHtcclxuICAgIGF3YWl0IGFwaS5kZWxldGVNZW1vKGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0TWVtbyhtZW1vOiBNb2RlbC5NZW1vKSB7XHJcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XHJcbiAgICAgIHR5cGU6ICdFRElUX01FTU8nLFxyXG4gICAgICBwYXlsb2FkOiBtZW1vLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlVGFnc1N0YXRlKCkge1xyXG4gICAgY29uc3Qge21lbW9zfSA9IHRoaXMuZ2V0U3RhdGUoKTtcclxuICAgIGNvbnN0IHRhZ3NTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGZvciAoY29uc3QgbSBvZiBtZW1vcykge1xyXG4gICAgICBmb3IgKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShtLmNvbnRlbnQubWF0Y2goVEFHX1JFRykgPz8gW10pKSB7XHJcbiAgICAgICAgdGFnc1NldC5hZGQodC5yZXBsYWNlKFRBR19SRUcsICckMScpLnRyaW0oKSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCB0IG9mIEFycmF5LmZyb20obS5jb250ZW50Lm1hdGNoKE5PUF9GSVJTVF9UQUdfUkVHKSA/PyBbXSkpIHtcclxuICAgICAgICB0YWdzU2V0LmFkZCh0LnJlcGxhY2UoTk9QX0ZJUlNUX1RBR19SRUcsICckMScpLnRyaW0oKSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCB0IG9mIEFycmF5LmZyb20obS5jb250ZW50Lm1hdGNoKEZJUlNUX1RBR19SRUcpID8/IFtdKSkge1xyXG4gICAgICAgIHRhZ3NTZXQuYWRkKHQucmVwbGFjZShGSVJTVF9UQUdfUkVHLCAnJDInKS50cmltKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xyXG4gICAgICB0eXBlOiAnU0VUX1RBR1MnLFxyXG4gICAgICBwYXlsb2FkOiB7XHJcbiAgICAgICAgdGFnczogQXJyYXkuZnJvbSh0YWdzU2V0KSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyTWVtb3MoKSB7XHJcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XHJcbiAgICAgIHR5cGU6ICdTRVRfTUVNT1MnLFxyXG4gICAgICBwYXlsb2FkOiB7XHJcbiAgICAgICAgbWVtb3M6IFtdLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0TGlua2VkTWVtb3MobWVtb0lkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsLk1lbW9bXT4ge1xyXG4gICAgY29uc3Qge21lbW9zfSA9IHRoaXMuZ2V0U3RhdGUoKTtcclxuICAgIHJldHVybiBtZW1vcy5maWx0ZXIoKG0pID0+IG0uY29udGVudC5pbmNsdWRlcyhtZW1vSWQpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVNZW1vKHRleHQ6IHN0cmluZywgaXNMaXN0OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XHJcbiAgICBjb25zdCBtZW1vID0gYXdhaXQgd2FpdEZvckluc2VydCh0ZXh0LCBpc0xpc3QpO1xyXG4gICAgcmV0dXJuIG1lbW87XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlTWVtbyhtZW1vSWQ6IHN0cmluZywgb3JpZ2luYWxUZXh0OiBzdHJpbmcsIHRleHQ6IHN0cmluZywgdHlwZTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XHJcbiAgICBjb25zdCBtZW1vID0gYXdhaXQgY2hhbmdlTWVtbyhtZW1vSWQsIG9yaWdpbmFsVGV4dCwgdGV4dCwgdHlwZSk7XHJcbiAgICByZXR1cm4gbWVtbztcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG1lbW9TZXJ2aWNlID0gbmV3IE1lbW9TZXJ2aWNlKCk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBtZW1vU2VydmljZTtcclxuIiwiLy8gaW1wb3J0IHVzZXJTZXJ2aWNlIGZyb20gXCIuL3VzZXJTZXJ2aWNlXCI7XG5pbXBvcnQgYXBpIGZyb20gJy4uL2hlbHBlcnMvYXBpJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5jbGFzcyBRdWVyeVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIGFwcFN0b3JlLmdldFN0YXRlKCkucXVlcnlTdGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRNeUFsbFF1ZXJpZXMoKSB7XG4gICAgLy8gaWYgKCF1c2VyU2VydmljZS5nZXRTdGF0ZSgpLnVzZXIpIHtcbiAgICAvLyAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB9XG5cbiAgICAvLyBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwaS5nZXRNeVF1ZXJpZXMoKTtcbiAgICAvLyBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgLy8gICB0eXBlOiBcIlNFVF9RVUVSSUVTXCIsXG4gICAgLy8gICBwYXlsb2FkOiB7XG4gICAgLy8gICAgIHF1ZXJpZXM6IGRhdGEsXG4gICAgLy8gICB9LFxuICAgIC8vIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGkuZ2V0TXlRdWVyaWVzKCk7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9RVUVSSUVTJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgcXVlcmllczogZGF0YSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0UXVlcnlCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IHEgb2YgdGhpcy5nZXRTdGF0ZSgpLnF1ZXJpZXMpIHtcbiAgICAgIGlmIChxLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gcTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHVzaFF1ZXJ5KHF1ZXJ5OiBNb2RlbC5RdWVyeSkge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdJTlNFUlRfUVVFUlknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBxdWVyeToge1xuICAgICAgICAgIC4uLnF1ZXJ5LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0UXVlcnkocXVlcnk6IE1vZGVsLlF1ZXJ5KSB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1VQREFURV9RVUVSWScsXG4gICAgICBwYXlsb2FkOiBxdWVyeSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGVRdWVyeShxdWVyeUlkOiBzdHJpbmcpIHtcbiAgICBhd2FpdCBhcGkuZGVsZXRlUXVlcnlCeUlkKHF1ZXJ5SWQpO1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdERUxFVEVfUVVFUllfQllfSUQnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBpZDogcXVlcnlJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlUXVlcnkodGl0bGU6IHN0cmluZywgcXVlcnlzdHJpbmc6IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGkuY3JlYXRlUXVlcnkodGl0bGUsIHF1ZXJ5c3RyaW5nKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVRdWVyeShxdWVyeUlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHF1ZXJ5c3RyaW5nOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpLnVwZGF0ZVF1ZXJ5KHF1ZXJ5SWQsIHRpdGxlLCBxdWVyeXN0cmluZyk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGluUXVlcnkocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgYXBpLnBpblF1ZXJ5KHF1ZXJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVucGluUXVlcnkocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgYXBpLnVucGluUXVlcnkocXVlcnlJZCk7XG4gIH1cbn1cblxuY29uc3QgcXVlcnlTZXJ2aWNlID0gbmV3IFF1ZXJ5U2VydmljZSgpO1xuXG5leHBvcnQgZGVmYXVsdCBxdWVyeVNlcnZpY2U7XG4iLCIvLyBpbXBvcnQgYXBpIGZyb20gXCIuLi9oZWxwZXJzL2FwaVwiO1xyXG5cclxuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQge2NyZWF0ZURhaWx5Tm90ZSwgZ2V0QWxsRGFpbHlOb3RlcywgZ2V0RGFpbHlOb3RlfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuLy8gaW1wb3J0IGRhaWx5Tm90ZXNTZXJ2aWNlIGZyb20gJy4vZGFpbHlOb3Rlc1NlcnZpY2UnO1xyXG5cclxuLy8gaW50ZXJmYWNlIEZpbGVEYXRhIHtcclxuLy8gICBidWZmZXI6IEFycmF5QnVmZmVyO1xyXG4vLyAgIG1pbWVUeXBlOiBzdHJpbmc7XHJcbi8vICAgb3JpZ2luYWxOYW1lOiBzdHJpbmc7XHJcbi8vIH1cclxuXHJcbmNsYXNzIFJlc291cmNlU2VydmljZSB7XHJcbiAgLyoqXHJcbiAgICogVXBsb2FkIHJlc291cmNlIGZpbGUgdG8gc2VydmVyLFxyXG4gICAqIEBwYXJhbSBmaWxlIGZpbGVcclxuICAgKiBAcmV0dXJucyByZXNvdXJjZTogaWQsIGZpbGVuYW1lXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIHVwbG9hZChmaWxlOiBGaWxlKSB7XHJcbiAgICAvLyBjb25zdCB7IG5hbWU6IGZpbGVuYW1lLCBzaXplIH0gPSBmaWxlO1xyXG5cclxuICAgIGNvbnN0IHt2YXVsdCwgZmlsZU1hbmFnZXJ9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG5cclxuICAgIGNvbnN0IGZpbGVBcnJheSA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtcclxuICAgIGNvbnN0IGV4dCA9IGdldEV4dChmaWxlLnR5cGUpO1xyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKG5ld09uZSk7XHJcblxyXG4gICAgLy8gY29uc3QgZmlsZU5hbWUgPSBcIlBhc3RlIEltYWdlIFwiICsgbW9tZW50KCkuZm9ybWF0KFwiWVlZWU1NRERISG1tc3NcIik7XHJcbiAgICBjb25zdCBkYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcygpO1xyXG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xyXG4gICAgY29uc3QgZXhpc3RpbmdGaWxlID0gZ2V0RGFpbHlOb3RlKGRhdGUsIGRhaWx5Tm90ZXMpO1xyXG4gICAgbGV0IG5ld0ZpbGU7XHJcbiAgICBpZiAoIWV4aXN0aW5nRmlsZSkge1xyXG4gICAgICBjb25zdCBkYWlseUZpbGUgPSBhd2FpdCBjcmVhdGVEYWlseU5vdGUoZGF0ZSk7XHJcbiAgICAgIG5ld0ZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGVCaW5hcnkoXHJcbiAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgICAgIGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhgUGFzdGVkIEltYWdlICR7bW9tZW50KCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpfWAsIGV4dCwgZGFpbHlGaWxlKSxcclxuICAgICAgICBmaWxlQXJyYXksXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2UgaWYgKGV4aXN0aW5nRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcbiAgICAgIG5ld0ZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGVCaW5hcnkoXHJcbiAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgICAgIGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhcclxuICAgICAgICAgIGBQYXN0ZWQgSW1hZ2UgJHttb21lbnQoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyl9YCxcclxuICAgICAgICAgIGV4dCxcclxuICAgICAgICAgIGV4aXN0aW5nRmlsZSxcclxuICAgICAgICApLFxyXG4gICAgICAgIGZpbGVBcnJheSxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0ZpbGVQYXRoID0gZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsobmV3RmlsZSwgbmV3RmlsZS5wYXRoLCAnJywgJycpO1xyXG5cclxuICAgIHJldHVybiBuZXdGaWxlUGF0aDtcclxuXHJcbiAgICAvLyBjb25zdCBmaWxlUGF0aCA9IGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhmaWxlTmFtZSwgXCJwbmdcIiwgXCJcIik7XHJcblxyXG4gICAgLy8gY29uc3QgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAvLyByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZS5hcnJheUJ1ZmZlcik7XHJcbiAgICAvLyByZWFkZXIub25sb2FkID0gKCkgPT57XHJcbiAgICAvLyAgIC8vIGNvbnNvbGUubG9nKCdSRVNVTFQnLCByZWFkZXIucmVzdWx0KVxyXG4gICAgLy8gICBmaWxlQXJyYXJ5ID0gcmVhZGVyLnJlc3VsdDtcclxuICAgIC8vICAgY29uc29sZS5sb2coZmlsZUFycmFyeSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaWYgKHNpemUgPiA1IDw8IDIwKSB7XHJcbiAgICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIui2hei/h+acgOWkp+aWh+S7tuWkp+WwjyA1TWJcIik7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuXHJcbiAgICAvLyBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGZpbGUsIGZpbGVuYW1lKTtcclxuXHJcbiAgICAvLyBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwaS51cGxvYWRGaWxlKGZvcm1EYXRhKTtcclxuICB9XHJcbn1cclxuXHJcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbmNvbnN0IGdldEV4dCA9IChsaW5lOiBzdHJpbmcpID0+IC9eaW1hZ2VcXC8oLispJC8uZXhlYyhsaW5lKT8uWzFdO1xyXG5cclxuY29uc3QgcmVzb3VyY2VTZXJ2aWNlID0gbmV3IFJlc291cmNlU2VydmljZSgpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgcmVzb3VyY2VTZXJ2aWNlO1xyXG4iLCJjb25zdCBnZXRJbml0aWFsQWN0aW9uID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiaW5pdGlhbFRleHRcIixcbiAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IDAsXG4gICAgICAgIHNlbGVjdGlvbkVuZDogMCxcbiAgICB9O1xufTtcbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gICAgaW5pdGlhbFZhbHVlOiBcIlwiLFxuICAgIGludGVydmFsOiAzMDAsXG59O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlueVVuZG8ge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZyA9IGRlZmF1bHRDb25maWcpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgdGhpcy5ydW5VbmRvID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKGN1cnNvclBvc2l0aW9uLCBjdXJzb3JQb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucnVuUmVkbyA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMuYWN0aW9ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gdGhpcy5hY3Rpb25zW3RoaXMuY3VycmVudEluZGV4XS5zZWxlY3Rpb25FbmQ7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKGN1cnNvclBvc2l0aW9uLCBjdXJzb3JQb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0QWN0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnM7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0U3RhdGUgPSAoYWN0aW9ucywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IFsuLi5hY3Rpb25zXTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaW5kZXggPCB0aGlzLmFjdGlvbnMubGVuZ3RoID8gaW5kZXggOiB0aGlzLmFjdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hDaGFuZ2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZXNldFN0YXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gW2dldEluaXRpYWxBY3Rpb24oKV07XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IDA7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucm1FdmVudExpc3RlbmVycygpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN1YnNjcmliZSA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRWxlbWVudEtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleWJvYXJkRXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgIGlmIChrZXlib2FyZEV2ZW50LmtleSA9PT0gXCJ6XCIgJiYgIWtleWJvYXJkRXZlbnQuc2hpZnRLZXkgJiYgKGtleWJvYXJkRXZlbnQubWV0YUtleSB8fCBrZXlib2FyZEV2ZW50LmN0cmxLZXkpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blVuZG8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChrZXlib2FyZEV2ZW50LmtleSA9PT0gXCJ6XCIgJiYga2V5Ym9hcmRFdmVudC5zaGlmdEtleSAmJiAoa2V5Ym9hcmRFdmVudC5tZXRhS2V5IHx8IGtleWJvYXJkRXZlbnQuY3RybEtleSkpIHx8XG4gICAgICAgICAgICAgICAgKGtleWJvYXJkRXZlbnQua2V5ID09PSBcInlcIiAmJiAoa2V5Ym9hcmRFdmVudC5tZXRhS2V5IHx8IGtleWJvYXJkRXZlbnQuY3RybEtleSkpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blJlZG8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVFbGVtZW50SW5wdXQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RBY3Rpb24gPSB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5wdXNoTmV3QWN0aW9uKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBpbnB1dEV2ZW50LmlucHV0VHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5lbGVtZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydDogdGhpcy5lbGVtZW50LnNlbGVjdGlvbkVuZCAtICh0aGlzLmVsZW1lbnQudmFsdWUubGVuZ3RoIC0gbGFzdEFjdGlvbi52YWx1ZS5sZW5ndGgpLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZDogdGhpcy5lbGVtZW50LnNlbGVjdGlvbkVuZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuaGFuZGxlRWxlbWVudEtleWRvd24pO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0aGlzLmhhbmRsZUVsZW1lbnRJbnB1dCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucm1FdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmhhbmRsZUVsZW1lbnRLZXlkb3duKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdGhpcy5oYW5kbGVFbGVtZW50SW5wdXQpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnB1c2hOZXdBY3Rpb24gPSAoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXN0QWN0aW9uID0gdGhpcy5hY3Rpb25zW3RoaXMuY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIGlmIChsYXN0QWN0aW9uICYmIGxhc3RBY3Rpb24udHlwZSA9PT0gYWN0aW9uLnR5cGUgJiYgYWN0aW9uLnRpbWVzdGFtcCAtIGxhc3RBY3Rpb24udGltZXN0YW1wIDwgdGhpcy5jb25maWcuaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBsYXN0QWN0aW9uKSwgeyB2YWx1ZTogYWN0aW9uLnZhbHVlLCBzZWxlY3Rpb25FbmQ6IGFjdGlvbi5zZWxlY3Rpb25FbmQsIHRpbWVzdGFtcDogYWN0aW9uLnRpbWVzdGFtcCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5tYXhTaXplICYmIHRoaXMuY3VycmVudEluZGV4ID49IHRoaXMuY29uZmlnLm1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uc1swXSA9IGdldEluaXRpYWxBY3Rpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uc1t0aGlzLmN1cnJlbnRJbmRleF0gPSBhY3Rpb247XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gdGhpcy5hY3Rpb25zLnNsaWNlKDAsIHRoaXMuY3VycmVudEluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNiIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgY2IoWy4uLnRoaXMuYWN0aW9uc10sIHRoaXMuY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRDb25maWcpLCBjb25maWcpO1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaW5pdGlhbEFjdGlvbnMgJiYgdGhpcy5jb25maWcuaW5pdGlhbEFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gdGhpcy5jb25maWcuaW5pdGlhbEFjdGlvbnM7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcuaW5pdGlhbEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jb25maWcuaW5pdGlhbEluZGV4IDwgdGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5jb25maWcuaW5pdGlhbEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLmFjdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IFtnZXRJbml0aWFsQWN0aW9uKCldO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluaXRpYWxWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnNlcnRUZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNvbmZpZy5pbml0aWFsVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZDogdGhpcy5jb25maWcuaW5pdGlhbFZhbHVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudC52YWx1ZSA9IHRoaXMuYWN0aW9uc1t0aGlzLmN1cnJlbnRJbmRleF0udmFsdWU7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiB1c2VSZWZyZXNoKCkge1xuICBjb25zdCBbLCBzZXRCb29sZWFuXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdCByZWZyZXNoID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEJvb2xlYW4oKHBzKSA9PiB7XG4gICAgICByZXR1cm4gIXBzO1xuICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIHJlZnJlc2g7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVJlZnJlc2g7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3JlcXVpcmUoXCJvYmplY3QtYXNzaWduXCIpO3ZhciBmPXJlcXVpcmUoXCJyZWFjdFwiKSxnPTYwMTAzO2V4cG9ydHMuRnJhZ21lbnQ9NjAxMDc7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvcil7dmFyIGg9U3ltYm9sLmZvcjtnPWgoXCJyZWFjdC5lbGVtZW50XCIpO2V4cG9ydHMuRnJhZ21lbnQ9aChcInJlYWN0LmZyYWdtZW50XCIpfXZhciBtPWYuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RDdXJyZW50T3duZXIsbj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHA9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIHEoYyxhLGspe3ZhciBiLGQ9e30sZT1udWxsLGw9bnVsbDt2b2lkIDAhPT1rJiYoZT1cIlwiK2spO3ZvaWQgMCE9PWEua2V5JiYoZT1cIlwiK2Eua2V5KTt2b2lkIDAhPT1hLnJlZiYmKGw9YS5yZWYpO2ZvcihiIGluIGEpbi5jYWxsKGEsYikmJiFwLmhhc093blByb3BlcnR5KGIpJiYoZFtiXT1hW2JdKTtpZihjJiZjLmRlZmF1bHRQcm9wcylmb3IoYiBpbiBhPWMuZGVmYXVsdFByb3BzLGEpdm9pZCAwPT09ZFtiXSYmKGRbYl09YVtiXSk7cmV0dXJueyQkdHlwZW9mOmcsdHlwZTpjLGtleTplLHJlZjpsLHByb3BzOmQsX293bmVyOm0uY3VycmVudH19ZXhwb3J0cy5qc3g9cTtleHBvcnRzLmpzeHM9cTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0ICogYXMganN4UnVudGltZSBmcm9tIFwiRTpcXFxcb2JkZXZcXFxcLm9ic2lkaWFuXFxcXHBsdWdpbnNcXFxcb2JzaWRpYW4tbWVtb3NcXFxcbm9kZV9tb2R1bGVzXFxcXHJlYWN0XFxcXGpzeC1ydW50aW1lLmpzXCJcbmV4cG9ydCBjb25zdCBqc3ggPSBqc3hSdW50aW1lLmpzeFxuZXhwb3J0IGNvbnN0IGpzeHMgPSBqc3hSdW50aW1lLmpzeHNcbmV4cG9ydCBjb25zdCBGcmFnbWVudCA9IGpzeFJ1bnRpbWUuRnJhZ21lbnQiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcblxuaW50ZXJmYWNlIE9ubHlXaGVuUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICB3aGVuOiBib29sZWFuO1xufVxuXG5jb25zdCBPbmx5V2hlbjogUmVhY3QuRkM8T25seVdoZW5Qcm9wcz4gPSAocHJvcHM6IE9ubHlXaGVuUHJvcHMpID0+IHtcbiAgY29uc3Qge2NoaWxkcmVuLCB3aGVufSA9IHByb3BzO1xuICByZXR1cm4gd2hlbiA/IDw+e2NoaWxkcmVufTwvPiA6IG51bGw7XG59O1xuXG5jb25zdCBPbmx5ID0gT25seVdoZW47XG5cbmV4cG9ydCBkZWZhdWx0IE9ubHk7XG4iLCIvKiBqc2hpbnQgYnJvd3NlcjogdHJ1ZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXG4vLyBUaGUgcHJvcGVydGllcyB0aGF0IHdlIGNvcHkgaW50byBhIG1pcnJvcmVkIGRpdi5cbi8vIE5vdGUgdGhhdCBzb21lIGJyb3dzZXJzLCBzdWNoIGFzIEZpcmVmb3gsXG4vLyBkbyBub3QgY29uY2F0ZW5hdGUgcHJvcGVydGllcywgaS5lLiBwYWRkaW5nLXRvcCwgYm90dG9tIGV0Yy4gLT4gcGFkZGluZyxcbi8vIHNvIHdlIGhhdmUgdG8gZG8gZXZlcnkgc2luZ2xlIHByb3BlcnR5IHNwZWNpZmljYWxseS5cbnZhciBwcm9wZXJ0aWVzID0gW1xuICAnZGlyZWN0aW9uJywgIC8vIFJUTCBzdXBwb3J0XG4gICdib3hTaXppbmcnLFxuICAnd2lkdGgnLCAgLy8gb24gQ2hyb21lIGFuZCBJRSwgZXhjbHVkZSB0aGUgc2Nyb2xsYmFyLCBzbyB0aGUgbWlycm9yIGRpdiB3cmFwcyBleGFjdGx5IGFzIHRoZSB0ZXh0YXJlYSBkb2VzXG4gICdoZWlnaHQnLFxuICAnb3ZlcmZsb3dYJyxcbiAgJ292ZXJmbG93WScsICAvLyBjb3B5IHRoZSBzY3JvbGxiYXIgZm9yIElFXG5cbiAgJ2JvcmRlclRvcFdpZHRoJyxcbiAgJ2JvcmRlclJpZ2h0V2lkdGgnLFxuICAnYm9yZGVyQm90dG9tV2lkdGgnLFxuICAnYm9yZGVyTGVmdFdpZHRoJyxcbiAgJ2JvcmRlclN0eWxlJyxcblxuICAncGFkZGluZ1RvcCcsXG4gICdwYWRkaW5nUmlnaHQnLFxuICAncGFkZGluZ0JvdHRvbScsXG4gICdwYWRkaW5nTGVmdCcsXG5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZvbnRcbiAgJ2ZvbnRTdHlsZScsXG4gICdmb250VmFyaWFudCcsXG4gICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnRTdHJldGNoJyxcbiAgJ2ZvbnRTaXplJyxcbiAgJ2ZvbnRTaXplQWRqdXN0JyxcbiAgJ2xpbmVIZWlnaHQnLFxuICAnZm9udEZhbWlseScsXG5cbiAgJ3RleHRBbGlnbicsXG4gICd0ZXh0VHJhbnNmb3JtJyxcbiAgJ3RleHRJbmRlbnQnLFxuICAndGV4dERlY29yYXRpb24nLCAgLy8gbWlnaHQgbm90IG1ha2UgYSBkaWZmZXJlbmNlLCBidXQgYmV0dGVyIGJlIHNhZmVcblxuICAnbGV0dGVyU3BhY2luZycsXG4gICd3b3JkU3BhY2luZycsXG5cbiAgJ3RhYlNpemUnLFxuICAnTW96VGFiU2l6ZSdcblxuXTtcblxudmFyIGlzQnJvd3NlciA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyk7XG52YXIgaXNGaXJlZm94ID0gKGlzQnJvd3NlciAmJiB3aW5kb3cubW96SW5uZXJTY3JlZW5YICE9IG51bGwpO1xuXG5mdW5jdGlvbiBnZXRDYXJldENvb3JkaW5hdGVzKGVsZW1lbnQsIHBvc2l0aW9uLCBvcHRpb25zKSB7XG4gIGlmKCFpc0Jyb3dzZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RleHRhcmVhLWNhcmV0LXBvc2l0aW9uI2dldENhcmV0Q29vcmRpbmF0ZXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGEgYnJvd3NlcicpO1xuICB9XG5cbiAgdmFyIGRlYnVnID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlYnVnIHx8IGZhbHNlO1xuICBpZiAoZGVidWcpIHtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaW5wdXQtdGV4dGFyZWEtY2FyZXQtcG9zaXRpb24tbWlycm9yLWRpdicpO1xuICAgIGlmICggZWwgKSB7IGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpOyB9XG4gIH1cblxuICAvLyBtaXJyb3JlZCBkaXZcbiAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkaXYuaWQgPSAnaW5wdXQtdGV4dGFyZWEtY2FyZXQtcG9zaXRpb24tbWlycm9yLWRpdic7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcblxuICB2YXIgc3R5bGUgPSBkaXYuc3R5bGU7XG4gIHZhciBjb21wdXRlZCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlPyBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIDogZWxlbWVudC5jdXJyZW50U3R5bGU7ICAvLyBjdXJyZW50U3R5bGUgZm9yIElFIDwgOVxuXG4gIC8vIGRlZmF1bHQgdGV4dGFyZWEgc3R5bGVzXG4gIHN0eWxlLndoaXRlU3BhY2UgPSAncHJlLXdyYXAnO1xuICBpZiAoZWxlbWVudC5ub2RlTmFtZSAhPT0gJ0lOUFVUJylcbiAgICBzdHlsZS53b3JkV3JhcCA9ICdicmVhay13b3JkJzsgIC8vIG9ubHkgZm9yIHRleHRhcmVhLXNcblxuICAvLyBwb3NpdGlvbiBvZmYtc2NyZWVuXG4gIHN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsgIC8vIHJlcXVpcmVkIHRvIHJldHVybiBjb29yZGluYXRlcyBwcm9wZXJseVxuICBpZiAoIWRlYnVnKVxuICAgIHN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsgIC8vIG5vdCAnZGlzcGxheTogbm9uZScgYmVjYXVzZSB3ZSB3YW50IHJlbmRlcmluZ1xuXG4gIC8vIHRyYW5zZmVyIHRoZSBlbGVtZW50J3MgcHJvcGVydGllcyB0byB0aGUgZGl2XG4gIHByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHN0eWxlW3Byb3BdID0gY29tcHV0ZWRbcHJvcF07XG4gIH0pO1xuXG4gIGlmIChpc0ZpcmVmb3gpIHtcbiAgICAvLyBGaXJlZm94IGxpZXMgYWJvdXQgdGhlIG92ZXJmbG93IHByb3BlcnR5IGZvciB0ZXh0YXJlYXM6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTk4NDI3NVxuICAgIGlmIChlbGVtZW50LnNjcm9sbEhlaWdodCA+IHBhcnNlSW50KGNvbXB1dGVkLmhlaWdodCkpXG4gICAgICBzdHlsZS5vdmVyZmxvd1kgPSAnc2Nyb2xsJztcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOyAgLy8gZm9yIENocm9tZSB0byBub3QgcmVuZGVyIGEgc2Nyb2xsYmFyOyBJRSBrZWVwcyBvdmVyZmxvd1kgPSAnc2Nyb2xsJ1xuICB9XG5cbiAgZGl2LnRleHRDb250ZW50ID0gZWxlbWVudC52YWx1ZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24pO1xuICAvLyB0aGUgc2Vjb25kIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGlucHV0IHR5cGU9XCJ0ZXh0XCIgdnMgdGV4dGFyZWE6IHNwYWNlcyBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggbm9uLWJyZWFraW5nIHNwYWNlcyAtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEzNDAyMDM1LzEyNjkwMzdcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdJTlBVVCcpXG4gICAgZGl2LnRleHRDb250ZW50ID0gZGl2LnRleHRDb250ZW50LnJlcGxhY2UoL1xccy9nLCAnXFx1MDBhMCcpO1xuXG4gIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAvLyBXcmFwcGluZyBtdXN0IGJlIHJlcGxpY2F0ZWQgKmV4YWN0bHkqLCBpbmNsdWRpbmcgd2hlbiBhIGxvbmcgd29yZCBnZXRzXG4gIC8vIG9udG8gdGhlIG5leHQgbGluZSwgd2l0aCB3aGl0ZXNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgYmVmb3JlICgjNykuXG4gIC8vIFRoZSAgKm9ubHkqIHJlbGlhYmxlIHdheSB0byBkbyB0aGF0IGlzIHRvIGNvcHkgdGhlICplbnRpcmUqIHJlc3Qgb2YgdGhlXG4gIC8vIHRleHRhcmVhJ3MgY29udGVudCBpbnRvIHRoZSA8c3Bhbj4gY3JlYXRlZCBhdCB0aGUgY2FyZXQgcG9zaXRpb24uXG4gIC8vIGZvciBpbnB1dHMsIGp1c3QgJy4nIHdvdWxkIGJlIGVub3VnaCwgYnV0IHdoeSBib3RoZXI/XG4gIHNwYW4udGV4dENvbnRlbnQgPSBlbGVtZW50LnZhbHVlLnN1YnN0cmluZyhwb3NpdGlvbikgfHwgJy4nOyAgLy8gfHwgYmVjYXVzZSBhIGNvbXBsZXRlbHkgZW1wdHkgZmF1eCBzcGFuIGRvZXNuJ3QgcmVuZGVyIGF0IGFsbFxuICBkaXYuYXBwZW5kQ2hpbGQoc3Bhbik7XG5cbiAgdmFyIGNvb3JkaW5hdGVzID0ge1xuICAgIHRvcDogc3Bhbi5vZmZzZXRUb3AgKyBwYXJzZUludChjb21wdXRlZFsnYm9yZGVyVG9wV2lkdGgnXSksXG4gICAgbGVmdDogc3Bhbi5vZmZzZXRMZWZ0ICsgcGFyc2VJbnQoY29tcHV0ZWRbJ2JvcmRlckxlZnRXaWR0aCddKVxuICB9O1xuXG4gIGlmIChkZWJ1Zykge1xuICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNhYWEnO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGl2KTtcbiAgfVxuXG4gIHJldHVybiBjb29yZGluYXRlcztcbn1cblxuaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzICE9ICd1bmRlZmluZWQnKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gZ2V0Q2FyZXRDb29yZGluYXRlcztcbn0gZWxzZSBpZihpc0Jyb3dzZXIpe1xuICB3aW5kb3cuZ2V0Q2FyZXRDb29yZGluYXRlcyA9IGdldENhcmV0Q29vcmRpbmF0ZXM7XG59XG5cbn0oKSk7XG4iLCJcbnZhciBOYXRpdmVDdXN0b21FdmVudCA9IGdsb2JhbC5DdXN0b21FdmVudDtcblxuZnVuY3Rpb24gdXNlTmF0aXZlICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgcCA9IG5ldyBOYXRpdmVDdXN0b21FdmVudCgnY2F0JywgeyBkZXRhaWw6IHsgZm9vOiAnYmFyJyB9IH0pO1xuICAgIHJldHVybiAgJ2NhdCcgPT09IHAudHlwZSAmJiAnYmFyJyA9PT0gcC5kZXRhaWwuZm9vO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENyb3NzLWJyb3dzZXIgYEN1c3RvbUV2ZW50YCBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3VzdG9tRXZlbnQuQ3VzdG9tRXZlbnRcbiAqXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB1c2VOYXRpdmUoKSA/IE5hdGl2ZUN1c3RvbUV2ZW50IDpcblxuLy8gSUUgPj0gOVxuJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBkb2N1bWVudCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPyBmdW5jdGlvbiBDdXN0b21FdmVudCAodHlwZSwgcGFyYW1zKSB7XG4gIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gIGlmIChwYXJhbXMpIHtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwpO1xuICB9IGVsc2Uge1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSwgdm9pZCAwKTtcbiAgfVxuICByZXR1cm4gZTtcbn0gOlxuXG4vLyBJRSA8PSA4XG5mdW5jdGlvbiBDdXN0b21FdmVudCAodHlwZSwgcGFyYW1zKSB7XG4gIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTtcbiAgZS50eXBlID0gdHlwZTtcbiAgaWYgKHBhcmFtcykge1xuICAgIGUuYnViYmxlcyA9IEJvb2xlYW4ocGFyYW1zLmJ1YmJsZXMpO1xuICAgIGUuY2FuY2VsYWJsZSA9IEJvb2xlYW4ocGFyYW1zLmNhbmNlbGFibGUpO1xuICAgIGUuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgfSBlbHNlIHtcbiAgICBlLmJ1YmJsZXMgPSBmYWxzZTtcbiAgICBlLmNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICBlLmRldGFpbCA9IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gZTtcbn1cbiIsIi8qKlxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IEpha3ViIEJlbmXFoSA8YmVuZXNAd2Vic2NvcGUuaW8+XG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBnZXRDYXJldENvb3JkaW5hdGVzIGZyb20gJ3RleHRhcmVhLWNhcmV0JztcbmltcG9ydCBDdXN0b21FdmVudCBmcm9tICdjdXN0b20tZXZlbnQnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG59XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZjIoU3ltYm9sLml0ZXJhdG9yKSA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiBfdHlwZW9mMihvYmopO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFycjJbaV0gPSBhcnJbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xufVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbnZhciBLRVlfQ09ERVMgPSB7XG4gIEVTQzogMjcsXG4gIFVQOiAzOCxcbiAgRE9XTjogNDAsXG4gIExFRlQ6IDM3LFxuICBSSUdIVDogMzksXG4gIEVOVEVSOiAxMyxcbiAgVEFCOiA5XG59OyAvLyBUaGlzIGlzIHNlbGYtbWFkZSBrZXkgc2hvcnRjdXRzIG1hbmFnZXIsIHVzZWQgZm9yIGNhY2hpbmcga2V5IHN0cm9rZXNcblxudmFyIExpc3RlbmVyID0gZnVuY3Rpb24gTGlzdGVuZXIoKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpc3RlbmVyKTtcblxuICB0aGlzLnN0YXJ0TGlzdGVuID0gZnVuY3Rpb24gKHJlZikge1xuICAgIGlmICghcmVmKSByZXR1cm47XG4gICAgcmVmLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIF90aGlzLmYpO1xuICB9O1xuXG4gIHRoaXMuc3RvcExpc3RlbiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBfdGhpcy5mKTtcbiAgfTtcblxuICB0aGlzLmFkZCA9IGZ1bmN0aW9uIChrZXlDb2RlcywgZm4pIHtcbiAgICB2YXIga2V5Q29kZSA9IGtleUNvZGVzO1xuICAgIGlmICh0eXBlb2Yga2V5Q29kZSAhPT0gXCJvYmplY3RcIikga2V5Q29kZSA9IFtrZXlDb2RlXTtcbiAgICBfdGhpcy5saXN0ZW5lcnNbX3RoaXMuaW5kZXhdID0ge1xuICAgICAga2V5Q29kZToga2V5Q29kZSxcbiAgICAgIGZuOiBmblxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzLmluZGV4Kys7XG4gIH07XG5cbiAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBkZWxldGUgX3RoaXMubGlzdGVuZXJzW2lkXTtcbiAgfTtcblxuICB0aGlzLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpcy5saXN0ZW5lcnMgPSB7fTtcbiAgICBfdGhpcy5pbmRleCA9IDE7XG4gIH07XG5cbiAgdGhpcy5pbmRleCA9IDE7XG4gIHRoaXMubGlzdGVuZXJzID0ge307XG5cbiAgdGhpcy5mID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIWUpIHJldHVybjtcbiAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndoaWNoO1xuICAgIE9iamVjdC52YWx1ZXMoX3RoaXMubGlzdGVuZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIga2V5Q29kZSA9IF9yZWYua2V5Q29kZSxcbiAgICAgICAgICBmbiA9IF9yZWYuZm47XG5cbiAgICAgIGlmIChrZXlDb2RlLmluY2x1ZGVzKGNvZGUpKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZm4oZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59O1xuXG52YXIgTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyKCk7XG5cbnZhciBJdGVtID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhJdGVtLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBJdGVtKCkge1xuICAgIHZhciBfZ2V0UHJvdG90eXBlT2YyO1xuXG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEl0ZW0pO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKF9nZXRQcm90b3R5cGVPZjIgPSBfZ2V0UHJvdG90eXBlT2YoSXRlbSkpLmNhbGwuYXBwbHkoX2dldFByb3RvdHlwZU9mMiwgW3RoaXNdLmNvbmNhdChhcmdzKSkpO1xuXG4gICAgX3RoaXMuc2VsZWN0SXRlbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGl0ZW0gPSBfdGhpcyRwcm9wcy5pdGVtLFxuICAgICAgICAgIG9uU2VsZWN0SGFuZGxlciA9IF90aGlzJHByb3BzLm9uU2VsZWN0SGFuZGxlcjtcbiAgICAgIG9uU2VsZWN0SGFuZGxlcihpdGVtKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEl0ZW0sIFt7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5pdGVtICE9PSBuZXh0UHJvcHMuaXRlbSB8fCB0aGlzLnByb3BzLnNlbGVjdGVkICE9PSBuZXh0UHJvcHMuc2VsZWN0ZWQgfHwgdGhpcy5wcm9wcy5zdHlsZSAhPT0gbmV4dFByb3BzLnN0eWxlIHx8IHRoaXMucHJvcHMuY2xhc3NOYW1lICE9PSBuZXh0UHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgQ29tcG9uZW50ID0gX3RoaXMkcHJvcHMyLmNvbXBvbmVudCxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMi5zdHlsZSxcbiAgICAgICAgICBvbkNsaWNrSGFuZGxlciA9IF90aGlzJHByb3BzMi5vbkNsaWNrSGFuZGxlcixcbiAgICAgICAgICBpdGVtID0gX3RoaXMkcHJvcHMyLml0ZW0sXG4gICAgICAgICAgc2VsZWN0ZWQgPSBfdGhpcyRwcm9wczIuc2VsZWN0ZWQsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgICBpbm5lclJlZiA9IF90aGlzJHByb3BzMi5pbm5lclJlZjtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwicnRhX19pdGVtICBcIi5jb25jYXQoc2VsZWN0ZWQgPT09IHRydWUgPyBcInJ0YV9faXRlbS0tc2VsZWN0ZWRcIiA6IFwiXCIsIFwiIFwiKS5jb25jYXQoY2xhc3NOYW1lIHx8IFwiXCIpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwicnRhX19lbnRpdHkgXCIuY29uY2F0KHNlbGVjdGVkID09PSB0cnVlID8gXCJydGFfX2VudGl0eS0tc2VsZWN0ZWRcIiA6IFwiXCIpLFxuICAgICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgICB0YWJJbmRleDogMCxcbiAgICAgICAgb25DbGljazogb25DbGlja0hhbmRsZXIsXG4gICAgICAgIG9uRm9jdXM6IHRoaXMuc2VsZWN0SXRlbSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLnNlbGVjdEl0ZW0sXG4gICAgICAgIG9uVG91Y2hTdGFydDogZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KCkge1xuICAgICAgICAgIF90aGlzMi5jbGlja2VkID0gdHJ1ZTtcblxuICAgICAgICAgIF90aGlzMi5zZWxlY3RJdGVtKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uIG9uVG91Y2hFbmQoZSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmIChfdGhpczIuY2xpY2tlZCkge1xuICAgICAgICAgICAgb25DbGlja0hhbmRsZXIoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblRvdWNoTW92ZTogZnVuY3Rpb24gb25Ub3VjaE1vdmUoKSB7XG4gICAgICAgICAgX3RoaXMyLmNsaWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ub3VjaENhbmNlbDogZnVuY3Rpb24gb25Ub3VjaENhbmNlbCgpIHtcbiAgICAgICAgICBfdGhpczIuY2xpY2tlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qICRGbG93Rml4TWUgKi9cbiAgICAgICAgLFxuICAgICAgICByZWY6IGlubmVyUmVmXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwge1xuICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWQsXG4gICAgICAgIGVudGl0eTogaXRlbVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSXRlbTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIExpc3QgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKExpc3QsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIExpc3QoKSB7XG4gICAgdmFyIF9nZXRQcm90b3R5cGVPZjI7XG5cbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGlzdCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX2dldFByb3RvdHlwZU9mMiA9IF9nZXRQcm90b3R5cGVPZihMaXN0KSkuY2FsbC5hcHBseShfZ2V0UHJvdG90eXBlT2YyLCBbdGhpc10uY29uY2F0KGFyZ3MpKSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBzZWxlY3RlZEl0ZW06IG51bGxcbiAgICB9O1xuICAgIF90aGlzLmNhY2hlZElkT2ZJdGVtcyA9IG5ldyBNYXAoKTtcblxuICAgIF90aGlzLm9uUHJlc3NFbnRlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAodHlwZW9mIGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzID0gX3RoaXMucHJvcHMudmFsdWVzO1xuXG4gICAgICBfdGhpcy5tb2RpZnlUZXh0KHZhbHVlc1tfdGhpcy5nZXRQb3NpdGlvbkluTGlzdCgpXSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldFBvc2l0aW9uSW5MaXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IF90aGlzLnByb3BzLnZhbHVlcztcbiAgICAgIHZhciBzZWxlY3RlZEl0ZW0gPSBfdGhpcy5zdGF0ZS5zZWxlY3RlZEl0ZW07XG4gICAgICBpZiAoIXNlbGVjdGVkSXRlbSkgcmV0dXJuIDA7XG4gICAgICByZXR1cm4gdmFsdWVzLmZpbmRJbmRleChmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZ2V0SWQoYSkgPT09IF90aGlzLmdldElkKHNlbGVjdGVkSXRlbSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0SWQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKF90aGlzLmNhY2hlZElkT2ZJdGVtcy5oYXMoaXRlbSkpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICByZXR1cm4gX3RoaXMuY2FjaGVkSWRPZkl0ZW1zLmdldChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRleHRUb1JlcGxhY2UgPSBfdGhpcy5wcm9wcy5nZXRUZXh0VG9SZXBsYWNlKGl0ZW0pO1xuXG4gICAgICB2YXIgY29tcHV0ZUlkID0gZnVuY3Rpb24gY29tcHV0ZUlkKCkge1xuICAgICAgICBpZiAodGV4dFRvUmVwbGFjZSkge1xuICAgICAgICAgIGlmICh0ZXh0VG9SZXBsYWNlLmtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRUb1JlcGxhY2Uua2V5O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIiB8fCAhaXRlbS5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0VG9SZXBsYWNlLnRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpdGVtLmtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkl0ZW0gXCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGl0ZW0pLCBcIiBoYXMgdG8gaGF2ZSBkZWZpbmVkIFxcXCJrZXlcXFwiIHByb3BlcnR5XCIpKTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgICByZXR1cm4gaXRlbS5rZXk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgaWQgPSBjb21wdXRlSWQoKTtcblxuICAgICAgX3RoaXMuY2FjaGVkSWRPZkl0ZW1zLnNldChpdGVtLCBpZCk7XG5cbiAgICAgIHJldHVybiBpZDtcbiAgICB9O1xuXG4gICAgX3RoaXMubGlzdGVuZXJzID0gW107XG4gICAgX3RoaXMuaXRlbXNSZWYgPSB7fTtcblxuICAgIF90aGlzLm1vZGlmeVRleHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHJldHVybjtcbiAgICAgIHZhciBvblNlbGVjdCA9IF90aGlzLnByb3BzLm9uU2VsZWN0O1xuICAgICAgb25TZWxlY3QodmFsdWUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZWxlY3RJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBrZXlib2FyZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICB2YXIgb25JdGVtSGlnaGxpZ2h0ZWQgPSBfdGhpcy5wcm9wcy5vbkl0ZW1IaWdobGlnaHRlZDtcbiAgICAgIGlmIChfdGhpcy5zdGF0ZS5zZWxlY3RlZEl0ZW0gPT09IGl0ZW0pIHJldHVybjtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEl0ZW06IGl0ZW1cbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb25JdGVtSGlnaGxpZ2h0ZWQoaXRlbSk7XG5cbiAgICAgICAgaWYgKGtleWJvYXJkKSB7XG4gICAgICAgICAgX3RoaXMucHJvcHMuZHJvcGRvd25TY3JvbGwoX3RoaXMuaXRlbXNSZWZbX3RoaXMuZ2V0SWQoaXRlbSldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLnNjcm9sbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgdmFsdWVzID0gX3RoaXMucHJvcHMudmFsdWVzO1xuICAgICAgdmFyIGNvZGUgPSBlLmtleUNvZGUgfHwgZS53aGljaDtcblxuICAgICAgdmFyIG9sZFBvc2l0aW9uID0gX3RoaXMuZ2V0UG9zaXRpb25Jbkxpc3QoKTtcblxuICAgICAgdmFyIG5ld1Bvc2l0aW9uO1xuXG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSBLRVlfQ09ERVMuRE9XTjpcbiAgICAgICAgICBuZXdQb3NpdGlvbiA9IG9sZFBvc2l0aW9uICsgMTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEtFWV9DT0RFUy5VUDpcbiAgICAgICAgICBuZXdQb3NpdGlvbiA9IG9sZFBvc2l0aW9uIC0gMTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIG5ld1Bvc2l0aW9uID0gb2xkUG9zaXRpb247XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG5ld1Bvc2l0aW9uID0gKG5ld1Bvc2l0aW9uICUgdmFsdWVzLmxlbmd0aCArIHZhbHVlcy5sZW5ndGgpICUgdmFsdWVzLmxlbmd0aDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgICBfdGhpcy5zZWxlY3RJdGVtKHZhbHVlc1tuZXdQb3NpdGlvbl0sIFtLRVlfQ09ERVMuRE9XTiwgS0VZX0NPREVTLlVQXS5pbmNsdWRlcyhjb2RlKSk7XG4gICAgfTtcblxuICAgIF90aGlzLmlzU2VsZWN0ZWQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIHNlbGVjdGVkSXRlbSA9IF90aGlzLnN0YXRlLnNlbGVjdGVkSXRlbTtcbiAgICAgIGlmICghc2VsZWN0ZWRJdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gX3RoaXMuZ2V0SWQoc2VsZWN0ZWRJdGVtKSA9PT0gX3RoaXMuZ2V0SWQoaXRlbSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhMaXN0LCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goTGlzdGVuZXJzLmFkZChbS0VZX0NPREVTLkRPV04sIEtFWV9DT0RFUy5VUF0sIHRoaXMuc2Nyb2xsKSwgTGlzdGVuZXJzLmFkZChbS0VZX0NPREVTLkVOVEVSLCBLRVlfQ09ERVMuVEFCXSwgdGhpcy5vblByZXNzRW50ZXIpKTtcbiAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnByb3BzLnZhbHVlcztcbiAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzWzBdKSB0aGlzLnNlbGVjdEl0ZW0odmFsdWVzWzBdKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShfcmVmKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIG9sZFZhbHVlcyA9IF9yZWYudmFsdWVzO1xuICAgICAgdmFyIHZhbHVlcyA9IHRoaXMucHJvcHMudmFsdWVzO1xuICAgICAgdmFyIG9sZFZhbHVlc1NlcmlhbGl6ZWQgPSBvbGRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5nZXRJZCh2YWwpO1xuICAgICAgfSkuam9pbihcIlwiKTtcbiAgICAgIHZhciBuZXdWYWx1ZXNTZXJpYWxpemVkID0gdmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZ2V0SWQodmFsKTtcbiAgICAgIH0pLmpvaW4oXCJcIik7XG5cbiAgICAgIGlmIChvbGRWYWx1ZXNTZXJpYWxpemVkICE9PSBuZXdWYWx1ZXNTZXJpYWxpemVkICYmIHZhbHVlcyAmJiB2YWx1ZXNbMF0pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKHZhbHVlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIGxpc3RlbmVyO1xuXG4gICAgICB3aGlsZSAodGhpcy5saXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgIGxpc3RlbmVyID0gdGhpcy5saXN0ZW5lcnMucG9wKCk7XG4gICAgICAgIExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdmFsdWVzID0gX3RoaXMkcHJvcHMudmFsdWVzLFxuICAgICAgICAgIGNvbXBvbmVudCA9IF90aGlzJHByb3BzLmNvbXBvbmVudCxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzLnN0eWxlLFxuICAgICAgICAgIGl0ZW1DbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5pdGVtQ2xhc3NOYW1lLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBpdGVtU3R5bGUgPSBfdGhpcyRwcm9wcy5pdGVtU3R5bGU7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YV9fbGlzdCBcIi5jb25jYXQoY2xhc3NOYW1lIHx8IFwiXCIpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIHZhbHVlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwge1xuICAgICAgICAgIGtleTogX3RoaXMzLmdldElkKGl0ZW0pLFxuICAgICAgICAgIGlubmVyUmVmOiBmdW5jdGlvbiBpbm5lclJlZihyZWYpIHtcbiAgICAgICAgICAgIF90aGlzMy5pdGVtc1JlZltfdGhpczMuZ2V0SWQoaXRlbSldID0gcmVmO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZWN0ZWQ6IF90aGlzMy5pc1NlbGVjdGVkKGl0ZW0pLFxuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgY2xhc3NOYW1lOiBpdGVtQ2xhc3NOYW1lLFxuICAgICAgICAgIHN0eWxlOiBpdGVtU3R5bGUsXG4gICAgICAgICAgb25DbGlja0hhbmRsZXI6IF90aGlzMy5vblByZXNzRW50ZXIsXG4gICAgICAgICAgb25TZWxlY3RIYW5kbGVyOiBfdGhpczMuc2VsZWN0SXRlbSxcbiAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudFxuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTGlzdDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZnVuY3Rpb24gZGVmYXVsdFNjcm9sbFRvSXRlbShjb250YWluZXIsIGl0ZW0pIHtcbiAgdmFyIGl0ZW1IZWlnaHQgPSBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGl0ZW0pLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiksIDEwKTtcbiAgdmFyIGNvbnRhaW5lckhpZ2h0ID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiksIDEwKSAtIGl0ZW1IZWlnaHQ7XG4gIHZhciBpdGVtT2Zmc2V0VG9wID0gaXRlbS5vZmZzZXRUb3A7XG4gIHZhciBhY3R1YWxTY3JvbGxUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuXG4gIGlmIChpdGVtT2Zmc2V0VG9wIDwgYWN0dWFsU2Nyb2xsVG9wICsgY29udGFpbmVySGlnaHQgJiYgYWN0dWFsU2Nyb2xsVG9wIDwgaXRlbU9mZnNldFRvcCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcblxuXG4gIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBpdGVtT2Zmc2V0VG9wO1xufVxuXG52YXIgREVGQVVMVF9DQVJFVF9QT1NJVElPTiA9IFwibmV4dFwiO1xudmFyIFBPU0lUSU9OX0NPTkZJR1VSQVRJT04gPSB7XG4gIFg6IHtcbiAgICBMRUZUOiBcInJ0YV9fYXV0b2NvbXBsZXRlLS1sZWZ0XCIsXG4gICAgUklHSFQ6IFwicnRhX19hdXRvY29tcGxldGUtLXJpZ2h0XCJcbiAgfSxcbiAgWToge1xuICAgIFRPUDogXCJydGFfX2F1dG9jb21wbGV0ZS0tdG9wXCIsXG4gICAgQk9UVE9NOiBcInJ0YV9fYXV0b2NvbXBsZXRlLS1ib3R0b21cIlxuICB9XG59O1xuXG52YXIgZXJyb3JNZXNzYWdlID0gZnVuY3Rpb24gZXJyb3JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJSVEE6IGRhdGFQcm92aWRlciBmYWlsczogXCIuY29uY2F0KG1lc3NhZ2UsIFwiXFxuICAgIFxcbkNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIG9yIGNyZWF0ZSBpc3N1ZSBpZiB5b3UgdGhpbmsgaXQncyBidWcuIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzY29wZWlvL3JlYWN0LXRleHRhcmVhLWF1dG9jb21wbGV0ZS9pc3N1ZXNcIikpO1xufTtcblxudmFyIHJlc2VydmVkUmVnZXhDaGFycyA9IFtcIi5cIiwgXCJeXCIsIFwiJFwiLCBcIipcIiwgXCIrXCIsIFwiLVwiLCBcIj9cIiwgXCIoXCIsIFwiKVwiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgXCJcXFxcXCIsIFwifFwiXTtcblxudmFyIGVzY2FwZVJlZ2V4ID0gZnVuY3Rpb24gZXNjYXBlUmVnZXgodGV4dCkge1xuICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KHRleHQpLm1hcChmdW5jdGlvbiAoY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIHJlc2VydmVkUmVnZXhDaGFycy5pbmNsdWRlcyhjaGFyYWN0ZXIpID8gXCJcXFxcXCIuY29uY2F0KGNoYXJhY3RlcikgOiBjaGFyYWN0ZXI7XG4gIH0pLmpvaW4oXCJcIik7XG59OyAvLyBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgY29tcG9uZW50IGlzIHRvIGZpZ3VyZSBvdXQgdG8gd2hpY2ggc2lkZSB0aGUgYXV0b2NvbXBsZXRlIHNob3VsZCBiZSBvcGVuZWRcblxuXG52YXIgQXV0b2NvbXBsZXRlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhBdXRvY29tcGxldGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEF1dG9jb21wbGV0ZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXV0b2NvbXBsZXRlKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfZ2V0UHJvdG90eXBlT2YoQXV0b2NvbXBsZXRlKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBdXRvY29tcGxldGUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIGJvdW5kYXJpZXNFbGVtZW50ID0gdGhpcy5wcm9wcy5ib3VuZGFyaWVzRWxlbWVudDtcblxuICAgICAgaWYgKHR5cGVvZiBib3VuZGFyaWVzRWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYm91bmRhcmllc0VsZW1lbnQpO1xuXG4gICAgICAgIGlmICghZWxlbSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJUQTogSW52YWxpZCBwcm9wIGJvdW5kYXJpZXNFbGVtZW50OiBpdCBoYXMgdG8gYmUgc3RyaW5nIG9yIEhUTUxFbGVtZW50LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWxlbSA9IGVsZW07XG4gICAgICB9IGVsc2UgaWYgKGJvdW5kYXJpZXNFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJFbGVtID0gYm91bmRhcmllc0VsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSVEE6IEludmFsaWQgcHJvcCBib3VuZGFyaWVzRWxlbWVudDogaXQgaGFzIHRvIGJlIHN0cmluZyBvciBIVE1MRWxlbWVudC5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5jb250YWluZXJFbGVtIHx8ICF0aGlzLmNvbnRhaW5lckVsZW0uY29udGFpbnModGhpcy5yZWYpKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSVEE6IEludmFsaWQgcHJvcCBib3VuZGFyaWVzRWxlbWVudDogaXQgaGFzIHRvIGJlIG9uZSBvZiB0aGUgcGFyZW50cyBvZiB0aGUgUlRBLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzJHJlZiRjbGFzc0xpc3QsIF90aGlzJHJlZiRjbGFzc0xpc3QyO1xuXG4gICAgICB2YXIgdG9wID0gdGhpcy5wcm9wcy50b3AgfHwgMDtcbiAgICAgIHZhciBsZWZ0ID0gdGhpcy5wcm9wcy5sZWZ0IHx8IDA7XG4gICAgICB2YXIgdXNlZENsYXNzZXMgPSBbXTtcbiAgICAgIHZhciB1bnVzZWRDbGFzc2VzID0gW107XG4gICAgICB2YXIgdG9wUG9zaXRpb24gPSAwO1xuICAgICAgdmFyIGxlZnRQb3NpdGlvbiA9IDA7XG4gICAgICB2YXIgY29udGFpbmVyQm91bmRzID0gdGhpcy5jb250YWluZXJFbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIGRyb3Bkb3duQm91bmRzID0gdGhpcy5yZWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgdGV4dGFyZWFCb3VuZHMgPSB0aGlzLnByb3BzLnRleHRhcmVhUmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnJlZik7XG4gICAgICB2YXIgbWFyZ2luVG9wID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwibWFyZ2luLXRvcFwiKSwgMTApO1xuICAgICAgdmFyIG1hcmdpbkJvdHRvbSA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIm1hcmdpbi1ib3R0b21cIiksIDEwKTtcbiAgICAgIHZhciBtYXJnaW5MZWZ0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwibWFyZ2luLWxlZnRcIiksIDEwKTtcbiAgICAgIHZhciBtYXJnaW5SaWdodCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIm1hcmdpbi1yaWdodFwiKSwgMTApO1xuICAgICAgdmFyIGRyb3Bkb3duQm90dG9tID0gbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tICsgdGV4dGFyZWFCb3VuZHMudG9wICsgdG9wICsgZHJvcGRvd25Cb3VuZHMuaGVpZ2h0O1xuICAgICAgdmFyIGRyb3Bkb3duUmlnaHQgPSBtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQgKyB0ZXh0YXJlYUJvdW5kcy5sZWZ0ICsgbGVmdCArIGRyb3Bkb3duQm91bmRzLndpZHRoO1xuXG4gICAgICBpZiAoZHJvcGRvd25SaWdodCA+IGNvbnRhaW5lckJvdW5kcy5yaWdodCAmJiB0ZXh0YXJlYUJvdW5kcy5sZWZ0ICsgbGVmdCA+IGRyb3Bkb3duQm91bmRzLndpZHRoKSB7XG4gICAgICAgIGxlZnRQb3NpdGlvbiA9IGxlZnQgLSBkcm9wZG93bkJvdW5kcy53aWR0aDtcbiAgICAgICAgdXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlguTEVGVCk7XG4gICAgICAgIHVudXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlguUklHSFQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVmdFBvc2l0aW9uID0gbGVmdDtcbiAgICAgICAgdXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlguUklHSFQpO1xuICAgICAgICB1bnVzZWRDbGFzc2VzLnB1c2goUE9TSVRJT05fQ09ORklHVVJBVElPTi5YLkxFRlQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJvcGRvd25Cb3R0b20gPiBjb250YWluZXJCb3VuZHMuYm90dG9tICYmIHRleHRhcmVhQm91bmRzLnRvcCArIHRvcCA+IGRyb3Bkb3duQm91bmRzLmhlaWdodCkge1xuICAgICAgICB0b3BQb3NpdGlvbiA9IHRvcCAtIGRyb3Bkb3duQm91bmRzLmhlaWdodDtcbiAgICAgICAgdXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlkuVE9QKTtcbiAgICAgICAgdW51c2VkQ2xhc3Nlcy5wdXNoKFBPU0lUSU9OX0NPTkZJR1VSQVRJT04uWS5CT1RUT00pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9wUG9zaXRpb24gPSB0b3A7XG4gICAgICAgIHVzZWRDbGFzc2VzLnB1c2goUE9TSVRJT05fQ09ORklHVVJBVElPTi5ZLkJPVFRPTSk7XG4gICAgICAgIHVudXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlkuVE9QKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMucmVuZGVyVG9Cb2R5KSB7XG4gICAgICAgIHRvcFBvc2l0aW9uICs9IHRleHRhcmVhQm91bmRzLnRvcDtcbiAgICAgICAgbGVmdFBvc2l0aW9uICs9IHRleHRhcmVhQm91bmRzLmxlZnQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVmLnN0eWxlLnRvcCA9IFwiXCIuY29uY2F0KHRvcFBvc2l0aW9uLCBcInB4XCIpO1xuICAgICAgdGhpcy5yZWYuc3R5bGUubGVmdCA9IFwiXCIuY29uY2F0KGxlZnRQb3NpdGlvbiwgXCJweFwiKTtcblxuICAgICAgKF90aGlzJHJlZiRjbGFzc0xpc3QgPSB0aGlzLnJlZi5jbGFzc0xpc3QpLnJlbW92ZS5hcHBseShfdGhpcyRyZWYkY2xhc3NMaXN0LCB1bnVzZWRDbGFzc2VzKTtcblxuICAgICAgKF90aGlzJHJlZiRjbGFzc0xpc3QyID0gdGhpcy5yZWYuY2xhc3NMaXN0KS5hZGQuYXBwbHkoX3RoaXMkcmVmJGNsYXNzTGlzdDIsIHVzZWRDbGFzc2VzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wcy5zdHlsZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgaW5uZXJSZWYgPSBfdGhpcyRwcm9wcy5pbm5lclJlZixcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIHJlbmRlclRvQm9keSA9IF90aGlzJHByb3BzLnJlbmRlclRvQm9keTtcbiAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgIHZhciBhdXRvY29tcGxldGVDb250YWluZXIgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBmdW5jdGlvbiByZWYoX3JlZikge1xuICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICBfdGhpcy5yZWYgPSBfcmVmOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBpbm5lclJlZihfcmVmKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YV9fYXV0b2NvbXBsZXRlIFwiLmNvbmNhdChjbGFzc05hbWUgfHwgXCJcIiksXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgY2hpbGRyZW4pO1xuICAgICAgcmV0dXJuIHJlbmRlclRvQm9keSAmJiBib2R5ICE9PSBudWxsID8gUmVhY3RET00uY3JlYXRlUG9ydGFsKGF1dG9jb21wbGV0ZUNvbnRhaW5lciwgYm9keSkgOiBhdXRvY29tcGxldGVDb250YWluZXI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEF1dG9jb21wbGV0ZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQyKSB7XG4gIF9pbmhlcml0cyhSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlLCBfUmVhY3QkQ29tcG9uZW50Mik7XG5cbiAgZnVuY3Rpb24gUmVhY3RUZXh0YXJlYUF1dG9jb21wbGV0ZShfcHJvcHMpIHtcbiAgICB2YXIgX3RoaXMyO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUpO1xuXG4gICAgX3RoaXMyID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUpLmNhbGwodGhpcywgX3Byb3BzKSk7XG4gICAgX3RoaXMyLnN0YXRlID0ge1xuICAgICAgdG9wOiBudWxsLFxuICAgICAgbGVmdDogbnVsbCxcbiAgICAgIGN1cnJlbnRUcmlnZ2VyOiBudWxsLFxuICAgICAgYWN0dWFsVG9rZW46IFwiXCIsXG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICBkYXRhTG9hZGluZzogZmFsc2UsXG4gICAgICBzZWxlY3Rpb25FbmQ6IDAsXG4gICAgICBjb21wb25lbnQ6IG51bGwsXG4gICAgICB0ZXh0VG9SZXBsYWNlOiBudWxsXG4gICAgfTtcblxuICAgIF90aGlzMi5lc2NMaXN0ZW5lckluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzMi5lc2NMaXN0ZW5lcikge1xuICAgICAgICBfdGhpczIuZXNjTGlzdGVuZXIgPSBMaXN0ZW5lcnMuYWRkKEtFWV9DT0RFUy5FU0MsIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpczIuZXNjTGlzdGVuZXJEZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzMi5lc2NMaXN0ZW5lcikge1xuICAgICAgICBMaXN0ZW5lcnMucmVtb3ZlKF90aGlzMi5lc2NMaXN0ZW5lcik7XG4gICAgICAgIF90aGlzMi5lc2NMaXN0ZW5lciA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzMi5nZXRTZWxlY3Rpb25Qb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMyLnRleHRhcmVhUmVmKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdGlvblN0YXJ0OiBfdGhpczIudGV4dGFyZWFSZWYuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIHNlbGVjdGlvbkVuZDogX3RoaXMyLnRleHRhcmVhUmVmLnNlbGVjdGlvbkVuZFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLmdldFNlbGVjdGVkVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMyLnRleHRhcmVhUmVmKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBfdGhpczIkdGV4dGFyZWFSZWYgPSBfdGhpczIudGV4dGFyZWFSZWYsXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBfdGhpczIkdGV4dGFyZWFSZWYuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgc2VsZWN0aW9uRW5kID0gX3RoaXMyJHRleHRhcmVhUmVmLnNlbGVjdGlvbkVuZDtcbiAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA9PT0gc2VsZWN0aW9uRW5kKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBfdGhpczIuc3RhdGUudmFsdWUuc3Vic3RyKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgLSBzZWxlY3Rpb25TdGFydCk7XG4gICAgfTtcblxuICAgIF90aGlzMi5zZXRDYXJldFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwO1xuICAgICAgaWYgKCFfdGhpczIudGV4dGFyZWFSZWYpIHJldHVybjtcblxuICAgICAgX3RoaXMyLnRleHRhcmVhUmVmLmZvY3VzKCk7XG5cbiAgICAgIF90aGlzMi50ZXh0YXJlYVJlZi5zZXRTZWxlY3Rpb25SYW5nZShwb3NpdGlvbiwgcG9zaXRpb24pO1xuICAgIH07XG5cbiAgICBfdGhpczIuZ2V0Q2FyZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMyLnRleHRhcmVhUmVmKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zaXRpb24gPSBfdGhpczIudGV4dGFyZWFSZWYuc2VsZWN0aW9uRW5kO1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2hhbmRsZUNhcmV0Q2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjbGVhbkxhc3RUcmlnZ2VyID0gZnVuY3Rpb24gY2xlYW5MYXN0VHJpZ2dlcigpIHtcbiAgICAgICAgdmFyIGJlZm9yZUhhbmRsZSA9IF90aGlzMi5nZXRDYXJldFBvc2l0aW9uKCkgLSAxO1xuICAgICAgICBfdGhpczIubGFzdFRyaWdnZXIgPSBfdGhpczIubGFzdFRyaWdnZXIgPyBiZWZvcmVIYW5kbGUgOiAwO1xuICAgICAgfTtcblxuICAgICAgaWYgKGUudHlwZSA9PT0gXCJrZXlkb3duXCIpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndoaWNoO1xuXG4gICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgIGNhc2UgS0VZX0NPREVTLlVQOlxuICAgICAgICAgIGNhc2UgS0VZX0NPREVTLkRPV046XG4gICAgICAgICAgICBpZiAoIV90aGlzMi5faXNBdXRvY29tcGxldGVPcGVuKCkpIHtcbiAgICAgICAgICAgICAgY2xlYW5MYXN0VHJpZ2dlcigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgS0VZX0NPREVTLkxFRlQ6XG4gICAgICAgICAgY2FzZSBLRVlfQ09ERVMuUklHSFQ6XG4gICAgICAgICAgICBjbGVhbkxhc3RUcmlnZ2VyKCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNsZWFuTGFzdFRyaWdnZXIoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9vblNlbGVjdCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgX3RoaXMyJHN0YXRlID0gX3RoaXMyLnN0YXRlLFxuICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IF90aGlzMiRzdGF0ZS5zZWxlY3Rpb25FbmQsXG4gICAgICAgICAgY3VycmVudFRyaWdnZXIgPSBfdGhpczIkc3RhdGUuY3VycmVudFRyaWdnZXIsXG4gICAgICAgICAgdGV4dGFyZWFWYWx1ZSA9IF90aGlzMiRzdGF0ZS52YWx1ZTtcbiAgICAgIHZhciBvbkl0ZW1TZWxlY3RlZCA9IF90aGlzMi5wcm9wcy5vbkl0ZW1TZWxlY3RlZDtcbiAgICAgIGlmICghY3VycmVudFRyaWdnZXIpIHJldHVybjtcblxuICAgICAgdmFyIGdldFRleHRUb1JlcGxhY2VGb3JDdXJyZW50VHJpZ2dlciA9IF90aGlzMi5fZ2V0VGV4dFRvUmVwbGFjZShjdXJyZW50VHJpZ2dlcik7XG5cbiAgICAgIGlmICghZ2V0VGV4dFRvUmVwbGFjZUZvckN1cnJlbnRUcmlnZ2VyKSB7XG4gICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdUb2tlbiA9IGdldFRleHRUb1JlcGxhY2VGb3JDdXJyZW50VHJpZ2dlcihpdGVtKTtcblxuICAgICAgaWYgKCFuZXdUb2tlbikge1xuICAgICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob25JdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgb25JdGVtU2VsZWN0ZWQoe1xuICAgICAgICAgIGN1cnJlbnRUcmlnZ2VyOiBjdXJyZW50VHJpZ2dlcixcbiAgICAgICAgICBpdGVtOiBpdGVtXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tcHV0ZUNhcmV0UG9zaXRpb24gPSBmdW5jdGlvbiBjb21wdXRlQ2FyZXRQb3NpdGlvbihwb3NpdGlvbiwgdG9rZW4sIHN0YXJ0VG9rZW4pIHtcbiAgICAgICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgICAgIGNhc2UgXCJzdGFydFwiOlxuICAgICAgICAgICAgcmV0dXJuIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgICBjYXNlIFwibmV4dFwiOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBzdGFydFRva2VuICsgdG9rZW4ubGVuZ3RoO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSVEE6IGNhcmV0UG9zaXRpb24gc2hvdWxkIGJlIFwic3RhcnRcIiwgXCJuZXh0XCIsIFwiZW5kXCIgb3IgbnVtYmVyLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciB0ZXh0VG9Nb2RpZnkgPSB0ZXh0YXJlYVZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvbkVuZCk7XG4gICAgICAvKipcbiAgICAgICAqIEl0J3MgaW1wb3J0YW50IHRvIGVzY2FwZSB0aGUgY3VycmVudFRyaWdnZXIgY2hhciBmb3IgY2hhcnMgbGlrZSBbLCAoLC4uLlxuICAgICAgICogVGhpcyBpcyBhIHJpZGljdWxvdXMgZGFyayBtYWdpYywgYmFzaWNhbGx5IHdlIGZvdW5kIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGN1cnJlbnQgdG9rZW4gKGZyb20gY3VycmVudCB0cmlnZ2VyKSBhbmQgdGhlbiB3ZSByZXBsYWNlIHRoZSB0ZXh0IGZyb20gdGhhdCBwb3NpdGlvbiAoY2FsY3VsYXRpbmcgdGhlIG9mZnNldClcbiAgICAgICAqL1xuXG4gICAgICB2YXIgZXNjYXBlZEN1cnJlbnRUcmlnZ2VyID0gZXNjYXBlUmVnZXgoY3VycmVudFRyaWdnZXIpO1xuICAgICAgdmFyIHRyaWdnZXJPZmZzZXQgPSB0ZXh0VG9Nb2RpZnkubGVuZ3RoIC0gdGV4dFRvTW9kaWZ5Lmxhc3RJbmRleE9mKGN1cnJlbnRUcmlnZ2VyKTtcbiAgICAgIHZhciBzdGFydE9mVG9rZW5Qb3NpdGlvbiA9IHRleHRUb01vZGlmeS5zZWFyY2gobmV3IFJlZ0V4cChcIig/IVwiLmNvbmNhdChlc2NhcGVkQ3VycmVudFRyaWdnZXIsIFwiKSRcIikpKSAtIHRyaWdnZXJPZmZzZXQ7IC8vIHdlIGFkZCBzcGFjZSBhZnRlciBlbW9qaSBpcyBzZWxlY3RlZCBpZiBhIGNhcmV0IHBvc2l0aW9uIGlzIG5leHRcblxuICAgICAgdmFyIG5ld1Rva2VuU3RyaW5nID0gbmV3VG9rZW4uY2FyZXRQb3NpdGlvbiA9PT0gXCJuZXh0XCIgPyBcIlwiLmNvbmNhdChuZXdUb2tlbi50ZXh0LCBcIiBcIikgOiBuZXdUb2tlbi50ZXh0O1xuICAgICAgdmFyIG5ld0NhcmV0UG9zaXRpb24gPSBjb21wdXRlQ2FyZXRQb3NpdGlvbihuZXdUb2tlbi5jYXJldFBvc2l0aW9uLCBuZXdUb2tlblN0cmluZywgc3RhcnRPZlRva2VuUG9zaXRpb24pO1xuICAgICAgdmFyIG1vZGlmaWVkVGV4dCA9IHRleHRUb01vZGlmeS5zdWJzdHJpbmcoMCwgc3RhcnRPZlRva2VuUG9zaXRpb24pICsgbmV3VG9rZW5TdHJpbmc7XG4gICAgICB2YXIgbmV3VmFsdWUgPSB0ZXh0YXJlYVZhbHVlLnJlcGxhY2UodGV4dFRvTW9kaWZ5LCBtb2RpZmllZFRleHQpOyAvLyBzZXQgdGhlIG5ldyB0ZXh0YXJlYSB2YWx1ZSBhbmQgYWZ0ZXIgdGhhdCBzZXQgdGhlIGNhcmV0IGJhY2sgdG8gaXRzIHBvc2l0aW9uXG5cbiAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgZGF0YUxvYWRpbmc6IGZhbHNlXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnNlcnRlZFRyaWdnZXIgPSBfdGhpczIudG9rZW5SZWdFeHBFbmRpbmcuZXhlYyhuZXdUb2tlblN0cmluZyk7XG5cbiAgICAgICAgdmFyIGluc2VydGVkVHJpZ2dlck1vZGlmaWVyID0gaW5zZXJ0ZWRUcmlnZ2VyID8gaW5zZXJ0ZWRUcmlnZ2VyWzBdLmxlbmd0aCA6IDE7XG4gICAgICAgIF90aGlzMi5sYXN0VHJpZ2dlciA9IG5ld0NhcmV0UG9zaXRpb24gPyBuZXdDYXJldFBvc2l0aW9uIC0gaW5zZXJ0ZWRUcmlnZ2VyTW9kaWZpZXIgOiBuZXdDYXJldFBvc2l0aW9uO1xuICAgICAgICBfdGhpczIudGV4dGFyZWFSZWYudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgX3RoaXMyLnRleHRhcmVhUmVmLnNlbGVjdGlvbkVuZCA9IG5ld0NhcmV0UG9zaXRpb247XG5cbiAgICAgICAgX3RoaXMyLl9jaGFuZ2VIYW5kbGVyKCk7XG5cbiAgICAgICAgdmFyIHNjcm9sbFRvcCA9IF90aGlzMi50ZXh0YXJlYVJlZi5zY3JvbGxUb3A7XG5cbiAgICAgICAgX3RoaXMyLnNldENhcmV0UG9zaXRpb24obmV3Q2FyZXRQb3NpdGlvbik7XG4gICAgICAgIC8qXG4gICAgICAgICAgQ2hyb21lIGRvZXMgbm90IG1haW50YWluIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgIFJlbGV2YW50IGRpc2N1c3Npb24gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNjb3BlaW8vcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlL3B1bGwvOTdcbiAgICAgICAgKi9cblxuXG4gICAgICAgIGlmICh3aW5kb3cuY2hyb21lKSB7XG4gICAgICAgICAgX3RoaXMyLnRleHRhcmVhUmVmLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fZ2V0VGV4dFRvUmVwbGFjZSA9IGZ1bmN0aW9uIChjdXJyZW50VHJpZ2dlcikge1xuICAgICAgdmFyIHRyaWdnZXJTZXR0aW5ncyA9IF90aGlzMi5wcm9wcy50cmlnZ2VyW2N1cnJlbnRUcmlnZ2VyXTtcbiAgICAgIGlmICghY3VycmVudFRyaWdnZXIgfHwgIXRyaWdnZXJTZXR0aW5ncykgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgb3V0cHV0ID0gdHJpZ2dlclNldHRpbmdzLm91dHB1dDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiYgKCFvdXRwdXQgfHwgdHlwZW9mIG91dHB1dCAhPT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3V0cHV0IGZ1bmN0b3IgaXMgbm90IGRlZmluZWQhIElmIHlvdSBhcmUgdXNpbmcgaXRlbXMgYXMgb2JqZWN0IHlvdSBoYXZlIHRvIGRlZmluZSBcIm91dHB1dFwiIGZ1bmN0aW9uLiBodHRwczovL2dpdGh1Yi5jb20vd2Vic2NvcGVpby9yZWFjdC10ZXh0YXJlYS1hdXRvY29tcGxldGUjdHJpZ2dlci10eXBlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgICAgdmFyIHRleHRUb1JlcGxhY2UgPSBvdXRwdXQoaXRlbSwgY3VycmVudFRyaWdnZXIpO1xuXG4gICAgICAgICAgaWYgKHRleHRUb1JlcGxhY2UgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdGV4dFRvUmVwbGFjZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3V0cHV0IGZ1bmN0b3Igc2hvdWxkIHJldHVybiBzdHJpbmcgb3Igb2JqZWN0IGluIHNoYXBlIHt0ZXh0OiBzdHJpbmcsIGNhcmV0UG9zaXRpb246IHN0cmluZyB8IG51bWJlcn0uXFxuR290IFxcXCJcIi5jb25jYXQoU3RyaW5nKHRleHRUb1JlcGxhY2UpLCBcIlxcXCIuIENoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdHJpZ2dlciBcXFwiXCIpLmNvbmNhdChjdXJyZW50VHJpZ2dlciwgXCJcXFwiXFxuXFxuU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzY29wZWlvL3JlYWN0LXRleHRhcmVhLWF1dG9jb21wbGV0ZSN0cmlnZ2VyLXR5cGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uXFxuXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGV4dFRvUmVwbGFjZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHRleHRUb1JlcGxhY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRleHQ6IHRleHRUb1JlcGxhY2UsXG4gICAgICAgICAgICAgIGNhcmV0UG9zaXRpb246IERFRkFVTFRfQ0FSRVRfUE9TSVRJT05cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCF0ZXh0VG9SZXBsYWNlLnRleHQgJiYgdHlwZW9mIHRleHRUb1JlcGxhY2UudGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk91dHB1dCBcXFwidGV4dFxcXCIgaXMgbm90IGRlZmluZWQhIE9iamVjdCBzaG91bGQgaGFzIHNoYXBlIHt0ZXh0OiBzdHJpbmcsIGNhcmV0UG9zaXRpb246IHN0cmluZyB8IG51bWJlcn0uIENoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdHJpZ2dlciBcXFwiXCIuY29uY2F0KGN1cnJlbnRUcmlnZ2VyLCBcIlxcXCJcXG5cIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGV4dFRvUmVwbGFjZS5jYXJldFBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPdXRwdXQgXFxcImNhcmV0UG9zaXRpb25cXFwiIGlzIG5vdCBkZWZpbmVkISBPYmplY3Qgc2hvdWxkIGhhcyBzaGFwZSB7dGV4dDogc3RyaW5nLCBjYXJldFBvc2l0aW9uOiBzdHJpbmcgfCBudW1iZXJ9LiBDaGVjayB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRyaWdnZXIgXFxcIlwiLmNvbmNhdChjdXJyZW50VHJpZ2dlciwgXCJcXFwiXFxuXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGV4dFRvUmVwbGFjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk91dHB1dCBpdGVtIHNob3VsZCBiZSBzdHJpbmdcXG5cIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRleHQ6IFwiXCIuY29uY2F0KGN1cnJlbnRUcmlnZ2VyKS5jb25jYXQoaXRlbSkuY29uY2F0KGN1cnJlbnRUcmlnZ2VyKSxcbiAgICAgICAgICBjYXJldFBvc2l0aW9uOiBERUZBVUxUX0NBUkVUX1BPU0lUSU9OXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBfdGhpczIuX2dldEN1cnJlbnRUcmlnZ2VyU2V0dGluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY3VycmVudFRyaWdnZXIgPSBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXI7XG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBfdGhpczIucHJvcHMudHJpZ2dlcltjdXJyZW50VHJpZ2dlcl07XG4gICAgfTtcblxuICAgIF90aGlzMi5fZ2V0VmFsdWVzRnJvbVByb3ZpZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzMiRzdGF0ZTIgPSBfdGhpczIuc3RhdGUsXG4gICAgICAgICAgY3VycmVudFRyaWdnZXIgPSBfdGhpczIkc3RhdGUyLmN1cnJlbnRUcmlnZ2VyLFxuICAgICAgICAgIGFjdHVhbFRva2VuID0gX3RoaXMyJHN0YXRlMi5hY3R1YWxUb2tlbjtcblxuICAgICAgdmFyIHRyaWdnZXJTZXR0aW5ncyA9IF90aGlzMi5fZ2V0Q3VycmVudFRyaWdnZXJTZXR0aW5ncygpO1xuXG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyIHx8ICF0cmlnZ2VyU2V0dGluZ3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGF0YVByb3ZpZGVyID0gdHJpZ2dlclNldHRpbmdzLmRhdGFQcm92aWRlcixcbiAgICAgICAgICBjb21wb25lbnQgPSB0cmlnZ2VyU2V0dGluZ3MuY29tcG9uZW50O1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGFQcm92aWRlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyaWdnZXIgcHJvdmlkZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24hXCIpO1xuICAgICAgfVxuXG4gICAgICBfdGhpczIuc2V0U3RhdGUoe1xuICAgICAgICBkYXRhTG9hZGluZzogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBwcm92aWRlZERhdGEgPSBkYXRhUHJvdmlkZXIoYWN0dWFsVG9rZW4pO1xuXG4gICAgICBpZiAoIShwcm92aWRlZERhdGEgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgICBwcm92aWRlZERhdGEgPSBQcm9taXNlLnJlc29sdmUocHJvdmlkZWREYXRhKTtcbiAgICAgIH1cblxuICAgICAgcHJvdmlkZWREYXRhLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJpZ2dlciBwcm92aWRlciBoYXMgdG8gcHJvdmlkZSBhbiBhcnJheSFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tcG9uZW50IHNob3VsZCBiZSBkZWZpbmVkIVwiKTtcbiAgICAgICAgfSAvLyB0aHJvdyBhd2F5IGlmIHdlIHJlc29sdmVkIG9sZCB0cmlnZ2VyXG5cblxuICAgICAgICBpZiAoY3VycmVudFRyaWdnZXIgIT09IF90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlcikgcmV0dXJuOyAvLyBpZiB3ZSBoYXZlbid0IHJlc29sdmVkIGFueSBkYXRhIGxldCdzIGNsb3NlIHRoZSBhdXRvY29tcGxldGVcblxuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgX3RoaXMyLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMyLnNldFN0YXRlKHtcbiAgICAgICAgICBkYXRhTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudFxuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2UoZS5tZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2dldFN1Z2dlc3Rpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzMiRzdGF0ZTMgPSBfdGhpczIuc3RhdGUsXG4gICAgICAgICAgY3VycmVudFRyaWdnZXIgPSBfdGhpczIkc3RhdGUzLmN1cnJlbnRUcmlnZ2VyLFxuICAgICAgICAgIGRhdGEgPSBfdGhpczIkc3RhdGUzLmRhdGE7XG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyIHx8ICFkYXRhIHx8IGRhdGEgJiYgIWRhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2NyZWF0ZVJlZ0V4cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gX3RoaXMyLnByb3BzLnRyaWdnZXI7IC8vIG5lZ2F0aXZlIGxvb2thaGVhZCB0byBtYXRjaCBvbmx5IHRoZSB0cmlnZ2VyICsgdGhlIGFjdHVhbCB0b2tlbiA9IFwiYmxhZGh3ZDphZGF3ZDp3b3JkIHRlc3RcIiA9PiBcIjp3b3JkXCJcbiAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS84MDU3ODI3LzI3MTk5MTdcblxuICAgICAgX3RoaXMyLnRva2VuUmVnRXhwID0gbmV3IFJlZ0V4cChcIihcIi5jb25jYXQoT2JqZWN0LmtleXModHJpZ2dlcikgLy8gdGhlIHNvcnQgaXMgaW1wb3J0YW50IGZvciBtdWx0aS1jaGFyIGNvbWJvcyBhcyBcIi9raWNrXCIsIFwiL1wiXG4gICAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhID4gYikge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGVSZWdleChhKTtcbiAgICAgIH0pLmpvaW4oXCJ8XCIpLCBcIikoKD86KD8hXFxcXDEpW15cXFxcc10pKiQpXCIpKTtcbiAgICAgIF90aGlzMi50b2tlblJlZ0V4cEVuZGluZyA9IG5ldyBSZWdFeHAoXCIoXCIuY29uY2F0KE9iamVjdC5rZXlzKHRyaWdnZXIpIC8vIHRoZSBzb3J0IGlzIGltcG9ydGFudCBmb3IgbXVsdGktY2hhciBjb21ib3MgYXMgXCIva2lja1wiLCBcIi9cIlxuICAgICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYSA+IGIpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gZXNjYXBlUmVnZXgoYSk7XG4gICAgICB9KS5qb2luKFwifFwiKSwgXCIpJFwiKSk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY3VycmVudFRyaWdnZXIgPSBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXI7XG5cbiAgICAgIF90aGlzMi5lc2NMaXN0ZW5lckRlc3Ryb3koKTtcblxuICAgICAgX3RoaXMyLnNldFN0YXRlKHtcbiAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgZGF0YUxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBjdXJyZW50VHJpZ2dlcjogbnVsbFxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY3VycmVudFRyaWdnZXIpIF90aGlzMi5fb25JdGVtSGlnaGxpZ2h0ZWRIYW5kbGVyKG51bGwpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fY2xlYW5VcFByb3BzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgX3RoaXMyLnByb3BzKTtcblxuICAgICAgdmFyIG5vdFNhZmUgPSBbXCJsb2FkaW5nQ29tcG9uZW50XCIsIFwiYm91bmRhcmllc0VsZW1lbnRcIiwgXCJjb250YWluZXJTdHlsZVwiLCBcIm1pbkNoYXJcIiwgXCJzY3JvbGxUb0l0ZW1cIiwgXCJyZWZcIiwgXCJpbm5lclJlZlwiLCBcIm9uQ2hhbmdlXCIsIFwib25DYXJldFBvc2l0aW9uQ2hhbmdlXCIsIFwiY2xhc3NOYW1lXCIsIFwidmFsdWVcIiwgXCJ0cmlnZ2VyXCIsIFwibGlzdFN0eWxlXCIsIFwiaXRlbVN0eWxlXCIsIFwiY29udGFpbmVyU3R5bGVcIiwgXCJsb2FkZXJTdHlsZVwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRhaW5lckNsYXNzTmFtZVwiLCBcImxpc3RDbGFzc05hbWVcIiwgXCJpdGVtQ2xhc3NOYW1lXCIsIFwibG9hZGVyQ2xhc3NOYW1lXCIsIFwiZHJvcGRvd25TdHlsZVwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwibW92ZVBvcHVwQXNZb3VUeXBlXCIsIFwidGV4dEFyZWFDb21wb25lbnRcIiwgXCJyZW5kZXJUb0JvZHlcIiwgXCJvbkl0ZW1TZWxlY3RlZFwiLCBcIm9uSXRlbUhpZ2hsaWdodGVkXCJdOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcblxuICAgICAgZm9yICh2YXIgcHJvcCBpbiBwcm9wcykge1xuICAgICAgICBpZiAobm90U2FmZS5pbmNsdWRlcyhwcm9wKSkgZGVsZXRlIHByb3BzW3Byb3BdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcblxuICAgIF90aGlzMi5fY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMyJHByb3BzID0gX3RoaXMyLnByb3BzLFxuICAgICAgICAgIHRyaWdnZXIgPSBfdGhpczIkcHJvcHMudHJpZ2dlcixcbiAgICAgICAgICBvbkNoYW5nZSA9IF90aGlzMiRwcm9wcy5vbkNoYW5nZSxcbiAgICAgICAgICBtaW5DaGFyID0gX3RoaXMyJHByb3BzLm1pbkNoYXIsXG4gICAgICAgICAgb25DYXJldFBvc2l0aW9uQ2hhbmdlID0gX3RoaXMyJHByb3BzLm9uQ2FyZXRQb3NpdGlvbkNoYW5nZSxcbiAgICAgICAgICBtb3ZlUG9wdXBBc1lvdVR5cGUgPSBfdGhpczIkcHJvcHMubW92ZVBvcHVwQXNZb3VUeXBlO1xuICAgICAgdmFyIF90aGlzMiRzdGF0ZTQgPSBfdGhpczIuc3RhdGUsXG4gICAgICAgICAgdG9wID0gX3RoaXMyJHN0YXRlNC50b3AsXG4gICAgICAgICAgbGVmdCA9IF90aGlzMiRzdGF0ZTQubGVmdDtcbiAgICAgIHZhciBldmVudCA9IGU7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgLy8gZmlyZSBvbkNoYW5nZSBldmVudCBhZnRlciBzdWNjZXNzZnVsIHNlbGVjdGlvblxuICAgICAgICBldmVudCA9IG5ldyBDdXN0b21FdmVudChcImNoYW5nZVwiLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczIudGV4dGFyZWFSZWYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0ZXh0YXJlYSA9IGV2ZW50LnRhcmdldCB8fCBfdGhpczIudGV4dGFyZWFSZWY7IC8vIGZhbGxiYWNrIHRvIHN1cHBvcnQgU2hhZG93IERPTVxuXG4gICAgICB2YXIgc2VsZWN0aW9uRW5kID0gdGV4dGFyZWEuc2VsZWN0aW9uRW5kO1xuICAgICAgdmFyIHZhbHVlID0gdGV4dGFyZWEudmFsdWU7XG4gICAgICBfdGhpczIubGFzdFZhbHVlQnViYmxlZEV2ZW50ID0gdmFsdWU7XG5cbiAgICAgIGlmIChvbkNoYW5nZSAmJiBldmVudCkge1xuICAgICAgICBldmVudC5wZXJzaXN0ICYmIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgICAgb25DaGFuZ2UobmV3IFByb3h5KGV2ZW50LCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQob3JpZ2luYWwsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJ0YXJnZXRcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGV4dGFyZWE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldChvcmlnaW5hbCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25DYXJldFBvc2l0aW9uQ2hhbmdlKSB7XG4gICAgICAgIHZhciBjYXJldFBvc2l0aW9uID0gX3RoaXMyLmdldENhcmV0UG9zaXRpb24oKTtcblxuICAgICAgICBvbkNhcmV0UG9zaXRpb25DaGFuZ2UoY2FyZXRQb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBzZXRUb3BMZWZ0ID0gZnVuY3Rpb24gc2V0VG9wTGVmdCgpIHtcbiAgICAgICAgdmFyIF9nZXRDYXJldENvb3JkaW5hdGVzID0gZ2V0Q2FyZXRDb29yZGluYXRlcyh0ZXh0YXJlYSwgc2VsZWN0aW9uRW5kKSxcbiAgICAgICAgICAgIG5ld1RvcCA9IF9nZXRDYXJldENvb3JkaW5hdGVzLnRvcCxcbiAgICAgICAgICAgIG5ld0xlZnQgPSBfZ2V0Q2FyZXRDb29yZGluYXRlcy5sZWZ0O1xuXG4gICAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgICAgLy8gbWFrZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0ZXh0YXJlYVxuICAgICAgICAgIHRvcDogbmV3VG9wIC0gX3RoaXMyLnRleHRhcmVhUmVmLnNjcm9sbFRvcCB8fCAwLFxuICAgICAgICAgIGxlZnQ6IG5ld0xlZnRcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgY2xlYW5MYXN0VHJpZ2dlciA9IGZ1bmN0aW9uIGNsZWFuTGFzdFRyaWdnZXIodHJpZ2dlckxlbmd0aCkge1xuICAgICAgICBfdGhpczIubGFzdFRyaWdnZXIgPSBzZWxlY3Rpb25FbmQgLSB0cmlnZ2VyTGVuZ3RoO1xuXG4gICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcblxuICAgICAgICBzZXRUb3BMZWZ0KCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoc2VsZWN0aW9uRW5kIDw9IF90aGlzMi5sYXN0VHJpZ2dlcikge1xuICAgICAgICB2YXIgX2FmZmVjdGVkVGV4dGFyZWFWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvbkVuZCk7XG5cbiAgICAgICAgdmFyIF9uZXdUcmlnZ2VyID0gX3RoaXMyLnRva2VuUmVnRXhwLmV4ZWMoX2FmZmVjdGVkVGV4dGFyZWFWYWx1ZSk7XG5cbiAgICAgICAgY2xlYW5MYXN0VHJpZ2dlcihfbmV3VHJpZ2dlciA/IF9uZXdUcmlnZ2VyWzBdLmxlbmd0aCA6IDApO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWZmZWN0ZWRUZXh0YXJlYVZhbHVlID0gdmFsdWUuc2xpY2UoX3RoaXMyLmxhc3RUcmlnZ2VyLCBzZWxlY3Rpb25FbmQpO1xuXG4gICAgICB2YXIgdG9rZW5NYXRjaCA9IF90aGlzMi50b2tlblJlZ0V4cC5leGVjKGFmZmVjdGVkVGV4dGFyZWFWYWx1ZSk7XG5cbiAgICAgIHZhciBsYXN0VG9rZW4gPSB0b2tlbk1hdGNoICYmIHRva2VuTWF0Y2hbMF07XG4gICAgICB2YXIgY3VycmVudFRyaWdnZXIgPSB0b2tlbk1hdGNoICYmIHRva2VuTWF0Y2hbMV0gfHwgbnVsbDtcbiAgICAgIHZhciBjdXJyZW50VHJpZ2dlckxlbmd0aCA9IGN1cnJlbnRUcmlnZ2VyID8gY3VycmVudFRyaWdnZXIubGVuZ3RoIC0gMSA6IDA7IC8vIHdpdGggdGhpcyBhcHByb2FjaCB3ZSB3YW50IHRvIGtub3cgaWYgdGhlIHVzZXIganVzdCBpbnNlcnRlZCBhIG5ldyB0cmlnZ2VyIHNlcXVlbmNlXG5cbiAgICAgIHZhciBuZXdUcmlnZ2VyID0gX3RoaXMyLnRva2VuUmVnRXhwRW5kaW5nLmV4ZWMoYWZmZWN0ZWRUZXh0YXJlYVZhbHVlKTtcblxuICAgICAgaWYgKG5ld1RyaWdnZXIpIHtcbiAgICAgICAgY2xlYW5MYXN0VHJpZ2dlcihuZXdUcmlnZ2VyWzBdLmxlbmd0aCk7XG4gICAgICB9IGVsc2UgaWYgKCFfdGhpczIuX2lzQXV0b2NvbXBsZXRlT3BlbigpKSB7XG4gICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICAgIC8qXG4gICAgICAgaWYgd2UgbG9zdCB0aGUgdHJpZ2dlciB0b2tlbiBvciB0aGVyZSBpcyBubyBmb2xsb3dpbmcgY2hhcmFjdGVyIHdlIHdhbnQgdG8gY2xvc2VcbiAgICAgICB0aGUgYXV0b2NvbXBsZXRlXG4gICAgICAqL1xuXG5cbiAgICAgIGlmICgoIWxhc3RUb2tlbiB8fCBsYXN0VG9rZW4ubGVuZ3RoIDw9IG1pbkNoYXIgKyBjdXJyZW50VHJpZ2dlckxlbmd0aCkgJiYgKCAvLyBjaGVjayBpZiBvdXIgY3VycmVudCB0cmlnZ2VyIGRpc2FsbG93cyB3aGl0ZXNwYWNlXG4gICAgICBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXIgJiYgIXRyaWdnZXJbX3RoaXMyLnN0YXRlLmN1cnJlbnRUcmlnZ2VyXS5hbGxvd1doaXRlc3BhY2UgfHwgIV90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlcikpIHtcbiAgICAgICAgX3RoaXMyLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBjb2RlIGhhcyB0byBiZSBzeW5jIHRoYXQgaXMgdGhlIHJlYXNvbiB3aHkgd2Ugb2J0YWluIHRoZSBjdXJyZW50VHJpZ2dlclxuICAgICAgICogZnJvbSBjdXJyZW50VHJpZ2dlciBub3QgdGhpcy5zdGF0ZS5jdXJyZW50VHJpZ2dlclxuICAgICAgICpcbiAgICAgICAqIENoZWNrIGlmIHRoZSBjdXJyZW50bHkgdHlwZWQgdG9rZW4gaGFzIHRvIGJlIGFmdGVyV2hpdGVzcGFjZSwgb3Igbm90LlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgc2V0dGluZyBtZWFucyB0aGF0IHRoZXJlIGhhcyB0byBiZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgdG9rZW4gKG9uIGl0IGhhcyB0byBiZSB0aGUgdGhlIGZpcnN0IGNoYXJhY3RlciB0eXBlZCBpbnRvIHRleHRhcmVhKVxuICAgICAgICovXG5cblxuICAgICAgaWYgKGN1cnJlbnRUcmlnZ2VyICYmIHRyaWdnZXJbY3VycmVudFRyaWdnZXJdLmFmdGVyV2hpdGVzcGFjZSAmJiAhL1xccy8udGVzdCh2YWx1ZVtzZWxlY3Rpb25FbmQgLSBsYXN0VG9rZW4ubGVuZ3RoIC0gMV0pICYmIHZhbHVlW3NlbGVjdGlvbkVuZCAtIGxhc3RUb2tlbi5sZW5ndGggLSAxXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAgSWYgb3VyIGN1cnJlbnQgdHJpZ2dlciBhbGxvd3Mgd2hpdGVzcGFjZVxuICAgICAgICBnZXQgdGhlIGNvcnJlY3QgdG9rZW4gZm9yIERhdGFQcm92aWRlciwgc28gd2UgbmVlZCB0byBjb25zdHJ1Y3QgbmV3IFJlZ0V4cFxuICAgICAgICovXG5cblxuICAgICAgaWYgKF90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlciAmJiB0cmlnZ2VyW190aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlcl0uYWxsb3dXaGl0ZXNwYWNlKSB7XG4gICAgICAgIHRva2VuTWF0Y2ggPSBuZXcgUmVnRXhwKFwiXCIuY29uY2F0KGVzY2FwZVJlZ2V4KF90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlciksIFwiLiokXCIpKS5leGVjKHZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvbkVuZCkpO1xuICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbk1hdGNoICYmIHRva2VuTWF0Y2hbMF07XG5cbiAgICAgICAgaWYgKCFsYXN0VG9rZW4pIHtcbiAgICAgICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJpZ2dlciA9IE9iamVjdC5rZXlzKHRyaWdnZXIpLmZpbmQoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICByZXR1cm4gYS5zbGljZSgwLCBjdXJyZW50VHJpZ2dlckxlbmd0aCArIDEpID09PSBsYXN0VG9rZW4uc2xpY2UoMCwgY3VycmVudFRyaWdnZXJMZW5ndGggKyAxKTtcbiAgICAgICAgfSkgfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjdHVhbFRva2VuID0gbGFzdFRva2VuLnNsaWNlKDEpOyAvLyBpZiB0cmlnZ2VyIGlzIG5vdCBjb25maWd1cmVkIHN0ZXAgb3V0IGZyb20gdGhlIGZ1bmN0aW9uLCBvdGhlcndpc2UgcHJvY2VlZFxuXG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vdmVQb3B1cEFzWW91VHlwZSB8fCB0b3AgPT09IG51bGwgJiYgbGVmdCA9PT0gbnVsbCB8fCAvLyBpZiB0aGUgdHJpZ2dlciBnb3QgY2hhbmdlZCwgbGV0J3MgcmVwb3NpdGlvbiB0aGUgYXV0b2NvbXBsZXRlXG4gICAgICBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXIgIT09IGN1cnJlbnRUcmlnZ2VyKSB7XG4gICAgICAgIHNldFRvcExlZnQoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMyLmVzY0xpc3RlbmVySW5pdCgpO1xuXG4gICAgICB2YXIgdGV4dFRvUmVwbGFjZSA9IF90aGlzMi5fZ2V0VGV4dFRvUmVwbGFjZShjdXJyZW50VHJpZ2dlcik7XG5cbiAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGlvbkVuZDogc2VsZWN0aW9uRW5kLFxuICAgICAgICBjdXJyZW50VHJpZ2dlcjogY3VycmVudFRyaWdnZXIsXG4gICAgICAgIHRleHRUb1JlcGxhY2U6IHRleHRUb1JlcGxhY2UsXG4gICAgICAgIGFjdHVhbFRva2VuOiBhY3R1YWxUb2tlblxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF90aGlzMi5fZ2V0VmFsdWVzRnJvbVByb3ZpZGVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGVycm9yTWVzc2FnZShlcnIubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpczIuX3NlbGVjdEhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzMiRwcm9wczIgPSBfdGhpczIucHJvcHMsXG4gICAgICAgICAgb25DYXJldFBvc2l0aW9uQ2hhbmdlID0gX3RoaXMyJHByb3BzMi5vbkNhcmV0UG9zaXRpb25DaGFuZ2UsXG4gICAgICAgICAgb25TZWxlY3QgPSBfdGhpczIkcHJvcHMyLm9uU2VsZWN0O1xuXG4gICAgICBpZiAob25DYXJldFBvc2l0aW9uQ2hhbmdlKSB7XG4gICAgICAgIHZhciBjYXJldFBvc2l0aW9uID0gX3RoaXMyLmdldENhcmV0UG9zaXRpb24oKTtcblxuICAgICAgICBvbkNhcmV0UG9zaXRpb25DaGFuZ2UoY2FyZXRQb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgb25TZWxlY3QoZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzMi5fc2hvdWxkU3RheU9wZW4gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGVsID0gZS5yZWxhdGVkVGFyZ2V0OyAvLyBJRTExIGRvZXNuJ3Qga25vdyBhYm91dCBgcmVsYXRlZFRhcmdldGAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ5MzI1MTk2LzI3MTk5MTdcblxuICAgICAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgICAgIGVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMi5kcm9wZG93blJlZiAmJiBlbCBpbnN0YW5jZW9mIE5vZGUgJiYgX3RoaXMyLmRyb3Bkb3duUmVmLmNvbnRhaW5zKGVsKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBfdGhpczIuX29uQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uQ2xpY2sgPSBfdGhpczIucHJvcHMub25DbGljaztcblxuICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIG9uQ2xpY2soZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczIuX3Nob3VsZFN0YXlPcGVuKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMyLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuICAgIH07XG5cbiAgICBfdGhpczIuX29uQmx1ciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25CbHVyID0gX3RoaXMyLnByb3BzLm9uQmx1cjtcblxuICAgICAgaWYgKG9uQmx1cikge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgb25CbHVyKGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMyLl9zaG91bGRTdGF5T3BlbihlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9vblNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fb25JdGVtSGlnaGxpZ2h0ZWRIYW5kbGVyID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBvbkl0ZW1IaWdobGlnaHRlZCA9IF90aGlzMi5wcm9wcy5vbkl0ZW1IaWdobGlnaHRlZDtcbiAgICAgIHZhciBjdXJyZW50VHJpZ2dlciA9IF90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlcjtcblxuICAgICAgaWYgKG9uSXRlbUhpZ2hsaWdodGVkKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb25JdGVtSGlnaGxpZ2h0ZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uSXRlbUhpZ2hsaWdodGVkKHtcbiAgICAgICAgICAgIGN1cnJlbnRUcmlnZ2VyOiBjdXJyZW50VHJpZ2dlcixcbiAgICAgICAgICAgIGl0ZW06IGl0ZW1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgb25JdGVtSGlnaGxpZ2h0ZWRgIGhhcyB0byBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzMi5fZHJvcGRvd25TY3JvbGwgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIHNjcm9sbFRvSXRlbSA9IF90aGlzMi5wcm9wcy5zY3JvbGxUb0l0ZW07XG4gICAgICBpZiAoIXNjcm9sbFRvSXRlbSkgcmV0dXJuO1xuXG4gICAgICBpZiAoc2Nyb2xsVG9JdGVtID09PSB0cnVlKSB7XG4gICAgICAgIGRlZmF1bHRTY3JvbGxUb0l0ZW0oX3RoaXMyLmRyb3Bkb3duUmVmLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjcm9sbFRvSXRlbSAhPT0gXCJmdW5jdGlvblwiIHx8IHNjcm9sbFRvSXRlbS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYHNjcm9sbFRvSXRlbWAgaGFzIHRvIGJlIGJvb2xlYW4gKHRydWUgZm9yIGRlZmF1bHQgaW1wbGVtZW50YXRpb24pIG9yIGZ1bmN0aW9uIHdpdGggdHdvIHBhcmFtZXRlcnM6IGNvbnRhaW5lciwgaXRlbS5cIik7XG4gICAgICB9XG5cbiAgICAgIHNjcm9sbFRvSXRlbShfdGhpczIuZHJvcGRvd25SZWYsIGl0ZW0pO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2lzQXV0b2NvbXBsZXRlT3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpczIkc3RhdGU1ID0gX3RoaXMyLnN0YXRlLFxuICAgICAgICAgIGRhdGFMb2FkaW5nID0gX3RoaXMyJHN0YXRlNS5kYXRhTG9hZGluZyxcbiAgICAgICAgICBjdXJyZW50VHJpZ2dlciA9IF90aGlzMiRzdGF0ZTUuY3VycmVudFRyaWdnZXI7XG5cbiAgICAgIHZhciBzdWdnZXN0aW9uRGF0YSA9IF90aGlzMi5fZ2V0U3VnZ2VzdGlvbnMoKTtcblxuICAgICAgcmV0dXJuICEhKChkYXRhTG9hZGluZyB8fCBzdWdnZXN0aW9uRGF0YSkgJiYgY3VycmVudFRyaWdnZXIpO1xuICAgIH07XG5cbiAgICBfdGhpczIuX3RleHRhcmVhUmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgLy8gJEZsb3dGaXhNZSAtIHJlZiBpcyBhY3R1YWxseSBhIGA/SFRNTFRleHRBcmVhRWxlbWVudGBcbiAgICAgIF90aGlzMi5wcm9wcy5pbm5lclJlZiAmJiBfdGhpczIucHJvcHMuaW5uZXJSZWYocmVmKTtcbiAgICAgIF90aGlzMi50ZXh0YXJlYVJlZiA9IHJlZjtcbiAgICB9O1xuXG4gICAgX3RoaXMyLmxhc3RUcmlnZ2VyID0gMDtcbiAgICBfdGhpczIuZXNjTGlzdGVuZXIgPSBudWxsO1xuICAgIHZhciBfdGhpczIkcHJvcHMzID0gX3RoaXMyLnByb3BzLFxuICAgICAgICBsb2FkaW5nQ29tcG9uZW50ID0gX3RoaXMyJHByb3BzMy5sb2FkaW5nQ29tcG9uZW50LFxuICAgICAgICBfdHJpZ2dlciA9IF90aGlzMiRwcm9wczMudHJpZ2dlcixcbiAgICAgICAgX3ZhbHVlID0gX3RoaXMyJHByb3BzMy52YWx1ZTtcbiAgICBpZiAoX3ZhbHVlKSBfdGhpczIuc3RhdGUudmFsdWUgPSBfdmFsdWU7XG5cbiAgICBfdGhpczIuX2NyZWF0ZVJlZ0V4cCgpO1xuXG4gICAgaWYgKCFsb2FkaW5nQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSVEE6IGxvYWRpbmdDb21wb25lbnQgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKCFfdHJpZ2dlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUlRBOiB0cmlnZ2VyIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpczI7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmVhY3RUZXh0YXJlYUF1dG9jb21wbGV0ZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBMaXN0ZW5lcnMuc3RhcnRMaXN0ZW4odGhpcy50ZXh0YXJlYVJlZik7IC8vIGhhbmRsZSBjYXJldCBjaGFuZ2VcblxuICAgICAgdGhpcy50ZXh0YXJlYVJlZiAmJiB0aGlzLnRleHRhcmVhUmVmLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLl9oYW5kbGVDYXJldENoYW5nZSk7XG4gICAgICB0aGlzLnRleHRhcmVhUmVmICYmIHRoaXMudGV4dGFyZWFSZWYuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZUNhcmV0Q2hhbmdlKTtcbiAgICAgIHRoaXMudGV4dGFyZWFSZWYgJiYgdGhpcy50ZXh0YXJlYVJlZi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLl9oYW5kbGVDYXJldENoYW5nZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoX3JlZjIpIHtcbiAgICAgIHZhciBvbGRUcmlnZ2VyID0gX3JlZjIudHJpZ2dlcixcbiAgICAgICAgICBvbGRWYWx1ZSA9IF9yZWYyLnZhbHVlO1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdHJpZ2dlciA9IF90aGlzJHByb3BzMi50cmlnZ2VyLFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkcHJvcHMyLnZhbHVlO1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXModHJpZ2dlcikuam9pbihcIlwiKSAhPT0gT2JqZWN0LmtleXMob2xkVHJpZ2dlcikuam9pbihcIlwiKSkge1xuICAgICAgICB0aGlzLl9jcmVhdGVSZWdFeHAoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZFZhbHVlICE9PSB2YWx1ZSAmJiB0aGlzLmxhc3RWYWx1ZUJ1YmJsZWRFdmVudCAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5sYXN0VHJpZ2dlciA9IDA7XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlSGFuZGxlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuZXNjTGlzdGVuZXJEZXN0cm95KCk7XG4gICAgICBMaXN0ZW5lcnMuc3RvcExpc3Rlbih0aGlzLnRleHRhcmVhUmVmKTsgLy8gaGFuZGxlIGNhcmV0IGNoYW5nZVxuXG4gICAgICB0aGlzLnRleHRhcmVhUmVmICYmIHRoaXMudGV4dGFyZWFSZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuX2hhbmRsZUNhcmV0Q2hhbmdlKTtcbiAgICAgIHRoaXMudGV4dGFyZWFSZWYgJiYgdGhpcy50ZXh0YXJlYVJlZi5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGFuZGxlQ2FyZXRDaGFuZ2UpO1xuICAgICAgdGhpcy50ZXh0YXJlYVJlZiAmJiB0aGlzLnRleHRhcmVhUmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuX2hhbmRsZUNhcmV0Q2hhbmdlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBMb2FkZXIgPSBfdGhpcyRwcm9wczMubG9hZGluZ0NvbXBvbmVudCxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMy5zdHlsZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczMuY2xhc3NOYW1lLFxuICAgICAgICAgIGxpc3RTdHlsZSA9IF90aGlzJHByb3BzMy5saXN0U3R5bGUsXG4gICAgICAgICAgaXRlbVN0eWxlID0gX3RoaXMkcHJvcHMzLml0ZW1TdHlsZSxcbiAgICAgICAgICBib3VuZGFyaWVzRWxlbWVudCA9IF90aGlzJHByb3BzMy5ib3VuZGFyaWVzRWxlbWVudCxcbiAgICAgICAgICBtb3ZlUG9wdXBBc1lvdVR5cGUgPSBfdGhpcyRwcm9wczMubW92ZVBvcHVwQXNZb3VUeXBlLFxuICAgICAgICAgIGxpc3RDbGFzc05hbWUgPSBfdGhpcyRwcm9wczMubGlzdENsYXNzTmFtZSxcbiAgICAgICAgICBpdGVtQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMzLml0ZW1DbGFzc05hbWUsXG4gICAgICAgICAgZHJvcGRvd25DbGFzc05hbWUgPSBfdGhpcyRwcm9wczMuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgICAgICAgZHJvcGRvd25TdHlsZSA9IF90aGlzJHByb3BzMy5kcm9wZG93blN0eWxlLFxuICAgICAgICAgIGNvbnRhaW5lclN0eWxlID0gX3RoaXMkcHJvcHMzLmNvbnRhaW5lclN0eWxlLFxuICAgICAgICAgIGNvbnRhaW5lckNsYXNzTmFtZSA9IF90aGlzJHByb3BzMy5jb250YWluZXJDbGFzc05hbWUsXG4gICAgICAgICAgbG9hZGVyU3R5bGUgPSBfdGhpcyRwcm9wczMubG9hZGVyU3R5bGUsXG4gICAgICAgICAgbG9hZGVyQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMzLmxvYWRlckNsYXNzTmFtZSxcbiAgICAgICAgICB0ZXh0QXJlYUNvbXBvbmVudCA9IF90aGlzJHByb3BzMy50ZXh0QXJlYUNvbXBvbmVudCxcbiAgICAgICAgICByZW5kZXJUb0JvZHkgPSBfdGhpcyRwcm9wczMucmVuZGVyVG9Cb2R5O1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBsZWZ0ID0gX3RoaXMkc3RhdGUubGVmdCxcbiAgICAgICAgICB0b3AgPSBfdGhpcyRzdGF0ZS50b3AsXG4gICAgICAgICAgZGF0YUxvYWRpbmcgPSBfdGhpcyRzdGF0ZS5kYXRhTG9hZGluZyxcbiAgICAgICAgICBjb21wb25lbnQgPSBfdGhpcyRzdGF0ZS5jb21wb25lbnQsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRzdGF0ZS52YWx1ZSxcbiAgICAgICAgICB0ZXh0VG9SZXBsYWNlID0gX3RoaXMkc3RhdGUudGV4dFRvUmVwbGFjZTtcblxuICAgICAgdmFyIGlzQXV0b2NvbXBsZXRlT3BlbiA9IHRoaXMuX2lzQXV0b2NvbXBsZXRlT3BlbigpO1xuXG4gICAgICB2YXIgc3VnZ2VzdGlvbkRhdGEgPSB0aGlzLl9nZXRTdWdnZXN0aW9ucygpO1xuXG4gICAgICB2YXIgZXh0cmFBdHRycyA9IHt9O1xuICAgICAgdmFyIFRleHRBcmVhQ29tcG9uZW50O1xuXG4gICAgICBpZiAodGV4dEFyZWFDb21wb25lbnQuY29tcG9uZW50KSB7XG4gICAgICAgIFRleHRBcmVhQ29tcG9uZW50ID0gdGV4dEFyZWFDb21wb25lbnQuY29tcG9uZW50O1xuICAgICAgICBleHRyYUF0dHJzW3RleHRBcmVhQ29tcG9uZW50LnJlZl0gPSB0aGlzLl90ZXh0YXJlYVJlZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFRleHRBcmVhQ29tcG9uZW50ID0gdGV4dEFyZWFDb21wb25lbnQ7XG4gICAgICAgIGV4dHJhQXR0cnMucmVmID0gdGhpcy5fdGV4dGFyZWFSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YSBcIi5jb25jYXQoZGF0YUxvYWRpbmcgPT09IHRydWUgPyBcInJ0YS0tbG9hZGluZ1wiIDogXCJcIiwgXCIgXCIpLmNvbmNhdChjb250YWluZXJDbGFzc05hbWUgfHwgXCJcIiksXG4gICAgICAgIHN0eWxlOiBjb250YWluZXJTdHlsZVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0QXJlYUNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY2xlYW5VcFByb3BzKCksIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YV9fdGV4dGFyZWEgXCIuY29uY2F0KGNsYXNzTmFtZSB8fCBcIlwiKSxcbiAgICAgICAgb25DaGFuZ2U6IHRoaXMuX2NoYW5nZUhhbmRsZXIsXG4gICAgICAgIG9uU2VsZWN0OiB0aGlzLl9zZWxlY3RIYW5kbGVyLFxuICAgICAgICBvblNjcm9sbDogdGhpcy5fb25TY3JvbGxIYW5kbGVyLFxuICAgICAgICBvbkNsaWNrOiAvLyBUaGUgdGV4dGFyZWEgaXRzZWxmIGlzIG91dHNpZGUgdGhlIGF1dG9zZWxlY3QgZHJvcGRvd24uXG4gICAgICAgIHRoaXMuX29uQ2xpY2ssXG4gICAgICAgIG9uQmx1cjogdGhpcy5fb25CbHVyLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgZXh0cmFBdHRycykpLCBpc0F1dG9jb21wbGV0ZU9wZW4gJiYgUmVhY3QuY3JlYXRlRWxlbWVudChBdXRvY29tcGxldGUsIHtcbiAgICAgICAgaW5uZXJSZWY6IGZ1bmN0aW9uIGlubmVyUmVmKHJlZikge1xuICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICBfdGhpczMuZHJvcGRvd25SZWYgPSByZWY7XG4gICAgICAgIH0sXG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICBzdHlsZTogZHJvcGRvd25TdHlsZSxcbiAgICAgICAgY2xhc3NOYW1lOiBkcm9wZG93bkNsYXNzTmFtZSxcbiAgICAgICAgbW92ZVBvcHVwQXNZb3VUeXBlOiBtb3ZlUG9wdXBBc1lvdVR5cGUsXG4gICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiBib3VuZGFyaWVzRWxlbWVudCxcbiAgICAgICAgdGV4dGFyZWFSZWY6IHRoaXMudGV4dGFyZWFSZWYsXG4gICAgICAgIHJlbmRlclRvQm9keTogcmVuZGVyVG9Cb2R5XG4gICAgICB9LCBzdWdnZXN0aW9uRGF0YSAmJiBjb21wb25lbnQgJiYgdGV4dFRvUmVwbGFjZSAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KExpc3QsIHtcbiAgICAgICAgdmFsdWVzOiBzdWdnZXN0aW9uRGF0YSxcbiAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgIHN0eWxlOiBsaXN0U3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZTogbGlzdENsYXNzTmFtZSxcbiAgICAgICAgaXRlbUNsYXNzTmFtZTogaXRlbUNsYXNzTmFtZSxcbiAgICAgICAgaXRlbVN0eWxlOiBpdGVtU3R5bGUsXG4gICAgICAgIGdldFRleHRUb1JlcGxhY2U6IHRleHRUb1JlcGxhY2UsXG4gICAgICAgIG9uSXRlbUhpZ2hsaWdodGVkOiB0aGlzLl9vbkl0ZW1IaWdobGlnaHRlZEhhbmRsZXIsXG4gICAgICAgIG9uU2VsZWN0OiB0aGlzLl9vblNlbGVjdCxcbiAgICAgICAgZHJvcGRvd25TY3JvbGw6IHRoaXMuX2Ryb3Bkb3duU2Nyb2xsXG4gICAgICB9KSwgZGF0YUxvYWRpbmcgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJydGFfX2xvYWRlciBcIi5jb25jYXQoc3VnZ2VzdGlvbkRhdGEgIT09IG51bGwgPyBcInJ0YV9fbG9hZGVyLS1zdWdnZXN0aW9uLWRhdGFcIiA6IFwicnRhX19sb2FkZXItLWVtcHR5LXN1Z2dlc3Rpb24tZGF0YVwiLCBcIiBcIikuY29uY2F0KGxvYWRlckNsYXNzTmFtZSB8fCBcIlwiKSxcbiAgICAgICAgc3R5bGU6IGxvYWRlclN0eWxlXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KExvYWRlciwge1xuICAgICAgICBkYXRhOiBzdWdnZXN0aW9uRGF0YVxuICAgICAgfSkpKSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhfcmVmMykge1xuICAgICAgdmFyIHZhbHVlID0gX3JlZjMudmFsdWU7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUuZGVmYXVsdFByb3BzID0ge1xuICBtb3ZlUG9wdXBBc1lvdVR5cGU6IGZhbHNlLFxuICB2YWx1ZTogbnVsbCxcbiAgbWluQ2hhcjogMSxcbiAgYm91bmRhcmllc0VsZW1lbnQ6IFwiYm9keVwiLFxuICBzY3JvbGxUb0l0ZW06IHRydWUsXG4gIHRleHRBcmVhQ29tcG9uZW50OiBcInRleHRhcmVhXCIsXG4gIHJlbmRlclRvQm9keTogZmFsc2Vcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGU7XG4iLCIvLyBDcmVkaXRzIGdvIHRvIExpYW0ncyBQZXJpb2RpYyBOb3RlcyBQbHVnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9saWFtY2Fpbi9vYnNpZGlhbi1wZXJpb2RpYy1ub3Rlc1xyXG4vLyBpbXBvcnQgeyBUZXh0SW5wdXRTdWdnZXN0IH0gZnJvbSBcIi4vb2JTdWdnZXN0XCI7XHJcbmltcG9ydCBtZW1vU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9tZW1vU2VydmljZSc7XHJcbmltcG9ydCBkYWlseU5vdGVzU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZSc7XHJcbmltcG9ydCB7VXNlVmF1bHRUYWdzfSBmcm9tICcuLi9tZW1vcyc7XHJcblxyXG5jb25zdCBldFRhZ3MgPSAoKTogc3RyaW5nW10gPT4ge1xyXG4gIGNvbnN0IHthcHB9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcclxuICAvL0B0cy1leHBlY3QtZXJyb3IsIHByaXZhdGUgbWV0aG9kXHJcbiAgY29uc3QgdGFnczogYW55ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0VGFncygpO1xyXG4gIHJldHVybiBbLi4uT2JqZWN0LmtleXModGFncyldLm1hcCgocCkgPT4gcC5zcGxpdCgnIycpLnBvcCgpKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCB1c2VkVGFncyA9IChzZWxldGVjVGV4dDogc3RyaW5nKSA9PiB7XHJcbiAgbGV0IGFsbFRhZ3M7XHJcblxyXG4gIGlmIChVc2VWYXVsdFRhZ3MpIHtcclxuICAgIGFsbFRhZ3MgPSBldFRhZ3MoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3Qge3RhZ3N9ID0gbWVtb1NlcnZpY2UuZ2V0U3RhdGUoKTtcclxuICAgIGFsbFRhZ3MgPSB0YWdzO1xyXG4gIH1cclxuICBjb25zdCBsb3dlckNhc2VJbnB1dFN0ciA9IHNlbGV0ZWNUZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgY29uc3QgdXNlZFRhZ3MgPSBbXSBhcyBhbnk7XHJcblxyXG4gIGFsbFRhZ3MuZm9yRWFjaCgodGFnOiBzdHJpbmcpID0+IHtcclxuICAgIGlmICh0YWcgJiYgdGFnLnRvTG93ZXJDYXNlKCkuY29udGFpbnMobG93ZXJDYXNlSW5wdXRTdHIpKSB7XHJcbiAgICAgIHVzZWRUYWdzLnB1c2goe1xyXG4gICAgICAgIG5hbWU6IHRhZyBhcyBzdHJpbmcsXHJcbiAgICAgICAgY2hhcjogdGFnIGFzIHN0cmluZyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiB1c2VkVGFncztcclxufTtcclxuIiwiLy8gQ3JlZGl0cyBnbyB0byBMaWFtJ3MgUGVyaW9kaWMgTm90ZXMgUGx1Z2luOiBodHRwczovL2dpdGh1Yi5jb20vbGlhbWNhaW4vb2JzaWRpYW4tcGVyaW9kaWMtbm90ZXNcbmltcG9ydCB7VEFic3RyYWN0RmlsZSwgVEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBkYWlseU5vdGVzU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBnZXRTdWdnZXN0aW9ucyA9IChpbnB1dFN0cjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHthcHB9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcblxuICBjb25zdCBhYnN0cmFjdEZpbGVzID0gYXBwLnZhdWx0LmdldEFsbExvYWRlZEZpbGVzKCk7XG4gIC8vIGNvbnN0IGZpbGVzOiBURmlsZVtdID0gW107XG4gIGNvbnN0IGZpbGVzID0gW10gYXMgYW55O1xuXG4gIGxldCBhY3R1YWxJbnB1dDogc3RyaW5nO1xuXG4gIGFic3RyYWN0RmlsZXMuZm9yRWFjaCgoZmlsZTogVEFic3RyYWN0RmlsZSkgPT4ge1xuICAgIGlmIChpbnB1dFN0ciA9PT0gJ1snKSB7XG4gICAgICBhY3R1YWxJbnB1dCA9ICcnO1xuICAgICAgY29uc3QgbG93ZXJDYXNlSW5wdXRTdHIgPSBhY3R1YWxJbnB1dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlIGluc3RhbmNlb2YgVEZpbGUgJiZcbiAgICAgICAgKGZpbGUuZXh0ZW5zaW9uID09PSAnbWQnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdwbmcnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdqcGcnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdqcGVnJyB8fFxuICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID09PSAnZ2lmJykgJiZcbiAgICAgICAgZmlsZS5wYXRoLnRvTG93ZXJDYXNlKCkuY29udGFpbnMobG93ZXJDYXNlSW5wdXRTdHIpXG4gICAgICApIHtcbiAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZmlsZS5iYXNlbmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgY2hhcjogZmlsZS5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBmaWxlOiBmaWxlIGFzIFRGaWxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlucHV0U3RyLmNvbnRhaW5zKCdbJykpIHtcbiAgICAgIGFjdHVhbElucHV0ID0gaW5wdXRTdHIuc2xpY2UoMSk7XG4gICAgICBjb25zdCBsb3dlckNhc2VJbnB1dFN0ciA9IGFjdHVhbElucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGUgaW5zdGFuY2VvZiBURmlsZSAmJlxuICAgICAgICAoZmlsZS5leHRlbnNpb24gPT09ICdtZCcgfHxcbiAgICAgICAgICBmaWxlLmV4dGVuc2lvbiA9PT0gJ3BuZycgfHxcbiAgICAgICAgICBmaWxlLmV4dGVuc2lvbiA9PT0gJ2pwZycgfHxcbiAgICAgICAgICBmaWxlLmV4dGVuc2lvbiA9PT0gJ2pwZWcnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdnaWYnKSAmJlxuICAgICAgICBmaWxlLnBhdGgudG9Mb3dlckNhc2UoKS5jb250YWlucyhsb3dlckNhc2VJbnB1dFN0cilcbiAgICAgICkge1xuICAgICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBmaWxlLmJhc2VuYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBjaGFyOiBmaWxlLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGZpbGU6IGZpbGUgYXMgVEZpbGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZpbGVzO1xufTtcbiIsIi8vINin2YTYudix2KjZitipXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gxI1lxaF0aW5hXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gRGFuc2tcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHt9O1xyXG4iLCIvLyBEZXV0c2NoXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gRW5nbGlzaFxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIC8vIHNldHRpbmcudHNcclxuICB3ZWxjb21lOiAnV2VsY29tZSB0byB0aGUgTWVtb3MnLFxyXG4gIHJpYmJvbkljb25UaXRsZTogJ01lbW9zJyxcclxuICB0bzogJ3RvJyxcclxuICBtb250aHM6IFtcclxuICAgICdKYW51YXJ5JyxcclxuICAgICdGZWJydWFyeScsXHJcbiAgICAnTWFyY2gnLFxyXG4gICAgJ0FwcmlsJyxcclxuICAgICdNYXknLFxyXG4gICAgJ0p1bmUnLFxyXG4gICAgJ0p1bHknLFxyXG4gICAgJ0F1Z3VzdCcsXHJcbiAgICAnU2VwdGVtYmVyJyxcclxuICAgICdPY3RvYmVyJyxcclxuICAgICdOb3ZlbWJlcicsXHJcbiAgICAnRGVjZW1iZXInLFxyXG4gIF0sXHJcbiAgbW9udGhzU2hvcnQ6IFsnSmFuLicsICdGZWIuJywgJ01hci4nLCAnQXByLicsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Zy4nLCAnU2VwdC4nLCAnT2N0LicsICdOb3YuJywgJ0RlYy4nXSxcclxuICB3ZWVrRGF5czogWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddLFxyXG4gIHdlZWtEYXlzU2hvcnQ6IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXHJcbiAgeWVhcjogbnVsbCxcclxuICBtb250aDogbnVsbCxcclxuICAnQmFzaWMgT3B0aW9ucyc6ICdCYXNpYyBPcHRpb25zJyxcclxuICAnVXNlciBuYW1lIGluIE1lbW9zJzogJ1VzZXIgbmFtZSBpbiBNZW1vcycsXHJcbiAgXCJTZXQgeW91ciB1c2VyIG5hbWUgaGVyZS4gJ01lbW9zIPCfmI8nIEJ5IGRlZmF1bHRcIjogXCJTZXQgeW91ciB1c2VyIG5hbWUgaGVyZS4gJ01lbW9zIPCfmI8nIEJ5IGRlZmF1bHRcIixcclxuICAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnOiAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnLFxyXG4gICdZb3Ugc2hvdWxkIHNldCB0aGUgc2FtZSBoZWFkaW5nIGJlbG93IGlmIHlvdSB3YW50IHRvIGluc2VydCBhbmQgcHJvY2VzcyBtZW1vcyBiZWxvdyB0aGUgc2FtZSBoZWFkaW5nLic6XHJcbiAgICAnWW91IHNob3VsZCBzZXQgdGhlIHNhbWUgaGVhZGluZyBiZWxvdyBpZiB5b3Ugd2FudCB0byBpbnNlcnQgYW5kIHByb2Nlc3MgbWVtb3MgYmVsb3cgdGhlIHNhbWUgaGVhZGluZy4nLFxyXG4gICdBbGxvd3MgYWRtb25pdGlvbnMgdG8gYmUgY3JlYXRlZCB1c2luZyAnOiAnQWxsb3dzIGFkbW9uaXRpb25zIHRvIGJlIGNyZWF0ZWQgdXNpbmcgJyxcclxuICAnUHJvY2VzcyBNZW1vcyBiZWxvdyc6ICdQcm9jZXNzIE1lbW9zIGJlbG93JyxcclxuICAnT25seSBlbnRyaWVzIGJlbG93IHRoaXMgc3RyaW5nL3NlY3Rpb24gaW4geW91ciBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgaXQgZG9lcyBub3QgZXhpc3Qgbm8gbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoYXQgZmlsZS4nOlxyXG4gICAgJ09ubHkgZW50cmllcyBiZWxvdyB0aGlzIHN0cmluZy9zZWN0aW9uIGluIHlvdXIgbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQuIElmIGl0IGRvZXMgbm90IGV4aXN0IG5vIG5vdGVzIHdpbGwgYmUgcHJvY2Vzc2VkIGZvciB0aGF0IGZpbGUuJyxcclxuICAnU2F2ZSBNZW1vIGJ1dHRvbiBsYWJlbCc6ICdTYXZlIE1lbW8gYnV0dG9uIGxhYmVsJyxcclxuICBcIlRoZSB0ZXh0IHNob3duIG9uIHRoZSBzYXZlIE1lbW8gYnV0dG9uIGluIHRoZSBVSS4gJ05PVEVJVCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiVGhlIHRleHQgc2hvd24gb24gdGhlIHNhdmUgTWVtbyBidXR0b24gaW4gdGhlIFVJLiAnTk9URUlUJyBieSBkZWZhdWx0LlwiLFxyXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zJzogJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MnLFxyXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zLiBGb2N1cyBieSBkZWZhdWx0Lic6ICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zLiBGb2N1cyBieSBkZWZhdWx0LicsXHJcbiAgJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zJzogJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zJyxcclxuICAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MuIE9wZW4gYnkgZGVmYXVsdC4nOiAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MuIE9wZW4gYnkgZGVmYXVsdC4nLFxyXG4gICdPcGVuIE1lbW9zIHdoZW4gb2JzaWRpYW4gb3BlbnMnOiAnT3BlbiBNZW1vcyB3aGVuIG9ic2lkaWFuIG9wZW5zJyxcclxuICAnV2hlbiBlbmFibGUgdGhpcywgTWVtb3Mgd2lsbCBvcGVuIHdoZW4gT2JzaWRpYW4gb3BlbnMuIEZhbHNlIGJ5IGRlZmF1bHQuJzpcclxuICAgICdXaGVuIGVuYWJsZSB0aGlzLCBNZW1vcyB3aWxsIG9wZW4gd2hlbiBPYnNpZGlhbiBvcGVucy4gRmFsc2UgYnkgZGVmYXVsdC4nLFxyXG4gICdIaWRlIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0JzogJ0hpZGUgZG9uZSB0YXNrcyBpbiBNZW1vIGxpc3QnLFxyXG4gICdIaWRlIGFsbCBkb25lIHRhc2tzIGluIE1lbW8gbGlzdC4gU2hvdyBkb25lIHRhc2tzIGJ5IGRlZmF1bHQuJzpcclxuICAgICdIaWRlIGFsbCBkb25lIHRhc2tzIGluIE1lbW8gbGlzdC4gU2hvdyBkb25lIHRhc2tzIGJ5IGRlZmF1bHQuJyxcclxuICAnQWR2YW5jZWQgT3B0aW9ucyc6ICdBZHZhbmNlZCBPcHRpb25zJyxcclxuICAnVUkgbGFuZ3VhZ2UgZm9yIGRhdGUnOiAnVUkgbGFuZ3VhZ2UgZm9yIGRhdGUnLFxyXG4gIFwiVHJhbnNsYXRlcyB0aGUgZGF0ZSBVSSBsYW5ndWFnZS4gT25seSAnZW4nIGFuZCAnemgnIGFyZSBhdmFpbGFibGUuXCI6XHJcbiAgICBcIlRyYW5zbGF0ZXMgdGhlIGRhdGUgVUkgbGFuZ3VhZ2UuIE9ubHkgJ2VuJyBhbmQgJ3poJyBhcmUgYXZhaWxhYmxlLlwiLFxyXG4gICdEZWZhdWx0IHByZWZpeCc6ICdEZWZhdWx0IHByZWZpeCcsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgcHJlZml4IHdoZW4gY3JlYXRlIG1lbW8sICdMaXN0JyBieSBkZWZhdWx0LlwiOlxyXG4gICAgXCJTZXQgdGhlIGRlZmF1bHQgcHJlZml4IHdoZW4gY3JlYXRlIG1lbW8sICdMaXN0JyBieSBkZWZhdWx0LlwiLFxyXG4gICdEZWZhdWx0IGluc2VydCBkYXRlIGZvcm1hdCc6ICdEZWZhdWx0IGluc2VydCBkYXRlIGZvcm1hdCcsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgd2hlbiBpbnNlcnQgZGF0ZSBieSBALCAnVGFza3MnIGJ5IGRlZmF1bHQuXCI6XHJcbiAgICBcIlNldCB0aGUgZGVmYXVsdCBkYXRlIGZvcm1hdCB3aGVuIGluc2VydCBkYXRlIGJ5IEAsICdUYXNrcycgYnkgZGVmYXVsdC5cIixcclxuICAnRGVmYXVsdCBlZGl0b3IgcG9zaXRpb24gb24gbW9iaWxlJzogJ0RlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIG1vYmlsZScsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIE1vYmlsZSwgJ1RvcCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiU2V0IHRoZSBkZWZhdWx0IGVkaXRvciBwb3NpdGlvbiBvbiBNb2JpbGUsICdUb3AnIGJ5IGRlZmF1bHQuXCIsXHJcbiAgJ1VzZSBidXR0b24gdG8gc2hvdyBlZGl0b3Igb24gbW9iaWxlJzogJ1VzZSBidXR0b24gdG8gc2hvdyBlZGl0b3Igb24gbW9iaWxlJyxcclxuICAnU2V0IGEgZmxvYXQgYnV0dG9uIHRvIGNhbGwgZWRpdG9yIG9uIG1vYmlsZS4gT25seSB3aGVuIGVkaXRvciBsb2NhdGVkIGF0IHRoZSBib3R0b20gd29ya3MuJzpcclxuICAgICdTZXQgYSBmbG9hdCBidXR0b24gdG8gY2FsbCBlZGl0b3Igb24gbW9iaWxlLiBPbmx5IHdoZW4gZWRpdG9yIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSB3b3Jrcy4nLFxyXG4gICdTaG93IFRpbWUgV2hlbiBDb3B5IFJlc3VsdHMnOiAnU2hvdyBUaW1lIFdoZW4gQ29weSBSZXN1bHRzJyxcclxuICAnU2hvdyB0aW1lIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSAxMjowMC4gQ29weSB0aW1lIGJ5IGRlZmF1bHQuJzpcclxuICAgICdTaG93IHRpbWUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIDEyOjAwLiBDb3B5IHRpbWUgYnkgZGVmYXVsdC4nLFxyXG4gICdTaG93IERhdGUgV2hlbiBDb3B5IFJlc3VsdHMnOiAnU2hvdyBEYXRlIFdoZW4gQ29weSBSZXN1bHRzJyxcclxuICAnU2hvdyBkYXRlIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSBbWzIwMjItMDEtMDFdXS4gQ29weSBkYXRlIGJ5IGRlZmF1bHQuJzpcclxuICAgICdTaG93IGRhdGUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIFtbMjAyMi0wMS0wMV1dLiBDb3B5IGRhdGUgYnkgZGVmYXVsdC4nLFxyXG4gICdBZGQgQmxhbmsgTGluZSBCZXR3ZWVuIERpZmZlcmVudCBEYXRlJzogJ0FkZCBCbGFuayBMaW5lIEJldHdlZW4gRGlmZmVyZW50IERhdGUnLFxyXG4gICdBZGQgYmxhbmsgbGluZSB3aGVuIGNvcHkgcmVzdWx0IHdpdGggZGF0ZS4gTm8gYmxhbmsgbGluZSBieSBkZWZhdWx0Lic6XHJcbiAgICAnQWRkIGJsYW5rIGxpbmUgd2hlbiBjb3B5IHJlc3VsdCB3aXRoIGRhdGUuIE5vIGJsYW5rIGxpbmUgYnkgZGVmYXVsdC4nLFxyXG4gICdTaGFyZSBPcHRpb25zJzogJ1NoYXJlIE9wdGlvbnMnLFxyXG4gICdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgU3RhcnQnOiAnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIFN0YXJ0JyxcclxuICBcIlNldCBhbnl0aGluZyB5b3Ugd2FudCBoZXJlLCB1c2Uge01lbW9zTnVtfSB0byBkaXNwbGF5IE51bWJlciBvZiBtZW1vcywge1VzZWREYXl9IGZvciBkYXlzLiAne01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5cycgQnkgZGVmYXVsdFwiOlxyXG4gICAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtNZW1vc051bX0gdG8gZGlzcGxheSBOdW1iZXIgb2YgbWVtb3MsIHtVc2VkRGF5fSBmb3IgZGF5cy4gJ3tNZW1vc051bX0gTWVtb3Mge1VzZWREYXl9IERheXMnIEJ5IGRlZmF1bHRcIixcclxuICAnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIEVuZCc6ICdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgRW5kJyxcclxuICBcIlNldCBhbnl0aGluZyB5b3Ugd2FudCBoZXJlLCB1c2Uge1VzZXJOYW1lfSBhcyB5b3VyIHVzZXJuYW1lLiAn4pyN77iPIEJ5IHtVc2VyTmFtZX0nIEJ5IGRlZmF1bHRcIjpcclxuICAgIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7VXNlck5hbWV9IGFzIHlvdXIgdXNlcm5hbWUuICfinI3vuI8gQnkge1VzZXJOYW1lfScgQnkgZGVmYXVsdFwiLFxyXG4gICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZSc6ICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZScsXHJcbiAgJ1NhdmUgaW1hZ2UgdG8gZm9sZGVyIGZvciBtb2JpbGUuIEZhbHNlIGJ5IERlZmF1bHQnOiAnU2F2ZSBpbWFnZSB0byBmb2xkZXIgZm9yIG1vYmlsZS4gRmFsc2UgYnkgRGVmYXVsdCcsXHJcbiAgJ1NheSBUaGFuayBZb3UnOiAnU2F5IFRoYW5rIFlvdScsXHJcbiAgRG9uYXRlOiAnRG9uYXRlJyxcclxuICAnSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4sIGNvbnNpZGVyIGRvbmF0aW5nIHRvIHN1cHBvcnQgY29udGludWVkIGRldmVsb3BtZW50Oic6XHJcbiAgICAnSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4sIGNvbnNpZGVyIGRvbmF0aW5nIHRvIHN1cHBvcnQgY29udGludWVkIGRldmVsb3BtZW50OicsXHJcbiAgJ0ZpbGUgTmFtZSBvZiBSZWN5Y2xlIEJpbic6ICdGaWxlIE5hbWUgb2YgUmVjeWNsZSBCaW4nLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcmVjeWNsZSBiaW4uICdkZWxldGUnIEJ5IGRlZmF1bHRcIjogXCJTZXQgdGhlIGZpbGVuYW1lIGZvciByZWN5Y2xlIGJpbi4gJ2RlbGV0ZScgQnkgZGVmYXVsdFwiLFxyXG4gICdGaWxlIE5hbWUgb2YgUXVlcnkgRmlsZSc6ICdGaWxlIE5hbWUgb2YgUXVlcnkgRmlsZScsXHJcbiAgXCJTZXQgdGhlIGZpbGVuYW1lIGZvciBxdWVyeSBmaWxlLiAncXVlcnknIEJ5IGRlZmF1bHRcIjogXCJTZXQgdGhlIGZpbGVuYW1lIGZvciBxdWVyeSBmaWxlLiAncXVlcnknIEJ5IGRlZmF1bHRcIixcclxuICAnVXNlIFRhZ3MgSW4gVmF1bHQnOiAnVXNlIFRhZ3MgSW4gVmF1bHQnLFxyXG4gICdVc2UgdGFncyBpbiB2YXVsdCByYXRoZXIgdGhhbiBvbmx5IGluIE1lbW9zLiBGYWxzZSBieSBkZWZhdWx0Lic6XHJcbiAgICAnVXNlIHRhZ3MgaW4gdmF1bHQgcmF0aGVyIHRoYW4gb25seSBpbiBNZW1vcy4gRmFsc2UgYnkgZGVmYXVsdC4nLFxyXG4gICdSZWFkeSB0byBjb252ZXJ0IGltYWdlIGludG8gYmFja2dyb3VuZCc6ICdSZWFkeSB0byBjb252ZXJ0IGltYWdlIGludG8gYmFja2dyb3VuZCcsXHJcbiAgTGlzdDogJ0xpc3QnLFxyXG4gIFRhc2s6ICdUYXNrJyxcclxuICBUb3A6ICdUb3AnLFxyXG4gIEJvdHRvbTogJ0JvdHRvbScsXHJcbiAgVEFHOiAnVEFHJyxcclxuICBEQVk6ICdEQVknLFxyXG4gIFFVRVJZOiAnUVVFUlknLFxyXG4gIEVESVQ6ICdFRElUJyxcclxuICBQSU46ICdQSU4nLFxyXG4gIFVOUElOOiAnVU5QSU4nLFxyXG4gIERFTEVURTogJ0RFTEVURScsXHJcbiAgJ0NPTkZJUk3vvIEnOiAnQ09ORklSTe+8gScsXHJcbiAgJ0NSRUFURSBGSUxURVInOiAnQ1JFQVRFIEZJTFRFUicsXHJcbiAgU2V0dGluZ3M6ICdTZXR0aW5ncycsXHJcbiAgJ1JlY3ljbGUgYmluJzogJ1JlY3ljbGUgYmluJyxcclxuICAnQWJvdXQgTWUnOiAnQWJvdXQgTWUnLFxyXG4gICdGZXRjaGluZyBkYXRhLi4uJzogJ0ZldGNoaW5nIGRhdGEuLi4nLFxyXG4gICdIZXJlIGlzIE5vIFpldHRlbHMuJzogJ0hlcmUgaXMgTm8gWmV0dGVscy4nLFxyXG4gICdGcmVxdWVudGx5IFVzZWQgVGFncyc6ICdGcmVxdWVudGx5IFVzZWQgVGFncycsXHJcbiAgJ1doYXQgZG8geW91IHRoaW5rIG5vdy4uLic6ICdXaGF0IGRvIHlvdSB0aGluayBub3cuLi4nLFxyXG4gIFJFQUQ6ICdSRUFEJyxcclxuICBNQVJLOiAnTUFSSycsXHJcbiAgU0hBUkU6ICdTSEFSRScsXHJcbiAgU09VUkNFOiAnU09VUkNFJyxcclxuICBSRVNUT1JFOiAnUkVTVE9SRScsXHJcbiAgJ0RFTEVURSBBVCc6ICdERUxFVEUgQVQnLFxyXG4gICdOb29vb3AhJzogJ05vb29vcCEnLFxyXG4gICdBbGwgRGF0YSBpcyBMb2FkZWQg8J+OiSc6ICdBbGwgRGF0YSBpcyBMb2FkZWQg8J+OiScsXHJcbiAgJ1F1aWNrIGZpbHRlcic6ICdRdWljayBmaWx0ZXInLFxyXG4gIFRZUEU6ICdUWVBFJyxcclxuICBMSU5LRUQ6ICdMSU5LRUQnLFxyXG4gICdOTyBUQUdTJzogJ05PIFRBR1MnLFxyXG4gICdIQVMgTElOS1MnOiAnSEFTIExJTktTJyxcclxuICAnSEFTIElNQUdFUyc6ICdIQVMgSU1BR0VTJyxcclxuICBJTkNMVURFOiAnSU5DTFVERScsXHJcbiAgRVhDTFVERTogJ0VYQ0xVREUnLFxyXG4gIFRFWFQ6ICdURVhUJyxcclxuICBJUzogJ0lTJyxcclxuICBJU05PVDogJ0lTTk9UJyxcclxuICBTRUxFQ1Q6ICdTRUxFQ1QnLFxyXG4gICdBREQgRklMVEVSIFRFUk1TJzogJ0FERCBGSUxURVIgVEVSTVMnLFxyXG4gIEZJTFRFUjogJ0ZJTFRFUicsXHJcbiAgVElUTEU6ICdUSVRMRScsXHJcbiAgJ0NSRUFURSBRVUVSWSc6ICdDUkVBVEUgUVVFUlknLFxyXG4gICdFRElUIFFVRVJZJzogJ0VESVQgUVVFUlknLFxyXG4gIE1BVENIOiAnTUFUQ0gnLFxyXG4gIFRJTUVTOiAnVElNRVMnLFxyXG4gICdTaGFyZSBNZW1vIEltYWdlJzogJ1NoYXJlIE1lbW8gSW1hZ2UnLFxyXG4gICfihpdDbGljayB0aGUgYnV0dG9uIHRvIHNhdmUnOiAn4oaXQ2xpY2sgdGhlIGJ1dHRvbiB0byBzYXZlJyxcclxuICAnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLic6ICdJbWFnZSBpcyBnZW5lcmF0aW5nLi4uJyxcclxuICAnSW1hZ2UgaXMgbG9hZGluZy4uLic6ICdJbWFnZSBpcyBsb2FkaW5nLi4uJyxcclxuICAnTG9hZGluZy4uLic6ICdMb2FkaW5nLi4uJyxcclxuICAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nOiAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nLFxyXG4gICdEYWlseSBNZW1vcyc6ICdEYWlseSBNZW1vcycsXHJcbiAgJ0NBTkNFTCBFRElUJzogJ0NBTkNFTCBFRElUJyxcclxuICAnTElOSyBUTyBUSEUnOiAnTElOSyBUTyBUSEUnLFxyXG4gICdNb2JpbGUgT3B0aW9ucyc6ICdNb2JpbGUgT3B0aW9ucycsXHJcbiAgJ0V4cGVyaW1lbnRhbCBPcHRpb25zJzogJ0V4cGVyaW1lbnRhbCBPcHRpb25zJyxcclxuICBcIkRvbid0IHN1cHBvcnQgd2ViIGltYWdlIHlldCwgcGxlYXNlIGlucHV0IGltYWdlIHBhdGggaW4gdmF1bHRcIjpcclxuICAgIFwiRG9uJ3Qgc3VwcG9ydCB3ZWIgaW1hZ2UgeWV0LCBwbGVhc2UgaW5wdXQgaW1hZ2UgcGF0aCBpbiB2YXVsdFwiLFxyXG4gICdCYWNrZ3JvdW5kIEltYWdlIGluIERhcmsgVGhlbWUnOiAnQmFja2dyb3VuZCBJbWFnZSBpbiBEYXJrIFRoZW1lJyxcclxuICAnQmFja2dyb3VuZCBJbWFnZSBpbiBMaWdodCBUaGVtZSc6ICdCYWNrZ3JvdW5kIEltYWdlIGluIExpZ2h0IFRoZW1lJyxcclxuICAnU2V0IGJhY2tncm91bmQgaW1hZ2UgaW4gZGFyayB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJzpcclxuICAgICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBkYXJrIHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInLFxyXG4gICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBsaWdodCB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJzpcclxuICAgICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBsaWdodCB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJyxcclxuICAnU2V0IGRlZmF1bHQgbWVtbyBjb21wb3NpdGlvbiwgeW91IHNob3VsZCB1c2Uge1RJTUV9IGFzIFwiSEg6bW1cIiBhbmQge0NPTlRFTlR9IGFzIGNvbnRlbnQuIFwie1RJTUV9IHtDT05URU5UfVwiIGJ5IGRlZmF1bHQnOlxyXG4gICAgJ1NldCBkZWZhdWx0IG1lbW8gY29tcG9zaXRpb24sIHlvdSBzaG91bGQgdXNlIHtUSU1FfSBhcyBcIkhIOm1tXCIgYW5kIHtDT05URU5UfSBhcyBjb250ZW50LiBcIntUSU1FfSB7Q09OVEVOVH1cIiBieSBkZWZhdWx0JyxcclxuICAnRGVmYXVsdCBNZW1vIENvbXBvc2l0aW9uJzogJ0RlZmF1bHQgTWVtbyBDb21wb3NpdGlvbicsXHJcbiAgJ1Nob3cgVGFza3MgTGFiZWwnOiAnU2hvdyBUYXNrcyBMYWJlbCcsXHJcbiAgJ1Nob3cgdGFza3MgbGFiZWwgbmVhciB0aGUgdGltZSB0ZXh0LiBGYWxzZSBieSBkZWZhdWx0JzogJ1Nob3cgdGFza3MgbGFiZWwgbmVhciB0aGUgdGltZSB0ZXh0LiBGYWxzZSBieSBkZWZhdWx0JyxcclxufTtcclxuIiwiLy8gQnJpdGlzaCBFbmdsaXNoXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gRXNwYcOxb2xcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHt9O1xyXG4iLCIvLyBmcmFuw6dhaXNcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAvLyBzZXR0aW5nLnRzXHJcbiAgd2VsY29tZTogJ0JpZW52ZW51ZSBkYW5zIE3DqW1vICEnLFxyXG4gIHJpYmJvbkljb25UaXRsZTogJ03DqW1vcycsXHJcbiAgbW9udGhzOiBbXHJcbiAgICAnSmFudmllcicsXHJcbiAgICAnRsOpdnJpZXInLFxyXG4gICAgJ01hcnMnLFxyXG4gICAgJ0F2cmlsJyxcclxuICAgICdNYWknLFxyXG4gICAgJ0p1aW4nLFxyXG4gICAgJ0p1aWxsZXQnLFxyXG4gICAgJ0FvdXQnLFxyXG4gICAgJ1NlcHRlbWJyZScsXHJcbiAgICAnT2N0b2JyZScsXHJcbiAgICAnTm92ZW1icmUnLFxyXG4gICAgJ0TDqWNlbWJyZScsXHJcbiAgXSxcclxuICBtb250aHNTaG9ydDogWydKYW4uJywgJ0ZlYi4nLCAnTWFyLicsICdBcHIuJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVnLicsICdTZXB0LicsICdPY3QuJywgJ05vdi4nLCAnRGVjLiddLFxyXG4gIHdlZWtEYXlzOiBbJ0RpbWFuY2hlJywgJ0x1bmRpJywgJ01hcmRpJywgJ01lcmNyZWRpJywgJ0pldWRpJywgJ1ZlbmRyZWRpJywgJ1NhbWVkaSddLFxyXG4gIHdlZWtEYXlzU2hvcnQ6IFsnRGltJywgJ0x1bicsICdNYXInLCAnTWVyJywgJ0pldScsICdWZW4nLCAnU2FtJ10sXHJcbiAgdG86ICfDoCcsXHJcbiAgeWVhcjogbnVsbCxcclxuICBtb250aDogbnVsbCxcclxuICAnQmFzaWMgT3B0aW9ucyc6ICdPcHRpb25zIGJhc2lxdWUnLFxyXG4gICdVc2VyIG5hbWUgaW4gTWVtb3MnOiAnVXNlcm5hbWUgZGFucyBNw6ltb3MnLFxyXG4gIFwiU2V0IHlvdXIgdXNlciBuYW1lIGhlcmUuICdNZW1vcyDwn5iPJyBCeSBkZWZhdWx0XCI6IFwiRMOpZmluaXNzZXogdm90cmUgdXNlcm5hbWUgaWNpLiBEw6lmYXV0IDogJ01lbW8g8J+YjydcIixcclxuICAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnOiAnSW5zw6lyZXIgYXByw6hzIGxlIHRpdHJlJyxcclxuICAnWW91IHNob3VsZCBzZXQgdGhlIHNhbWUgaGVhZGluZyBiZWxvdyBpZiB5b3Ugd2FudCB0byBpbnNlcnQgYW5kIHByb2Nlc3MgbWVtb3MgYmVsb3cgdGhlIHNhbWUgaGVhZGluZy4nOlxyXG4gICAgJ1ZvdXMgZGV2ZXogZMOpZmluaXIgbGUgbcOqbWUgdGl0cmUgZW4tZGVzc291cyBzaSB2b3VzIHZvdWxleiBpbnPDqXJlciBldCB0cmFpdGVyIGRlcyBtw6ltb3Mgc291cyBsZSBtw6ptZSB0aXRyZS4nLFxyXG4gICdBbGxvd3MgYWRtb25pdGlvbnMgdG8gYmUgY3JlYXRlZCB1c2luZyAnOiAnUGVybWV0IGRlIGNyw6llciBkZXMgYWRtb25pdGlvbnMgZW4gdXRpbGlzYW50JyxcclxuICAnUHJvY2VzcyBNZW1vcyBiZWxvdyc6ICdJbnPDqXJlciBNw6ltbyBzb3VzJyxcclxuICAnT25seSBlbnRyaWVzIGJlbG93IHRoaXMgc3RyaW5nL3NlY3Rpb24gaW4geW91ciBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgaXQgZG9lcyBub3QgZXhpc3Qgbm8gbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoYXQgZmlsZS4nOlxyXG4gICAgXCJTZXVsZW1lbnQgbGVzIGVudHLDqWUgc291cyBjZXR0ZSBzZWN0aW9uL3BocmFzZSBkYW5zIHZvcyBub3RlcyBzZXJvbnQgY29uc2lkw6lyw6lzLiBTJ2lsIG4nZXhpc3RlIHBhcywgYXVjdW5lIG5vdGVzIG5lIHNlcmEgdHJhaXTDqSBwb3VyIGNlIGZpY2hpZXIuXCIsXHJcbiAgJ1NhdmUgTWVtbyBidXR0b24gbGFiZWwnOiAnVGl0cmUgZHUgYm91dG9uIGRlIHNhdXZlZ2FyZGUnLFxyXG4gIFwiVGhlIHRleHQgc2hvd24gb24gdGhlIHNhdmUgTWVtbyBidXR0b24gaW4gdGhlIFVJLiAnTk9URUlUJyBieSBkZWZhdWx0LlwiOlxyXG4gICAgXCJMZSB0ZXh0ZSBhZmZpY2jDqSBzdXIgbGUgYm91dG9uIGRlIHNhdXZlZ2FyZGUgZGFucyBsJ1VJLiBEw6lmYXV0IDogJ05PVEVJVCdcIixcclxuICAnRm9jdXMgb24gZWRpdG9yIHdoZW4gb3BlbiBtZW1vcyc6IFwiRm9jdXMgc3VyIGwnw6lkaXRldXIgbG9ycyBkZSBsJ291dmVydHVyZSBkdSBtw6ltby5cIixcclxuICAnRm9jdXMgb24gZWRpdG9yIHdoZW4gb3BlbiBtZW1vcy4gRm9jdXMgYnkgZGVmYXVsdC4nOlxyXG4gICAgXCJGb2N1cyBzdXIgbCfDqWRpdGV1ciBsb3JzIGRlIGwnb3V2ZXJ0dXJlIGR1IG3DqW1vLiBGb2N1cyBwYXIgZMOpZmF1dC5cIixcclxuICAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MnOiAnT3V2cmlyIGxlcyBtw6ltb3MgcXVvdGlkaWVucyBxdWFuZCBtw6ltbyBlc3Qgb3V2ZXJ0LicsXHJcbiAgJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zLiBPcGVuIGJ5IGRlZmF1bHQuJzogJ091dnJpciBsZXMgbcOpbW9zIHF1b3RpZGllbnMgcXVhbmQgbcOpbW8gZXN0IG91dmVydC4nLFxyXG4gICdPcGVuIE1lbW9zIHdoZW4gb2JzaWRpYW4gb3BlbnMnOiAnT3V2cmlyIE3DqW1vIHF1YW5kIE9ic2lkaWFuIGVzdCBvdXZlcnQuJyxcclxuICAnV2hlbiBlbmFibGUgdGhpcywgTWVtb3Mgd2lsbCBvcGVuIHdoZW4gT2JzaWRpYW4gb3BlbnMuIEZhbHNlIGJ5IGRlZmF1bHQuJzpcclxuICAgIFwiUXVhbmQgYWN0aXbDqSwgTWVtbyBzZXJhIG91dmVydCBxdWFuZCBPYnNpZGlhbiDDoCBsJ291dmVydHVyZSBkJ09ic2lkaWFuLiBEw6lzYWN0aXbDqSBwYXIgZMOpZmF1dC5cIixcclxuICAnSGlkZSBkb25lIHRhc2tzIGluIE1lbW8gbGlzdCc6ICdNYXNxdWVyIGxlcyB0w6JjaGVzIGFjY29tcGxpZXMgZGFucyBsYSBsaXN0ZSBkZXMgbcOpbW9zLicsXHJcbiAgJ0hpZGUgYWxsIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0LiBTaG93IGRvbmUgdGFza3MgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ01hc3F1ZXIgbGVzIHTDomNoZXMgYWNjb21wbGllcyBkYW5zIGxlcyBtw6ltb3MuIEFmZmljaGUgbGVzIHTDomNoZXMgYWNjb21wbGllcyBwYXIgZMOpZmF1dC4nLFxyXG4gICdBZHZhbmNlZCBPcHRpb25zJzogJ09wdGlvbnMgYXZhbmPDqWVzJyxcclxuICAnVUkgbGFuZ3VhZ2UgZm9yIGRhdGUnOiBcIkxhbmd1ZSBkZSBsJ1VJIHBvdXIgbGEgZGF0ZVwiLFxyXG4gIFwiVHJhbnNsYXRlcyB0aGUgZGF0ZSBVSSBsYW5ndWFnZS4gT25seSAnZW4nIGFuZCAnemgnIGFyZSBhdmFpbGFibGUuXCI6XHJcbiAgICBcIlRyYWR1aXQgbGEgbGFuZ3VlIGRlcyBkYXRlcyBkYW5zIGwnVUkuIFNldWxzICdlbicsICdmcicgZXQgJ3poJyBzb250IGRpc3BvbmlibGVzLiBcIixcclxuICAnRGVmYXVsdCBwcmVmaXgnOiAnUHLDqWZpeCBwYXIgZMOpZmF1dC4nLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IHByZWZpeCB3aGVuIGNyZWF0ZSBtZW1vLCAnTGlzdCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiRMOpZmluaXQgbGUgcHLDqWZpeCBwYXIgZMOpZmF1dCBsb3JzIGRlIGxhIGNyw6lhdGlvbiBkJ3VuIG3DqW1vLiBEw6lmYXVsdCA6ICdMaXN0ZSdcIixcclxuICAnRGVmYXVsdCBpbnNlcnQgZGF0ZSBmb3JtYXQnOiAnRm9ybWF0IGRlIGxhIGRhdGUgaW5zw6lyw6llIHBhciBkw6lmYXV0LicsXHJcbiAgJ0RlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIG1vYmlsZSc6IFwiUG9zaXRpb24gcGFyIGTDqWZhdXQgZGUgbCfDqWRpdGV1ciBzdXIgbW9iaWxlLlwiLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IGRhdGUgZm9ybWF0IHdoZW4gaW5zZXJ0IGRhdGUgYnkgQCwgJ1Rhc2tzJyBieSBkZWZhdWx0LlwiOlxyXG4gICAgXCJEw6lmaW5pdCBsZSBmb3JtYXQgZGUgbGEgZGF0ZSBwYXIgZMOpZmF1dCBsb3JzIGRlIGwnaW5zZXJ0aW9uIGRlIGxhIGRhdGUgcGFyIEAuIETDqWZhdXQgOiAnVMOiY2hlcycuXCIsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIE1vYmlsZSwgJ1RvcCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiUG9zaXRpb24gcGFyIGTDqWZhdXQgZGUgbCfDqWRpdGV1ciBzdXIgbGUgbW9iaWxlLiBEw6lmYXV0IDogJ0hhdXQnLlwiLFxyXG4gICdVc2UgYnV0dG9uIHRvIHNob3cgZWRpdG9yIG9uIG1vYmlsZSc6IFwiVXRpbGlzYXRpb24gZHUgYm91dG9uIHBvdXIgYWZmaWNoZXIgbCfDqWRpdGV1ciBzdXIgbGUgbW9iaWxlLlwiLFxyXG4gICdTaG93IFRpbWUgV2hlbiBDb3B5IFJlc3VsdHMnOiBcIkFmaWNoZXIgbCdoZXVyZSBxdWFuZCBsZXMgcsOpc3VsdGF0cyBzb250IGNvcGnDqXNcIixcclxuICAnU2V0IGEgZmxvYXQgYnV0dG9uIHRvIGNhbGwgZWRpdG9yIG9uIG1vYmlsZS4gT25seSB3aGVuIGVkaXRvciBsb2NhdGVkIGF0IHRoZSBib3R0b20gd29ya3MuJzpcclxuICAgIFwiUGxhY2UgdW4gYm91dG9uIGZsb3R0YW50IHBvdXIgYXBwZWxlciBsJ8OpZGl0ZXVyIHN1ciBtb2JpbGUuIEZvbmN0aW9ubmUgdW5pcXVlbWVudCBxdWFuZCBsJ8OpZGl0ZXVyIGVzdCBwbGFjw6kgZW4gYmFzLlwiLFxyXG4gICdTaG93IHRpbWUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIDEyOjAwLiBDb3B5IHRpbWUgYnkgZGVmYXVsdC4nOlxyXG4gICAgXCJBZmZpY2hlIGwnaGV1cmUgcXVhbmQgbGVzIHLDqXN1bHRhdHMgc29udCBjb3Bpw6lzLCBjb21tZSAnMTI6MDAnLiBDb3BpZSBsJ2hldXJlIHBhciBkw6lmYXV0XCIsXHJcbiAgJ1Nob3cgRGF0ZSBXaGVuIENvcHkgUmVzdWx0cyc6ICdBZmZpY2hlIGxhIGRhdGUgcXVhbmQgbGVzIHLDqXN1bHRhdHMgc29udCBjb3Bpw6lzJyxcclxuICAnU2hvdyBkYXRlIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSBbWzIwMjItMDEtMDFdXS4gQ29weSBkYXRlIGJ5IGRlZmF1bHQuJzpcclxuICAgICdBZmZpY2hlIGxhIGRhdGUgcXVhbmQgbGVzIHLDqXN1bHRhdHMgc29udCBjb3Bpw6lzLCBjb21tZSBbWzIwMjItMDEtMDFdXS4gUGFyIGTDqWZhdXQsIGNvcGllIGxhIGRhdGUuJyxcclxuICAnQWRkIEJsYW5rIExpbmUgQmV0d2VlbiBEaWZmZXJlbnQgRGF0ZSc6ICdBam91dGUgdW5lIGxpZ25lIGVudHJlIGxlcyBkaWZmw6lyZW50ZXMgZGF0ZXMuJyxcclxuICAnQWRkIGJsYW5rIGxpbmUgd2hlbiBjb3B5IHJlc3VsdCB3aXRoIGRhdGUuIE5vIGJsYW5rIGxpbmUgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ0Fqb3V0ZSB1bmUgbGlnbmUgbG9ycyBkZSBsYSBjb3BpZSBkdSByw6lzdWx0YXQgYXZlYyBsYSBkYXRlLiBQYXMgZGUgbGlnbmUgcGFyIGTDqWZhdXQuJyxcclxuICAnU2hhcmUgT3B0aW9ucyc6ICdPcHRpb25zIGRlIHBhcnRhZ2UnLFxyXG4gICdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgU3RhcnQnOiAnRMOpYnV0IGR1IHBpZWQgZGUgcGFnZSDigJQgUGFydGFnZSBkZSBtw6ltbyBkZSBtw6ltb3MnLFxyXG4gIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7TWVtb3NOdW19IHRvIGRpc3BsYXkgTnVtYmVyIG9mIG1lbW9zLCB7VXNlZERheX0gZm9yIGRheXMuICd7TWVtb3NOdW19IE1lbW9zIHtVc2VkRGF5fSBEYXlzJyBCeSBkZWZhdWx0XCI6XHJcbiAgICBcIkTDqWZpbmlzc2V6IGNlIHF1ZSB2b3VzIHZvdWxleiBpY2ksIHV0aWxpc2V6IHtNZW1vc051bX0gcG91ciBhZmZpY2hlciBsZSBub21icmUgZGUgbcOpbW9zLCB7VXNlZERheX0gcG91ciBsZXMgam91cnMuIFBhciBkw6lmYXV0IDogJ3tNZW1vc051bX0gTWVtb3Mge1VzZWREYXl9IERheXMuXCIsXHJcbiAgJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBFbmQnOiAnRmluIGR1IHBpZWQgZGUgcGFnZSDigJQgUGFydGFnZSBkZSBtw6ltbycsXHJcbiAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtVc2VyTmFtZX0gYXMgeW91ciB1c2VybmFtZS4gJ+Kcje+4jyBCeSB7VXNlck5hbWV9JyBCeSBkZWZhdWx0XCI6XHJcbiAgICBcIkTDqWZpbmlzc2V6IGNlIHF1ZSB2b3VzIHZvdWxleiBpY2kuIFV0aWxpc2V6IHtVc2VyTmFtZX0gY29tbWUgdXNlcm5hbWUuIFBhciBkw6lmYXV0IDogJ+Kcje+4jyBCeSB7VXNlck5hbWV9J1wiLFxyXG4gICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZSc6ICdTYXV2ZWdhcmRlIGRlcyBpbWFnZXMgcGFydGFnw6lzIGRhbnMgdW4gZG9zc2llciBzdXIgbW9iaWxlLicsXHJcbiAgJ1NhdmUgaW1hZ2UgdG8gZm9sZGVyIGZvciBtb2JpbGUuIEZhbHNlIGJ5IERlZmF1bHQnOlxyXG4gICAgJ1NhdXZlZ2FyZGVyIGxlcyBpbWFnZXMgZGFucyB1biBkb3NzaWVyIHN1ciBtb2JpbGUuIETDqXNhY3RpdsOpIHBhciBkw6lmYXV0LicsXHJcbiAgJ1NheSBUaGFuayBZb3UnOiAnRGl0ZXMgTWVyY2knLFxyXG4gIERvbmF0ZTogJ0ZhaXJlIHVuIGRvbicsXHJcbiAgJ0lmIHlvdSBsaWtlIHRoaXMgcGx1Z2luLCBjb25zaWRlciBkb25hdGluZyB0byBzdXBwb3J0IGNvbnRpbnVlZCBkZXZlbG9wbWVudDonOlxyXG4gICAgJ1NpIHZvdXMgYWltZXogY2UgcGx1Z2luLCBlbnZpc2FnZXogZGUgZmFpcmUgdW4gZG9uIHBvdXIgc291dGVuaXIgbGUgZMOpdmVsb3BwZW1lbnQgY29udGludSA6JyxcclxuICAnRmlsZSBOYW1lIG9mIFJlY3ljbGUgQmluJzogJ05vbSBkZSBsYSBjb3JiZWlsbGUnLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcmVjeWNsZSBiaW4uICdkZWxldGUnIEJ5IGRlZmF1bHRcIjogXCJEw6lmaW5pdGlvbiBkdSBub20gZGUgbGEgcG91YmVsbGUuIETDqWZhdXQgOiAnRGVsZXRlJ1wiLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcXVlcnkgZmlsZS4gJ3F1ZXJ5JyBCeSBkZWZhdWx0XCI6IFwiRMOpZmluaXQgbGUgbm9tIGRlIGZpY2hpZXIgcG91ciBsZXMgcmVxdcOqdGUuIETDqWZhdXQgOiAnUXVlcnknXCIsXHJcbiAgJ1VzZSBUYWdzIEluIFZhdWx0JzogJ1V0aWxpc2VyIGRlcyB0YWdzIGRhbnMgbGUgQ29mZnJlJyxcclxuICAnVXNlIHRhZ3MgaW4gdmF1bHQgcmF0aGVyIHRoYW4gb25seSBpbiBNZW1vcy4gRmFsc2UgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ1V0aWxpc2VyIGRlcyB0YWdzIGR1IGNvZmZyZSBwbHV0w7R0IHF1ZSBjZXV4IHF1ZSBzZXVsZW1lbnQgZGFucyBNw6ltby4gRMOpc2FjdGl2w6kgcGFyIGTDqWZhdXQuJyxcclxuICAnUmVhZHkgdG8gY29udmVydCBpbWFnZSBpbnRvIGJhY2tncm91bmQnOiAnUHLDqnQgcG91ciBjb252ZXJ0aXIgZGVzIGltYWdlIGVuIGFycmnDqHJlLXBsYW4uJyxcclxuICBMaXN0OiAnTGlzdGUnLFxyXG4gIFRhc2s6ICdUw6JjaGUnLFxyXG4gIFRvcDogJ0hhdXQnLFxyXG4gIEJvdHRvbTogJ0JhcycsXHJcbiAgVEFHOiAnVEFHJyxcclxuICBEQVk6ICdKT1VSJyxcclxuICBRVUVSWTogJ1JFQ0hFUkNIRScsXHJcbiAgRURJVDogJ0VESVRFUicsXHJcbiAgUElOOiAnUElOJyxcclxuICBVTlBJTjogJ8OJUElOR0xFUicsXHJcbiAgREVMRVRFOiAnREVTw4lQSU5HTEVSJyxcclxuICAnQ09ORklSTe+8gSc6ICdDT05GSVJNRVIg77yBJyxcclxuICAnQ1JFQVRFIEZJTFRFUic6ICdDUsOJRVIgRklMVFJFJyxcclxuICBTZXR0aW5nczogJ1BhcmFtw6h0cmVzJyxcclxuICAnUmVjeWNsZSBiaW4nOiAnQ29yYmVpbGxlJyxcclxuICAnQWJvdXQgTWUnOiAnw4AgcHJvcG9zIGRlIG1vaScsXHJcbiAgJ0ZldGNoaW5nIGRhdGEuLi4nOiAnUsOpY3Vww6lyYXRpb24gZGVzIGRvbm7DqWVzLi4uJyxcclxuICAnSGVyZSBpcyBObyBaZXR0ZWxzLic6IFwiSWwgbid5IGEgcGFzIGRlIFpldHRlbHMuXCIsXHJcbiAgJ0ZyZXF1ZW50bHkgVXNlZCBUYWdzJzogJ1RhZ3MgZnLDqXF1ZW1tZW50IHV0aWxpc8OpcycsXHJcbiAgJ1doYXQgZG8geW91IHRoaW5rIG5vdy4uLic6ICdRdWUgcGVuc2V6LXZvdXMgbWFpbnRlbmFudC4uLicsXHJcbiAgUkVBRDogJ0xVJyxcclxuICBNQVJLOiAnTUFSUVVFUicsXHJcbiAgU0hBUkU6ICdQQVJUQUdFUicsXHJcbiAgU09VUkNFOiAnU09VUkNFJyxcclxuICBSRVNUT1JFOiAnUkVTVEFVUkVSJyxcclxuICAnREVMRVRFIEFUJzogJ1NVUFBSSU1FUicsXHJcbiAgJ05vb29vcCEnOiAnTm9vb29wIScsXHJcbiAgJ0FsbCBEYXRhIGlzIExvYWRlZCDwn46JJzogJ1RvdXRlcyBsZXMgZG9ubsOpZXMgc29udCBjaGFyZ8OpZXMg8J+OiScsXHJcbiAgJ1F1aWNrIGZpbHRlcic6ICdGaWx0cmUgcmFwaWRlJyxcclxuICBUWVBFOiAnVFlQRScsXHJcbiAgTElOS0VEOiAnTElFTicsXHJcbiAgJ05PIFRBR1MnOiAnUEFTIERFIFRBR1MnLFxyXG4gICdIQVMgTElOS1MnOiAnQSBERVMgTElFTlMnLFxyXG4gICdIQVMgSU1BR0VTJzogJ0EgREVTIElNQUdFUycsXHJcbiAgSU5DTFVERTogJ0lOQ0xVUycsXHJcbiAgRVhDTFVERTogJ0VYQ0xVUycsXHJcbiAgVEVYVDogJ1RFWFRFJyxcclxuICBJUzogJ0VTVCcsXHJcbiAgSVNOT1Q6IFwiTidFU1QgUEFTXCIsXHJcbiAgU0VMRUNUOiAnU0VMRUNUSU9OJyxcclxuICAnQUREIEZJTFRFUiBURVJNUyc6ICdBSk9VVEVSIERFUyBURVJNRVMgRklMVFLDiScsXHJcbiAgRklMVEVSOiAnRklMVFJFJyxcclxuICBUSVRMRTogJ1RJVFJFJyxcclxuICAnQ1JFQVRFIFFVRVJZJzogJ0NSw4lFUiBVTkUgUkVDSEVSQ0hFJyxcclxuICAnRURJVCBRVUVSWSc6ICfDiURJVEVSIFVORSBSRUNIRVJDSEUnLFxyXG4gIE1BVENIOiAnTUFUQ0gnLFxyXG4gIFRJTUVTOiAnSEVVUkUnLFxyXG4gICdTaGFyZSBNZW1vIEltYWdlJzogJ1BhcnRhZ2VyIHVuIG3DqW1vIGltYWdlJyxcclxuICAn4oaXQ2xpY2sgdGhlIGJ1dHRvbiB0byBzYXZlJzogJ+KGl0NsaXF1ZSBwb3VyIHNhdXZlZ2FyZGVyJyxcclxuICAnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLic6IFwiR8OpbsOpcmF0aW9uIGRlIGwnaW1hZ2UuLi5cIixcclxuICAnSW1hZ2UgaXMgbG9hZGluZy4uLic6ICdJbWFnZSBlbiBjaGFyZ2VtZW50Li4uJyxcclxuICAnTG9hZGluZy4uLic6ICdDaGFyZ2VtZW50Li4uJyxcclxuICAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nOiBcIvCfmJ8gSW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGwnaW1hZ2UsIGxlIGxpZW4gcGV1dCDDqnRyZSBicmlzw6lcIixcclxuICAnRGFpbHkgTWVtb3MnOiAnTcOpbW8gcXVvdGlkaWVuJyxcclxuICAnQ0FOQ0VMIEVESVQnOiBcIkFOTlVMRVIgTCfDiURJVElPTlwiLFxyXG4gICdMSU5LIFRPIFRIRSc6ICdMSUVOUyDDgCcsXHJcbiAgJ01vYmlsZSBPcHRpb25zJzogJ09wdGlvbnMgbW9iaWxlJyxcclxuICBcIkRvbid0IHN1cHBvcnQgd2ViIGltYWdlIHlldCwgcGxlYXNlIGlucHV0IGltYWdlIHBhdGggaW4gdmF1bHRcIjpcclxuICAgIFwiTmUgc3VwcG9ydGUgcGFzIGxlcyBpbWFnZXMgd2Vicy4gTWVyY2kgZCdpbnPDqXJlciBsZSBjaGVtaW4gZGUgbCdpbWFnZSBkZXB1aXMgbGUgY29mZnJlLlwiLFxyXG4gICdCYWNrZ3JvdW5kIEltYWdlIGluIERhcmsgVGhlbWUnOiAnSW1hZ2UgZGUgZm9uZCBlbiB0aMOobWUgc29tYnJlJyxcclxuICAnQmFja2dyb3VuZCBJbWFnZSBpbiBMaWdodCBUaGVtZSc6ICdJbWFnZSBkZSBmb25kIGVuIHRow6htZSBjbGFpcicsXHJcbiAgJ1NldCBiYWNrZ3JvdW5kIGltYWdlIGluIGRhcmsgdGhlbWUuIFNldCBzb21ldGhpbmcgbGlrZSBcIkRhaWx5L29uZS5wbmdcIic6XHJcbiAgICBcIkTDqWZpbmlyIGwnaW1hZ2UgZGUgZm9uZCBlbiB0aMOobWUgc29tYnJlLiBEw6lmaW5pciAnRGFpbHkvb25lLnBuZycgcGFyIGV4ZW1wbGUuXCIsXHJcbiAgJ1NldCBiYWNrZ3JvdW5kIGltYWdlIGluIGxpZ2h0IHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInOlxyXG4gICAgXCJEw6lmaW5pciBsJ2ltYWdlIGRlIGZvbmQgZW4gdGjDqG1lIGNsYWlyLiBEw6lmaW5pciAnRGFpbHkvb25lLnBuZycgcGFyIGV4ZW1wbGUuXCIsXHJcbiAgJ1NldCBkZWZhdWx0IG1lbW8gY29tcG9zaXRpb24sIHlvdSBzaG91bGQgdXNlIHtUSU1FfSBhcyBcIkhIOm1tXCIgYW5kIHtDT05URU5UfSBhcyBjb250ZW50LiBcIntUSU1FfSB7Q09OVEVOVH1cIiBieSBkZWZhdWx0JzpcclxuICAgICdEw6lmaW5pciBsYSBjb21wb3NpdGlvbiBwYXIgZMOpZmF1dCBkdSBtw6ltbywgdm91cyBkZXZleiB1dGlsaXNlciB7VElNRX0gY29tbWUgXCJISDptbVwiIGV0IHtDT05URU5UfSBjb21tZSBjb250ZW51LiBcIntUSU1FfSB7Q09OVEVOVH1cIiBwYXIgZMOpZmF1dCcsXHJcbiAgJ0RlZmF1bHQgTWVtbyBDb21wb3NpdGlvbic6ICdDb21wb3NpdGlvbiBwYXIgZMOpZmF1dCBkdSBtw6ltbycsXHJcbiAgJ1Nob3cgVGFza3MgTGFiZWwnOiAnQWZmaWNoZXIgbGVzIMOpdGlxdWV0dGVzIGRlcyB0w6JjaGVzJyxcclxuICAnU2hvdyB0YXNrcyBsYWJlbCBuZWFyIHRoZSB0aW1lIHRleHQuIEZhbHNlIGJ5IGRlZmF1bHQnOlxyXG4gICAgJ0FmZmljaGVyIGxlcyDDqXRpcXVldHRlcyBkZXMgdMOiY2hlcyDDoCBjw7R0w6kgZHUgdGV4dGUgaG9yYWlyZS4gRMOpc2FjdGl2w6kgcGFyIGTDqWZhdXQuJyxcclxufTtcclxuIiwiLy8g4KS54KS/4KSo4KWN4KSm4KWAXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gQmFoYXNhIEluZG9uZXNpYVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vIEl0YWxpYW5vXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8g5pel5pys6KqeXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8g7ZWc6rWt7Ja0XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gTmVkZXJsYW5kc1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vIE5vcnNrXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gasSZenlrIHBvbHNraVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vIFBvcnR1Z3XDqnNcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAvLyBzZXR0aW5nLnRzXHJcbiAgd2VsY29tZTogJ0JlbS12aW5kbyBhbyBNZW1vcyEnLFxyXG4gIHJpYmJvbkljb25UaXRsZTogJ01lbW9zJyxcclxuICBtb250aHM6IFtcclxuICAgICdKYW5laXJvJyxcclxuICAgICdGZXZlcmVpcm8nLFxyXG4gICAgJ01hcsOnbycsXHJcbiAgICAnQWJyaWwnLFxyXG4gICAgJ01haW8nLFxyXG4gICAgJ0p1bmhvJyxcclxuICAgICdKdWxobycsXHJcbiAgICAnQWdvc3RvJyxcclxuICAgICdTZXRlbWJybycsXHJcbiAgICAnT3V0dWJybycsXHJcbiAgICAnTm92ZW1icm8nLFxyXG4gICAgJ0RlemVtYnJvJyxcclxuICBdLFxyXG4gIG1vbnRoc1Nob3J0OiBbJ0phbi4nLCAnRmViLicsICdNYXIuJywgJ0Fwci4nLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWcuJywgJ1NlcHQuJywgJ09jdC4nLCAnTm92LicsICdEZWMuJ10sXHJcbiAgd2Vla0RheXM6IFsnRG9taW5nbycsICdTZWd1bmRhJywgJ1RlcsOnYScsICdRdWFydGEnLCAnUXVpbnRhJywgJ1NleHRhJywgJ1PDoWJhZG8nXSxcclxuICB3ZWVrRGF5c1Nob3J0OiBbJ0RvbScsICdTZWcnLCAnVGVyJywgJ1F1YScsICdRdWknLCAnU2V4JywgJ1PDoWInXSxcclxuICB0bzogJ3BhcmEnLFxyXG4gIHllYXI6IG51bGwsXHJcbiAgbW9udGg6IG51bGwsXHJcbiAgJ0Jhc2ljIE9wdGlvbnMnOiAnT3DDp8O1ZXMgQsOhc2ljYXMnLFxyXG4gICdVc2VyIG5hbWUgaW4gTWVtb3MnOiAnTm9tZSBkZSBVc3XDoXJpbyBubyBNZW1vcycsXHJcbiAgXCJTZXQgeW91ciB1c2VyIG5hbWUgaGVyZS4gJ01lbW9zIPCfmI8nIEJ5IGRlZmF1bHRcIjogXCJEZWZpbmUgbyBub21lIGRlIHVzdcOhcmlvLiBQYWRyw6NvOiAnTWVtb3Mg8J+YjydcIixcclxuICAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnOiAnSW5zZXJpciBhcMOzcyBvIHTDrXR1bG8nLFxyXG4gICdZb3Ugc2hvdWxkIHNldCB0aGUgc2FtZSBoZWFkaW5nIGJlbG93IGlmIHlvdSB3YW50IHRvIGluc2VydCBhbmQgcHJvY2VzcyBtZW1vcyBiZWxvdyB0aGUgc2FtZSBoZWFkaW5nLic6XHJcbiAgICAnRGV2ZSBkZWZpbmlyIG8gbWVzbW8gdMOtdHVsbyBuYSBvcMOnw6NvIGFiYWl4byBzZSBwcmV0ZW5kZSBpbnNlcmlyIGUgcHJvY2Vzc2FyIE1lbW9zIGFiYWl4byBkbyB0w610dWxvIGFxdWkgZGVmaW5pZG8uJyxcclxuICAnQWxsb3dzIGFkbW9uaXRpb25zIHRvIGJlIGNyZWF0ZWQgdXNpbmcgJzogJ1Blcm1pdGUgcXVlIGFkbW9uaXRpb25zIHNlamFtIGNyaWFkYXMgdXNhbmRvICcsXHJcbiAgJ1Byb2Nlc3MgTWVtb3MgYmVsb3cnOiAnUHJvY2Vzc2FyIE1lbW9zIGFiYWl4bycsXHJcbiAgJ09ubHkgZW50cmllcyBiZWxvdyB0aGlzIHN0cmluZy9zZWN0aW9uIGluIHlvdXIgbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQuIElmIGl0IGRvZXMgbm90IGV4aXN0IG5vIG5vdGVzIHdpbGwgYmUgcHJvY2Vzc2VkIGZvciB0aGF0IGZpbGUuJzpcclxuICAgICdTb21lbnRlIGFzIGVudHJhZGFzIGFiYWl4byBkZXN0ZSBUw610dWxvL1NlY8Onw6NvIHNlcsOjbyBwcm9jZXNzYWRhcyBuYXMgc3VhcyBub3Rhcy4gU2UgZXN0YSBTZWPDp8OjbyBuw6NvIGVzdGl2ZXIgZGVmaW5pZGEsIG5lbmh1bWEgbm90YSBzZXLDoSBwcm9jZXNzYWRhIHBhcmEgZXNzZSBmaWNoZWlyby4nLFxyXG4gICdTYXZlIE1lbW8gYnV0dG9uIGxhYmVsJzogJ0xlZ2VuZGEgZG8gYm90w6NvIEd1YXJkYXIgTWVtbycsXHJcbiAgXCJUaGUgdGV4dCBzaG93biBvbiB0aGUgc2F2ZSBNZW1vIGJ1dHRvbiBpbiB0aGUgVUkuICdOT1RFSVQnIGJ5IGRlZmF1bHQuXCI6XHJcbiAgICAnRGVmaW5lIG8gdGV4dG8gYXByZXNlbnRhZG8gbm8gYm90w6NvIFwiR3VhcmRhciBNZW1vXCIgbmEgaW50ZXJmYWNlIGRlIHVzdcOhcmlvLiBQYWRyw6NvOiBcIk5PVEVJVFwiLicsXHJcbiAgJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MnOiAnRm9jYXIgbm8gRWRpdG9yIGFvIGluaWNpYXIgbyBNZW1vcycsXHJcbiAgJ0ZvY3VzIG9uIEVkaXRvciB3aGVuIG9wZW4gbWVtb3MuIEZvY3VzIGJ5IGRlZmF1bHQuJzpcclxuICAgICdGb2NhciBubyBlZGl0b3IgYW8gaW5pY2lhciBvIE1lbW9zLiBGb2NhciBlc3TDoSBkZWZpbmlkbyBjb21vIHBhZHLDo28uJyxcclxuICAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MnOiAnQWJyaXIgbWVtb3JhbmRvcyBkacOhcmlvcyBhbyBpbmljaWFyIG8gTWVtb3MnLFxyXG4gICdPcGVuIGRhaWx5IG1lbW9zIHdpdGggb3BlbiBtZW1vcy4gT3BlbiBieSBkZWZhdWx0Lic6XHJcbiAgICAnQWJyaXIgbWVtb3JhbmRvcyBkacOhcmlvcyBhbyBpbmljaWFyIG8gTWVtb3MuIEFicmlyIGVzdMOhIGRlZmluaWRvIGNvbW8gcGFkcsOjby4nLFxyXG4gICdPcGVuIE1lbW9zIHdoZW4gb2JzaWRpYW4gb3BlbnMnOiAnQWJyaXIgTWVtb3MgcXVhbmRvIG8gT2JzaWRpYW4gaW5pY2lhJyxcclxuICAnV2hlbiBlbmFibGUgdGhpcywgTWVtb3Mgd2lsbCBvcGVuIHdoZW4gT2JzaWRpYW4gb3BlbnMuIEZhbHNlIGJ5IGRlZmF1bHQuJzpcclxuICAgICdRdWFuZG8gZXN0YSBvcMOnw6NvIGVzdMOhIGFjdGl2YSwgbyBNZW1vcyBhYnJpcsOhIHF1YW5kbyBvIE9ic2lkaWFuIGluaWNpYS4gRGVzYWN0aXZhZG8gcG9yIHBhZHLDo28uJyxcclxuICAnSGlkZSBkb25lIHRhc2tzIGluIE1lbW8gbGlzdCc6ICdPY3VsdGFyIHRhcmVmYXMgY29uY2x1w61kYXMgbmEgbGlzdGEgZGUgTWVtb3MnLFxyXG4gICdIaWRlIGFsbCBkb25lIHRhc2tzIGluIE1lbW8gbGlzdC4gU2hvdyBkb25lIHRhc2tzIGJ5IGRlZmF1bHQuJzpcclxuICAgICdPY3VsdGFyIHRvZGFzIGFzIHRhcmVmYXMgY29uY2x1w61kYXMgbmEgbGlzdGEgZGUgTWVtb3MuIE1vc3RyYXIgYXMgdGFyZWZhcyBjb25jbHXDrWRhcyBlc3TDoSBkZWZpbmlkbyBjb21vIHBhZHLDo28uJyxcclxuICAnQWR2YW5jZWQgT3B0aW9ucyc6ICdPcMOnw7VlcyBBdmFuw6dhZGFzJyxcclxuICAnVUkgbGFuZ3VhZ2UgZm9yIGRhdGUnOiAnSWRpb21hIGRhIERhdGEgbmEgaW50ZXJmYWNlIGRvIHVzdcOhcmlvJyxcclxuICBcIlRyYW5zbGF0ZXMgdGhlIGRhdGUgVUkgbGFuZ3VhZ2UuIE9ubHkgJ2VuJyBhbmQgJ3poJyBhcmUgYXZhaWxhYmxlLlwiOlxyXG4gICAgXCJEZWZpbmUgbyBpZGlvbWEgZGEgRGF0YSBuYSBpbnRlcmZhY2UgZG8gdXN1w6FyaW8uIERlIG1vbWVudG8sIGFwZW5hcyAnZW4nLCAnZnInLCAncHQnIGUgJ3poJyBlc3TDo28gZGlzcG9uw612ZWlzLlwiLFxyXG4gICdEZWZhdWx0IHByZWZpeCc6ICdQcmVmaXhvIHBhZHLDo28nLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IHByZWZpeCB3aGVuIGNyZWF0ZSBtZW1vLCAnTGlzdCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiRGVmaW5lIG8gcHJlZml4byBwYWRyw6NvIHF1YW5kbyB1bSBtZW1vcmFuZG8gw6kgY3JpYWRvLiBQYWRyw6NvOiAnTGlzdGEnLlwiLFxyXG4gICdEZWZhdWx0IGluc2VydCBkYXRlIGZvcm1hdCc6ICdGb3JtYXRvIHBhZHLDo28gcGFyYSBpbnNlcsOnw6NvIGRlIERhdGEnLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IGRhdGUgZm9ybWF0IHdoZW4gaW5zZXJ0IGRhdGUgYnkgQCwgJ1Rhc2tzJyBieSBkZWZhdWx0LlwiOlxyXG4gICAgXCJEZWZpbmUgbyBmb3JtYXRvIGRlIERhdGEgcGFkcsOjbyBhbyBpbnNlcmlyIGEgZGF0YSB1c2FuZG8gQC4gUGFkcsOjbzogJ1RhcmVmYXMnLlwiLFxyXG4gICdEZWZhdWx0IGVkaXRvciBwb3NpdGlvbiBvbiBtb2JpbGUnOiAnUG9zacOnw6NvIHBhZHLDo28gZG8gZWRpdG9yIGRlIG1lbW9zIG5hIHZlcnPDo28gbcOzdmVsLicsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIE1vYmlsZSwgJ1RvcCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiRGVmaW5lIGEgcG9zacOnw6NvIHBhZHLDo28gZG8gZWRpdG9yIGRlIE1lbW9zIG5hIHZlcnPDo28gbcOzdmVsLiBQYWRyw6NvOiAnVG9wbycuXCIsXHJcbiAgJ1VzZSBidXR0b24gdG8gc2hvdyBlZGl0b3Igb24gbW9iaWxlJzogJ1VzYXIgdW0gYm90w6NvIHBhcmEgbW9zdHJhciBvIGVkaXRvciBuYSB2ZXJzw6NvIG3Ds3ZlbCcsXHJcbiAgJ1NldCBhIGZsb2F0IGJ1dHRvbiB0byBjYWxsIGVkaXRvciBvbiBtb2JpbGUuIE9ubHkgd2hlbiBlZGl0b3IgbG9jYXRlZCBhdCB0aGUgYm90dG9tIHdvcmtzLic6XHJcbiAgICBcIkRlZmluZSB1bSBib3TDo28gZmx1dHVhbnRlIHBhcmEgYWJyaXIgbyBlZGl0b3IgbmEgdmVyc8OjbyBtw7N2ZWwuIE9ww6fDo28gZGlzcG9uw612ZWwgc29tZW50ZSBxdWFuZG8gYSBwb3Npw6fDo28gZG8gZWRpdG9yIGVzdMOhIGRlZmluaWRhIHBhcmEgJ0Z1bmRvJ1wiLFxyXG4gICdTaG93IFRpbWUgV2hlbiBDb3B5IFJlc3VsdHMnOiAnTW9zdHJhciBhIEhvcmEgYW8gY29waWFyIG9zIHJlc3VsdGFkb3MnLFxyXG4gICdTaG93IHRpbWUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIDEyOjAwLiBDb3B5IHRpbWUgYnkgZGVmYXVsdC4nOlxyXG4gICAgXCJNb3N0cmFyIGEgSG9yYSBhbyBjb3BpYXIgb3MgcmVzdWx0YWRvcywgY29tbyAnMTI6MDAnLiBDb3BpYXIgYSBIb3JhIGVzdMOhIGFjdGl2YWRvIHBvciBwYWRyw6NvLlwiLFxyXG4gICdTaG93IERhdGUgV2hlbiBDb3B5IFJlc3VsdHMnOiAnTW9zdHJhciBhIERhdGEgYW8gY29waWFyIG9zIHJlc3VsdGFkb3MnLFxyXG4gICdTaG93IGRhdGUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIFtbMjAyMi0wMS0wMV1dLiBDb3B5IGRhdGUgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ01vc3RyYXIgYSBEYXRhIGFvIGNvcGlhciBvcyByZXN1bHRhZG9zLCBjb21vIFtbMjAyMi0wMS0wMV1dLiBDb3BpYXIgYSBEYXRhIGVzdMOhIGFjdGl2YWRvIHBvciBwYWRyw6NvLicsXHJcbiAgJ0FkZCBCbGFuayBMaW5lIEJldHdlZW4gRGlmZmVyZW50IERhdGUnOiAnQWRpY2lvbmFyIGxpbmhhIGVtIGJyYW5jbyBlbnRyZSBEYXRhcyBkaWZlcmVudGVzLicsXHJcbiAgJ0FkZCBibGFuayBsaW5lIHdoZW4gY29weSByZXN1bHQgd2l0aCBkYXRlLiBObyBibGFuayBsaW5lIGJ5IGRlZmF1bHQuJzpcclxuICAgICdBZGljaW9uYXIgbGluaGEgZW0gYnJhbmNvIGFvIGNvcGlhciByZXN1bHRhZG9zIGNvbSBEYXRhLiBQb3IgcGFkcsOjbyBuZW5odW1hIGxpbmhhIMOpIGFkaWNpb25hZGEuJyxcclxuICAnU2hhcmUgT3B0aW9ucyc6ICdPcMOnw7VlcyBkZSBQYXJ0aWxoYScsXHJcbiAgJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBTdGFydCc6ICdQYXJ0aWxoYXIgYSBJbWFnZW0gZGUgdW0gTWVtbyAtIEluw61jaW8gZG8gcm9kYXDDqScsXHJcbiAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtNZW1vc051bX0gdG8gZGlzcGxheSBOdW1iZXIgb2YgbWVtb3MsIHtVc2VkRGF5fSBmb3IgZGF5cy4gJ3tNZW1vc051bX0gTWVtb3Mge1VzZWREYXl9IERheXMnIEJ5IGRlZmF1bHRcIjpcclxuICAgIFwiRGVmaW5hIG8gcXVlIHF1aXNlciwgdXNlIHtNZW1vc051bX0gcGFyYSBtb3N0cmFyIG8gbsO6bWVybyBkZSBNZW1vcyBlIHVzZSB7VXNlZERheX0gcGFyYSBkaWFzLiAnUGFkcsOjbzoge01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5cycuXCIsXHJcbiAgJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBFbmQnOiAnUGFydGlsaGFyIGEgSW1hZ2VtIGRlIHVtIE1lbW8gLSBGaW0gZG8gcm9kYXDDqScsXHJcbiAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtVc2VyTmFtZX0gYXMgeW91ciB1c2VybmFtZS4gJ+Kcje+4jyBCeSB7VXNlck5hbWV9JyBCeSBkZWZhdWx0XCI6XHJcbiAgICBcIkRlZmluYSBvIHF1ZSBxdWlzZXIsIHVzZSB7VXNlck5hbWV9IGNvbW8gbyBzZXUgbm9tZSBkZSB1c3XDoXJpby4gUGFkcsOjbzogJ+Kcje+4jyBQb3Ige1VzZXJOYW1lfScuXCIsXHJcbiAgJ1NhdmUgU2hhcmVkIEltYWdlIFRvIEZvbGRlciBGb3IgTW9iaWxlJzogJ0d1YXJkYXIgYSBpbWFnZW0gcGFydGlsaGFkYSBwYXJhIHBhc3RhIG5hIHZlcnPDo28gbcOzdmVsJyxcclxuICAnU2F2ZSBpbWFnZSB0byBmb2xkZXIgZm9yIG1vYmlsZS4gRmFsc2UgYnkgRGVmYXVsdCc6XHJcbiAgICAnR3VhcmRhciBhIGltYWdlbSBwYXJ0aWxoYWRhIHBhcmEgcGFzdGEgbmEgdmVyc8OjbyBtw7N2ZWwuIERlc2FjdGl2YWRvIHBvciBwYWRyw6NvLicsXHJcbiAgJ1NheSBUaGFuayBZb3UnOiAnQWdyYWRlw6dhJyxcclxuICBEb25hdGU6ICdEb2FyJyxcclxuICAnSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4sIGNvbnNpZGVyIGRvbmF0aW5nIHRvIHN1cHBvcnQgY29udGludWVkIGRldmVsb3BtZW50Oic6XHJcbiAgICAnU2UgZ29zdGEgZGVzdGUgcGx1Z2luLCBjb25zaWRlcmUgZG9hciBwYXJhIGFwb2lhciBvIHNldSBkZXNlbnZvbHZpbWVudG8gY29udMOtbnVvOicsXHJcbiAgJ0ZpbGUgTmFtZSBvZiBSZWN5Y2xlIEJpbic6ICdOb21lIGRhIFJlY2ljbGFnZW0nLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcmVjeWNsZSBiaW4uICdkZWxldGUnIEJ5IGRlZmF1bHRcIjpcclxuICAgIFwiRGVmaW5lIG8gbm9tZSBkbyBmaWNoZWlybyBwYXJhIGEgUmVjaWNsYWdlbS4gUGFkcsOjbzogJ2RlbGV0ZScuXCIsXHJcbiAgJ0ZpbGUgTmFtZSBvZiBRdWVyeSBGaWxlJzogJ05vbWUgZG8gYXJxdWl2byBkbyBmaWNoZWlybyBkZSBDb25zdWx0YScsXHJcbiAgXCJTZXQgdGhlIGZpbGVuYW1lIGZvciBxdWVyeSBmaWxlLiAncXVlcnknIEJ5IGRlZmF1bHRcIjogXCJEZWZpbmUgbyBub21lIGRvIGZpY2hlaXJvIHBhcmEgQ29uc3VsdGFzLiBQYWRyw6NvOiAnUXVlcnknLlwiLFxyXG4gICdVc2UgVGFncyBJbiBWYXVsdCc6ICdVc2FyIFRhZ3Mgbm8gVmF1bHQnLFxyXG4gICdVc2UgdGFncyBpbiB2YXVsdCByYXRoZXIgdGhhbiBvbmx5IGluIE1lbW9zLiBGYWxzZSBieSBkZWZhdWx0Lic6XHJcbiAgICAnVXNhciBhcyBUYWdzIGRvIFZhdWx0IGUgbsOjbyBzb21lbnRlIGRvIE1lbW9zLiBEZXNhY3RpdmFkbyBwb3IgcGFkcsOjby4nLFxyXG4gICdSZWFkeSB0byBjb252ZXJ0IGltYWdlIGludG8gYmFja2dyb3VuZCc6ICdQcm9udG8gcGFyYSBjb252ZXJ0ZXIgaW1hZ2VtIGVtIGZ1bmRvJyxcclxuICBMaXN0OiAnTGlzdGEnLFxyXG4gIFRhc2s6ICdUYXJlZmEnLFxyXG4gIFRvcDogJ1RvcG8nLFxyXG4gIEJvdHRvbTogJ0Z1bmRvJyxcclxuICBUQUc6ICdUQUcnLFxyXG4gIERBWTogJ0RJQScsXHJcbiAgUVVFUlk6ICdRVUVSWScsXHJcbiAgRURJVDogJ0VESVRBUicsXHJcbiAgUElOOiAnRklYQVInLFxyXG4gIFVOUElOOiAnREVTQUZJWEFSJyxcclxuICBERUxFVEU6ICdFTElNSU5BUicsXHJcbiAgJ0NPTkZJUk3vvIEnOiAnQ09ORklSTUFS77yBJyxcclxuICAnQ1JFQVRFIEZJTFRFUic6ICdDUklBUiBGSUxUUk8nLFxyXG4gIFNldHRpbmdzOiAnRGVmaW5pw6fDtWVzJyxcclxuICAnUmVjeWNsZSBiaW4nOiAnUmVjaWNsYWdlbScsXHJcbiAgJ0Fib3V0IE1lJzogJ0FjZXJjYSBkZSBtaW0nLFxyXG4gICdGZXRjaGluZyBkYXRhLi4uJzogJ0EgcHJvY3VyYXIgZGFkb3MuLi4nLFxyXG4gICdIZXJlIGlzIE5vIFpldHRlbHMuJzogJ07Do28gZXhpc3RlbSBaZXR0ZWxzLicsXHJcbiAgJ0ZyZXF1ZW50bHkgVXNlZCBUYWdzJzogJ1RhZ3MgVXNhZGFzIEZyZXF1ZW50ZW1lbnRlJyxcclxuICAnV2hhdCBkbyB5b3UgdGhpbmsgbm93Li4uJzogJ0VtIHF1ZSBlc3TDoSBhIHBlbnNhci4uLicsXHJcbiAgUkVBRDogJ0xFUicsXHJcbiAgTUFSSzogJ0FTU0lOQUxBUicsXHJcbiAgU0hBUkU6ICdQQVJUSUxIQVInLFxyXG4gIFNPVVJDRTogJ09SSUdFTScsXHJcbiAgUkVTVE9SRTogJ1JFU1RBVVJBUicsXHJcbiAgJ0RFTEVURSBBVCc6ICdFTElNSU5BRE8gRU0nLFxyXG4gICdOb29vb3AhJzogJ05vb29vcCEnLFxyXG4gICdBbGwgRGF0YSBpcyBMb2FkZWQg8J+OiSc6ICdUb2RvcyBvcyBkYWRvcyBmb3JhbSBjYXJyZWdhZG9zIPCfjoknLFxyXG4gICdRdWljayBmaWx0ZXInOiAnRmlsdHJvIHLDoXBpZG8nLFxyXG4gIFRZUEU6ICdUSVBPJyxcclxuICBMSU5LRUQ6ICdMSU5LRUQnLFxyXG4gICdOTyBUQUdTJzogJ1NFTSBUQUdTJyxcclxuICAnSEFTIExJTktTJzogJ1RFTSBMSU5LUycsXHJcbiAgJ0hBUyBJTUFHRVMnOiAnVEVNIElNQUdFTlMnLFxyXG4gIElOQ0xVREU6ICdJTkNMVUlSJyxcclxuICBFWENMVURFOiAnRVhDTFVJUicsXHJcbiAgVEVYVDogJ1RFWFRPJyxcclxuICBJUzogJ8OJJyxcclxuICBJU05PVDogJ07Dg08gw4knLFxyXG4gIFNFTEVDVDogJ1NFTEVDQ0lPTkFSJyxcclxuICAnQUREIEZJTFRFUiBURVJNUyc6ICdBRElDSU9OQVIgVEVSTU9TIERFIEZJTFRSQUdFTScsXHJcbiAgRklMVEVSOiAnRklMVFJBUicsXHJcbiAgVElUTEU6ICdUw41UVUxPJyxcclxuICAnQ1JFQVRFIFFVRVJZJzogJ0NSSUFSIFFVRVJZJyxcclxuICAnRURJVCBRVUVSWSc6ICdFRElUQVIgUVVFUlknLFxyXG4gIE1BVENIOiAnSUdVQUxBJyxcclxuICBUSU1FUzogJ1ZFWkVTJyxcclxuICAnU2hhcmUgTWVtbyBJbWFnZSc6ICdQYXJ0aWxoYXIgaW1hZ2VtIGRvIE1lbW8nLFxyXG4gICfihpdDbGljayB0aGUgYnV0dG9uIHRvIHNhdmUnOiAn4oaXQ2xpcXVlIG5vIGJvdMOjbyBwYXJhIGd1YXJkYXInLFxyXG4gICdJbWFnZSBpcyBnZW5lcmF0aW5nLi4uJzogJ0EgZ2VyYXIgSW1hZ2VtLi4nLFxyXG4gICdJbWFnZSBpcyBsb2FkaW5nLi4uJzogJ0EgY2FycmVnYXIgSW1hZ2VtLi4uJyxcclxuICAnTG9hZGluZy4uLic6ICdDYXJyZWdhbmRvLi4uJyxcclxuICAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nOlxyXG4gICAgJ/CfmJ8gTsOjbyDDqSBwb3Nzw612ZWwgY2FycmVnYXIgYSBpbWFnZW0sIG8gbGluayBkYSBpbWFnZW0gcGFyZWNlIGVzdGFyIHF1ZWJyYWRvJyxcclxuICAnRGFpbHkgTWVtb3MnOiAnTWVtb3MgRGnDoXJpb3MnLFxyXG4gICdDQU5DRUwgRURJVCc6ICdDQU5DRUxBUiBFREnDh8ODTycsXHJcbiAgJ0xJTksgVE8gVEhFJzogJ0xJTksgUEFSQSBPJyxcclxuICAnTW9iaWxlIE9wdGlvbnMnOiAnT3DDp8O1ZXMgTcOzdmVpcycsXHJcbiAgXCJEb24ndCBzdXBwb3J0IHdlYiBpbWFnZSB5ZXQsIHBsZWFzZSBpbnB1dCBpbWFnZSBwYXRoIGluIHZhdWx0XCI6XHJcbiAgICAnQWluZGEgbsOjbyBleGlzdGUgc3Vwb3J0ZSBwYXJhIGltYWdlbnMgZGUgd2ViLiBQb3IgZmF2b3IsIGluc2lyYSBvIGxpbmsgcGFyYSB1bWEgaW1hZ2VtIG5vIHZhdWx0JyxcclxuICAnRXhwZXJpbWVudGFsIE9wdGlvbnMnOiAnT3DDp8O1ZXMgRXhwZXJpbWVudGFpcycsXHJcbiAgJ0JhY2tncm91bmQgSW1hZ2UgaW4gRGFyayBUaGVtZSc6ICdJbWFnZW0gZGUgZnVuZG8gbm8gVGVtYSBFc2N1cm8nLFxyXG4gICdCYWNrZ3JvdW5kIEltYWdlIGluIExpZ2h0IFRoZW1lJzogJ0ltYWdlbSBkZSBmdW5kbyBubyBUZW1hIENsYXJvJyxcclxuICAnU2V0IGJhY2tncm91bmQgaW1hZ2UgaW4gZGFyayB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJzpcclxuICAgICdEZWZpbmEgYSBpbWFnZW0gZGUgZnVuZG8gbm8gVGVtYSBFc2N1cm8uIERlZmluYSBhbGdvIGNvbW8gXCJEYWlseS9vbmUucG5nXCInLFxyXG4gICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBsaWdodCB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJzpcclxuICAgICdEZWZpbmEgYSBpbWFnZW0gZGUgZnVuZG8gbm8gVGVtYSBDbGFyby4gRGVmaW5hIGFsZ28gY29tbyBcIkRhaWx5L29uZS5wbmdcIicsXHJcbiAgJ1NldCBkZWZhdWx0IG1lbW8gY29tcG9zaXRpb24sIHlvdSBzaG91bGQgdXNlIHtUSU1FfSBhcyBcIkhIOm1tXCIgYW5kIHtDT05URU5UfSBhcyBjb250ZW50LiBcIntUSU1FfSB7Q09OVEVOVH1cIiBieSBkZWZhdWx0JzpcclxuICAgICdEZWZpbmEgYSBjb21wb3Npw6fDo28gcGFkcsOjbyBkbyBNZW1vLCBkZXZlIHVzYXIge1RJTUV9IGNvbW8gXCJISDptbVwiIGUge0NPTlRFTlR9IGNvbW8gY29udGXDumRvLiBQYWRyw6NvOiBcIntUSU1FfSB7Q09OVEVOVH1cIicsXHJcbiAgJ0RlZmF1bHQgTWVtbyBDb21wb3NpdGlvbic6ICdDb21wb3Npw6fDo28gUGFkcsOjbyBkbyBNZW1vJyxcclxuICAnU2hvdyBUYXNrcyBMYWJlbCc6ICdNb3N0cmFyIEV0aXF1ZXRhcyBkZSBUYXJlZmFzJyxcclxuICAnU2hvdyB0YXNrcyBsYWJlbCBuZWFyIHRoZSB0aW1lIHRleHQuIEZhbHNlIGJ5IGRlZmF1bHQnOlxyXG4gICAgJ01vc3RyYXIgZXRpcXVldGFzIGRlIHRhcmVmYXMgcHLDs3hpbW8gYW8gdGV4dG8gZGUgdGVtcG8uIERlc2FjdGl2YWRvIHBvciBwYWRyw6NvJyxcclxufTtcclxuIiwiLy8gUG9ydHVndcOqcyBkbyBCcmFzaWxcclxuLy8gQnJhemlsaWFuIFBvcnR1Z3Vlc2VcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHt9O1xyXG4iLCIvLyBSb23Dom7Eg1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vINGA0YPRgdGB0LrQuNC5XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gVMO8cmvDp2VcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHt9O1xyXG4iLCJleHBvcnQgZGVmYXVsdCB7XHJcbiAgLy8gc2V0dGluZy50c1xyXG4gIHdlbGNvbWU6ICfmrKLov47kvb/nlKggTWVtb3MgJyxcclxuICByaWJib25JY29uVGl0bGU6ICdNZW1vcycsXHJcbiAgbW9udGhzOiBbJ+S4gOaciCcsICfkuozmnIgnLCAn5LiJ5pyIJywgJ+Wbm+aciCcsICfkupTmnIgnLCAn5YWt5pyIJywgJ+S4g+aciCcsICflhavmnIgnLCAn5Lmd5pyIJywgJ+WNgeaciCcsICfljYHkuIDmnIgnLCAn5Y2B5LqM5pyIJ10sXHJcbiAgbW9udGhzU2hvcnQ6IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXSxcclxuICB3ZWVrRGF5czogWyflkajml6UnLCAn5ZGo5LiAJywgJ+WRqOS6jCcsICflkajkuIknLCAn5ZGo5ZubJywgJ+WRqOS6lCcsICflkajlha0nXSxcclxuICB3ZWVrRGF5c1Nob3J0OiBbJ+WRqOaXpScsICflkajkuIAnLCAn5ZGo5LqMJywgJ+WRqOS4iScsICflkajlm5snLCAn5ZGo5LqUJywgJ+WRqOWFrSddLFxyXG4gIHRvOiAn6IezJyxcclxuICB5ZWFyOiAn5bm0JyxcclxuICBtb250aDogJ+aciCcsXHJcbiAgJ0Jhc2ljIE9wdGlvbnMnOiAn5Z+656GA6YCJ6aG5JyxcclxuICAnVXNlciBuYW1lIGluIE1lbW9zJzogJ+WcqCBNZW1vcyDkuK3mmL7npLrnmoTnlKjmiLflkI0nLFxyXG4gIFwiU2V0IHlvdXIgdXNlciBuYW1lIGhlcmUuICdNZW1vcyDwn5iPJyBCeSBkZWZhdWx0XCI6IFwi5Zyo6L+Z6YeM6K6+572u5L2g5Zac5qyi55qE55So5oi35ZCN44CCIOm7mOiupOS4uiAnTWVtb3Mg8J+YjydcIixcclxuICAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnOiAn5Zyo5oyH5a6a5qCH6aKY5ZCO5o+S5YWlIE1lbW8nLFxyXG4gICdZb3Ugc2hvdWxkIHNldCB0aGUgc2FtZSBoZWFkaW5nIGJlbG93IGlmIHlvdSB3YW50IHRvIGluc2VydCBhbmQgcHJvY2VzcyBtZW1vcyBiZWxvdyB0aGUgc2FtZSBoZWFkaW5nLic6XHJcbiAgICAn5L2g5aaC5p6c5oOz6KaB5o+S5YWl5qCH6aKY55qE5ZCM5pe25pi+56S65a+55bqU5qCH6aKY5LiL55qEIE1lbW/vvIzkvaDlv4Xpobvkv53or4HlvZPliY3orr7nva7kuI7kuIvmlrnnmoTop6PmnpDorr7nva7mmK/kuIDoh7TnmoTjgILlvZPkuLrnqbrml7bmj5LlhaXliLDmlofmnKsnLFxyXG4gICdQcm9jZXNzIE1lbW9zIGJlbG93JzogJ+ino+aekOaMh+Wumuagh+mimOWQjueahCBNZW1vJyxcclxuICAnT25seSBlbnRyaWVzIGJlbG93IHRoaXMgc3RyaW5nL3NlY3Rpb24gaW4geW91ciBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgaXQgZG9lcyBub3QgZXhpc3Qgbm8gbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoYXQgZmlsZS4nOlxyXG4gICAgJ+WPquacieWcqOiuvue9rueahOagh+mimOWQjueahCBNZW1vIOaJjeS8muiiq+ino+aekOOAguW9k+S4uuepuuaXtuino+aekOWFqOaWh+eahCBNZW1vJyxcclxuICAnU2F2ZSBNZW1vIGJ1dHRvbiBsYWJlbCc6ICfkv53lrZjmjInpkq7kuIrnmoTmlofmnKwnLFxyXG4gIFwiVGhlIHRleHQgc2hvd24gb24gdGhlIHNhdmUgTWVtbyBidXR0b24gaW4gdGhlIFVJLiAnTk9URUlUJyBieSBkZWZhdWx0LlwiOiBcIuWcqOS/neWtmOaMiemSruS4iuWxleekuueahOaWh+acrOOAgum7mOiupOS4uiAnTk9URUlUJ1wiLFxyXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zJzogJ+iHquWKqOiBmueEpuWIsCBNZW1vcyDovpPlhaXmoYYnLFxyXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zLiBGb2N1cyBieSBkZWZhdWx0Lic6ICflvZPmiZPlvIAgTWVtb3Mg55qE5pe25YCZ6Ieq5Yqo6IGa54Sm5YiwIE1lbW9zIOi+k+WFpeahhuOAgum7mOiupOW8gOWQrycsXHJcbiAgJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zJzogJ+aJk+W8gOavj+aXpSBNZW1vIOeahOaXtuWAmeaJk+W8gCBNZW1vcyDnlYzpnaInLFxyXG4gICdPcGVuIGRhaWx5IG1lbW9zIHdpdGggb3BlbiBtZW1vcy4gT3BlbiBieSBkZWZhdWx0Lic6ICfmiZPlvIDmr4/ml6UgTWVtbyDnmoTml7blgJnmiZPlvIAgTWVtb3Mg55WM6Z2i44CC6buY6K6k5byA5ZCvJyxcclxuICAnT3BlbiBNZW1vcyB3aGVuIG9ic2lkaWFuIG9wZW5zJzogJ+W9k+W8gOWQryBPYnNpZGlhbiDnmoTml7blgJnoh6rliqjmiZPlvIAgTWVtb3MnLFxyXG4gICdXaGVuIGVuYWJsZSB0aGlzLCBNZW1vcyB3aWxsIG9wZW4gd2hlbiBPYnNpZGlhbiBvcGVucy4gRmFsc2UgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ+W9k+W8gOWQr+ivpemAiemhuSwgTWVtb3Mg5Lya5ZyoIE9ic2lkaWFuIOaJk+W8gOaXtuiHquWKqOaJk+W8gOOAgum7mOiupOS4jeW8gOWQr+OAgicsXHJcbiAgJ0hpZGUgZG9uZSB0YXNrcyBpbiBNZW1vIGxpc3QnOiAn5ZyoIG1lbW8g5YiX6KGo5Lit6ZqQ6JeP5bey5a6M5oiQIG1lbW8nLFxyXG4gICdIaWRlIGFsbCBkb25lIHRhc2tzIGluIE1lbW8gbGlzdC4gU2hvdyBkb25lIHRhc2tzIGJ5IGRlZmF1bHQuJzogJ+WcqCBtZW1vIOWIl+ihqOS4remakOiXj+W3suWujOaIkCBtZW1v44CC6buY6K6k5LiN5byA5ZCvJyxcclxuICAnQWR2YW5jZWQgT3B0aW9ucyc6ICfov5vpmLbpgInpobknLFxyXG4gICdVSSBsYW5ndWFnZSBmb3IgZGF0ZSc6ICfpkojlr7nml6XmnJ/lsZXnpLrnmoTor63oqIDnlYzpnaInLFxyXG4gIFwiVHJhbnNsYXRlcyB0aGUgZGF0ZSBVSSBsYW5ndWFnZS4gT25seSAnZW4nIGFuZCAnemgnIGFyZSBhdmFpbGFibGUuXCI6XHJcbiAgICBcIuWvueaXpeacn+eahOS4jeWQjOe/u+ivkeOAguebruWJjeWPquiDvemAieaLqSAnZW4nIOWSjCAnemgn77yI5pyq5p2l5Lya5bqf572u77yJXCIsXHJcbiAgJ0RlZmF1bHQgcHJlZml4JzogJ+m7mOiupOWJjee8gCcsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgcHJlZml4IHdoZW4gY3JlYXRlIG1lbW8sICdMaXN0JyBieSBkZWZhdWx0LlwiOiAn6K6+572u6buY6K6k55qE5YmN57yA5qC35byP44CC6buY6K6k5Li65YiX6KGoJyxcclxuICAnRGVmYXVsdCBpbnNlcnQgZGF0ZSBmb3JtYXQnOiAn5o+S5YWl5pel5pyf6ZmE5bim55qE5qC35byPJyxcclxuICBcIlNldCB0aGUgZGVmYXVsdCBkYXRlIGZvcm1hdCB3aGVuIGluc2VydCBkYXRlIGJ5IEAsICdUYXNrcycgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwi5b2T5L2/55SoIEAg5p2l5b+r6YCf5o+S5YWl5pel5pyf5pe277yM5o+S5YWl5pel5pyf6ZmE5bim55qE5qC35byP77yM6buY6K6k5Li6ICdUYXNrcycg5qC35byPXCIsXHJcbiAgJ0RlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIG1vYmlsZSc6ICflnKjnp7vliqjnq6/kuIrnmoTpu5jorqTnvJbovpHlmajkvY3nva4nLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IGVkaXRvciBwb3NpdGlvbiBvbiBNb2JpbGUsICdUb3AnIGJ5IGRlZmF1bHQuXCI6ICforr7nva7lnKjnp7vliqjnq6/kuIrnmoTpu5jorqTnvJbovpHlmajkvY3nva7vvIzpu5jorqTlnKjpobbpg6jjgIInLFxyXG4gICdVc2UgYnV0dG9uIHRvIHNob3cgZWRpdG9yIG9uIG1vYmlsZSc6ICflvZPnvJbovpHlmajkvY3nva7lnKjlupXpg6jml7bvvIznlKjmjInpkq7mnaXllKTlh7rnvJbovpHlmagnLFxyXG4gICdTZXQgYSBmbG9hdCBidXR0b24gdG8gY2FsbCBlZGl0b3Igb24gbW9iaWxlLiBPbmx5IHdoZW4gZWRpdG9yIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSB3b3Jrcy4nOlxyXG4gICAgJ+iuvue9ruS4gOS4qua1ruWKqOaMiemSruadpeWUpOWHuue8lui+keWZqOOAguW9k+WcqOenu+WKqOerr+S4iuWQr+eUqOivpemAiemhueaJjeS8mueUn+aViCcsXHJcbiAgJ1Nob3cgVGltZSBXaGVuIENvcHkgUmVzdWx0cyc6ICflvZPlpI3liLbmo4DntKLnu5Pmnpzml7bpmYTluKbml7bpl7QnLFxyXG4gICdTaG93IHRpbWUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIDEyOjAwLiBDb3B5IHRpbWUgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ+WcqOWkjeWItuajgOe0oue7k+aenOaXtumZhOW4puWFtuaXtumXtO+8jOS+i+WmgiAxMjowMCDjgILpu5jorqTlvIDlkK8nLFxyXG4gICdTaG93IERhdGUgV2hlbiBDb3B5IFJlc3VsdHMnOiAn5b2T5aSN5Yi25qOA57Si57uT5p6c5pe26ZmE5bim5pel5pyfJyxcclxuICAnU2hvdyBkYXRlIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSBbWzIwMjItMDEtMDFdXS4gQ29weSBkYXRlIGJ5IGRlZmF1bHQuJzpcclxuICAgICflnKjlpI3liLbmo4DntKLnu5Pmnpzml7bpmYTluKblhbbml6XmnJ/vvIzkvovlpoIgW1syMDIyLTAxLTAxXV3jgILpu5jorqTlvIDlkK8nLFxyXG4gICdBZGQgQmxhbmsgTGluZSBCZXR3ZWVuIERpZmZlcmVudCBEYXRlJzogJ+WcqOWkjeWItuaXpeacn+eahOaXtuWAmeWKoOS4iuepuuihjCcsXHJcbiAgJ0FkZCBibGFuayBsaW5lIHdoZW4gY29weSByZXN1bHQgd2l0aCBkYXRlLiBObyBibGFuayBsaW5lIGJ5IGRlZmF1bHQuJzpcclxuICAgICflnKjlpI3liLbml6XmnJ/nmoTml7blgJnlnKjnm7jpgrvnmoTml6XmnJ/kuYvpl7TliqDkuIrnqbrooYzjgILpu5jorqTml6DnqbrooYwnLFxyXG4gICdTaGFyZSBPcHRpb25zJzogJ+WIhuS6q+mAiemhuScsXHJcbiAgJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBTdGFydCc6ICfliIbkuqsgbWVtbyDlm77niYfnmoTlt6bovrnpobXohJonLFxyXG4gIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7TWVtb3NOdW19IHRvIGRpc3BsYXkgTnVtYmVyIG9mIG1lbW9zLCB7VXNlZERheX0gZm9yIGRheXMuICd7TWVtb3NOdW19IE1lbW9zIHtVc2VkRGF5fSBEYXlzJyBCeSBkZWZhdWx0XCI6XHJcbiAgICBcIuS9oOWPr+S7peWcqOi/memHjOiuvue9ruS9oOaDs+imgeeahOS7u+aEj+aWh+acrO+8jOeUqCB7TWVtb3NOdW19IOadpeWxleekuuS9oOiusOW9leeahCBtZW1vIOaVsOmHj++8jHtVc2VkRGF5fSDmnaXlsZXnpLrkvb/nlKjml6XmnJ/jgILpu5jorqTkuLone01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5cydcIixcclxuICAnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIEVuZCc6ICfliIbkuqsgbWVtbyDlm77niYfnmoTlj7PovrnpobXohJonLFxyXG4gIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7VXNlck5hbWV9IGFzIHlvdXIgdXNlcm5hbWUuICfinI3vuI8gQnkge1VzZXJOYW1lfScgQnkgZGVmYXVsdFwiOlxyXG4gICAgXCLkvaDlj6/ku6XlnKjov5nph4zorr7nva7kvaDmg7PopoHnmoTku7vmhI/mlofmnKzvvIznlKgge1VzZXJOYW1lfSDmnaXlsZXnpLrkvaDnmoTnlKjmiLflkI3jgILpu5jorqTkuLogJ+Kcje+4jyBCeSB7VXNlck5hbWV9J1wiLFxyXG4gICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZSc6ICflvZPlnKjnp7vliqjnq6/kuIrml7bkv53lrZjlm77niYfliLDmlofku7blpLknLFxyXG4gICdTYXZlIGltYWdlIHRvIGZvbGRlciBmb3IgbW9iaWxlLiBGYWxzZSBieSBEZWZhdWx0JzogJ+W9k+WcqOenu+WKqOerr+S4iuaXtu+8jOS/neWtmOeUn+aIkOeahOWbvueJh+WIsOaWh+S7tuWkuScsXHJcbiAgJ1NheSBUaGFuayBZb3UnOiAn5oSf6LCi5byA5Y+RJyxcclxuICBEb25hdGU6ICfmjZDotaAnLFxyXG4gICdJZiB5b3UgbGlrZSB0aGlzIHBsdWdpbiwgY29uc2lkZXIgZG9uYXRpbmcgdG8gc3VwcG9ydCBjb250aW51ZWQgZGV2ZWxvcG1lbnQ6JzpcclxuICAgICflpoLmnpzkvaDllpzmrKLov5nkuKrmj5Lku7bvvIzogIzkuJTkuZ/luIzmnJvnu5nmiJHkubDpuKHohb/vvIzpgqPkuYjlj6/ku6XogIPomZEgR2l0aHViIOmhtemdouWPs+i+ueeahCBTcG9uc29yficsXHJcbiAgJ0ZpbGUgTmFtZSBvZiBSZWN5Y2xlIEJpbic6ICflm57mlLbnq5nnmoTmlofku7blkI0nLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcmVjeWNsZSBiaW4uICdkZWxldGUnIEJ5IGRlZmF1bHRcIjogXCLnu5nlm57mlLbnq5norr7nva7kuIDkuKrmlofku7blkI3jgILpu5jorqTkuLonZGVsZXRlJ1wiLFxyXG4gICdGaWxlIE5hbWUgb2YgUXVlcnkgRmlsZSc6ICfmo4DntKLmlofku7bnmoTmlofku7blkI0nLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcXVlcnkgZmlsZS4gJ3F1ZXJ5JyBCeSBkZWZhdWx0XCI6IFwi6K6+572u5a2Y5pS+5qOA57Si5byP55qE5paH5Lu255qE5paH5Lu25ZCN44CC6buY6K6k5Li6J3F1ZXJ5J1wiLFxyXG4gICdVc2UgVGFncyBJbiBWYXVsdCc6ICfkvb/nlKjlnKjlupPlhoXnmoTmiYDmnInmoIfnrb4nLFxyXG4gICdVc2UgdGFncyBpbiB2YXVsdCByYXRoZXIgdGhhbiBvbmx5IGluIE1lbW9zLiBGYWxzZSBieSBkZWZhdWx0Lic6ICfkvb/nlKjlnKjlupPlhoXnmoTogIzkuI3mmK8gTWVtb3Mg5YaF55qE5qCH562+44CC6buY6K6k5YWz6ZetJyxcclxuICBcIkRvbid0IHN1cHBvcnQgd2ViIGltYWdlIHlldCwgcGxlYXNlIGlucHV0IGltYWdlIHBhdGggaW4gdmF1bHRcIjogJ+aaguS4jeaUr+aMgee9kee7nOWbvueJh++8jOivt+S9v+eUqOacrOWcsOWbvueJhycsXHJcbiAgJ1JlYWR5IHRvIGNvbnZlcnQgaW1hZ2UgaW50byBiYWNrZ3JvdW5kJzogJ+ato+WcqOWwhuWbvueJh+i9rOaNouS4uuiDjOaZr+WbvicsXHJcbiAgTGlzdDogJ+WIl+ihqCcsXHJcbiAgVGFzazogJ+S7u+WKoScsXHJcbiAgVG9wOiAn6aG26YOoJyxcclxuICBCb3R0b206ICflupXpg6gnLFxyXG4gIFRBRzogJ+agh+etvicsXHJcbiAgREFZOiAn5aSpJyxcclxuICBRVUVSWTogJ+ajgOe0ouW8jycsXHJcbiAgRURJVDogJ+e8lui+kScsXHJcbiAgUElOOiAn572u6aG2JyxcclxuICBVTlBJTjogJ+WPlua2iOe9rumhticsXHJcbiAgREVMRVRFOiAn5Yig6ZmkJyxcclxuICAnQ09ORklSTe+8gSc6ICfnoa7lrprliKDpmaQnLFxyXG4gICdDUkVBVEUgRklMVEVSJzogJ+WIm+W7uuajgOe0ouW8jycsXHJcbiAgU2V0dGluZ3M6ICforr7nva4nLFxyXG4gICdSZWN5Y2xlIGJpbic6ICflm57mlLbnq5knLFxyXG4gICdBYm91dCBNZSc6ICflhbPkuo4nLFxyXG4gICdGZXRjaGluZyBkYXRhLi4uJzogJ+iOt+WPluaVsOaNruS4rS4uLicsXHJcbiAgJ0hlcmUgaXMgTm8gWmV0dGVscy4nOiAn5rKh5pyJ5om+5YiwIG1lbW8nLFxyXG4gICdGcmVxdWVudGx5IFVzZWQgVGFncyc6ICfluLjnlKjmoIfnrb4nLFxyXG4gICdXaGF0IGRvIHlvdSB0aGluayBub3cuLi4nOiAn5L2g546w5Zyo5Zyo5oOz5LuA5LmI77yfJyxcclxuICBSRUFEOiAn6ZiF6K+7JyxcclxuICBNQVJLOiAn5byV55SoJyxcclxuICBTSEFSRTogJ+WIhuS6qycsXHJcbiAgU09VUkNFOiAn5p2l5rqQJyxcclxuICBSRVNUT1JFOiAn5oGi5aSNJyxcclxuICAnREVMRVRFIEFUJzogJ+WIoOmZpOS6jicsXHJcbiAgJ05vb29vcCEnOiAn5ZWl6YO95rKh5pyJ77yBJyxcclxuICAnQWxsIERhdGEgaXMgTG9hZGVkIPCfjoknOiAn5omA5pyJ5pWw5o2u6YO95Yqg6L295aW95ZWmIPCfjoknLFxyXG4gICdRdWljayBmaWx0ZXInOiAn5b+r6YCf562b6YCJJyxcclxuICBUWVBFOiAn57G75Z6LJyxcclxuICBMSU5LRUQ6ICfmnInpk77mjqUnLFxyXG4gICdOTyBUQUdTJzogJ+aXoOagh+etvicsXHJcbiAgJ0hBUyBMSU5LUyc6ICfmnInotoXpk77mjqUnLFxyXG4gICdIQVMgSU1BR0VTJzogJ+acieWbvueJhycsXHJcbiAgSU5DTFVERTogJ+WMheaLrCcsXHJcbiAgRVhDTFVERTogJ+aOkumZpCcsXHJcbiAgVEVYVDogJ+aWh+acrCcsXHJcbiAgSVM6ICfmmK8nLFxyXG4gIElTTk9UOiAn5LiN5pivJyxcclxuICBTRUxFQ1Q6ICfpgInmi6knLFxyXG4gICdBREQgRklMVEVSIFRFUk1TJzogJ+a3u+WKoOajgOe0ouadoeS7ticsXHJcbiAgRklMVEVSOiAn5qOA57Si5ZmoJyxcclxuICBUSVRMRTogJ+agh+mimCcsXHJcbiAgJ0NSRUFURSBRVUVSWSc6ICfliJvlu7rmo4DntKLlvI8nLFxyXG4gICdFRElUIFFVRVJZJzogJ+e8lui+keajgOe0ouW8jycsXHJcbiAgTUFUQ0g6ICfljLnphY0nLFxyXG4gIFRJTUVTOiAn5qyhJyxcclxuICAnU2hhcmUgTWVtbyBJbWFnZSc6ICfliIbkuqsgTWVtbyDlm77niYcnLFxyXG4gICfihpdDbGljayB0aGUgYnV0dG9uIHRvIHNhdmUnOiAn4oaX54K55Ye75Y+z5LiK6KeS55qE5oyJ6ZKu5p2l5L+d5a2YJyxcclxuICAnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLic6ICflm77niYfmraPlnKjnlJ/miJDkuK0uLi4nLFxyXG4gICdJbWFnZSBpcyBsb2FkaW5nLi4uJzogJ+WbvueJh+ato+WcqOWKoOi9veS4rS4uLicsXHJcbiAgJ/CfmJ8gQ2Fubm90IGxvYWQgaW1hZ2UsIGltYWdlIGxpbmsgbWF5YmUgYnJva2VuJzogJ/CfmJ8g5peg5rOV5Yqg6L295Zu+54mH77yM5Zu+54mH6ZO+5o6l5Lmf6K645LiN5a2Y5ZyoJyxcclxuICAnTG9hZGluZy4uLic6ICfliqrlipvliqDovb3kuK0uLi4nLFxyXG4gICdEYWlseSBNZW1vcyc6ICfmr4/ml6UgTWVtb3MnLFxyXG4gICdDQU5DRUwgRURJVCc6ICflj5bmtojnvJbovpEnLFxyXG4gICdMSU5LIFRPIFRIRSc6ICfpk77mjqXliLAnLFxyXG4gICdNb2JpbGUgT3B0aW9ucyc6ICfnp7vliqjnq6/pgInpobknLFxyXG4gICdFeHBlcmltZW50YWwgT3B0aW9ucyc6ICflrp7pqozmgKfpgInpobknLFxyXG4gICdCYWNrZ3JvdW5kIEltYWdlIGluIERhcmsgVGhlbWUnOiAn5rex6Imy5Li76aKY55qE6IOM5pmv5Zu+JyxcclxuICAnQmFja2dyb3VuZCBJbWFnZSBpbiBMaWdodCBUaGVtZSc6ICfmtYXoibLkuLvpopjnmoTog4zmma/lm74nLFxyXG4gICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBkYXJrIHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInOlxyXG4gICAgJ+iuvue9rua3seiJsuS4u+mimOeahOiDjOaZr+WbvuOAguivt+iuvue9ruexu+S8vFwiRGFpbHkvb25lLnBuZ1wi55qE6Lev5b6EJyxcclxuICAnU2V0IGJhY2tncm91bmQgaW1hZ2UgaW4gbGlnaHQgdGhlbWUuIFNldCBzb21ldGhpbmcgbGlrZSBcIkRhaWx5L29uZS5wbmdcIic6XHJcbiAgICAn6K6+572u5rWF6Imy5Li76aKY55qE6IOM5pmv5Zu+44CC6K+36K6+572u57G75Ly8XCJEYWlseS9vbmUucG5nXCLnmoTot6/lvoQnLFxyXG4gICdTZXQgZGVmYXVsdCBtZW1vIGNvbXBvc2l0aW9uLCB5b3Ugc2hvdWxkIHVzZSB7VElNRX0gYXMgXCJISDptbVwiIGFuZCB7Q09OVEVOVH0gYXMgY29udGVudC4gXCJ7VElNRX0ge0NPTlRFTlR9XCIgYnkgZGVmYXVsdCc6XHJcbiAgICAn6K6+572u6buY6K6kIE1lbW8g57uE5oiQ77yM5L2g5b+F6aG76KaB5L2/55SoIHtUSU1FfSDkvZzkuLogXCJISDptbVwiIOiAjOS4lOimgeiuvue9riB7Q09OVEVOVH0g5L2c5Li65YaF5a656K+G5Yir44CC6buY6K6k5oOF5Ya15LiL77yMIE1lbW8g5Z+65LqOIFwie1RJTUV9IHtDT05URU5UfVwiIOivhuWIqycsXHJcbiAgJ0RlZmF1bHQgTWVtbyBDb21wb3NpdGlvbic6ICfpu5jorqQgTWVtbyDnu4TmiJAnLFxyXG4gICdTaG93IFRhc2tzIExhYmVsJzogJ+WxleekuuS7u+WKoeagh+etvicsXHJcbiAgJ1Nob3cgdGFza3MgbGFiZWwgbmVhciB0aGUgdGltZSB0ZXh0LiBGYWxzZSBieSBkZWZhdWx0JzogJ+WcqCBNZW1vIOeahOaXtumXtOaXgeWxleekuuS7u+WKoeagh+etvuOAgum7mOiupOaDheWGteS4i+S4jeWxleekuicsXHJcbn07XHJcbiIsIi8vIOe5gemrlOS4reaWh1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vIENvZGUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdmFsZW50aW5lMTk1L29ic2lkaWFuLWFkbW9uaXRpb24vYmxvYi9tYXN0ZXIvc3JjL2xhbmcvaGVscGVycy50c1xyXG5cclxuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCBhciBmcm9tICcuL2xvY2FsZS9hcic7XHJcbmltcG9ydCBjeiBmcm9tICcuL2xvY2FsZS9jeic7XHJcbmltcG9ydCBkYSBmcm9tICcuL2xvY2FsZS9kYSc7XHJcbmltcG9ydCBkZSBmcm9tICcuL2xvY2FsZS9kZSc7XHJcbmltcG9ydCBlbiBmcm9tICcuL2xvY2FsZS9lbic7XHJcbmltcG9ydCBlbkdCIGZyb20gJy4vbG9jYWxlL2VuLWdiJztcclxuaW1wb3J0IGVzIGZyb20gJy4vbG9jYWxlL2VzJztcclxuaW1wb3J0IGZyIGZyb20gJy4vbG9jYWxlL2ZyJztcclxuaW1wb3J0IGhpIGZyb20gJy4vbG9jYWxlL2hpJztcclxuaW1wb3J0IGlkIGZyb20gJy4vbG9jYWxlL2lkJztcclxuaW1wb3J0IGl0IGZyb20gJy4vbG9jYWxlL2l0JztcclxuaW1wb3J0IGphIGZyb20gJy4vbG9jYWxlL2phJztcclxuaW1wb3J0IGtvIGZyb20gJy4vbG9jYWxlL2tvJztcclxuaW1wb3J0IG5sIGZyb20gJy4vbG9jYWxlL25sJztcclxuaW1wb3J0IG5vIGZyb20gJy4vbG9jYWxlL25vJztcclxuaW1wb3J0IHBsIGZyb20gJy4vbG9jYWxlL3BsJztcclxuaW1wb3J0IHB0IGZyb20gJy4vbG9jYWxlL3B0JztcclxuaW1wb3J0IHB0QlIgZnJvbSAnLi9sb2NhbGUvcHQtYnInO1xyXG5pbXBvcnQgcm8gZnJvbSAnLi9sb2NhbGUvcm8nO1xyXG5pbXBvcnQgcnUgZnJvbSAnLi9sb2NhbGUvcnUnO1xyXG5pbXBvcnQgdHIgZnJvbSAnLi9sb2NhbGUvdHInO1xyXG5pbXBvcnQgemhDTiBmcm9tICcuL2xvY2FsZS96aC1jbic7XHJcbmltcG9ydCB6aFRXIGZyb20gJy4vbG9jYWxlL3poLXR3JztcclxuXHJcbmNvbnN0IGxvY2FsZU1hcDoge1trOiBzdHJpbmddOiBQYXJ0aWFsPHR5cGVvZiBlbj59ID0ge1xyXG4gIGFyLFxyXG4gIGNzOiBjeixcclxuICBkYSxcclxuICBkZSxcclxuICBlbixcclxuICAnZW4tZ2InOiBlbkdCLFxyXG4gIGVzLFxyXG4gIGZyLFxyXG4gIGhpLFxyXG4gIGlkLFxyXG4gIGl0LFxyXG4gIGphLFxyXG4gIGtvLFxyXG4gIG5sLFxyXG4gIG5uOiBubyxcclxuICBwbCxcclxuICBwdCxcclxuICAncHQtYnInOiBwdEJSLFxyXG4gIHJvLFxyXG4gIHJ1LFxyXG4gIHRyLFxyXG4gICd6aC1jbic6IHpoQ04sXHJcbiAgJ3poLXR3JzogemhUVyxcclxufTtcclxuXHJcbmNvbnN0IGxvY2FsZSA9IGxvY2FsZU1hcFttb21lbnQubG9jYWxlKCldO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHQoc3RyOiBrZXlvZiB0eXBlb2YgZW4pOiBzdHJpbmcge1xyXG4gIHJldHVybiAobG9jYWxlICYmIGxvY2FsZVtzdHJdKSB8fCBlbltzdHJdO1xyXG59XHJcbiIsImltcG9ydCB7Zm9yd2FyZFJlZiwgUmVhY3ROb2RlLCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBUaW55VW5kbyBmcm9tICd0aW55LXVuZG8nO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi8uLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7c3RvcmFnZSwgcmVtb3ZlfSBmcm9tICcuLi8uLi9oZWxwZXJzL3N0b3JhZ2UnO1xyXG5pbXBvcnQgdXNlUmVmcmVzaCBmcm9tICcuLi8uLi9ob29rcy91c2VSZWZyZXNoJztcclxuaW1wb3J0IE9ubHkgZnJvbSAnLi4vY29tbW9uL09ubHlXaGVuJztcclxuaW1wb3J0ICcuLi8uLi9sZXNzL2VkaXRvci5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUgZnJvbSAnQHdlYnNjb3BlaW8vcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHt1c2VkVGFnc30gZnJvbSAnLi4vLi4vb2JDb21wb25lbnRzL29iVGFnU3VnZ2VzdGVyJztcclxuaW1wb3J0ICcuLi8uLi9sZXNzL3N1Z2dlc3QubGVzcyc7XHJcbmltcG9ydCB7Rm9jdXNPbkVkaXRvciwgU2F2ZU1lbW9CdXR0b25MYWJlbH0gZnJvbSAnLi4vLi4vbWVtb3MnO1xyXG5pbXBvcnQge2dldFN1Z2dlc3Rpb25zfSBmcm9tICcuLi8uLi9vYkNvbXBvbmVudHMvb2JGaWxlU3VnZ2VzdGVyJztcclxuaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi8uLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbnR5cGUgSXRlbVByb3BzID0ge1xyXG4gIGVudGl0eToge1xyXG4gICAgY2hhcjogc3RyaW5nO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgZmlsZT86IFRGaWxlO1xyXG4gIH07XHJcbn07XHJcblxyXG50eXBlIExvYWRpbmdQcm9wcyA9IHtcclxuICBkYXRhOiBBcnJheTx7bmFtZTogc3RyaW5nOyBjaGFyOiBzdHJpbmd9PjtcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRWRpdG9yUmVmQWN0aW9ucyB7XHJcbiAgZWxlbWVudDogSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICBmb2N1czogRnVuY3Rpb25UeXBlO1xyXG4gIGluc2VydFRleHQ6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgc2V0Q29udGVudDogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcclxuICBnZXRDb250ZW50OiAoKSA9PiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBFZGl0b3JQcm9wcyB7XHJcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XHJcbiAgaW5pdGlhbENvbnRlbnQ6IHN0cmluZztcclxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIHNob3dDb25maXJtQnRuOiBib29sZWFuO1xyXG4gIHNob3dDYW5jZWxCdG46IGJvb2xlYW47XHJcbiAgdG9vbHM/OiBSZWFjdE5vZGU7XHJcbiAgb25Db25maXJtQnRuQ2xpY2s6IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgb25DYW5jZWxCdG5DbGljazogKCkgPT4gdm9pZDtcclxuICBvbkNvbnRlbnRDaGFuZ2U6IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQ7XHJcbn1cclxuXHJcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbmNvbnN0IFRJdGVtID0gKHtlbnRpdHk6IHtuYW1lLCBjaGFyLCBmaWxlfX06IEl0ZW1Qcm9wcykgPT4ge1xyXG4gIHJldHVybiA8ZGl2PntgJHtjaGFyfWB9PC9kaXY+O1xyXG59O1xyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5jb25zdCBMb2FkaW5nID0gKHtkYXRhfTogTG9hZGluZ1Byb3BzKSA9PiB7XHJcbiAgcmV0dXJuIDxkaXY+TG9hZGluZzwvZGl2PjtcclxufTtcclxuXHJcbmV4cG9ydCBsZXQgZWRpdG9ySW5wdXQ6IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbmxldCBhY3R1YWxUb2tlbjogc3RyaW5nO1xyXG5cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2Rpc3BsYXktbmFtZVxyXG5jb25zdCBFZGl0b3IgPSBmb3J3YXJkUmVmKChwcm9wczogRWRpdG9yUHJvcHMsIHJlZjogUmVhY3QuRm9yd2FyZGVkUmVmPEVkaXRvclJlZkFjdGlvbnM+KSA9PiB7XHJcbiAgY29uc3Qge1xyXG4gICAgZ2xvYmFsU3RhdGU6IHt1c2VUaW55VW5kb0hpc3RvcnlDYWNoZX0sXHJcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XHJcbiAgY29uc3Qge1xyXG4gICAgY2xhc3NOYW1lLFxyXG4gICAgaW5pdGlhbENvbnRlbnQsXHJcbiAgICBwbGFjZWhvbGRlcixcclxuICAgIHNob3dDb25maXJtQnRuLFxyXG4gICAgc2hvd0NhbmNlbEJ0bixcclxuICAgIG9uQ29uZmlybUJ0bkNsaWNrOiBoYW5kbGVDb25maXJtQnRuQ2xpY2tDYWxsYmFjayxcclxuICAgIG9uQ2FuY2VsQnRuQ2xpY2s6IGhhbmRsZUNhbmNlbEJ0bkNsaWNrQ2FsbGJhY2ssXHJcbiAgICBvbkNvbnRlbnRDaGFuZ2U6IGhhbmRsZUNvbnRlbnRDaGFuZ2VDYWxsYmFjayxcclxuICB9ID0gcHJvcHM7XHJcbiAgY29uc3QgZWRpdG9yUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IHRpbnlVbmRvUmVmID0gdXNlUmVmPFRpbnlVbmRvIHwgbnVsbD4obnVsbCk7XHJcbiAgY29uc3QgcmVmcmVzaCA9IHVzZVJlZnJlc2goKTtcclxuICAvLyBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpXHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW5pdGlhbENvbnRlbnQpIHtcclxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPSBpbml0aWFsQ29udGVudDtcclxuICAgICAgcmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICh1c2VUaW55VW5kb0hpc3RvcnlDYWNoZSkge1xyXG4gICAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB7dGlueVVuZG9BY3Rpb25zQ2FjaGUsIHRpbnlVbmRvSW5kZXhDYWNoZX0gPSBzdG9yYWdlLmdldChbJ3RpbnlVbmRvQWN0aW9uc0NhY2hlJywgJ3RpbnlVbmRvSW5kZXhDYWNoZSddKTtcclxuXHJcbiAgICAgIHRpbnlVbmRvUmVmLmN1cnJlbnQgPSBuZXcgVGlueVVuZG8oZWRpdG9yUmVmLmN1cnJlbnQsIHtcclxuICAgICAgICBpbnRlcnZhbDogNTAwMCxcclxuICAgICAgICBpbml0aWFsQWN0aW9uczogdGlueVVuZG9BY3Rpb25zQ2FjaGUsXHJcbiAgICAgICAgaW5pdGlhbEluZGV4OiB0aW55VW5kb0luZGV4Q2FjaGUsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGlueVVuZG9SZWYuY3VycmVudC5zdWJzY3JpYmUoKGFjdGlvbnMsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgc3RvcmFnZS5zZXQoe1xyXG4gICAgICAgICAgdGlueVVuZG9BY3Rpb25zQ2FjaGU6IGFjdGlvbnMsXHJcbiAgICAgICAgICB0aW55VW5kb0luZGV4Q2FjaGU6IGluZGV4LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgdGlueVVuZG9SZWYuY3VycmVudD8uZGVzdHJveSgpO1xyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGlueVVuZG9SZWYuY3VycmVudD8uZGVzdHJveSgpO1xyXG4gICAgICB0aW55VW5kb1JlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgc3RvcmFnZS5yZW1vdmUoWyd0aW55VW5kb0FjdGlvbnNDYWNoZScsICd0aW55VW5kb0luZGV4Q2FjaGUnXSk7XHJcbiAgICB9XHJcbiAgfSwgW3VzZVRpbnlVbmRvSGlzdG9yeUNhY2hlXSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSAoZWRpdG9yUmVmLmN1cnJlbnQuc2Nyb2xsSGVpZ2h0ID8/IDApICsgJ3B4JztcclxuICAgIH1cclxuICB9LCBbZWRpdG9yUmVmLmN1cnJlbnQ/LnZhbHVlXSk7XHJcblxyXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUoXHJcbiAgICByZWYsXHJcbiAgICAoKSA9PiAoe1xyXG4gICAgICBlbGVtZW50OiBlZGl0b3JSZWYuY3VycmVudCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50LFxyXG4gICAgICBmb2N1czogKCkgPT4ge1xyXG4gICAgICAgIGlmIChGb2N1c09uRWRpdG9yKSB7XHJcbiAgICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGluc2VydFRleHQ6IChyYXdUZXh0OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcmV2VmFsdWUgPSBlZGl0b3JSZWYuY3VycmVudC52YWx1ZTtcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC52YWx1ZSA9XHJcbiAgICAgICAgICBwcmV2VmFsdWUuc2xpY2UoMCwgZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQpICtcclxuICAgICAgICAgIHJhd1RleHQgK1xyXG4gICAgICAgICAgcHJldlZhbHVlLnNsaWNlKGVkaXRvclJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0KTtcclxuICAgICAgICBoYW5kbGVDb250ZW50Q2hhbmdlQ2FsbGJhY2soZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUpO1xyXG4gICAgICAgIHJlZnJlc2goKTtcclxuICAgICAgfSxcclxuICAgICAgc2V0Q29udGVudDogKHRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChlZGl0b3JSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPSB0ZXh0O1xyXG4gICAgICAgICAgaGFuZGxlQ29udGVudENoYW5nZUNhbGxiYWNrKGVkaXRvclJlZi5jdXJyZW50LnZhbHVlKTtcclxuICAgICAgICAgIHJlZnJlc2goKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGdldENvbnRlbnQ6ICgpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIHJldHVybiBlZGl0b3JSZWYuY3VycmVudD8udmFsdWUgPz8gJyc7XHJcbiAgICAgIH0sXHJcbiAgICB9KSxcclxuICAgIFtdLFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUluc2VydFRyaWdnZXIgPSAoZXZlbnQ6IHtjdXJyZW50VHJpZ2dlcjogc3RyaW5nOyBpdGVtOiBhbnl9KSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7ZmlsZU1hbmFnZXJ9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG5cclxuICAgIGlmIChldmVudC5jdXJyZW50VHJpZ2dlciA9PT0gJyMnKSB7XHJcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IGVkaXRvclJlZi5jdXJyZW50LnZhbHVlO1xyXG4gICAgICBsZXQgcmVtb3ZlQ2hhck51bTtcclxuICAgICAgaWYgKGFjdHVhbFRva2VuICE9PSBudWxsICYmIGFjdHVhbFRva2VuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZW1vdmVDaGFyTnVtID0gYWN0dWFsVG9rZW4ubGVuZ3RoO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlbW92ZUNoYXJOdW0gPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBiZWhpbmRDaGFyTnVtID0gZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldlZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKCEvXFxzL2cudGVzdChwcmV2VmFsdWVbYmVoaW5kQ2hhck51bV0pKSB7XHJcbiAgICAgICAgICBiZWhpbmRDaGFyTnVtKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC52YWx1ZSA9XHJcbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICBwcmV2VmFsdWUuc2xpY2UoMCwgZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQgLSByZW1vdmVDaGFyTnVtKSArXHJcbiAgICAgICAgZXZlbnQuaXRlbS5jaGFyICtcclxuICAgICAgICBwcmV2VmFsdWUuc2xpY2UoYmVoaW5kQ2hhck51bSk7XHJcbiAgICAgIGhhbmRsZUNvbnRlbnRDaGFuZ2VDYWxsYmFjayhlZGl0b3JSZWYuY3VycmVudC52YWx1ZSk7XHJcbiAgICAgIHJlZnJlc2goKTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQuY3VycmVudFRyaWdnZXIgPT09ICdbWycpIHtcclxuICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlTWFuYWdlci5nZW5lcmF0ZU1hcmtkb3duTGluayhldmVudC5pdGVtLmZpbGUsIGV2ZW50Lml0ZW0uZmlsZS5wYXRoLCAnJywgJycpO1xyXG5cclxuICAgICAgY29uc3QgcHJldlZhbHVlID0gZWRpdG9yUmVmLmN1cnJlbnQudmFsdWU7XHJcbiAgICAgIGxldCByZW1vdmVDaGFyTnVtO1xyXG4gICAgICBpZiAoYWN0dWFsVG9rZW4gIT09IG51bGwgJiYgYWN0dWFsVG9rZW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmIChmaWxlUGF0aC5jb250YWlucygnW1snKSkge1xyXG4gICAgICAgICAgcmVtb3ZlQ2hhck51bSA9IGFjdHVhbFRva2VuLmxlbmd0aCArIDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5pdGVtLmZpbGUuZXh0ZW5zaW9uICE9PSAnbWQnKSB7XHJcbiAgICAgICAgICByZW1vdmVDaGFyTnVtID0gYWN0dWFsVG9rZW4ubGVuZ3RoICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVtb3ZlQ2hhck51bSA9IGFjdHVhbFRva2VuLmxlbmd0aCArIDI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlbW92ZUNoYXJOdW0gPSAyO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBiZWhpbmRDaGFyTnVtID0gZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldlZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKCEvXFxzL2cudGVzdChwcmV2VmFsdWVbYmVoaW5kQ2hhck51bV0pKSB7XHJcbiAgICAgICAgICBiZWhpbmRDaGFyTnVtKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC52YWx1ZSA9XHJcbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICBwcmV2VmFsdWUuc2xpY2UoMCwgZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQgLSByZW1vdmVDaGFyTnVtKSArXHJcbiAgICAgICAgZmlsZVBhdGggK1xyXG4gICAgICAgIHByZXZWYWx1ZS5zbGljZShiZWhpbmRDaGFyTnVtKTtcclxuICAgICAgaGFuZGxlQ29udGVudENoYW5nZUNhbGxiYWNrKGVkaXRvclJlZi5jdXJyZW50LnZhbHVlKTtcclxuICAgICAgcmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUVkaXRvcklucHV0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgaGFuZGxlQ29udGVudENoYW5nZUNhbGxiYWNrKGVkaXRvclJlZi5jdXJyZW50Py52YWx1ZSA/PyAnJyk7XHJcbiAgICByZWZyZXNoKCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVFZGl0b3JLZXlEb3duID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xyXG4gICAgICBpZiAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgaGFuZGxlQ29tbW9uQ29uZmlybUJ0bkNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJlZnJlc2goKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNvbW1vbkNvbmZpcm1CdG5DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXRvclJlZi5jdXJyZW50LnZhbHVlID0gZ2V0RWRpdG9yQ29udGVudENhY2hlKCk7XHJcblxyXG4gICAgaGFuZGxlQ29uZmlybUJ0bkNsaWNrQ2FsbGJhY2soZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUpO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPSAnJztcclxuXHJcbiAgICByZWZyZXNoKCk7XHJcbiAgICAvLyBBZnRlciBjb25maXJtIGJ0biBjbGlja2VkLCB0aW55LXVuZG8gc2hvdWxkIHJlc2V0IHN0YXRlKGNsZWFyIGFjdGlvbnMgYW5kIGluZGV4KVxyXG4gICAgdGlueVVuZG9SZWYuY3VycmVudD8ucmVzZXRTdGF0ZSgpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQ29tbW9uQ2FuY2VsQnRuQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICBoYW5kbGVDYW5jZWxCdG5DbGlja0NhbGxiYWNrKCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBnZXRFZGl0b3JDb250ZW50Q2FjaGUgPSAoKTogc3RyaW5nID0+IHtcclxuICAgIHJldHVybiBzdG9yYWdlLmdldChbJ2VkaXRvckNvbnRlbnRDYWNoZSddKS5lZGl0b3JDb250ZW50Q2FjaGUgPz8gJyc7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZ2V0RWRpdG9yQ29udGVudCA9ICgpOiBzdHJpbmcgPT4ge1xyXG4gICAgaWYgKCFlZGl0b3JSZWYuY3VycmVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPSBnZXRFZGl0b3JDb250ZW50Q2FjaGUoKTtcclxuICAgIC8vIGlmKCBGb2N1c09uRWRpdG9yICl7XHJcbiAgICAvLyAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJldHVybiBlZGl0b3JSZWYuY3VycmVudC52YWx1ZTtcclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9eydjb21tb24tZWRpdG9yLXdyYXBwZXIgJyArIGNsYXNzTmFtZX0+XHJcbiAgICAgIDxSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlXHJcbiAgICAgICAgLy8gYXV0b0ZvY3VzXHJcbiAgICAgICAgY2xhc3NOYW1lPVwiY29tbW9uLWVkaXRvci1pbnB1dGVyIHNjcm9sbFwiXHJcbiAgICAgICAgbG9hZGluZ0NvbXBvbmVudD17TG9hZGluZ31cclxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XHJcbiAgICAgICAgbW92ZVBvcHVwQXNZb3VUeXBlPXt0cnVlfVxyXG4gICAgICAgIC8vIHJlbmRlclRvQm9keT17dHJ1ZX1cclxuXHJcbiAgICAgICAgcmVmPXsocnRhKSA9PiB7XHJcbiAgICAgICAgICBydGEgPSBydGE7XHJcbiAgICAgICAgfX1cclxuICAgICAgICB2YWx1ZT17Z2V0RWRpdG9yQ29udGVudCgpfVxyXG4gICAgICAgIGlubmVyUmVmPXsodGV4dGFyZWEpID0+IHtcclxuICAgICAgICAgIGVkaXRvclJlZi5jdXJyZW50ID0gdGV4dGFyZWE7XHJcbiAgICAgICAgfX1cclxuICAgICAgICBvbklucHV0PXtoYW5kbGVFZGl0b3JJbnB1dH1cclxuICAgICAgICBvbktleURvd249e2hhbmRsZUVkaXRvcktleURvd259XHJcbiAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgIG1pbkhlaWdodDogNDgsXHJcbiAgICAgICAgfX1cclxuICAgICAgICBkcm9wZG93blN0eWxlPXt7XHJcbiAgICAgICAgICBtaW5XaWR0aDogMTgwLFxyXG4gICAgICAgICAgbWF4SGVpZ2h0OiAyNTAsXHJcbiAgICAgICAgICBvdmVyZmxvd1k6ICdhdXRvJyxcclxuICAgICAgICB9fVxyXG4gICAgICAgIG1pbkNoYXI9ezB9XHJcbiAgICAgICAgb25JdGVtU2VsZWN0ZWQ9e2hhbmRsZUluc2VydFRyaWdnZXJ9XHJcbiAgICAgICAgc2Nyb2xsVG9JdGVtPXt0cnVlfVxyXG4gICAgICAgIHRyaWdnZXI9e3tcclxuICAgICAgICAgICcjJzoge1xyXG4gICAgICAgICAgICBkYXRhUHJvdmlkZXI6ICh0b2tlbikgPT4ge1xyXG4gICAgICAgICAgICAgIGFjdHVhbFRva2VuID0gdG9rZW47XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHVzZWRUYWdzKHRva2VuKS5tYXAoKHtuYW1lLCBjaGFyfSkgPT4gKHtuYW1lLCBjaGFyfSkpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IFRJdGVtLFxyXG4gICAgICAgICAgICBhZnRlcldoaXRlc3BhY2U6IHRydWUsXHJcbiAgICAgICAgICAgIG91dHB1dDogKGl0ZW0pID0+IGl0ZW0uY2hhcixcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAnW1snOiB7XHJcbiAgICAgICAgICAgIGRhdGFQcm92aWRlcjogKHRva2VuKSA9PiB7XHJcbiAgICAgICAgICAgICAgYWN0dWFsVG9rZW4gPSB0b2tlbjtcclxuICAgICAgICAgICAgICByZXR1cm4gZ2V0U3VnZ2VzdGlvbnModG9rZW4pXHJcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgMTApXHJcbiAgICAgICAgICAgICAgICAubWFwKCh7bmFtZSwgY2hhciwgZmlsZX0pID0+ICh7bmFtZSwgY2hhciwgZmlsZX0pKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICAgICAgY29tcG9uZW50OiBUSXRlbSxcclxuICAgICAgICAgICAgYWZ0ZXJXaGl0ZXNwYWNlOiB0cnVlLFxyXG4gICAgICAgICAgICBvdXRwdXQ6IChpdGVtKSA9PiBpdGVtLmNoYXIsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgLy8gXCJbW1wiOiB7XHJcbiAgICAgICAgICAvLyAgIGRhdGFQcm92aWRlcjogdG9rZW4gPT4ge1xyXG4gICAgICAgICAgLy8gICAgIGFjdHVhbFRva2VuID0gdG9rZW47XHJcbiAgICAgICAgICAvLyAgICAgcmV0dXJuIHVzZWRUYWdzKHRva2VuKVxyXG4gICAgICAgICAgLy8gICAgICAgLnNsaWNlKDAsIDEwKVxyXG4gICAgICAgICAgLy8gICAgICAgLm1hcCgoeyBuYW1lLCBjaGFyIH0pID0+ICh7IG5hbWUsIGNoYXIgfSkpO1xyXG4gICAgICAgICAgLy8gICB9LFxyXG4gICAgICAgICAgLy8gICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgLy8gICBjb21wb25lbnQ6IEl0ZW0sXHJcbiAgICAgICAgICAvLyAgIGFmdGVyV2hpdGVzcGFjZTogdHJ1ZSxcclxuICAgICAgICAgIC8vICAgb3V0cHV0OiAoaXRlbSwgdHJpZ2dlcikgPT4gaXRlbS5jaGFyLFxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgIH19XHJcbiAgICAgIC8+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29tbW9uLXRvb2xzLXdyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbW1vbi10b29scy1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxPbmx5IHdoZW49e3Byb3BzLnRvb2xzICE9PSB1bmRlZmluZWR9Pntwcm9wcy50b29sc308L09ubHk+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG5zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPE9ubHkgd2hlbj17c2hvd0NhbmNlbEJ0bn0+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYWN0aW9uLWJ0biBjYW5jZWwtYnRuXCIgb25DbGljaz17aGFuZGxlQ29tbW9uQ2FuY2VsQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIHt0KCdDQU5DRUwgRURJVCcpfVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvT25seT5cclxuICAgICAgICAgIDxPbmx5IHdoZW49e3Nob3dDb25maXJtQnRufT5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFjdGlvbi1idG4gY29uZmlybS1idG5cIlxyXG4gICAgICAgICAgICAgIGRpc2FibGVkPXshZWRpdG9yUmVmLmN1cnJlbnQ/LnZhbHVlfVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNvbW1vbkNvbmZpcm1CdG5DbGlja31cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHtTYXZlTWVtb0J1dHRvbkxhYmVsfVxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPuKcje+4jzwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L09ubHk+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBFZGl0b3I7XHJcbiIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiZnVuY3Rpb24gY2FuVXNlRE9NKCkge1xuICByZXR1cm4gISEodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xufVxuXG5leHBvcnQgeyBjYW5Vc2VET00gfTtcbiIsImltcG9ydCB7IHVzZUxheW91dEVmZmVjdCwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2FuVXNlRE9NIH0gZnJvbSAnLi4vLi4vY2FuLXVzZS1kb20vZGlzdC9yZWFjaC11dGlscy1jYW4tdXNlLWRvbS5lc20uanMnO1xuXG4vKipcbiAqIFJlYWN0IGN1cnJlbnRseSB0aHJvd3MgYSB3YXJuaW5nIHdoZW4gdXNpbmcgdXNlTGF5b3V0RWZmZWN0IG9uIHRoZSBzZXJ2ZXIuIFRvXG4gKiBnZXQgYXJvdW5kIGl0LCB3ZSBjYW4gY29uZGl0aW9uYWxseSB1c2VFZmZlY3Qgb24gdGhlIHNlcnZlciAobm8tb3ApIGFuZFxuICogdXNlTGF5b3V0RWZmZWN0IGluIHRoZSBicm93c2VyLiBXZSBvY2Nhc2lvbmFsbHkgbmVlZCB1c2VMYXlvdXRFZmZlY3QgdG9cbiAqIGVuc3VyZSB3ZSBkb24ndCBnZXQgYSByZW5kZXIgZmxhc2ggZm9yIGNlcnRhaW4gb3BlcmF0aW9ucywgYnV0IHdlIG1heSBhbHNvXG4gKiBuZWVkIGFmZmVjdGVkIGNvbXBvbmVudHMgdG8gcmVuZGVyIG9uIHRoZSBzZXJ2ZXIuIE9uZSBleGFtcGxlIGlzIHdoZW4gc2V0dGluZ1xuICogYSBjb21wb25lbnQncyBkZXNjZW5kYW50cyB0byByZXRyaWV2ZSB0aGVpciBpbmRleCB2YWx1ZXMuXG4gKlxuICogSW1wb3J0YW50IHRvIG5vdGUgdGhhdCB1c2luZyB0aGlzIGhvb2sgYXMgYW4gZXNjYXBlIGhhdGNoIHdpbGwgYnJlYWsgdGhlXG4gKiBlc2xpbnQgZGVwZW5kZW5jeSB3YXJuaW5ncyB1bmxlc3MgeW91IHJlbmFtZSB0aGUgaW1wb3J0IHRvIGB1c2VMYXlvdXRFZmZlY3RgLlxuICogVXNlIHNwYXJpbmdseSBvbmx5IHdoZW4gdGhlIGVmZmVjdCB3b24ndCBlZmZlY3QgdGhlIHJlbmRlcmVkIEhUTUwgdG8gYXZvaWRcbiAqIGFueSBzZXJ2ZXIvY2xpZW50IG1pc21hdGNoLlxuICpcbiAqIElmIGEgdXNlTGF5b3V0RWZmZWN0IGlzIG5lZWRlZCBhbmQgdGhlIHJlc3VsdCB3b3VsZCBjcmVhdGUgYSBtaXNtYXRjaCwgaXQnc1xuICogbGlrZWx5IHRoYXQgdGhlIGNvbXBvbmVudCBpbiBxdWVzdGlvbiBzaG91bGRuJ3QgYmUgcmVuZGVyZWQgb24gdGhlIHNlcnZlciBhdFxuICogYWxsLCBzbyBhIGJldHRlciBhcHByb2FjaCB3b3VsZCBiZSB0byBsYXppbHkgcmVuZGVyIHRob3NlIGluIGEgcGFyZW50XG4gKiBjb21wb25lbnQgYWZ0ZXIgY2xpZW50LXNpZGUgaHlkcmF0aW9uLlxuICpcbiAqIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2dhZWFyb24vZTdkOTdjZGYzOGEyOTA3OTI0ZWExMmU0ZWJkZjNjODVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlYWN0LXJlZHV4L2Jsb2IvbWFzdGVyL3NyYy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzXG4gKlxuICogQHBhcmFtIGVmZmVjdFxuICogQHBhcmFtIGRlcHNcbiAqL1xuXG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IC8qI19fUFVSRV9fKi9jYW5Vc2VET00oKSA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDtcblxuZXhwb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9O1xuIiwiaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICdAcmVhY2gvdXRpbHMvdXNlLWlzb21vcnBoaWMtbGF5b3V0LWVmZmVjdCc7XG5cbi8qXG4gKiBXZWxjb21lIHRvIEByZWFjaC9hdXRvLWlkIVxuXG4gKiBMZXQncyBzZWUgaWYgd2UgY2FuIG1ha2Ugc2Vuc2Ugb2Ygd2h5IHRoaXMgaG9vayBleGlzdHMgYW5kIGl0c1xuICogaW1wbGVtZW50YXRpb24uXG4gKlxuICogU29tZSBiYWNrZ3JvdW5kOlxuICogICAxLiBBY2Nlc3NpYmlsaXR5IEFQSXMgcmVseSBoZWF2aWx5IG9uIGVsZW1lbnQgSURzXG4gKiAgIDIuIFJlcXVpcmluZyBkZXZlbG9wZXJzIHRvIHB1dCBJRHMgb24gZXZlcnkgZWxlbWVudCBpbiBSZWFjaCBVSSBpcyBib3RoXG4gKiAgICAgIGN1bWJlcnNvbWUgYW5kIGVycm9yLXByb25lXG4gKiAgIDMuIFdpdGggYSBjb21wb25lbnQgbW9kZWwsIHdlIGNhbiBnZW5lcmF0ZSBJRHMgZm9yIHRoZW0hXG4gKlxuICogU29sdXRpb24gMTogR2VuZXJhdGUgcmFuZG9tIElEcy5cbiAqXG4gKiBUaGlzIHdvcmtzIGdyZWF0IGFzIGxvbmcgYXMgeW91IGRvbid0IHNlcnZlciByZW5kZXIgeW91ciBhcHAuIFdoZW4gUmVhY3QgKGluXG4gKiB0aGUgY2xpZW50KSB0cmllcyB0byByZXVzZSB0aGUgbWFya3VwIGZyb20gdGhlIHNlcnZlciwgdGhlIElEcyB3b24ndCBtYXRjaFxuICogYW5kIFJlYWN0IHdpbGwgdGhlbiByZWNyZWF0ZSB0aGUgZW50aXJlIERPTSB0cmVlLlxuICpcbiAqIFNvbHV0aW9uIDI6IEluY3JlbWVudCBhbiBpbnRlZ2VyXG4gKlxuICogVGhpcyBzb3VuZHMgZ3JlYXQuIFNpbmNlIHdlJ3JlIHJlbmRlcmluZyB0aGUgZXhhY3Qgc2FtZSB0cmVlIG9uIHRoZSBzZXJ2ZXJcbiAqIGFuZCBjbGllbnQsIHdlIGNhbiBpbmNyZW1lbnQgYSBjb3VudGVyIGFuZCBnZXQgYSBkZXRlcm1pbmlzdGljIHJlc3VsdCBiZXR3ZWVuXG4gKiBjbGllbnQgYW5kIHNlcnZlci4gQWxzbywgSlMgaW50ZWdlcnMgY2FuIGdvIHVwIHRvIG5pbmUtcXVhZHJpbGxpb24uIEknbVxuICogcHJldHR5IHN1cmUgdGhlIHRhYiB3aWxsIGJlIGNsb3NlZCBiZWZvcmUgYW4gYXBwIG5ldmVyIG5lZWRzXG4gKiAxMCBxdWFkcmlsbGlvbiBJRHMhXG4gKlxuICogUHJvYmxlbSBzb2x2ZWQsIHJpZ2h0P1xuICpcbiAqIEFoLCBidXQgdGhlcmUncyBhIGNhdGNoISBSZWFjdCdzIGNvbmN1cnJlbnQgcmVuZGVyaW5nIG1ha2VzIHRoaXMgYXBwcm9hY2hcbiAqIG5vbi1kZXRlcm1pbmlzdGljLiBXaGlsZSB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgd2lsbCBlbmQgdXAgd2l0aCB0aGUgc2FtZVxuICogZWxlbWVudHMgaW4gdGhlIGVuZCwgZGVwZW5kaW5nIG9uIHN1c3BlbnNlIGJvdW5kYXJpZXMgKGFuZCBwb3NzaWJseSBzb21lIHVzZXJcbiAqIGlucHV0IGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIpIHRoZSBpbmNyZW1lbnRpbmcgaW50ZWdlcnMgd29uJ3QgYWx3YXlzIG1hdGNoXG4gKiB1cC5cbiAqXG4gKiBTb2x1dGlvbiAzOiBEb24ndCB1c2UgSURzIGF0IGFsbCBvbiB0aGUgc2VydmVyOyBwYXRjaCBhZnRlciBmaXJzdCByZW5kZXIuXG4gKlxuICogV2hhdCB3ZSd2ZSBkb25lIGhlcmUgaXMgc29sdXRpb24gMiB3aXRoIHNvbWUgdHJpY2tzLiBXaXRoIHRoaXMgYXBwcm9hY2gsIHRoZVxuICogSUQgcmV0dXJuZWQgaXMgYW4gZW1wdHkgc3RyaW5nIG9uIHRoZSBmaXJzdCByZW5kZXIuIFRoaXMgd2F5IHRoZSBzZXJ2ZXIgYW5kXG4gKiBjbGllbnQgaGF2ZSB0aGUgc2FtZSBtYXJrdXAgbm8gbWF0dGVyIGhvdyB3aWxkIHRoZSBjb25jdXJyZW50IHJlbmRlcmluZyBtYXlcbiAqIGhhdmUgZ290dGVuLlxuICpcbiAqIEFmdGVyIHRoZSByZW5kZXIsIHdlIHBhdGNoIHVwIHRoZSBjb21wb25lbnRzIHdpdGggYW4gaW5jcmVtZW50ZWQgSUQuIFRoaXNcbiAqIGNhdXNlcyBhIGRvdWJsZSByZW5kZXIgb24gYW55IGNvbXBvbmVudHMgd2l0aCBgdXNlSWRgLiBTaG91bGRuJ3QgYmUgYSBwcm9ibGVtXG4gKiBzaW5jZSB0aGUgY29tcG9uZW50cyB1c2luZyB0aGlzIGhvb2sgc2hvdWxkIGJlIHNtYWxsLCBhbmQgd2UncmUgb25seSB1cGRhdGluZ1xuICogdGhlIElEIGF0dHJpYnV0ZSBvbiB0aGUgRE9NLCBub3RoaW5nIGJpZyBpcyBoYXBwZW5pbmcuXG4gKlxuICogSXQgZG9lc24ndCBoYXZlIHRvIGJlIGFuIGluY3JlbWVudGVkIG51bWJlciwgdGhvdWdoLS13ZSBjb3VsZCBkbyBnZW5lcmF0ZVxuICogcmFuZG9tIHN0cmluZ3MgaW5zdGVhZCwgYnV0IGluY3JlbWVudGluZyBhIG51bWJlciBpcyBwcm9iYWJseSB0aGUgY2hlYXBlc3RcbiAqIHRoaW5nIHdlIGNhbiBkby5cbiAqXG4gKiBBZGRpdGlvbmFsbHksIHdlIG9ubHkgZG8gdGhpcyBwYXRjaHVwIG9uIHRoZSB2ZXJ5IGZpcnN0IGNsaWVudCByZW5kZXIgZXZlci5cbiAqIEFueSBjYWxscyB0byBgdXNlSWRgIHRoYXQgaGFwcGVuIGR5bmFtaWNhbGx5IGluIHRoZSBjbGllbnQgd2lsbCBiZVxuICogcG9wdWxhdGVkIGltbWVkaWF0ZWx5IHdpdGggYSB2YWx1ZS4gU28sIHdlIG9ubHkgZ2V0IHRoZSBkb3VibGUgcmVuZGVyIGFmdGVyXG4gKiBzZXJ2ZXIgaHlkcmF0aW9uIGFuZCBuZXZlciBhZ2FpbiwgU08gQkFDSyBPRkYgQUxSSUdIVD9cbiAqL1xudmFyIHNlcnZlckhhbmRvZmZDb21wbGV0ZSA9IGZhbHNlO1xudmFyIGlkID0gMDtcblxudmFyIGdlbklkID0gZnVuY3Rpb24gZ2VuSWQoKSB7XG4gIHJldHVybiArK2lkO1xufTtcbi8qKlxuICogdXNlSWRcbiAqXG4gKiBBdXRvZ2VuZXJhdGUgSURzIHRvIGZhY2lsaXRhdGUgV0FJLUFSSUEgYW5kIHNlcnZlciByZW5kZXJpbmcuXG4gKlxuICogTm90ZTogVGhlIHJldHVybmVkIElEIHdpbGwgaW5pdGlhbGx5IGJlIGBudWxsYCBhbmQgd2lsbCB1cGRhdGUgYWZ0ZXIgYVxuICogY29tcG9uZW50IG1vdW50cy4gVXNlcnMgbWF5IG5lZWQgdG8gc3VwcGx5IHRoZWlyIG93biBJRCBpZiB0aGV5IG5lZWRcbiAqIGNvbnNpc3RlbnQgdmFsdWVzIGZvciBTU1IuXG4gKlxuICogQHNlZSBEb2NzIGh0dHBzOi8vcmVhY2gudGVjaC9hdXRvLWlkXG4gKi9cblxuXG5mdW5jdGlvbiB1c2VJZChpZEZyb21Qcm9wcykge1xuICAvKlxuICAgKiBJZiB0aGlzIGluc3RhbmNlIGlzbid0IHBhcnQgb2YgdGhlIGluaXRpYWwgcmVuZGVyLCB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoZVxuICAgKiBkb3VibGUgcmVuZGVyL3BhdGNoLXVwIGRhbmNlLiBXZSBjYW4ganVzdCBnZW5lcmF0ZSB0aGUgSUQgYW5kIHJldHVybiBpdC5cbiAgICovXG4gIHZhciBpbml0aWFsSWQgPSBpZEZyb21Qcm9wcyB8fCAoc2VydmVySGFuZG9mZkNvbXBsZXRlID8gZ2VuSWQoKSA6IG51bGwpO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSB1c2VTdGF0ZShpbml0aWFsSWQpLFxuICAgICAgaWQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRJZCA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIC8qXG4gICAgICAgKiBQYXRjaCB0aGUgSUQgYWZ0ZXIgcmVuZGVyLiBXZSBkbyB0aGlzIGluIGB1c2VMYXlvdXRFZmZlY3RgIHRvIGF2b2lkIGFueVxuICAgICAgICogcmVuZGVyaW5nIGZsaWNrZXIsIHRob3VnaCBpdCdsbCBtYWtlIHRoZSBmaXJzdCByZW5kZXIgc2xvd2VyICh1bmxpa2VseVxuICAgICAgICogdG8gbWF0dGVyLCBidXQgeW91J3JlIHdlbGNvbWUgdG8gbWVhc3VyZSB5b3VyIGFwcCBhbmQgbGV0IHVzIGtub3cgaWZcbiAgICAgICAqIGl0J3MgYSBwcm9ibGVtKS5cbiAgICAgICAqL1xuICAgICAgc2V0SWQoZ2VuSWQoKSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG5cbiAgfSwgW10pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZXJ2ZXJIYW5kb2ZmQ29tcGxldGUgPT09IGZhbHNlKSB7XG4gICAgICAvKlxuICAgICAgICogRmxhZyBhbGwgZnV0dXJlIHVzZXMgb2YgYHVzZUlkYCB0byBza2lwIHRoZSB1cGRhdGUgZGFuY2UuIFRoaXMgaXMgaW5cbiAgICAgICAqIGB1c2VFZmZlY3RgIGJlY2F1c2UgaXQgZ29lcyBhZnRlciBgdXNlTGF5b3V0RWZmZWN0YCwgZW5zdXJpbmcgd2UgZG9uJ3RcbiAgICAgICAqIGFjY2lkZW50YWxseSBiYWlsIG91dCBvZiB0aGUgcGF0Y2gtdXAgZGFuY2UgcHJlbWF0dXJlbHkuXG4gICAgICAgKi9cbiAgICAgIHNlcnZlckhhbmRvZmZDb21wbGV0ZSA9IHRydWU7XG4gICAgfVxuICB9LCBbXSk7XG4gIHJldHVybiBpZCAhPSBudWxsID8gU3RyaW5nKGlkKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IHsgdXNlSWQgfTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkRm9ybWF0TG9uZ0ZuKGFyZ3MpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgLy8gVE9ETzogUmVtb3ZlIFN0cmluZygpXG4gICAgdmFyIHdpZHRoID0gb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgIHZhciBmb3JtYXQgPSBhcmdzLmZvcm1hdHNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0c1thcmdzLmRlZmF1bHRXaWR0aF07XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZExvY2FsaXplRm4oYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24gKGRpcnR5SW5kZXgsIGRpcnR5T3B0aW9ucykge1xuICAgIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICAgIHZhciBjb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0ID8gU3RyaW5nKG9wdGlvbnMuY29udGV4dCkgOiAnc3RhbmRhbG9uZSc7XG4gICAgdmFyIHZhbHVlc0FycmF5O1xuXG4gICAgaWYgKGNvbnRleHQgPT09ICdmb3JtYXR0aW5nJyAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIHZhciBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRGb3JtYXR0aW5nV2lkdGggfHwgYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICB2YXIgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoO1xuICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2RlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YXIgX3dpZHRoID0gb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MudmFsdWVzW193aWR0aF0gfHwgYXJncy52YWx1ZXNbX2RlZmF1bHRXaWR0aF07XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKGRpcnR5SW5kZXgpIDogZGlydHlJbmRleDsgLy8gQHRzLWlnbm9yZTogRm9yIHNvbWUgcmVhc29uIFR5cGVTY3JpcHQganVzdCBkb24ndCB3YW50IHRvIG1hdGNoIGl0LCBubyBtYXR0ZXIgaG93IGhhcmQgd2UgdHJ5LiBJIGNoYWxsZW5nZSB5b3UgdG8gdHJ5IHRvIHJlbW92ZSBpdCFcblxuICAgIHJldHVybiB2YWx1ZXNBcnJheVtpbmRleF07XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcGFyc2VSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pO1xuICAgIGlmICghcGFyc2VSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhwYXJzZVJlc3VsdFswXSkgOiBwYXJzZVJlc3VsdFswXTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB2YXIgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlc3Q6IHJlc3RcbiAgICB9O1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG4gICAgdmFyIG1hdGNoUGF0dGVybiA9IHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5tYXRjaFBhdHRlcm5zW2FyZ3MuZGVmYXVsdE1hdGNoV2lkdGhdO1xuICAgIHZhciBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChtYXRjaFBhdHRlcm4pO1xuXG4gICAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcGFyc2VQYXR0ZXJucyA9IHdpZHRoICYmIGFyZ3MucGFyc2VQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuICAgIHZhciBrZXkgPSBBcnJheS5pc0FycmF5KHBhcnNlUGF0dGVybnMpID8gZmluZEluZGV4KHBhcnNlUGF0dGVybnMsIGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpO1xuICAgIH0pIDogZmluZEtleShwYXJzZVBhdHRlcm5zLCBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKTtcbiAgICB9KTtcbiAgICB2YXIgdmFsdWU7XG4gICAgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2soa2V5KSA6IGtleTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB2YXIgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlc3Q6IHJlc3RcbiAgICB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkgJiYgcHJlZGljYXRlKG9iamVjdFtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKHZhciBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlcXVpcmVkQXJncyhyZXF1aXJlZCwgYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPCByZXF1aXJlZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocmVxdWlyZWQgKyAnIGFyZ3VtZW50JyArIChyZXF1aXJlZCA+IDEgPyAncycgOiAnJykgKyAnIHJlcXVpcmVkLCBidXQgb25seSAnICsgYXJncy5sZW5ndGggKyAnIHByZXNlbnQnKTtcbiAgfVxufSIsImltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiAqKk5vdGUqKjogKmFsbCogRGF0ZSBhcmd1bWVudHMgcGFzc2VkIHRvIGFueSAqZGF0ZS1mbnMqIGZ1bmN0aW9uIGlzIHByb2Nlc3NlZCBieSBgdG9EYXRlYC5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBhcmd1bWVudCAtIHRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIHBhcnNlZCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDbG9uZSB0aGUgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvRGF0ZShuZXcgRGF0ZSgyMDE0LCAxLCAxMSwgMTEsIDMwLCAzMCkpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHRoZSB0aW1lc3RhbXAgdG8gZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvRGF0ZSgxMzkyMDk4NDMwMDAwKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBhcmdTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpOyAvLyBDbG9uZSB0aGUgZGF0ZVxuXG4gIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIGFyZ3VtZW50ID09PSAnb2JqZWN0JyAmJiBhcmdTdHIgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIC8vIFByZXZlbnQgdGhlIGRhdGUgdG8gbG9zZSB0aGUgbWlsbGlzZWNvbmRzIHdoZW4gcGFzc2VkIHRvIG5ldyBEYXRlKCkgaW4gSUUxMFxuICAgIHJldHVybiBuZXcgRGF0ZShhcmd1bWVudC5nZXRUaW1lKCkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ251bWJlcicgfHwgYXJnU3RyID09PSAnW29iamVjdCBOdW1iZXJdJykge1xuICAgIHJldHVybiBuZXcgRGF0ZShhcmd1bWVudCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCh0eXBlb2YgYXJndW1lbnQgPT09ICdzdHJpbmcnIHx8IGFyZ1N0ciA9PT0gJ1tvYmplY3QgU3RyaW5nXScpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcIlN0YXJ0aW5nIHdpdGggdjIuMC4wLWJldGEuMSBkYXRlLWZucyBkb2Vzbid0IGFjY2VwdCBzdHJpbmdzIGFzIGRhdGUgYXJndW1lbnRzLiBQbGVhc2UgdXNlIGBwYXJzZUlTT2AgdG8gcGFyc2Ugc3RyaW5ncy4gU2VlOiBodHRwczovL2dpdC5pby9manVsZVwiKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblxuICAgICAgY29uc29sZS53YXJuKG5ldyBFcnJvcigpLnN0YWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvSW50ZWdlcihkaXJ0eU51bWJlcikge1xuICBpZiAoZGlydHlOdW1iZXIgPT09IG51bGwgfHwgZGlydHlOdW1iZXIgPT09IHRydWUgfHwgZGlydHlOdW1iZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIHZhciBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpO1xuXG4gIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuXG4gIHJldHVybiBudW1iZXIgPCAwID8gTWF0aC5jZWlsKG51bWJlcikgOiBNYXRoLmZsb29yKG51bWJlcik7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL3RvSW50ZWdlci9pbmRleC5qc1wiOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ1dlZWsoZGlydHlEYXRlLCBkaXJ0eU9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGU7XG4gIHZhciBsb2NhbGVXZWVrU3RhcnRzT24gPSBsb2NhbGUgJiYgbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMud2Vla1N0YXJ0c09uO1xuICB2YXIgZGVmYXVsdFdlZWtTdGFydHNPbiA9IGxvY2FsZVdlZWtTdGFydHNPbiA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihsb2NhbGVXZWVrU3RhcnRzT24pO1xuICB2YXIgd2Vla1N0YXJ0c09uID0gb3B0aW9ucy53ZWVrU3RhcnRzT24gPT0gbnVsbCA/IGRlZmF1bHRXZWVrU3RhcnRzT24gOiB0b0ludGVnZXIob3B0aW9ucy53ZWVrU3RhcnRzT24pOyAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDAgYW5kIDYgX2FuZF8gaXMgbm90IE5hTlxuXG4gIGlmICghKHdlZWtTdGFydHNPbiA+PSAwICYmIHdlZWtTdGFydHNPbiA8PSA2KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd3ZWVrU3RhcnRzT24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYgaW5jbHVzaXZlbHknKTtcbiAgfVxuXG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXkgPSBkYXRlLmdldFVUQ0RheSgpO1xuICB2YXIgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIGRpZmYpO1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBhZGREYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgZGF5cyB0byBiZSBhZGRlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IC0gdGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheXMgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gLSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMTAgZGF5cyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IFRodSBTZXAgMTEgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZERheXMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG5cbiAgaWYgKGlzTmFOKGFtb3VudCkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxuXG4gIGlmICghYW1vdW50KSB7XG4gICAgLy8gSWYgMCBkYXlzLCBuby1vcCB0byBhdm9pZCBjaGFuZ2luZyB0aW1lcyBpbiB0aGUgaG91ciBiZWZvcmUgZW5kIG9mIERTVFxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgYWRkTW9udGhzXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb250aHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgbW9udGhzIHRvIGJlIGFkZGVkLiBQb3NpdGl2ZSBkZWNpbWFscyB3aWxsIGJlIHJvdW5kZWQgdXNpbmcgYE1hdGguZmxvb3JgLCBkZWNpbWFscyBsZXNzIHRoYW4gemVybyB3aWxsIGJlIHJvdW5kZWQgdXNpbmcgYE1hdGguY2VpbGAuXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIG5ldyBkYXRlIHdpdGggdGhlIG1vbnRocyBhZGRlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNSBtb250aHMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1vbnRocyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNSlcbiAqIC8vPT4gU3VuIEZlYiAwMSAyMDE1IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkTW9udGhzKGRpcnR5RGF0ZSwgZGlydHlBbW91bnQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBhbW91bnQgPSB0b0ludGVnZXIoZGlydHlBbW91bnQpO1xuXG4gIGlmIChpc05hTihhbW91bnQpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cblxuICBpZiAoIWFtb3VudCkge1xuICAgIC8vIElmIDAgbW9udGhzLCBuby1vcCB0byBhdm9pZCBjaGFuZ2luZyB0aW1lcyBpbiB0aGUgaG91ciBiZWZvcmUgZW5kIG9mIERTVFxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgdmFyIGRheU9mTW9udGggPSBkYXRlLmdldERhdGUoKTsgLy8gVGhlIEpTIERhdGUgb2JqZWN0IHN1cHBvcnRzIGRhdGUgbWF0aCBieSBhY2NlcHRpbmcgb3V0LW9mLWJvdW5kcyB2YWx1ZXMgZm9yXG4gIC8vIG1vbnRoLCBkYXksIGV0Yy4gRm9yIGV4YW1wbGUsIG5ldyBEYXRlKDIwMjAsIDAsIDApIHJldHVybnMgMzEgRGVjIDIwMTkgYW5kXG4gIC8vIG5ldyBEYXRlKDIwMjAsIDEzLCAxKSByZXR1cm5zIDEgRmViIDIwMjEuICBUaGlzIGlzICphbG1vc3QqIHRoZSBiZWhhdmlvciB3ZVxuICAvLyB3YW50IGV4Y2VwdCB0aGF0IGRhdGVzIHdpbGwgd3JhcCBhcm91bmQgdGhlIGVuZCBvZiBhIG1vbnRoLCBtZWFuaW5nIHRoYXRcbiAgLy8gbmV3IERhdGUoMjAyMCwgMTMsIDMxKSB3aWxsIHJldHVybiAzIE1hciAyMDIxIG5vdCAyOCBGZWIgMjAyMSBhcyBkZXNpcmVkLiBTb1xuICAvLyB3ZSdsbCBkZWZhdWx0IHRvIHRoZSBlbmQgb2YgdGhlIGRlc2lyZWQgbW9udGggYnkgYWRkaW5nIDEgdG8gdGhlIGRlc2lyZWRcbiAgLy8gbW9udGggYW5kIHVzaW5nIGEgZGF0ZSBvZiAwIHRvIGJhY2sgdXAgb25lIGRheSB0byB0aGUgZW5kIG9mIHRoZSBkZXNpcmVkXG4gIC8vIG1vbnRoLlxuXG4gIHZhciBlbmRPZkRlc2lyZWRNb250aCA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTtcbiAgZW5kT2ZEZXNpcmVkTW9udGguc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgYW1vdW50ICsgMSwgMCk7XG4gIHZhciBkYXlzSW5Nb250aCA9IGVuZE9mRGVzaXJlZE1vbnRoLmdldERhdGUoKTtcblxuICBpZiAoZGF5T2ZNb250aCA+PSBkYXlzSW5Nb250aCkge1xuICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgYXQgdGhlIGVuZCBvZiB0aGUgbW9udGgsIHRoZW4gdGhpcyBpcyB0aGUgY29ycmVjdCBkYXRlXG4gICAgLy8gYW5kIHdlJ3JlIGRvbmUuXG4gICAgcmV0dXJuIGVuZE9mRGVzaXJlZE1vbnRoO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgd2Ugbm93IGtub3cgdGhhdCBzZXR0aW5nIHRoZSBvcmlnaW5hbCBkYXktb2YtbW9udGggdmFsdWUgd29uJ3RcbiAgICAvLyBjYXVzZSBhbiBvdmVyZmxvdywgc28gc2V0IHRoZSBkZXNpcmVkIGRheS1vZi1tb250aC4gTm90ZSB0aGF0IHdlIGNhbid0XG4gICAgLy8ganVzdCBzZXQgdGhlIGRhdGUgb2YgYGVuZE9mRGVzaXJlZE1vbnRoYCBiZWNhdXNlIHRoYXQgb2JqZWN0IG1heSBoYXZlIGhhZFxuICAgIC8vIGl0cyB0aW1lIGNoYW5nZWQgaW4gdGhlIHVudXN1YWwgY2FzZSB3aGVyZSB3aGVyZSBhIERTVCB0cmFuc2l0aW9uIHdhcyBvblxuICAgIC8vIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGggYW5kIGl0cyBsb2NhbCB0aW1lIHdhcyBpbiB0aGUgaG91ciBza2lwcGVkIG9yXG4gICAgLy8gcmVwZWF0ZWQgbmV4dCB0byBhIERTVCB0cmFuc2l0aW9uLiAgU28gd2UgdXNlIGBkYXRlYCBpbnN0ZWFkIHdoaWNoIGlzXG4gICAgLy8gZ3VhcmFudGVlZCB0byBzdGlsbCBoYXZlIHRoZSBvcmlnaW5hbCB0aW1lLlxuICAgIGRhdGUuc2V0RnVsbFllYXIoZW5kT2ZEZXNpcmVkTW9udGguZ2V0RnVsbFllYXIoKSwgZW5kT2ZEZXNpcmVkTW9udGguZ2V0TW9udGgoKSwgZGF5T2ZNb250aCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBhZGRNaWxsaXNlY29uZHNcbiAqIEBjYXRlZ29yeSBNaWxsaXNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbWlsbGlzZWNvbmRzIGFkZGVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA3NTAgbWlsbGlzZWNvbmRzIHRvIDEwIEp1bHkgMjAxNCAxMjo0NTozMC4wMDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNaWxsaXNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMzAsIDApLCA3NTApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NTozMC43NTBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIHRpbWVzdGFtcCA9IHRvRGF0ZShkaXJ0eURhdGUpLmdldFRpbWUoKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXAgKyBhbW91bnQpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgc3RhcnQgb2YgYSB3ZWVrXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFN1biBBdWcgMzEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LCB0aGUgc3RhcnQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFydE9mV2VlayhkaXJ0eURhdGUsIGRpcnR5T3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIG9wdGlvbnMgPSBkaXJ0eU9wdGlvbnMgfHwge307XG4gIHZhciBsb2NhbGUgPSBvcHRpb25zLmxvY2FsZTtcbiAgdmFyIGxvY2FsZVdlZWtTdGFydHNPbiA9IGxvY2FsZSAmJiBsb2NhbGUub3B0aW9ucyAmJiBsb2NhbGUub3B0aW9ucy53ZWVrU3RhcnRzT247XG4gIHZhciBkZWZhdWx0V2Vla1N0YXJ0c09uID0gbG9jYWxlV2Vla1N0YXJ0c09uID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGxvY2FsZVdlZWtTdGFydHNPbik7XG4gIHZhciB3ZWVrU3RhcnRzT24gPSBvcHRpb25zLndlZWtTdGFydHNPbiA9PSBudWxsID8gZGVmYXVsdFdlZWtTdGFydHNPbiA6IHRvSW50ZWdlcihvcHRpb25zLndlZWtTdGFydHNPbik7IC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMCBhbmQgNiBfYW5kXyBpcyBub3QgTmFOXG5cbiAgaWYgKCEod2Vla1N0YXJ0c09uID49IDAgJiYgd2Vla1N0YXJ0c09uIDw9IDYpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dlZWtTdGFydHNPbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNiBpbmNsdXNpdmVseScpO1xuICB9XG5cbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0RGF5KCk7XG4gIHZhciBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcbiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsIi8qKlxuICogR29vZ2xlIENocm9tZSBhcyBvZiA2Ny4wLjMzOTYuODcgaW50cm9kdWNlZCB0aW1lem9uZXMgd2l0aCBvZmZzZXQgdGhhdCBpbmNsdWRlcyBzZWNvbmRzLlxuICogVGhleSB1c3VhbGx5IGFwcGVhciBmb3IgZGF0ZXMgdGhhdCBkZW5vdGUgdGltZSBiZWZvcmUgdGhlIHRpbWV6b25lcyB3ZXJlIGludHJvZHVjZWRcbiAqIChlLmcuIGZvciAnRXVyb3BlL1ByYWd1ZScgdGltZXpvbmUgdGhlIG9mZnNldCBpcyBHTVQrMDA6NTc6NDQgYmVmb3JlIDEgT2N0b2JlciAxODkxXG4gKiBhbmQgR01UKzAxOjAwOjAwIGFmdGVyIHRoYXQgZGF0ZSlcbiAqXG4gKiBEYXRlI2dldFRpbWV6b25lT2Zmc2V0IHJldHVybnMgdGhlIG9mZnNldCBpbiBtaW51dGVzIGFuZCB3b3VsZCByZXR1cm4gNTcgZm9yIHRoZSBleGFtcGxlIGFib3ZlLFxuICogd2hpY2ggd291bGQgbGVhZCB0byBpbmNvcnJlY3QgY2FsY3VsYXRpb25zLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdGltZXpvbmUgb2Zmc2V0IGluIG1pbGxpc2Vjb25kcyB0aGF0IHRha2VzIHNlY29uZHMgaW4gYWNjb3VudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIHZhciB1dGNEYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldEhvdXJzKCksIGRhdGUuZ2V0TWludXRlcygpLCBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSkpO1xuICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gIHJldHVybiBkYXRlLmdldFRpbWUoKSAtIHV0Y0RhdGUuZ2V0VGltZSgpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgc3RhcnRPZkRheVxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgb3JpZ2luYWwgZGF0ZVxuICogQHJldHVybnMge0RhdGV9IHRoZSBzdGFydCBvZiBhIGRheVxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZkRheShkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsImltcG9ydCBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mRGF5IGZyb20gXCIuLi9zdGFydE9mRGF5L2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xudmFyIE1JTExJU0VDT05EU19JTl9EQVkgPSA4NjQwMDAwMDtcbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHRpbWVzIGFyZSByZW1vdmVkXG4gKiBmcm9tIHRoZSBkYXRlcyBhbmQgdGhlbiB0aGUgZGlmZmVyZW5jZSBpbiBkYXlzIGlzIGNhbGN1bGF0ZWQuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlTGVmdCAtIHRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlUmlnaHQgLSB0aGUgZWFybGllciBkYXRlXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6MDA6MDAgYW5kIDIgSnVseSAyMDEyIDAwOjAwOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDEyLCA2LCAyLCAwLCAwKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDApXG4gKiApXG4gKiAvLz0+IDM2NlxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6NTk6MDAgYW5kIDMgSnVseSAyMDExIDAwOjAxOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAzLCAwLCAxKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDU5KVxuICogKVxuICogLy89PiAxXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGRpcnR5RGF0ZUxlZnQsIGRpcnR5RGF0ZVJpZ2h0KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgc3RhcnRPZkRheUxlZnQgPSBzdGFydE9mRGF5KGRpcnR5RGF0ZUxlZnQpO1xuICB2YXIgc3RhcnRPZkRheVJpZ2h0ID0gc3RhcnRPZkRheShkaXJ0eURhdGVSaWdodCk7XG4gIHZhciB0aW1lc3RhbXBMZWZ0ID0gc3RhcnRPZkRheUxlZnQuZ2V0VGltZSgpIC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhzdGFydE9mRGF5TGVmdCk7XG4gIHZhciB0aW1lc3RhbXBSaWdodCA9IHN0YXJ0T2ZEYXlSaWdodC5nZXRUaW1lKCkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKHN0YXJ0T2ZEYXlSaWdodCk7IC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyXG4gIC8vIGJlY2F1c2UgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSBkYXkgaXMgbm90IGNvbnN0YW50XG4gIC8vIChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSBkYXkgb2YgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKCh0aW1lc3RhbXBMZWZ0IC0gdGltZXN0YW1wUmlnaHQpIC8gTUlMTElTRUNPTkRTX0lOX0RBWSk7XG59IiwiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCBhZGREYXlzIGZyb20gXCIuLi9hZGREYXlzL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBhZGRXZWVrc1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2Ygd2Vla3MgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgd2Vla3MgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDQgd2Vla3MgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFdlZWtzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA0KVxuICogLy89PiBNb24gU2VwIDI5IDIwMTQgMDA6MDA6MDBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRXZWVrcyhkaXJ0eURhdGUsIGRpcnR5QW1vdW50KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgYW1vdW50ID0gdG9JbnRlZ2VyKGRpcnR5QW1vdW50KTtcbiAgdmFyIGRheXMgPSBhbW91bnQgKiA3O1xuICByZXR1cm4gYWRkRGF5cyhkaXJ0eURhdGUsIGRheXMpO1xufSIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgYWRkTW9udGhzIGZyb20gXCIuLi9hZGRNb250aHMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGFkZFllYXJzXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgeWVhcnMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgeWVhcnMgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDUgeWVhcnMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFllYXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBTdW4gU2VwIDAxIDIwMTkgMDA6MDA6MDBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRZZWFycyhkaXJ0eURhdGUsIGRpcnR5QW1vdW50KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgYW1vdW50ID0gdG9JbnRlZ2VyKGRpcnR5QW1vdW50KTtcbiAgcmV0dXJuIGFkZE1vbnRocyhkaXJ0eURhdGUsIGFtb3VudCAqIDEyKTtcbn0iLCJpbXBvcnQgc3RhcnRPZkRheSBmcm9tIFwiLi4vc3RhcnRPZkRheS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgaXNTYW1lRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgZGF5IChhbmQgeWVhciBhbmQgbW9udGgpP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBkYXkgKGFuZCB5ZWFyIGFuZCBtb250aCk/XG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlTGVmdCAtIHRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlUmlnaHQgLSB0aGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIGRheSAoYW5kIHllYXIgYW5kIG1vbnRoKVxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgNCBTZXB0ZW1iZXIgMDY6MDA6MDAgYW5kIDQgU2VwdGVtYmVyIDE4OjAwOjAwIGluIHRoZSBzYW1lIGRheT9cbiAqIHZhciByZXN1bHQgPSBpc1NhbWVEYXkobmV3IERhdGUoMjAxNCwgOCwgNCwgNiwgMCksIG5ldyBEYXRlKDIwMTQsIDgsIDQsIDE4LCAwKSlcbiAqIC8vPT4gdHJ1ZVxuICogXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDQgU2VwdGVtYmVyIGFuZCA0IE9jdG9iZXIgaW4gdGhlIHNhbWUgZGF5P1xuICogdmFyIHJlc3VsdCA9IGlzU2FtZURheShuZXcgRGF0ZSgyMDE0LCA4LCA0KSwgbmV3IERhdGUoMjAxNCwgOSwgNCkpXG4gKiAvLz0+IGZhbHNlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgNCBTZXB0ZW1iZXIsIDIwMTQgYW5kIDQgU2VwdGVtYmVyLCAyMDE1IGluIHRoZSBzYW1lIGRheT9cbiAqIHZhciByZXN1bHQgPSBpc1NhbWVEYXkobmV3IERhdGUoMjAxNCwgOCwgNCksIG5ldyBEYXRlKDIwMTUsIDgsIDQpKVxuICogLy89PiBmYWxzZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2FtZURheShkaXJ0eURhdGVMZWZ0LCBkaXJ0eURhdGVSaWdodCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGVMZWZ0U3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXkoZGlydHlEYXRlTGVmdCk7XG4gIHZhciBkYXRlUmlnaHRTdGFydE9mRGF5ID0gc3RhcnRPZkRheShkaXJ0eURhdGVSaWdodCk7XG4gIHJldHVybiBkYXRlTGVmdFN0YXJ0T2ZEYXkuZ2V0VGltZSgpID09PSBkYXRlUmlnaHRTdGFydE9mRGF5LmdldFRpbWUoKTtcbn0iLCJpbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIHZhbHVlIGEgZGF0ZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZS4gVGhlIGZ1bmN0aW9uIHdvcmtzIGZvciBkYXRlcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgaWZyYW1lcy5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufSIsImltcG9ydCBpc0RhdGUgZnJvbSBcIi4uL2lzRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc1ZhbGlkXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBnaXZlbiBkYXRlIHZhbGlkP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyBmYWxzZSBpZiBhcmd1bWVudCBpcyBJbnZhbGlkIERhdGUgYW5kIHRydWUgb3RoZXJ3aXNlLlxuICogQXJndW1lbnQgaXMgY29udmVydGVkIHRvIERhdGUgdXNpbmcgYHRvRGF0ZWAuIFNlZSBbdG9EYXRlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL3RvRGF0ZX1cbiAqIEludmFsaWQgRGF0ZSBpcyBhIERhdGUsIHdob3NlIHRpbWUgdmFsdWUgaXMgTmFOLlxuICpcbiAqIFRpbWUgdmFsdWUgb2YgRGF0ZTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS45LjEuMVxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogLSBOb3cgYGlzVmFsaWRgIGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uXG4gKiAgIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqICAgSW5zdGVhZCwgYXJndW1lbnQgaXMgY29udmVydGVkIGJlZm9yZWhhbmQgdXNpbmcgYHRvRGF0ZWAuXG4gKlxuICogICBFeGFtcGxlczpcbiAqXG4gKiAgIHwgYGlzVmFsaWRgIGFyZ3VtZW50ICAgICAgICB8IEJlZm9yZSB2Mi4wLjAgfCB2Mi4wLjAgb253YXJkIHxcbiAqICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfFxuICogICB8IGBuZXcgRGF0ZSgpYCAgICAgICAgICAgICAgfCBgdHJ1ZWAgICAgICAgIHwgYHRydWVgICAgICAgICB8XG4gKiAgIHwgYG5ldyBEYXRlKCcyMDE2LTAxLTAxJylgICB8IGB0cnVlYCAgICAgICAgfCBgdHJ1ZWAgICAgICAgIHxcbiAqICAgfCBgbmV3IERhdGUoJycpYCAgICAgICAgICAgIHwgYGZhbHNlYCAgICAgICB8IGBmYWxzZWAgICAgICAgfFxuICogICB8IGBuZXcgRGF0ZSgxNDg4MzcwODM1MDgxKWAgfCBgdHJ1ZWAgICAgICAgIHwgYHRydWVgICAgICAgICB8XG4gKiAgIHwgYG5ldyBEYXRlKE5hTilgICAgICAgICAgICB8IGBmYWxzZWAgICAgICAgfCBgZmFsc2VgICAgICAgIHxcbiAqICAgfCBgJzIwMTYtMDEtMDEnYCAgICAgICAgICAgIHwgYFR5cGVFcnJvcmAgICB8IGBmYWxzZWAgICAgICAgfFxuICogICB8IGAnJ2AgICAgICAgICAgICAgICAgICAgICAgfCBgVHlwZUVycm9yYCAgIHwgYGZhbHNlYCAgICAgICB8XG4gKiAgIHwgYDE0ODgzNzA4MzUwODFgICAgICAgICAgICB8IGBUeXBlRXJyb3JgICAgfCBgdHJ1ZWAgICAgICAgIHxcbiAqICAgfCBgTmFOYCAgICAgICAgICAgICAgICAgICAgIHwgYFR5cGVFcnJvcmAgICB8IGBmYWxzZWAgICAgICAgfFxuICpcbiAqICAgV2UgaW50cm9kdWNlIHRoaXMgY2hhbmdlIHRvIG1ha2UgKmRhdGUtZm5zKiBjb25zaXN0ZW50IHdpdGggRUNNQVNjcmlwdCBiZWhhdmlvclxuICogICB0aGF0IHRyeSB0byBjb2VyY2UgYXJndW1lbnRzIHRvIHRoZSBleHBlY3RlZCB0eXBlXG4gKiAgICh3aGljaCBpcyBhbHNvIHRoZSBjYXNlIHdpdGggb3RoZXIgKmRhdGUtZm5zKiBmdW5jdGlvbnMpLlxuICpcbiAqIEBwYXJhbSB7Kn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdGhlIGRhdGUgaXMgdmFsaWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIHZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKDIwMTQsIDEsIDMxKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIHZhbHVlLCBjb252ZXJ0YWJsZSBpbnRvIGEgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQoMTM5MzgwNDgwMDAwMClcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIGludmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQobmV3IERhdGUoJycpKVxuICogLy89PiBmYWxzZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFsaWQoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuXG4gIGlmICghaXNEYXRlKGRpcnR5RGF0ZSkgJiYgdHlwZW9mIGRpcnR5RGF0ZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICByZXR1cm4gIWlzTmFOKE51bWJlcihkYXRlKSk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoc1xuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVMZWZ0IC0gdGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVSaWdodCAtIHRoZSBlYXJsaWVyIGRhdGVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgbW9udGhzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIG1vbnRocyBhcmUgYmV0d2VlbiAzMSBKYW51YXJ5IDIwMTQgYW5kIDEgU2VwdGVtYmVyIDIwMTQ/XG4gKiB2YXIgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDgsIDEpLFxuICogICBuZXcgRGF0ZSgyMDE0LCAwLCAzMSlcbiAqIClcbiAqIC8vPT4gOFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKGRpcnR5RGF0ZUxlZnQsIGRpcnR5RGF0ZVJpZ2h0KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZUxlZnQgPSB0b0RhdGUoZGlydHlEYXRlTGVmdCk7XG4gIHZhciBkYXRlUmlnaHQgPSB0b0RhdGUoZGlydHlEYXRlUmlnaHQpO1xuICB2YXIgeWVhckRpZmYgPSBkYXRlTGVmdC5nZXRGdWxsWWVhcigpIC0gZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCk7XG4gIHZhciBtb250aERpZmYgPSBkYXRlTGVmdC5nZXRNb250aCgpIC0gZGF0ZVJpZ2h0LmdldE1vbnRoKCk7XG4gIHJldHVybiB5ZWFyRGlmZiAqIDEyICsgbW9udGhEaWZmO1xufSIsImltcG9ydCBzdGFydE9mV2VlayBmcm9tIFwiLi4vc3RhcnRPZldlZWsvaW5kZXguanNcIjtcbmltcG9ydCBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX1dFRUsgPSA2MDQ4MDAwMDA7XG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3NcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHdlZWtzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgd2Vla3MgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlTGVmdCAtIHRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlUmlnaHQgLSB0aGUgZWFybGllciBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgd2Vla3NcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgd2Vla3MgYXJlIGJldHdlZW4gNSBKdWx5IDIwMTQgYW5kIDIwIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIwKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgNSlcbiAqIClcbiAqIC8vPT4gM1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LFxuICogLy8gaG93IG1hbnkgY2FsZW5kYXIgd2Vla3MgYXJlIGJldHdlZW4gNSBKdWx5IDIwMTQgYW5kIDIwIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIwKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgNSksXG4gKiAgIHsgd2Vla1N0YXJ0c09uOiAxIH1cbiAqIClcbiAqIC8vPT4gMlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoZGlydHlEYXRlTGVmdCwgZGlydHlEYXRlUmlnaHQsIGRpcnR5T3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIHN0YXJ0T2ZXZWVrTGVmdCA9IHN0YXJ0T2ZXZWVrKGRpcnR5RGF0ZUxlZnQsIGRpcnR5T3B0aW9ucyk7XG4gIHZhciBzdGFydE9mV2Vla1JpZ2h0ID0gc3RhcnRPZldlZWsoZGlydHlEYXRlUmlnaHQsIGRpcnR5T3B0aW9ucyk7XG4gIHZhciB0aW1lc3RhbXBMZWZ0ID0gc3RhcnRPZldlZWtMZWZ0LmdldFRpbWUoKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoc3RhcnRPZldlZWtMZWZ0KTtcbiAgdmFyIHRpbWVzdGFtcFJpZ2h0ID0gc3RhcnRPZldlZWtSaWdodC5nZXRUaW1lKCkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKHN0YXJ0T2ZXZWVrUmlnaHQpOyAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIGRheXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlclxuICAvLyBiZWNhdXNlIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnRcbiAgLy8gKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2YgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKCh0aW1lc3RhbXBMZWZ0IC0gdGltZXN0YW1wUmlnaHQpIC8gTUlMTElTRUNPTkRTX0lOX1dFRUspO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgZW5kT2ZNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGVuZCBvZiBhIG1vbnRoXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGVuZCBvZiBhIG1vbnRoIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgU2VwIDMwIDIwMTQgMjM6NTk6NTkuOTk5XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW5kT2ZNb250aChkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoICsgMSwgMCk7XG4gIGRhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzdGFydE9mTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIG9yaWdpbmFsIGRhdGVcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgc3RhcnQgb2YgYSBtb250aFxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIG1vbnRoIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZk1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZNb250aChkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIGRhdGUuc2V0RGF0ZSgxKTtcbiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgb3JpZ2luYWwgZGF0ZVxuICogQHJldHVybnMge0RhdGV9IHRoZSBzdGFydCBvZiBhIHllYXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB5ZWFyIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZlllYXIobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwMCkpXG4gKiAvLz0+IFdlZCBKYW4gMDEgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGNsZWFuRGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGF0ZSA9IG5ldyBEYXRlKDApO1xuICBkYXRlLnNldEZ1bGxZZWFyKGNsZWFuRGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcblxuLyoqXG4gKiBAbmFtZSBlbmRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGVuZCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiBAcGFyYW0ge0xvY2FsZX0gW29wdGlvbnMubG9jYWxlPWRlZmF1bHRMb2NhbGVdIC0gdGhlIGxvY2FsZSBvYmplY3QuIFNlZSBbTG9jYWxlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL0xvY2FsZX1cbiAqIEBwYXJhbSB7MHwxfDJ8M3w0fDV8Nn0gW29wdGlvbnMud2Vla1N0YXJ0c09uPTBdIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDAgLSBTdW5kYXkpXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGVuZCBvZiBhIHdlZWtcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMud2Vla1N0YXJ0c09uYCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTYXQgU2VwIDA2IDIwMTQgMjM6NTk6NTkuOTk5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBlbmQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gU3VuIFNlcCAwNyAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbmRPZldlZWsoZGlydHlEYXRlLCBkaXJ0eU9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGU7XG4gIHZhciBsb2NhbGVXZWVrU3RhcnRzT24gPSBsb2NhbGUgJiYgbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMud2Vla1N0YXJ0c09uO1xuICB2YXIgZGVmYXVsdFdlZWtTdGFydHNPbiA9IGxvY2FsZVdlZWtTdGFydHNPbiA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihsb2NhbGVXZWVrU3RhcnRzT24pO1xuICB2YXIgd2Vla1N0YXJ0c09uID0gb3B0aW9ucy53ZWVrU3RhcnRzT24gPT0gbnVsbCA/IGRlZmF1bHRXZWVrU3RhcnRzT24gOiB0b0ludGVnZXIob3B0aW9ucy53ZWVrU3RhcnRzT24pOyAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDAgYW5kIDYgX2FuZF8gaXMgbm90IE5hTlxuXG4gIGlmICghKHdlZWtTdGFydHNPbiA+PSAwICYmIHdlZWtTdGFydHNPbiA8PSA2KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd3ZWVrU3RhcnRzT24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYgaW5jbHVzaXZlbHknKTtcbiAgfVxuXG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXkgPSBkYXRlLmdldERheSgpO1xuICB2YXIgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyAtNyA6IDApICsgNiAtIChkYXkgLSB3ZWVrU3RhcnRzT24pO1xuICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBkaWZmKTtcbiAgZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJ2YXIgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6ICdsZXNzIHRoYW4gYSBzZWNvbmQnLFxuICAgIG90aGVyOiAnbGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzJ1xuICB9LFxuICB4U2Vjb25kczoge1xuICAgIG9uZTogJzEgc2Vjb25kJyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBzZWNvbmRzJ1xuICB9LFxuICBoYWxmQU1pbnV0ZTogJ2hhbGYgYSBtaW51dGUnLFxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiAnbGVzcyB0aGFuIGEgbWludXRlJyxcbiAgICBvdGhlcjogJ2xlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlcydcbiAgfSxcbiAgeE1pbnV0ZXM6IHtcbiAgICBvbmU6ICcxIG1pbnV0ZScsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gbWludXRlcydcbiAgfSxcbiAgYWJvdXRYSG91cnM6IHtcbiAgICBvbmU6ICdhYm91dCAxIGhvdXInLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IGhvdXJzJ1xuICB9LFxuICB4SG91cnM6IHtcbiAgICBvbmU6ICcxIGhvdXInLFxuICAgIG90aGVyOiAne3tjb3VudH19IGhvdXJzJ1xuICB9LFxuICB4RGF5czoge1xuICAgIG9uZTogJzEgZGF5JyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBkYXlzJ1xuICB9LFxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogJ2Fib3V0IDEgd2VlaycsXG4gICAgb3RoZXI6ICdhYm91dCB7e2NvdW50fX0gd2Vla3MnXG4gIH0sXG4gIHhXZWVrczoge1xuICAgIG9uZTogJzEgd2VlaycsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gd2Vla3MnXG4gIH0sXG4gIGFib3V0WE1vbnRoczoge1xuICAgIG9uZTogJ2Fib3V0IDEgbW9udGgnLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IG1vbnRocydcbiAgfSxcbiAgeE1vbnRoczoge1xuICAgIG9uZTogJzEgbW9udGgnLFxuICAgIG90aGVyOiAne3tjb3VudH19IG1vbnRocydcbiAgfSxcbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6ICdhYm91dCAxIHllYXInLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IHllYXJzJ1xuICB9LFxuICB4WWVhcnM6IHtcbiAgICBvbmU6ICcxIHllYXInLFxuICAgIG90aGVyOiAne3tjb3VudH19IHllYXJzJ1xuICB9LFxuICBvdmVyWFllYXJzOiB7XG4gICAgb25lOiAnb3ZlciAxIHllYXInLFxuICAgIG90aGVyOiAnb3ZlciB7e2NvdW50fX0geWVhcnMnXG4gIH0sXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogJ2FsbW9zdCAxIHllYXInLFxuICAgIG90aGVyOiAnYWxtb3N0IHt7Y291bnR9fSB5ZWFycydcbiAgfVxufTtcblxudmFyIGZvcm1hdERpc3RhbmNlID0gZnVuY3Rpb24gKHRva2VuLCBjb3VudCwgb3B0aW9ucykge1xuICB2YXIgcmVzdWx0O1xuICB2YXIgdG9rZW5WYWx1ZSA9IGZvcm1hdERpc3RhbmNlTG9jYWxlW3Rva2VuXTtcblxuICBpZiAodHlwZW9mIHRva2VuVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZTtcbiAgfSBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub25lO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZSgne3tjb3VudH19JywgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgJiYgb3B0aW9ucy5hZGRTdWZmaXgpIHtcbiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHtcbiAgICAgIHJldHVybiAnaW4gJyArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArICcgYWdvJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0RGlzdGFuY2U7IiwiaW1wb3J0IGJ1aWxkRm9ybWF0TG9uZ0ZuIGZyb20gXCIuLi8uLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuL2luZGV4LmpzXCI7XG52YXIgZGF0ZUZvcm1hdHMgPSB7XG4gIGZ1bGw6ICdFRUVFLCBNTU1NIGRvLCB5JyxcbiAgbG9uZzogJ01NTU0gZG8sIHknLFxuICBtZWRpdW06ICdNTU0gZCwgeScsXG4gIHNob3J0OiAnTU0vZGQveXl5eSdcbn07XG52YXIgdGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6ICdoOm1tOnNzIGEgenp6eicsXG4gIGxvbmc6ICdoOm1tOnNzIGEgeicsXG4gIG1lZGl1bTogJ2g6bW06c3MgYScsXG4gIHNob3J0OiAnaDptbSBhJ1xufTtcbnZhciBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiAne3tkYXRlfX0sIHt7dGltZX19JyxcbiAgc2hvcnQ6ICd7e2RhdGV9fSwge3t0aW1lfX0nXG59O1xudmFyIGZvcm1hdExvbmcgPSB7XG4gIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6ICdmdWxsJ1xuICB9KSxcbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogJ2Z1bGwnXG4gIH0pLFxuICBkYXRlVGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6ICdmdWxsJ1xuICB9KVxufTtcbmV4cG9ydCBkZWZhdWx0IGZvcm1hdExvbmc7IiwidmFyIGZvcm1hdFJlbGF0aXZlTG9jYWxlID0ge1xuICBsYXN0V2VlazogXCInbGFzdCcgZWVlZSAnYXQnIHBcIixcbiAgeWVzdGVyZGF5OiBcIid5ZXN0ZXJkYXkgYXQnIHBcIixcbiAgdG9kYXk6IFwiJ3RvZGF5IGF0JyBwXCIsXG4gIHRvbW9ycm93OiBcIid0b21vcnJvdyBhdCcgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICdhdCcgcFwiLFxuICBvdGhlcjogJ1AnXG59O1xuXG52YXIgZm9ybWF0UmVsYXRpdmUgPSBmdW5jdGlvbiAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSB7XG4gIHJldHVybiBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmb3JtYXRSZWxhdGl2ZTsiLCJpbXBvcnQgYnVpbGRMb2NhbGl6ZUZuIGZyb20gXCIuLi8uLi8uLi9fbGliL2J1aWxkTG9jYWxpemVGbi9pbmRleC5qc1wiO1xudmFyIGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbJ0InLCAnQSddLFxuICBhYmJyZXZpYXRlZDogWydCQycsICdBRCddLFxuICB3aWRlOiBbJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknXVxufTtcbnZhciBxdWFydGVyVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnMScsICcyJywgJzMnLCAnNCddLFxuICBhYmJyZXZpYXRlZDogWydRMScsICdRMicsICdRMycsICdRNCddLFxuICB3aWRlOiBbJzFzdCBxdWFydGVyJywgJzJuZCBxdWFydGVyJywgJzNyZCBxdWFydGVyJywgJzR0aCBxdWFydGVyJ11cbn07IC8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cblxudmFyIG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgYWJicmV2aWF0ZWQ6IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXSxcbiAgd2lkZTogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ11cbn07XG52YXIgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddLFxuICBzaG9ydDogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuICBhYmJyZXZpYXRlZDogWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSxcbiAgd2lkZTogWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddXG59O1xudmFyIGRheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06ICdhJyxcbiAgICBwbTogJ3AnLFxuICAgIG1pZG5pZ2h0OiAnbWknLFxuICAgIG5vb246ICduJyxcbiAgICBtb3JuaW5nOiAnbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnZXZlbmluZycsXG4gICAgbmlnaHQ6ICduaWdodCdcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogJ0FNJyxcbiAgICBwbTogJ1BNJyxcbiAgICBtaWRuaWdodDogJ21pZG5pZ2h0JyxcbiAgICBub29uOiAnbm9vbicsXG4gICAgbW9ybmluZzogJ21vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2FmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2V2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnbmlnaHQnXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogJ2EubS4nLFxuICAgIHBtOiAncC5tLicsXG4gICAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gICAgbm9vbjogJ25vb24nLFxuICAgIG1vcm5pbmc6ICdtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdldmVuaW5nJyxcbiAgICBuaWdodDogJ25pZ2h0J1xuICB9XG59O1xudmFyIGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiAnYScsXG4gICAgcG06ICdwJyxcbiAgICBtaWRuaWdodDogJ21pJyxcbiAgICBub29uOiAnbicsXG4gICAgbW9ybmluZzogJ2luIHRoZSBtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdpbiB0aGUgYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnaW4gdGhlIGV2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnYXQgbmlnaHQnXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06ICdBTScsXG4gICAgcG06ICdQTScsXG4gICAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gICAgbm9vbjogJ25vb24nLFxuICAgIG1vcm5pbmc6ICdpbiB0aGUgbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnaW4gdGhlIGFmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2luIHRoZSBldmVuaW5nJyxcbiAgICBuaWdodDogJ2F0IG5pZ2h0J1xuICB9LFxuICB3aWRlOiB7XG4gICAgYW06ICdhLm0uJyxcbiAgICBwbTogJ3AubS4nLFxuICAgIG1pZG5pZ2h0OiAnbWlkbmlnaHQnLFxuICAgIG5vb246ICdub29uJyxcbiAgICBtb3JuaW5nOiAnaW4gdGhlIG1vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2luIHRoZSBhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdpbiB0aGUgZXZlbmluZycsXG4gICAgbmlnaHQ6ICdhdCBuaWdodCdcbiAgfVxufTtcblxudmFyIG9yZGluYWxOdW1iZXIgPSBmdW5jdGlvbiAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSB7XG4gIHZhciBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpOyAvLyBJZiBvcmRpbmFsIG51bWJlcnMgZGVwZW5kIG9uIGNvbnRleHQsIGZvciBleGFtcGxlLFxuICAvLyBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBncmFtbWF0aWNhbCBnZW5kZXJzLFxuICAvLyB1c2UgYG9wdGlvbnMudW5pdGAuXG4gIC8vXG4gIC8vIGB1bml0YCBjYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RhdGUnLCAnZGF5T2ZZZWFyJyxcbiAgLy8gJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLlxuXG4gIHZhciByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG5cbiAgaWYgKHJlbTEwMCA+IDIwIHx8IHJlbTEwMCA8IDEwKSB7XG4gICAgc3dpdGNoIChyZW0xMDAgJSAxMCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgJ3N0JztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgJ25kJztcblxuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgJ3JkJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVtYmVyICsgJ3RoJztcbn07XG5cbnZhciBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcjogb3JkaW5hbE51bWJlcixcbiAgZXJhOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZXJhVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnXG4gIH0pLFxuICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJyxcbiAgICBhcmd1bWVudENhbGxiYWNrOiBmdW5jdGlvbiAocXVhcnRlcikge1xuICAgICAgcmV0dXJuIHF1YXJ0ZXIgLSAxO1xuICAgIH1cbiAgfSksXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiAnd2lkZSdcbiAgfSksXG4gIGRheTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJ1xuICB9KSxcbiAgZGF5UGVyaW9kOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogJ3dpZGUnXG4gIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxpemU7IiwiaW1wb3J0IGJ1aWxkTWF0Y2hGbiBmcm9tIFwiLi4vLi4vLi4vX2xpYi9idWlsZE1hdGNoRm4vaW5kZXguanNcIjtcbmltcG9ydCBidWlsZE1hdGNoUGF0dGVybkZuIGZyb20gXCIuLi8uLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4vaW5kZXguanNcIjtcbnZhciBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXFxkKykodGh8c3R8bmR8cmQpPy9pO1xudmFyIHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXFxkKy9pO1xudmFyIG1hdGNoRXJhUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYnxhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oYlxcLj9cXHM/Y1xcLj98YlxcLj9cXHM/Y1xcLj9cXHM/ZVxcLj98YVxcLj9cXHM/ZFxcLj98Y1xcLj9cXHM/ZVxcLj8pL2ksXG4gIHdpZGU6IC9eKGJlZm9yZSBjaHJpc3R8YmVmb3JlIGNvbW1vbiBlcmF8YW5ubyBkb21pbml8Y29tbW9uIGVyYSkvaVxufTtcbnZhciBwYXJzZUVyYVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXmIvaSwgL14oYXxjKS9pXVxufTtcbnZhciBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pXG59O1xudmFyIHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXVxufTtcbnZhciBtYXRjaE1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bamZtYXNvbmRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXihqYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYykvaSxcbiAgd2lkZTogL14oamFudWFyeXxmZWJydWFyeXxtYXJjaHxhcHJpbHxtYXl8anVuZXxqdWx5fGF1Z3VzdHxzZXB0ZW1iZXJ8b2N0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaVxufTtcbnZhciBwYXJzZU1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogWy9eai9pLCAvXmYvaSwgL15tL2ksIC9eYS9pLCAvXm0vaSwgL15qL2ksIC9eai9pLCAvXmEvaSwgL15zL2ksIC9eby9pLCAvXm4vaSwgL15kL2ldLFxuICBhbnk6IFsvXmphL2ksIC9eZi9pLCAvXm1hci9pLCAvXmFwL2ksIC9ebWF5L2ksIC9eanVuL2ksIC9eanVsL2ksIC9eYXUvaSwgL15zL2ksIC9eby9pLCAvXm4vaSwgL15kL2ldXG59O1xudmFyIG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc210d2ZdL2ksXG4gIHNob3J0OiAvXihzdXxtb3x0dXx3ZXx0aHxmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSxcbiAgd2lkZTogL14oc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpL2lcbn07XG52YXIgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLFxuICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldXG59O1xudmFyIG1hdGNoRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYXxwfG1pfG58KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pLFxuICBhbnk6IC9eKFthcF1cXC4/XFxzP21cXC4/fG1pZG5pZ2h0fG5vb258KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pXG59O1xudmFyIHBhcnNlRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIGFueToge1xuICAgIGFtOiAvXmEvaSxcbiAgICBwbTogL15wL2ksXG4gICAgbWlkbmlnaHQ6IC9ebWkvaSxcbiAgICBub29uOiAvXm5vL2ksXG4gICAgbW9ybmluZzogL21vcm5pbmcvaSxcbiAgICBhZnRlcm5vb246IC9hZnRlcm5vb24vaSxcbiAgICBldmVuaW5nOiAvZXZlbmluZy9pLFxuICAgIG5pZ2h0OiAvbmlnaHQvaVxuICB9XG59O1xudmFyIG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICB9KSxcbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICd3aWRlJyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgcXVhcnRlcjogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ3dpZGUnLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55JyxcbiAgICB2YWx1ZUNhbGxiYWNrOiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHJldHVybiBpbmRleCArIDE7XG4gICAgfVxuICB9KSxcbiAgbW9udGg6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAnd2lkZScsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICd3aWRlJyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgZGF5UGVyaW9kOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICdhbnknLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6ICdhbnknXG4gIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgbWF0Y2g7IiwiaW1wb3J0IGZvcm1hdERpc3RhbmNlIGZyb20gXCIuL19saWIvZm9ybWF0RGlzdGFuY2UvaW5kZXguanNcIjtcbmltcG9ydCBmb3JtYXRMb25nIGZyb20gXCIuL19saWIvZm9ybWF0TG9uZy9pbmRleC5qc1wiO1xuaW1wb3J0IGZvcm1hdFJlbGF0aXZlIGZyb20gXCIuL19saWIvZm9ybWF0UmVsYXRpdmUvaW5kZXguanNcIjtcbmltcG9ydCBsb2NhbGl6ZSBmcm9tIFwiLi9fbGliL2xvY2FsaXplL2luZGV4LmpzXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4vX2xpYi9tYXRjaC9pbmRleC5qc1wiO1xuXG4vKipcbiAqIEB0eXBlIHtMb2NhbGV9XG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgRW5nbGlzaCBsb2NhbGUgKFVuaXRlZCBTdGF0ZXMpLlxuICogQGxhbmd1YWdlIEVuZ2xpc2hcbiAqIEBpc28tNjM5LTIgZW5nXG4gKiBAYXV0aG9yIFNhc2hhIEtvc3MgW0Brb3Nzbm9jb3JwXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20va29zc25vY29ycH1cbiAqIEBhdXRob3IgTGVzaGEgS29zcyBbQGxlc2hha29zc117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xlc2hha29zc31cbiAqL1xudmFyIGxvY2FsZSA9IHtcbiAgY29kZTogJ2VuLVVTJyxcbiAgZm9ybWF0RGlzdGFuY2U6IGZvcm1hdERpc3RhbmNlLFxuICBmb3JtYXRMb25nOiBmb3JtYXRMb25nLFxuICBmb3JtYXRSZWxhdGl2ZTogZm9ybWF0UmVsYXRpdmUsXG4gIGxvY2FsaXplOiBsb2NhbGl6ZSxcbiAgbWF0Y2g6IG1hdGNoLFxuICBvcHRpb25zOiB7XG4gICAgd2Vla1N0YXJ0c09uOiAwXG4gICAgLyogU3VuZGF5ICovXG4gICAgLFxuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogMVxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxlOyIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgYWRkTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9hZGRNaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIHN1Yk1pbGxpc2Vjb25kc1xuICogQGNhdGVnb3J5IE1pbGxpc2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIGJlIHN1YnRyYWN0ZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbWlsbGlzZWNvbmRzIHN1YnRyYWN0ZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgNzUwIG1pbGxpc2Vjb25kcyBmcm9tIDEwIEp1bHkgMjAxNCAxMjo0NTozMC4wMDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJNaWxsaXNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMzAsIDApLCA3NTApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NToyOS4yNTBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdWJNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCAtYW1vdW50KTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xudmFyIE1JTExJU0VDT05EU19JTl9EQVkgPSA4NjQwMDAwMDsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVUQ0RheU9mWWVhcihkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTtcbiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZZZWFyVGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gIHZhciBkaWZmZXJlbmNlID0gdGltZXN0YW1wIC0gc3RhcnRPZlllYXJUaW1lc3RhbXA7XG4gIHJldHVybiBNYXRoLmZsb29yKGRpZmZlcmVuY2UgLyBNSUxMSVNFQ09ORFNfSU5fREFZKSArIDE7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZVVENJU09XZWVrKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIHdlZWtTdGFydHNPbiA9IDE7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXkgPSBkYXRlLmdldFVUQ0RheSgpO1xuICB2YXIgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIGRpZmYpO1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENJU09XZWVrIGZyb20gXCIuLi9zdGFydE9mVVRDSVNPV2Vlay9pbmRleC5qc1wiOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VVRDSVNPV2Vla1llYXIoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRVVENGdWxsWWVhcih5ZWFyICsgMSwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mVVRDSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZVVENJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIpO1xuXG4gIGlmIChkYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKGRhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZUaGlzWWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geWVhciAtIDE7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0VVRDSVNPV2Vla1llYXIgZnJvbSBcIi4uL2dldFVUQ0lTT1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ0lTT1dlZWsgZnJvbSBcIi4uL3N0YXJ0T2ZVVENJU09XZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZVVENJU09XZWVrWWVhcihkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciB5ZWFyID0gZ2V0VVRDSVNPV2Vla1llYXIoZGlydHlEYXRlKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeSA9IG5ldyBEYXRlKDApO1xuICBmb3VydGhPZkphbnVhcnkuc2V0VVRDRnVsbFllYXIoeWVhciwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIGRhdGUgPSBzdGFydE9mVVRDSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ0lTT1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2Vla1llYXIgZnJvbSBcIi4uL3N0YXJ0T2ZVVENJU09XZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX1dFRUsgPSA2MDQ4MDAwMDA7IC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhIHBhcnQgb2YgcHVibGljIEFQSSB3aGVuIFVUQyBmdW5jdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkLlxuLy8gU2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVVENJU09XZWVrKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRpZmYgPSBzdGFydE9mVVRDSVNPV2VlayhkYXRlKS5nZXRUaW1lKCkgLSBzdGFydE9mVVRDSVNPV2Vla1llYXIoZGF0ZSkuZ2V0VGltZSgpOyAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIGRheXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlclxuICAvLyBiZWNhdXNlIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnRcbiAgLy8gKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2YgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBNSUxMSVNFQ09ORFNfSU5fV0VFSykgKyAxO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uLy4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ1dlZWsgZnJvbSBcIi4uL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi90b0ludGVnZXIvaW5kZXguanNcIjsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVUQ1dlZWtZZWFyKGRpcnR5RGF0ZSwgZGlydHlPcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIG9wdGlvbnMgPSBkaXJ0eU9wdGlvbnMgfHwge307XG4gIHZhciBsb2NhbGUgPSBvcHRpb25zLmxvY2FsZTtcbiAgdmFyIGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZSAmJiBsb2NhbGUub3B0aW9ucyAmJiBsb2NhbGUub3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGU7XG4gIHZhciBkZWZhdWx0Rmlyc3RXZWVrQ29udGFpbnNEYXRlID0gbG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlID09IG51bGwgPyAxIDogdG9JbnRlZ2VyKGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIHZhciBmaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9PSBudWxsID8gZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA6IHRvSW50ZWdlcihvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7IC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMSBhbmQgNyBfYW5kXyBpcyBub3QgTmFOXG5cbiAgaWYgKCEoZmlyc3RXZWVrQ29udGFpbnNEYXRlID49IDEgJiYgZmlyc3RXZWVrQ29udGFpbnNEYXRlIDw9IDcpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2ZpcnN0V2Vla0NvbnRhaW5zRGF0ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNyBpbmNsdXNpdmVseScpO1xuICB9XG5cbiAgdmFyIGZpcnN0V2Vla09mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRVVENGdWxsWWVhcih5ZWFyICsgMSwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZVVENXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIGRpcnR5T3B0aW9ucyk7XG4gIHZhciBmaXJzdFdlZWtPZlRoaXNZZWFyID0gbmV3IERhdGUoMCk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0VVRDRnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZVVENXZWVrKGZpcnN0V2Vla09mVGhpc1llYXIsIGRpcnR5T3B0aW9ucyk7XG5cbiAgaWYgKGRhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufSIsImltcG9ydCBnZXRVVENXZWVrWWVhciBmcm9tIFwiLi4vZ2V0VVRDV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENXZWVrIGZyb20gXCIuLi9zdGFydE9mVVRDV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vdG9JbnRlZ2VyL2luZGV4LmpzXCI7IC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhIHBhcnQgb2YgcHVibGljIEFQSSB3aGVuIFVUQyBmdW5jdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkLlxuLy8gU2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFydE9mVVRDV2Vla1llYXIoZGlydHlEYXRlLCBkaXJ0eU9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGU7XG4gIHZhciBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGUgJiYgbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlO1xuICB2YXIgZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9PSBudWxsID8gMSA6IHRvSW50ZWdlcihsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICB2YXIgZmlyc3RXZWVrQ29udGFpbnNEYXRlID0gb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgOiB0b0ludGVnZXIob3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpO1xuICB2YXIgeWVhciA9IGdldFVUQ1dlZWtZZWFyKGRpcnR5RGF0ZSwgZGlydHlPcHRpb25zKTtcbiAgdmFyIGZpcnN0V2VlayA9IG5ldyBEYXRlKDApO1xuICBmaXJzdFdlZWsuc2V0VVRDRnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgZGF0ZSA9IHN0YXJ0T2ZVVENXZWVrKGZpcnN0V2VlaywgZGlydHlPcHRpb25zKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ1dlZWsgZnJvbSBcIi4uL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ1dlZWtZZWFyIGZyb20gXCIuLi9zdGFydE9mVVRDV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xudmFyIE1JTExJU0VDT05EU19JTl9XRUVLID0gNjA0ODAwMDAwOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VVRDV2VlayhkaXJ0eURhdGUsIG9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkaWZmID0gc3RhcnRPZlVUQ1dlZWsoZGF0ZSwgb3B0aW9ucykuZ2V0VGltZSgpIC0gc3RhcnRPZlVUQ1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpLmdldFRpbWUoKTsgLy8gUm91bmQgdGhlIG51bWJlciBvZiBkYXlzIHRvIHRoZSBuZWFyZXN0IGludGVnZXJcbiAgLy8gYmVjYXVzZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50XG4gIC8vIChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdClcblxuICByZXR1cm4gTWF0aC5yb3VuZChkaWZmIC8gTUlMTElTRUNPTkRTX0lOX1dFRUspICsgMTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRMZWFkaW5nWmVyb3MobnVtYmVyLCB0YXJnZXRMZW5ndGgpIHtcbiAgdmFyIHNpZ24gPSBudW1iZXIgPCAwID8gJy0nIDogJyc7XG4gIHZhciBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIpLnRvU3RyaW5nKCk7XG5cbiAgd2hpbGUgKG91dHB1dC5sZW5ndGggPCB0YXJnZXRMZW5ndGgpIHtcbiAgICBvdXRwdXQgPSAnMCcgKyBvdXRwdXQ7XG4gIH1cblxuICByZXR1cm4gc2lnbiArIG91dHB1dDtcbn0iLCJpbXBvcnQgYWRkTGVhZGluZ1plcm9zIGZyb20gXCIuLi8uLi9hZGRMZWFkaW5nWmVyb3MvaW5kZXguanNcIjtcbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICovXG5cbnZhciBmb3JtYXR0ZXJzID0ge1xuICAvLyBZZWFyXG4gIHk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIC8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfdG9rZW5zXG4gICAgLy8gfCBZZWFyICAgICB8ICAgICB5IHwgeXkgfCAgIHl5eSB8ICB5eXl5IHwgeXl5eXkgfFxuICAgIC8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbiAgICAvLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4gICAgLy8gfCBBRCAxMiAgICB8ICAgIDEyIHwgMTIgfCAgIDAxMiB8ICAwMDEyIHwgMDAwMTIgfFxuICAgIC8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbiAgICAvLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4gICAgLy8gfCBBRCAxMjM0NSB8IDEyMzQ1IHwgNDUgfCAxMjM0NSB8IDEyMzQ1IHwgMTIzNDUgfFxuICAgIHZhciBzaWduZWRZZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpOyAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuXG4gICAgdmFyIHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRva2VuID09PSAneXknID8geWVhciAlIDEwMCA6IHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHZhciBtb250aCA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICByZXR1cm4gdG9rZW4gPT09ICdNJyA/IFN0cmluZyhtb250aCArIDEpIDogYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gIH0sXG4gIC8vIERheSBvZiB0aGUgbW9udGhcbiAgZDogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ0RhdGUoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gQU0gb3IgUE1cbiAgYTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRhdGUuZ2V0VVRDSG91cnMoKSAvIDEyID49IDEgPyAncG0nIDogJ2FtJztcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgY2FzZSAnYWEnOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIGNhc2UgJ2FhYSc6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWU7XG5cbiAgICAgIGNhc2UgJ2FhYWFhJzpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTtcblxuICAgICAgY2FzZSAnYWFhYSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlID09PSAnYW0nID8gJ2EubS4nIDogJ3AubS4nO1xuICAgIH1cbiAgfSxcbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ0hvdXJzKCkgJSAxMiB8fCAxMiwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ0hvdXJzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIE1pbnV0ZVxuICBtOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDTWludXRlcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBTZWNvbmRcbiAgczogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ1NlY29uZHMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHZhciBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgICB2YXIgZnJhY3Rpb25hbFNlY29uZHMgPSBNYXRoLmZsb29yKG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGZyYWN0aW9uYWxTZWNvbmRzLCB0b2tlbi5sZW5ndGgpO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybWF0dGVyczsiLCJpbXBvcnQgZ2V0VVRDRGF5T2ZZZWFyIGZyb20gXCIuLi8uLi8uLi9fbGliL2dldFVUQ0RheU9mWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFVUQ0lTT1dlZWsgZnJvbSBcIi4uLy4uLy4uL19saWIvZ2V0VVRDSVNPV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFVUQ0lTT1dlZWtZZWFyIGZyb20gXCIuLi8uLi8uLi9fbGliL2dldFVUQ0lTT1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0VVRDV2VlayBmcm9tIFwiLi4vLi4vLi4vX2xpYi9nZXRVVENXZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0VVRDV2Vla1llYXIgZnJvbSBcIi4uLy4uLy4uL19saWIvZ2V0VVRDV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCBhZGRMZWFkaW5nWmVyb3MgZnJvbSBcIi4uLy4uL2FkZExlYWRpbmdaZXJvcy9pbmRleC5qc1wiO1xuaW1wb3J0IGxpZ2h0Rm9ybWF0dGVycyBmcm9tIFwiLi4vbGlnaHRGb3JtYXR0ZXJzL2luZGV4LmpzXCI7XG52YXIgZGF5UGVyaW9kRW51bSA9IHtcbiAgYW06ICdhbScsXG4gIHBtOiAncG0nLFxuICBtaWRuaWdodDogJ21pZG5pZ2h0JyxcbiAgbm9vbjogJ25vb24nLFxuICBtb3JuaW5nOiAnbW9ybmluZycsXG4gIGFmdGVybm9vbjogJ2FmdGVybm9vbicsXG4gIGV2ZW5pbmc6ICdldmVuaW5nJyxcbiAgbmlnaHQ6ICduaWdodCdcbn07XG4vKlxuICogfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCAgYSAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgfCAgQSogfCBNaWxsaXNlY29uZHMgaW4gZGF5ICAgICAgICAgICAgfFxuICogfCAgYiAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgfCAgQiAgfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgfFxuICogfCAgYyAgfCBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2VlayAgfCAgQyogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfFxuICogfCAgZCAgfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgfCAgRCAgfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZSAgfCBMb2NhbCBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgfCAgRSAgfCBEYXkgb2Ygd2VlayAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRiogfCBEYXkgb2Ygd2VlayBpbiBtb250aCAgICAgICAgICAgfFxuICogfCAgZyogfCBNb2RpZmllZCBKdWxpYW4gZGF5ICAgICAgICAgICAgfCAgRyAgfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaCAgfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgfCAgSCAgfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaSEgfCBJU08gZGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgfCAgSSEgfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgfFxuICogfCAgaiogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfCAgSiogfCBMb2NhbGl6ZWQgaG91ciB3L28gZGF5IHBlcmlvZCAgfFxuICogfCAgayAgfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgfCAgSyAgfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbCogfCAoZGVwcmVjYXRlZCkgICAgICAgICAgICAgICAgICAgfCAgTCAgfCBTdGFuZC1hbG9uZSBtb250aCAgICAgICAgICAgICAgfFxuICogfCAgbSAgfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTSAgfCBNb250aCAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbyEgfCBPcmRpbmFsIG51bWJlciBtb2RpZmllciAgICAgICAgfCAgTyAgfCBUaW1lem9uZSAoR01UKSAgICAgICAgICAgICAgICAgfFxuICogfCAgcCEgfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgfCAgUCEgfCBMb25nIGxvY2FsaXplZCBkYXRlICAgICAgICAgICAgfFxuICogfCAgcSAgfCBTdGFuZC1hbG9uZSBxdWFydGVyICAgICAgICAgICAgfCAgUSAgfCBRdWFydGVyICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgciogfCBSZWxhdGVkIEdyZWdvcmlhbiB5ZWFyICAgICAgICAgfCAgUiEgfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgfFxuICogfCAgcyAgfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgUyAgfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgfFxuICogfCAgdCEgfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgfCAgVCEgfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgfFxuICogfCAgdSAgfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgfCAgVSogfCBDeWNsaWMgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgdiogfCBUaW1lem9uZSAoZ2VuZXJpYyBub24tbG9jYXQuKSAgfCAgViogfCBUaW1lem9uZSAobG9jYXRpb24pICAgICAgICAgICAgfFxuICogfCAgdyAgfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgfCAgVyogfCBXZWVrIG9mIG1vbnRoICAgICAgICAgICAgICAgICAgfFxuICogfCAgeCAgfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgfCAgWCAgfCBUaW1lem9uZSAoSVNPLTg2MDEpICAgICAgICAgICAgfFxuICogfCAgeSAgfCBZZWFyIChhYnMpICAgICAgICAgICAgICAgICAgICAgfCAgWSAgfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgfFxuICogfCAgeiAgfCBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0LikgfCAgWiogfCBUaW1lem9uZSAoYWxpYXNlcykgICAgICAgICAgICAgfFxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICogYXJlIG5vdCBpbXBsZW1lbnRlZCBidXQgcmVzZXJ2ZWQgYnkgVW5pY29kZSBzdGFuZGFyZC5cbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAhIGFyZSBub24tc3RhbmRhcmQsIGJ1dCBpbXBsZW1lbnRlZCBieSBkYXRlLWZuczpcbiAqIC0gYG9gIG1vZGlmaWVzIHRoZSBwcmV2aW91cyB0b2tlbiB0byB0dXJuIGl0IGludG8gYW4gb3JkaW5hbCAoc2VlIGBmb3JtYXRgIGRvY3MpXG4gKiAtIGBpYCBpcyBJU08gZGF5IG9mIHdlZWsuIEZvciBgaWAgYW5kIGBpaWAgaXMgcmV0dXJucyBudW1lcmljIElTTyB3ZWVrIGRheXMsXG4gKiAgIGkuZS4gNyBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXksIGV0Yy5cbiAqIC0gYElgIGlzIElTTyB3ZWVrIG9mIHllYXIsIGFzIG9wcG9zZWQgdG8gYHdgIHdoaWNoIGlzIGxvY2FsIHdlZWsgb2YgeWVhci5cbiAqIC0gYFJgIGlzIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyLCBhcyBvcHBvc2VkIHRvIGBZYCB3aGljaCBpcyBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogICBgUmAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGBJYCBhbmQgYGlgXG4gKiAgIGZvciB1bml2ZXJzYWwgSVNPIHdlZWstbnVtYmVyaW5nIGRhdGUsIHdoZXJlYXNcbiAqICAgYFlgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgd2AgYW5kIGBlYFxuICogICBmb3Igd2Vlay1udW1iZXJpbmcgZGF0ZSBzcGVjaWZpYyB0byB0aGUgbG9jYWxlLlxuICogLSBgUGAgaXMgbG9uZyBsb2NhbGl6ZWQgZGF0ZSBmb3JtYXRcbiAqIC0gYHBgIGlzIGxvbmcgbG9jYWxpemVkIHRpbWUgZm9ybWF0XG4gKi9cblxudmFyIGZvcm1hdHRlcnMgPSB7XG4gIC8vIEVyYVxuICBHOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGVyYSA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKSA+IDAgPyAxIDogMDtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEFELCBCQ1xuICAgICAgY2FzZSAnRyc6XG4gICAgICBjYXNlICdHRyc6XG4gICAgICBjYXNlICdHR0cnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnXG4gICAgICAgIH0pO1xuICAgICAgLy8gQSwgQlxuXG4gICAgICBjYXNlICdHR0dHRyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnXG4gICAgICAgIH0pO1xuICAgICAgLy8gQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3RcblxuICAgICAgY2FzZSAnR0dHRyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZSdcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBZZWFyXG4gIHk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gJ3lvJykge1xuICAgICAgdmFyIHNpZ25lZFllYXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7IC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG5cbiAgICAgIHZhciB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7XG4gICAgICAgIHVuaXQ6ICd5ZWFyJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy55KGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIHNpZ25lZFdlZWtZZWFyID0gZ2V0VVRDV2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7IC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG5cbiAgICB2YXIgd2Vla1llYXIgPSBzaWduZWRXZWVrWWVhciA+IDAgPyBzaWduZWRXZWVrWWVhciA6IDEgLSBzaWduZWRXZWVrWWVhcjsgLy8gVHdvIGRpZ2l0IHllYXJcblxuICAgIGlmICh0b2tlbiA9PT0gJ1lZJykge1xuICAgICAgdmFyIHR3b0RpZ2l0WWVhciA9IHdlZWtZZWFyICUgMTAwO1xuICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0d29EaWdpdFllYXIsIDIpO1xuICAgIH0gLy8gT3JkaW5hbCBudW1iZXJcblxuXG4gICAgaWYgKHRva2VuID09PSAnWW8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwge1xuICAgICAgICB1bml0OiAneWVhcidcbiAgICAgIH0pO1xuICAgIH0gLy8gUGFkZGluZ1xuXG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICB2YXIgaXNvV2Vla1llYXIgPSBnZXRVVENJU09XZWVrWWVhcihkYXRlKTsgLy8gUGFkZGluZ1xuXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29XZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIHllYXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh5ZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBRdWFydGVyXG4gIFE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRVVENNb250aCgpICsgMSkgLyAzKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgJ1EnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcblxuICAgICAgY2FzZSAnUVEnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG5cbiAgICAgIGNhc2UgJ1FvJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwge1xuICAgICAgICAgIHVuaXQ6ICdxdWFydGVyJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG5cbiAgICAgIGNhc2UgJ1FRUSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcblxuICAgICAgY2FzZSAnUVFRUVEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG5cbiAgICAgIGNhc2UgJ1FRUVEnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3RhbmQtYWxvbmUgcXVhcnRlclxuICBxOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIHF1YXJ0ZXIgPSBNYXRoLmNlaWwoKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpIC8gMyk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlICdxJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhxdWFydGVyKTtcbiAgICAgIC8vIDAxLCAwMiwgMDMsIDA0XG5cbiAgICAgIGNhc2UgJ3FxJzpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhxdWFydGVyLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuXG4gICAgICBjYXNlICdxbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB1bml0OiAncXVhcnRlcidcbiAgICAgICAgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuXG4gICAgICBjYXNlICdxcXEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG5cbiAgICAgIGNhc2UgJ3FxcXFxJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuXG4gICAgICBjYXNlICdxcXFxJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgbW9udGggPSBkYXRlLmdldFVUQ01vbnRoKCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlICdNJzpcbiAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5NKGRhdGUsIHRva2VuKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcblxuICAgICAgY2FzZSAnTW8nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHtcbiAgICAgICAgICB1bml0OiAnbW9udGgnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG5cbiAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuXG4gICAgICBjYXNlICdNTU1NTSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuXG4gICAgICBjYXNlICdNTU1NJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3RhbmQtYWxvbmUgbW9udGhcbiAgTDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBtb250aCA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgJ0wnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcblxuICAgICAgY2FzZSAnTEwnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG5cbiAgICAgIGNhc2UgJ0xvJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7XG4gICAgICAgICAgdW5pdDogJ21vbnRoJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuXG4gICAgICBjYXNlICdMTEwnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgICAvLyBKLCBGLCAuLi4sIERcblxuICAgICAgY2FzZSAnTExMTEwnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcblxuICAgICAgY2FzZSAnTExMTCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIExvY2FsIHdlZWsgb2YgeWVhclxuICB3OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIHdlZWsgPSBnZXRVVENXZWVrKGRhdGUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHRva2VuID09PSAnd28nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrLCB7XG4gICAgICAgIHVuaXQ6ICd3ZWVrJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBJU08gd2VlayBvZiB5ZWFyXG4gIEk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaXNvV2VlayA9IGdldFVUQ0lTT1dlZWsoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09ICdJbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb1dlZWssIHtcbiAgICAgICAgdW5pdDogJ3dlZWsnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIERheSBvZiB0aGUgbW9udGhcbiAgZDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gJ2RvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRVVENEYXRlKCksIHtcbiAgICAgICAgdW5pdDogJ2RhdGUnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLmQoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBEYXkgb2YgeWVhclxuICBEOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGRheU9mWWVhciA9IGdldFVUQ0RheU9mWWVhcihkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gJ0RvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF5T2ZZZWFyLCB7XG4gICAgICAgIHVuaXQ6ICdkYXlPZlllYXInXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRGF5IG9mIHdlZWtcbiAgRTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBkYXlPZldlZWsgPSBkYXRlLmdldFVUQ0RheSgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlICdFJzpcbiAgICAgIGNhc2UgJ0VFJzpcbiAgICAgIGNhc2UgJ0VFRSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuXG4gICAgICBjYXNlICdFRUVFRSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG5cbiAgICAgIGNhc2UgJ0VFRUVFRSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuXG4gICAgICBjYXNlICdFRUVFJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheU9mV2VlayA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gICAgdmFyIGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKE50aCBkYXkgb2Ygd2VlayB3aXRoIGN1cnJlbnQgbG9jYWxlIG9yIHdlZWtTdGFydHNPbilcbiAgICAgIGNhc2UgJ2UnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGxvY2FsRGF5T2ZXZWVrKTtcbiAgICAgIC8vIFBhZGRlZCBudW1lcmljYWwgdmFsdWVcblxuICAgICAgY2FzZSAnZWUnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGxvY2FsRGF5T2ZXZWVrLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDd0aFxuXG4gICAgICBjYXNlICdlbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7XG4gICAgICAgICAgdW5pdDogJ2RheSdcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2VlZSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuXG4gICAgICBjYXNlICdlZWVlZSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG5cbiAgICAgIGNhc2UgJ2VlZWVlZSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuXG4gICAgICBjYXNlICdlZWVlJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2Vla1xuICBjOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheU9mV2VlayA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gICAgdmFyIGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKVxuICAgICAgY2FzZSAnYyc6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuXG4gICAgICBjYXNlICdjYyc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcblxuICAgICAgY2FzZSAnY28nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2Vlaywge1xuICAgICAgICAgIHVuaXQ6ICdkYXknXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdjY2MnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFRcblxuICAgICAgY2FzZSAnY2NjY2MnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuXG4gICAgICBjYXNlICdjY2NjY2MnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnc2hvcnQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcblxuICAgICAgY2FzZSAnY2NjYyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gSVNPIGRheSBvZiB3ZWVrXG4gIGk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgZGF5T2ZXZWVrID0gZGF0ZS5nZXRVVENEYXkoKTtcbiAgICB2YXIgaXNvRGF5T2ZXZWVrID0gZGF5T2ZXZWVrID09PSAwID8gNyA6IGRheU9mV2VlaztcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgJ2knOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGlzb0RheU9mV2Vlayk7XG4gICAgICAvLyAwMlxuXG4gICAgICBjYXNlICdpaSc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgLy8gMm5kXG5cbiAgICAgIGNhc2UgJ2lvJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvRGF5T2ZXZWVrLCB7XG4gICAgICAgICAgdW5pdDogJ2RheSdcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVcblxuICAgICAgY2FzZSAnaWlpJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG5cbiAgICAgIGNhc2UgJ2lpaWlpJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcblxuICAgICAgY2FzZSAnaWlpaWlpJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3Nob3J0JyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG5cbiAgICAgIGNhc2UgJ2lpaWknOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/ICdwbScgOiAnYW0nO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnYSc6XG4gICAgICBjYXNlICdhYSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdhYWEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBjYXNlICdhYWFhYSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnYWFhYSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gQU0sIFBNLCBtaWRuaWdodCwgbm9vblxuICBiOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpO1xuICAgIHZhciBkYXlQZXJpb2RFbnVtVmFsdWU7XG5cbiAgICBpZiAoaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA9PT0gMCkge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5taWRuaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gaG91cnMgLyAxMiA+PSAxID8gJ3BtJyA6ICdhbSc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnYic6XG4gICAgICBjYXNlICdiYic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdiYmInOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBjYXNlICdiYmJiYic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnYmJiYic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gaW4gdGhlIG1vcm5pbmcsIGluIHRoZSBhZnRlcm5vb24sIGluIHRoZSBldmVuaW5nLCBhdCBuaWdodFxuICBCOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpO1xuICAgIHZhciBkYXlQZXJpb2RFbnVtVmFsdWU7XG5cbiAgICBpZiAoaG91cnMgPj0gMTcpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uZXZlbmluZztcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmFmdGVybm9vbjtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDQpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubW9ybmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5uaWdodDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlICdCJzpcbiAgICAgIGNhc2UgJ0JCJzpcbiAgICAgIGNhc2UgJ0JCQic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdCQkJCQic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnQkJCQic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gJ2hvJykge1xuICAgICAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpICUgMTI7XG4gICAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMTI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3Vycywge1xuICAgICAgICB1bml0OiAnaG91cidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuaChkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIEhvdXIgWzAtMjNdXG4gIEg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09ICdIbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0VVRDSG91cnMoKSwge1xuICAgICAgICB1bml0OiAnaG91cidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuSChkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIEhvdXIgWzAtMTFdXG4gIEs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gJ0tvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBIb3VyIFsxLTI0XVxuICBrOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpO1xuICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAyNDtcblxuICAgIGlmICh0b2tlbiA9PT0gJ2tvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBNaW51dGVcbiAgbTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gJ21vJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRVVENNaW51dGVzKCksIHtcbiAgICAgICAgdW5pdDogJ21pbnV0ZSdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMubShkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSAnc28nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFVUQ1NlY29uZHMoKSwge1xuICAgICAgICB1bml0OiAnc2Vjb25kJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuUyhkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBhbHdheXMgYCdaJ2ApXG4gIFg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIG9yaWdpbmFsRGF0ZSA9IG9wdGlvbnMuX29yaWdpbmFsRGF0ZSB8fCBkYXRlO1xuICAgIHZhciB0aW1lem9uZU9mZnNldCA9IG9yaWdpbmFsRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gJ1onO1xuICAgIH1cblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEhvdXJzIGFuZCBvcHRpb25hbCBtaW51dGVzXG4gICAgICBjYXNlICdYJzpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcblxuICAgICAgY2FzZSAnWFhYWCc6XG4gICAgICBjYXNlICdYWCc6XG4gICAgICAgIC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpO1xuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhYYFxuXG4gICAgICBjYXNlICdYWFhYWCc6XG4gICAgICBjYXNlICdYWFgnOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCAnOicpO1xuICAgIH1cbiAgfSxcbiAgLy8gVGltZXpvbmUgKElTTy04NjAxLiBJZiBvZmZzZXQgaXMgMCwgb3V0cHV0IGlzIGAnKzAwOjAwJ2Agb3IgZXF1aXZhbGVudClcbiAgeDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gb3JpZ2luYWxEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSAneCc6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHhgXG5cbiAgICAgIGNhc2UgJ3h4eHgnOlxuICAgICAgY2FzZSAneHgnOlxuICAgICAgICAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcblxuICAgICAgY2FzZSAneHh4eHgnOlxuICAgICAgY2FzZSAneHh4JzogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aCBgOmAgZGVsaW1pdGVyXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICB9XG4gIH0sXG4gIC8vIFRpbWV6b25lIChHTVQpXG4gIE86IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIG9yaWdpbmFsRGF0ZSA9IG9wdGlvbnMuX29yaWdpbmFsRGF0ZSB8fCBkYXRlO1xuICAgIHZhciB0aW1lem9uZU9mZnNldCA9IG9yaWdpbmFsRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgJ08nOlxuICAgICAgY2FzZSAnT08nOlxuICAgICAgY2FzZSAnT09PJzpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICAgIC8vIExvbmdcblxuICAgICAgY2FzZSAnT09PTyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ0dNVCcgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICB9XG4gIH0sXG4gIC8vIFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXRpb24pXG4gIHo6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIG9yaWdpbmFsRGF0ZSA9IG9wdGlvbnMuX29yaWdpbmFsRGF0ZSB8fCBkYXRlO1xuICAgIHZhciB0aW1lem9uZU9mZnNldCA9IG9yaWdpbmFsRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgJ3onOlxuICAgICAgY2FzZSAnenonOlxuICAgICAgY2FzZSAnenp6JzpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICAgIC8vIExvbmdcblxuICAgICAgY2FzZSAnenp6eic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ0dNVCcgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICB9XG4gIH0sXG4gIC8vIFNlY29uZHMgdGltZXN0YW1wXG4gIHQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIG9yaWdpbmFsRGF0ZSA9IG9wdGlvbnMuX29yaWdpbmFsRGF0ZSB8fCBkYXRlO1xuICAgIHZhciB0aW1lc3RhbXAgPSBNYXRoLmZsb29yKG9yaWdpbmFsRGF0ZS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gTWlsbGlzZWNvbmRzIHRpbWVzdGFtcFxuICBUOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBvcmlnaW5hbERhdGUgPSBvcHRpb25zLl9vcmlnaW5hbERhdGUgfHwgZGF0ZTtcbiAgICB2YXIgdGltZXN0YW1wID0gb3JpZ2luYWxEYXRlLmdldFRpbWUoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZm9ybWF0VGltZXpvbmVTaG9ydChvZmZzZXQsIGRpcnR5RGVsaW1pdGVyKSB7XG4gIHZhciBzaWduID0gb2Zmc2V0ID4gMCA/ICctJyA6ICcrJztcbiAgdmFyIGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7XG4gIHZhciBob3VycyA9IE1hdGguZmxvb3IoYWJzT2Zmc2V0IC8gNjApO1xuICB2YXIgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuXG4gIGlmIChtaW51dGVzID09PSAwKSB7XG4gICAgcmV0dXJuIHNpZ24gKyBTdHJpbmcoaG91cnMpO1xuICB9XG5cbiAgdmFyIGRlbGltaXRlciA9IGRpcnR5RGVsaW1pdGVyIHx8ICcnO1xuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRpcnR5RGVsaW1pdGVyKSB7XG4gIGlmIChvZmZzZXQgJSA2MCA9PT0gMCkge1xuICAgIHZhciBzaWduID0gb2Zmc2V0ID4gMCA/ICctJyA6ICcrJztcbiAgICByZXR1cm4gc2lnbiArIGFkZExlYWRpbmdaZXJvcyhNYXRoLmFicyhvZmZzZXQpIC8gNjAsIDIpO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGlydHlEZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRpcnR5RGVsaW1pdGVyKSB7XG4gIHZhciBkZWxpbWl0ZXIgPSBkaXJ0eURlbGltaXRlciB8fCAnJztcbiAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnO1xuICB2YXIgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgdmFyIGhvdXJzID0gYWRkTGVhZGluZ1plcm9zKE1hdGguZmxvb3IoYWJzT2Zmc2V0IC8gNjApLCAyKTtcbiAgdmFyIG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0dGVyczsiLCJmdW5jdGlvbiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKSB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgJ1AnOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7XG4gICAgICAgIHdpZHRoOiAnc2hvcnQnXG4gICAgICB9KTtcblxuICAgIGNhc2UgJ1BQJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoe1xuICAgICAgICB3aWR0aDogJ21lZGl1bSdcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnUFBQJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoe1xuICAgICAgICB3aWR0aDogJ2xvbmcnXG4gICAgICB9KTtcblxuICAgIGNhc2UgJ1BQUFAnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHtcbiAgICAgICAgd2lkdGg6ICdmdWxsJ1xuICAgICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGltZUxvbmdGb3JtYXR0ZXIocGF0dGVybiwgZm9ybWF0TG9uZykge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlICdwJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoe1xuICAgICAgICB3aWR0aDogJ3Nob3J0J1xuICAgICAgfSk7XG5cbiAgICBjYXNlICdwcCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHtcbiAgICAgICAgd2lkdGg6ICdtZWRpdW0nXG4gICAgICB9KTtcblxuICAgIGNhc2UgJ3BwcCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHtcbiAgICAgICAgd2lkdGg6ICdsb25nJ1xuICAgICAgfSk7XG5cbiAgICBjYXNlICdwcHBwJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7XG4gICAgICAgIHdpZHRoOiAnZnVsbCdcbiAgICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRhdGVUaW1lTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKSB7XG4gIHZhciBtYXRjaFJlc3VsdCA9IHBhdHRlcm4ubWF0Y2goLyhQKykocCspPy8pIHx8IFtdO1xuICB2YXIgZGF0ZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsxXTtcbiAgdmFyIHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07XG5cbiAgaWYgKCF0aW1lUGF0dGVybikge1xuICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKTtcbiAgfVxuXG4gIHZhciBkYXRlVGltZUZvcm1hdDtcblxuICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7XG4gICAgY2FzZSAnUCc6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoe1xuICAgICAgICB3aWR0aDogJ3Nob3J0J1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ1BQJzpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7XG4gICAgICAgIHdpZHRoOiAnbWVkaXVtJ1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ1BQUCc6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoe1xuICAgICAgICB3aWR0aDogJ2xvbmcnXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnUFBQUCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7XG4gICAgICAgIHdpZHRoOiAnZnVsbCdcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXQucmVwbGFjZSgne3tkYXRlfX0nLCBkYXRlTG9uZ0Zvcm1hdHRlcihkYXRlUGF0dGVybiwgZm9ybWF0TG9uZykpLnJlcGxhY2UoJ3t7dGltZX19JywgdGltZUxvbmdGb3JtYXR0ZXIodGltZVBhdHRlcm4sIGZvcm1hdExvbmcpKTtcbn1cblxudmFyIGxvbmdGb3JtYXR0ZXJzID0ge1xuICBwOiB0aW1lTG9uZ0Zvcm1hdHRlcixcbiAgUDogZGF0ZVRpbWVMb25nRm9ybWF0dGVyXG59O1xuZXhwb3J0IGRlZmF1bHQgbG9uZ0Zvcm1hdHRlcnM7IiwidmFyIHByb3RlY3RlZERheU9mWWVhclRva2VucyA9IFsnRCcsICdERCddO1xudmFyIHByb3RlY3RlZFdlZWtZZWFyVG9rZW5zID0gWydZWScsICdZWVlZJ107XG5leHBvcnQgZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gcHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW5zLmluZGV4T2YodG9rZW4pICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIHByb3RlY3RlZFdlZWtZZWFyVG9rZW5zLmluZGV4T2YodG9rZW4pICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGlmICh0b2tlbiA9PT0gJ1lZWVknKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVc2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyB5ZWFycyB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clwiKSk7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09ICdZWScpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVzZSBgeXlgIGluc3RlYWQgb2YgYFlZYCAoaW4gYFwiLmNvbmNhdChmb3JtYXQsIFwiYCkgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdG8gdGhlIGlucHV0IGBcIikuY29uY2F0KGlucHV0LCBcImA7IHNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcIikpO1xuICB9IGVsc2UgaWYgKHRva2VuID09PSAnRCcpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVzZSBgZGAgaW5zdGVhZCBvZiBgRGAgKGluIGBcIi5jb25jYXQoZm9ybWF0LCBcImApIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHRvIHRoZSBpbnB1dCBgXCIpLmNvbmNhdChpbnB1dCwgXCJgOyBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXCIpKTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ0REJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clwiKSk7XG4gIH1cbn0iLCJpbXBvcnQgaXNWYWxpZCBmcm9tIFwiLi4vaXNWYWxpZC9pbmRleC5qc1wiO1xuaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSBcIi4uL2xvY2FsZS9lbi1VUy9pbmRleC5qc1wiO1xuaW1wb3J0IHN1Yk1pbGxpc2Vjb25kcyBmcm9tIFwiLi4vc3ViTWlsbGlzZWNvbmRzL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCBmb3JtYXR0ZXJzIGZyb20gXCIuLi9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzL2luZGV4LmpzXCI7XG5pbXBvcnQgbG9uZ0Zvcm1hdHRlcnMgZnJvbSBcIi4uL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyBmcm9tIFwiLi4vX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuLCBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4sIHRocm93UHJvdGVjdGVkRXJyb3IgfSBmcm9tIFwiLi4vX2xpYi9wcm90ZWN0ZWRUb2tlbnMvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiOyAvLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcblxudmFyIGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPSAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7IC8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcblxudmFyIGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG52YXIgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvO1xudmFyIGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG52YXIgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vO1xuLyoqXG4gKiBAbmFtZSBmb3JtYXRcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgRm9ybWF0IHRoZSBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcgaW4gdGhlIGdpdmVuIGZvcm1hdC4gVGhlIHJlc3VsdCBtYXkgdmFyeSBieSBsb2NhbGUuXG4gKlxuICogPiDimqDvuI8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgYGZvcm1hdGAgdG9rZW5zIGRpZmZlciBmcm9tIE1vbWVudC5qcyBhbmQgb3RoZXIgbGlicmFyaWVzLlxuICogPiBTZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKiAoc2VlIHRoZSBsYXN0IGV4YW1wbGUpXG4gKlxuICogRm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDcgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBBY2NlcHRlZCBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDB0aCwgMTd0aCAgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgMjAxN3RoICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgUiAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSICAgICAgfCAtNDMsIDAwLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAwLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAwLCAwMDAxLCAxOTAwLCAyMDE3ICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUsNyB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCB1ICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA3ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEuLmFhICAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWEgICAgIHwgYW0sIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCBiLi5iYiAgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiICAgICB8IGFtLCBwbSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICAgfCBPLi4uT09PIHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pICB8IHouLi56enogfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCA2ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiw2ICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8IFAgICAgICAgfCAwNC8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUCAgICAgIHwgQXByIDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQICAgICB8IEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFAgICAgfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcCAgICAgfCAxMjowMDowMCBBTSBHTVQrMiAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHBwICAgIHwgMTI6MDA6MDAgQU0gR01UKzAyOjAwICAgICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgUHAgICAgICB8IDA0LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQcHAgICAgfCBBcHIgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBwcHAgIHwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUHBwcHB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICB8IDIsNyAgIHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXI6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZSAoZS5nLiBgRUVFRUVFRUVFRUVgKVxuICogICAgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIGRlZmF1bHQgcGF0dGVybiBmb3IgdGhpcyB1bml0LCB1c3VhbGx5XG4gKiAgICB0aGUgbG9uZ2VzdCBvbmUgKGluIGNhc2Ugb2YgSVNPIHdlZWtkYXlzLCBgRUVFRWApLiBEZWZhdWx0IHBhdHRlcm5zIGZvciB1bml0c1xuICogICAgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU0nKSAvLz0+ICdOb3YnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NJykgLy89PiAnTidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqIDMuIFNvbWUgcGF0dGVybnMgY291bGQgYmUgdW5saW1pdGVkIGxlbmd0aCAoc3VjaCBhcyBgeXl5eXl5eXlgKS5cbiAqICAgIFRoZSBvdXRwdXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAneXl5eXl5eXknKSAvLz0+ICcwMDAwMjAxNydgXG4gKlxuICogNC4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAqICAgIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZDpcbiAqXG4gKiAgICB8IFllYXIgfCBgeXlgIHwgYHV1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gKiAgICB8IDEgICAgfCAgIDAxIHwgICAwMSB8XG4gKiAgICB8IDE0ICAgfCAgIDE0IHwgICAxNCB8XG4gKiAgICB8IDM3NiAgfCAgIDc2IHwgIDM3NiB8XG4gKiAgICB8IDE0NTMgfCAgIDUzIHwgMTQ1MyB8XG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbZ2V0SVNPV2Vla1llYXJde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0SVNPV2Vla1llYXJ9XG4gKiAgICBhbmQgW2dldFdlZWtZZWFyXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldFdlZWtZZWFyfSkuXG4gKlxuICogNi4gU3BlY2lmaWMgbm9uLWxvY2F0aW9uIHRpbWV6b25lcyBhcmUgY3VycmVudGx5IHVuYXZhaWxhYmxlIGluIGBkYXRlLWZuc2AsXG4gKiAgICBzbyByaWdodCBub3cgdGhlc2UgdG9rZW5zIGZhbGwgYmFjayB0byBHTVQgdGltZXpvbmVzLlxuICpcbiAqIDcuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYHRgOiBzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgVGA6IG1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogOC4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKlxuICogOS4gYERgIGFuZCBgRERgIHRva2VucyByZXByZXNlbnQgZGF5cyBvZiB0aGUgeWVhciBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCBkYXlzIG9mIHRoZSBtb250aC5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiAtIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbm93IHJlcXVpcmVkIGZvciB0aGUgc2FrZSBvZiBleHBsaWNpdG5lc3MuXG4gKlxuICogICBgYGBqYXZhc2NyaXB0XG4gKiAgIC8vIEJlZm9yZSB2Mi4wLjBcbiAqICAgZm9ybWF0KG5ldyBEYXRlKDIwMTYsIDAsIDEpKVxuICpcbiAqICAgLy8gdjIuMC4wIG9ud2FyZFxuICogICBmb3JtYXQobmV3IERhdGUoMjAxNiwgMCwgMSksIFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU3h4eFwiKVxuICogICBgYGBcbiAqXG4gKiAtIE5ldyBmb3JtYXQgc3RyaW5nIEFQSSBmb3IgYGZvcm1hdGAgZnVuY3Rpb25cbiAqICAgd2hpY2ggaXMgYmFzZWQgb24gW1VuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNV0oaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZSkuXG4gKiAgIFNlZSBbdGhpcyBwb3N0XShodHRwczovL2Jsb2cuZGF0ZS1mbnMub3JnL3Bvc3QvdW5pY29kZS10b2tlbnMtaW4tZGF0ZS1mbnMtdjItc3JlYXR5a2k5MWpnKSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIC0gQ2hhcmFjdGVycyBhcmUgbm93IGVzY2FwZWQgdXNpbmcgc2luZ2xlIHF1b3RlIHN5bWJvbHMgKGAnYCkgaW5zdGVhZCBvZiBzcXVhcmUgYnJhY2tldHMuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IC0gdGhlIHN0cmluZyBvZiB0b2tlbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICogQHBhcmFtIHtMb2NhbGV9IFtvcHRpb25zLmxvY2FsZT1kZWZhdWx0TG9jYWxlXSAtIHRoZSBsb2NhbGUgb2JqZWN0LiBTZWUgW0xvY2FsZV17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9Mb2NhbGV9XG4gKiBAcGFyYW0gezB8MXwyfDN8NHw1fDZ9IFtvcHRpb25zLndlZWtTdGFydHNPbj0wXSAtIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwIC0gU3VuZGF5KVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZT0xXSAtIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zPWZhbHNlXSAtIGlmIHRydWUsIGFsbG93cyB1c2FnZSBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhciB0b2tlbnMgYFlZYCBhbmQgYFlZWVlgO1xuICogICBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM9ZmFsc2VdIC0gaWYgdHJ1ZSwgYWxsb3dzIHVzYWdlIG9mIHRoZSBkYXkgb2YgeWVhciB0b2tlbnMgYERgIGFuZCBgRERgO1xuICogICBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgZGF0ZWAgbXVzdCBub3QgYmUgSW52YWxpZCBEYXRlXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgZm9ybWF0TG9uZ2AgcHJvcGVydHlcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDdcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IHVzZSBgeXl5eWAgaW5zdGVhZCBvZiBgWVlZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IHVzZSBgeXlgIGluc3RlYWQgb2YgYFlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVwcmVzZW50IDExIEZlYnJ1YXJ5IDIwMTQgaW4gbWlkZGxlLWVuZGlhbiBmb3JtYXQ6XG4gKiB2YXIgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDEsIDExKSwgJ01NL2RkL3l5eXknKVxuICogLy89PiAnMDIvMTEvMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVwcmVzZW50IDIgSnVseSAyMDE0IGluIEVzcGVyYW50bzpcbiAqIGltcG9ydCB7IGVvTG9jYWxlIH0gZnJvbSAnZGF0ZS1mbnMvbG9jYWxlL2VvJ1xuICogdmFyIHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIHZhciByZXN1bHQgPSBmb3JtYXQobmV3IERhdGUoMjAxNCwgNiwgMiwgMTUpLCBcImggJ28nJ2Nsb2NrJ1wiKVxuICogLy89PiBcIjMgbydjbG9ja1wiXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0KGRpcnR5RGF0ZSwgZGlydHlGb3JtYXRTdHIsIGRpcnR5T3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGZvcm1hdFN0ciA9IFN0cmluZyhkaXJ0eUZvcm1hdFN0cik7XG4gIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgZGVmYXVsdExvY2FsZTtcbiAgdmFyIGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZS5vcHRpb25zICYmIGxvY2FsZS5vcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZTtcbiAgdmFyIGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IDEgOiB0b0ludGVnZXIobG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID09IG51bGwgPyBkZWZhdWx0Rmlyc3RXZWVrQ29udGFpbnNEYXRlIDogdG9JbnRlZ2VyKG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTsgLy8gVGVzdCBpZiB3ZWVrU3RhcnRzT24gaXMgYmV0d2VlbiAxIGFuZCA3IF9hbmRfIGlzIG5vdCBOYU5cblxuICBpZiAoIShmaXJzdFdlZWtDb250YWluc0RhdGUgPj0gMSAmJiBmaXJzdFdlZWtDb250YWluc0RhdGUgPD0gNykpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZmlyc3RXZWVrQ29udGFpbnNEYXRlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA3IGluY2x1c2l2ZWx5Jyk7XG4gIH1cblxuICB2YXIgbG9jYWxlV2Vla1N0YXJ0c09uID0gbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMud2Vla1N0YXJ0c09uO1xuICB2YXIgZGVmYXVsdFdlZWtTdGFydHNPbiA9IGxvY2FsZVdlZWtTdGFydHNPbiA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihsb2NhbGVXZWVrU3RhcnRzT24pO1xuICB2YXIgd2Vla1N0YXJ0c09uID0gb3B0aW9ucy53ZWVrU3RhcnRzT24gPT0gbnVsbCA/IGRlZmF1bHRXZWVrU3RhcnRzT24gOiB0b0ludGVnZXIob3B0aW9ucy53ZWVrU3RhcnRzT24pOyAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDAgYW5kIDYgX2FuZF8gaXMgbm90IE5hTlxuXG4gIGlmICghKHdlZWtTdGFydHNPbiA+PSAwICYmIHdlZWtTdGFydHNPbiA8PSA2KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd3ZWVrU3RhcnRzT24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYgaW5jbHVzaXZlbHknKTtcbiAgfVxuXG4gIGlmICghbG9jYWxlLmxvY2FsaXplKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2xvY2FsZSBtdXN0IGNvbnRhaW4gbG9jYWxpemUgcHJvcGVydHknKTtcbiAgfVxuXG4gIGlmICghbG9jYWxlLmZvcm1hdExvbmcpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbG9jYWxlIG11c3QgY29udGFpbiBmb3JtYXRMb25nIHByb3BlcnR5Jyk7XG4gIH1cblxuICB2YXIgb3JpZ2luYWxEYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG5cbiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gIH0gLy8gQ29udmVydCB0aGUgZGF0ZSBpbiBzeXN0ZW0gdGltZXpvbmUgdG8gdGhlIHNhbWUgZGF0ZSBpbiBVVEMrMDA6MDAgdGltZXpvbmUuXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gVVRDIGZ1bmN0aW9ucyB3aWxsIGJlIGltcGxlbWVudGVkLCBsb2NhbGVzIHdpbGwgYmUgY29tcGF0aWJsZSB3aXRoIHRoZW0uXG4gIC8vIFNlZSBhbiBpc3N1ZSBhYm91dCBVVEMgZnVuY3Rpb25zOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuXG5cbiAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhvcmlnaW5hbERhdGUpO1xuICB2YXIgdXRjRGF0ZSA9IHN1Yk1pbGxpc2Vjb25kcyhvcmlnaW5hbERhdGUsIHRpbWV6b25lT2Zmc2V0KTtcbiAgdmFyIGZvcm1hdHRlck9wdGlvbnMgPSB7XG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uOiB3ZWVrU3RhcnRzT24sXG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgX29yaWdpbmFsRGF0ZTogb3JpZ2luYWxEYXRlXG4gIH07XG4gIHZhciByZXN1bHQgPSBmb3JtYXRTdHIubWF0Y2gobG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHApLm1hcChmdW5jdGlvbiAoc3Vic3RyaW5nKSB7XG4gICAgdmFyIGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuXG4gICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAncCcgfHwgZmlyc3RDaGFyYWN0ZXIgPT09ICdQJykge1xuICAgICAgdmFyIGxvbmdGb3JtYXR0ZXIgPSBsb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nLCBmb3JtYXR0ZXJPcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3Vic3RyaW5nO1xuICB9KS5qb2luKCcnKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwKS5tYXAoZnVuY3Rpb24gKHN1YnN0cmluZykge1xuICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICBpZiAoc3Vic3RyaW5nID09PSBcIicnXCIpIHtcbiAgICAgIHJldHVybiBcIidcIjtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG5cbiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICByZXR1cm4gY2xlYW5Fc2NhcGVkU3RyaW5nKHN1YnN0cmluZyk7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRlciA9IGZvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdO1xuXG4gICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgaWYgKCFvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4oc3Vic3RyaW5nKSkge1xuICAgICAgICB0aHJvd1Byb3RlY3RlZEVycm9yKHN1YnN0cmluZywgZGlydHlGb3JtYXRTdHIsIGRpcnR5RGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zICYmIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4oc3Vic3RyaW5nKSkge1xuICAgICAgICB0aHJvd1Byb3RlY3RlZEVycm9yKHN1YnN0cmluZywgZGlydHlGb3JtYXRTdHIsIGRpcnR5RGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb3JtYXR0ZXIodXRjRGF0ZSwgc3Vic3RyaW5nLCBsb2NhbGUubG9jYWxpemUsIGZvcm1hdHRlck9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYCcgKyBmaXJzdENoYXJhY3RlciArICdgJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnN0cmluZztcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkge1xuICByZXR1cm4gaW5wdXQubWF0Y2goZXNjYXBlZFN0cmluZ1JlZ0V4cClbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgXCInXCIpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgZ2V0RGF5c0luTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGdpdmVuIGRhdGVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZGF5cyBhcmUgaW4gRmVicnVhcnkgMjAwMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERheXNJbk1vbnRoKG5ldyBEYXRlKDIwMDAsIDEpKVxuICogLy89PiAyOVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERheXNJbk1vbnRoKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIHZhciBtb250aEluZGV4ID0gZGF0ZS5nZXRNb250aCgpO1xuICB2YXIgbGFzdERheU9mTW9udGggPSBuZXcgRGF0ZSgwKTtcbiAgbGFzdERheU9mTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGhJbmRleCArIDEsIDApO1xuICBsYXN0RGF5T2ZNb250aC5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGxhc3REYXlPZk1vbnRoLmdldERhdGUoKTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGdldFRpbWVcbiAqIEBjYXRlZ29yeSBUaW1lc3RhbXAgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBtaWxsaXNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBtaWxsaXNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBnaXZlbiBkYXRlXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgdGltZXN0YW1wXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2V0IHRoZSB0aW1lc3RhbXAgb2YgMjkgRmVicnVhcnkgMjAxMiAxMTo0NTowNS4xMjM6XG4gKiBjb25zdCByZXN1bHQgPSBnZXRUaW1lKG5ldyBEYXRlKDIwMTIsIDEsIDI5LCAxMSwgNDUsIDUsIDEyMykpXG4gKiAvLz0+IDEzMzA1MTU5MDUxMjNcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRUaW1lKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICByZXR1cm4gdGltZXN0YW1wO1xufSIsImltcG9ydCBnZXRUaW1lIGZyb20gXCIuLi9nZXRUaW1lL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBnZXRVbml4VGltZVxuICogQGNhdGVnb3J5IFRpbWVzdGFtcCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBzZWNvbmRzIHRpbWVzdGFtcCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZ2l2ZW4gZGF0ZVxuICogQHJldHVybnMge051bWJlcn0gdGhlIHRpbWVzdGFtcFxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdldCB0aGUgdGltZXN0YW1wIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDUgQ0VUOlxuICogY29uc3QgcmVzdWx0ID0gZ2V0VW5peFRpbWUobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSwgNSkpXG4gKiAvLz0+IDEzMzA1MTIzMDVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVbml4VGltZShkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHJldHVybiBNYXRoLmZsb29yKGdldFRpbWUoZGlydHlEYXRlKSAvIDEwMDApO1xufSIsImltcG9ydCBzdGFydE9mV2VlayBmcm9tIFwiLi4vc3RhcnRPZldlZWsvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5cbi8qKlxuICogQG5hbWUgZ2V0V2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNXZWVrX251bWJlcmluZ1xuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEBwYXJhbSB7MXwyfDN8NHw1fDZ8N30gW29wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlPTFdIC0gdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3M/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpKVxuICogLy89PiAyMDA1XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB3ZWVrIHN0YXJ0cyBvbiBTYXR1cmRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgd2Vla1N0YXJ0c09uOiA2IH0pXG4gKiAvLz0+IDIwMDRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHRoZSBmaXJzdCB3ZWVrIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH0pXG4gKiAvLz0+IDIwMDRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2Vla1llYXIoZGlydHlEYXRlLCBvcHRpb25zKSB7XG4gIHZhciBfb3B0aW9ucyRsb2NhbGUsIF9vcHRpb25zJGxvY2FsZSRvcHRpbztcblxuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIHZhciBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUgPSBvcHRpb25zLmxvY2FsZSkgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX29wdGlvbnMkbG9jYWxlJG9wdGlvID0gX29wdGlvbnMkbG9jYWxlLm9wdGlvbnMpID09PSBudWxsIHx8IF9vcHRpb25zJGxvY2FsZSRvcHRpbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbG9jYWxlJG9wdGlvLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZTtcbiAgdmFyIGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IDEgOiB0b0ludGVnZXIobG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSA9PSBudWxsID8gZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA6IHRvSW50ZWdlcihvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7IC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMSBhbmQgNyBfYW5kXyBpcyBub3QgTmFOXG5cbiAgaWYgKCEoZmlyc3RXZWVrQ29udGFpbnNEYXRlID49IDEgJiYgZmlyc3RXZWVrQ29udGFpbnNEYXRlIDw9IDcpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2ZpcnN0V2Vla0NvbnRhaW5zRGF0ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNyBpbmNsdXNpdmVseScpO1xuICB9XG5cbiAgdmFyIGZpcnN0V2Vla09mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIG9wdGlvbnMpO1xuICB2YXIgZmlyc3RXZWVrT2ZUaGlzWWVhciA9IG5ldyBEYXRlKDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZlRoaXNZZWFyLCBvcHRpb25zKTtcblxuICBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChkYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59IiwiaW1wb3J0IGdldFdlZWtZZWFyIGZyb20gXCIuLi9nZXRXZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZXZWVrIGZyb20gXCIuLi9zdGFydE9mV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNXZWVrX251bWJlcmluZ1xuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEBwYXJhbSB7MXwyfDN8NHw1fDZ8N30gW29wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlPTFdIC0gdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXJcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDUgd2l0aCBkZWZhdWx0IHNldHRpbmdzOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBTdW4gRGVjIDI2IDIwMDQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDVcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHdlZWtcbiAqIC8vIGFuZCA0IEphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZldlZWtZZWFyKGRpcnR5RGF0ZSwgZGlydHlPcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgb3B0aW9ucyA9IGRpcnR5T3B0aW9ucyB8fCB7fTtcbiAgdmFyIGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlO1xuICB2YXIgbG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlID0gbG9jYWxlICYmIGxvY2FsZS5vcHRpb25zICYmIGxvY2FsZS5vcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZTtcbiAgdmFyIGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IDEgOiB0b0ludGVnZXIobG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID09IG51bGwgPyBkZWZhdWx0Rmlyc3RXZWVrQ29udGFpbnNEYXRlIDogdG9JbnRlZ2VyKG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgdmFyIHllYXIgPSBnZXRXZWVrWWVhcihkaXJ0eURhdGUsIGRpcnR5T3B0aW9ucyk7XG4gIHZhciBmaXJzdFdlZWsgPSBuZXcgRGF0ZSgwKTtcbiAgZmlyc3RXZWVrLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIGRhdGUgPSBzdGFydE9mV2VlayhmaXJzdFdlZWssIGRpcnR5T3B0aW9ucyk7XG4gIHJldHVybiBkYXRlO1xufSIsImltcG9ydCBzdGFydE9mV2VlayBmcm9tIFwiLi4vc3RhcnRPZldlZWsvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mV2Vla1llYXIgZnJvbSBcIi4uL3N0YXJ0T2ZXZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xudmFyIE1JTExJU0VDT05EU19JTl9XRUVLID0gNjA0ODAwMDAwO1xuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjV2Vla19udW1iZXJpbmdcbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiBAcGFyYW0ge0xvY2FsZX0gW29wdGlvbnMubG9jYWxlPWRlZmF1bHRMb2NhbGVdIC0gdGhlIGxvY2FsZSBvYmplY3QuIFNlZSBbTG9jYWxlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL0xvY2FsZX1cbiAqIEBwYXJhbSB7MHwxfDJ8M3w0fDV8Nn0gW29wdGlvbnMud2Vla1N0YXJ0c09uPTBdIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDAgLSBTdW5kYXkpXG4gKiBAcGFyYW0gezF8MnwzfDR8NXw2fDd9IFtvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZT0xXSAtIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgd2Vla1xuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy53ZWVrU3RhcnRzT25gIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2XG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA3XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgb2YgdGhlIGxvY2FsIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDUgd2l0aCBkZWZhdWx0IG9wdGlvbnM/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiAyXG4gKlxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdlZWsoZGlydHlEYXRlLCBvcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGlmZiA9IHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpLmdldFRpbWUoKSAtIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKS5nZXRUaW1lKCk7IC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyXG4gIC8vIGJlY2F1c2UgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudFxuICAvLyAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZiB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpXG5cbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIE1JTExJU0VDT05EU19JTl9XRUVLKSArIDE7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBsYXN0RGF5T2ZNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgbGFzdCBkYXkgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGxhc3QgZGF5IG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgb3JpZ2luYWwgZGF0ZVxuICogQHJldHVybnMge0RhdGV9IHRoZSBsYXN0IGRheSBvZiBhIG1vbnRoXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGxhc3QgZGF5IG9mIGEgbW9udGggZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiB2YXIgcmVzdWx0ID0gbGFzdERheU9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAzMCAyMDE0IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFzdERheU9mTW9udGgoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyBmcm9tIFwiLi4vZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcy9pbmRleC5qc1wiO1xuaW1wb3J0IGxhc3REYXlPZk1vbnRoIGZyb20gXCIuLi9sYXN0RGF5T2ZNb250aC9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZNb250aCBmcm9tIFwiLi4vc3RhcnRPZk1vbnRoL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtzSW5Nb250aFxuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgd2Vla3MgYSBtb250aCBzcGFucy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHdlZWtzIHRoZSBtb250aCBpbiB0aGUgZ2l2ZW4gZGF0ZSBzcGFucy5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiBAcGFyYW0ge0xvY2FsZX0gW29wdGlvbnMubG9jYWxlPWRlZmF1bHRMb2NhbGVdIC0gdGhlIGxvY2FsZSBvYmplY3QuIFNlZSBbTG9jYWxlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL0xvY2FsZX1cbiAqIEBwYXJhbSB7MHwxfDJ8M3w0fDV8Nn0gW29wdGlvbnMud2Vla1N0YXJ0c09uPTBdIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDAgLSBTdW5kYXkpXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHdlZWtzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy53ZWVrU3RhcnRzT25gIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIHdlZWtzIGRvZXMgRmVicnVhcnkgMjAxNSBzcGFuP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla3NJbk1vbnRoKG5ldyBEYXRlKDIwMTUsIDEsIDgpKVxuICogLy89PiA0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksXG4gKiAvLyBob3cgbWFueSBjYWxlbmRhciB3ZWVrcyBkb2VzIEp1bHkgMjAxNyBzcGFuP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla3NJbk1vbnRoKG5ldyBEYXRlKDIwMTcsIDYsIDUpLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiA2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdlZWtzSW5Nb250aChkYXRlLCBvcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICByZXR1cm4gZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyhsYXN0RGF5T2ZNb250aChkYXRlKSwgc3RhcnRPZk1vbnRoKGRhdGUpLCBvcHRpb25zKSArIDE7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc0FmdGVyXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGFmdGVyIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSXMgdGhlIGZpcnN0IGRhdGUgYWZ0ZXIgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYWZ0ZXIgdGhlIG90aGVyIG9uZSB0byByZXR1cm4gdHJ1ZVxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZVRvQ29tcGFyZSAtIHRoZSBkYXRlIHRvIGNvbXBhcmUgd2l0aFxuICogQHJldHVybnMge0Jvb2xlYW59IHRoZSBmaXJzdCBkYXRlIGlzIGFmdGVyIHRoZSBzZWNvbmQgZGF0ZVxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJcyAxMCBKdWx5IDE5ODkgYWZ0ZXIgMTEgRmVicnVhcnkgMTk4Nz9cbiAqIHZhciByZXN1bHQgPSBpc0FmdGVyKG5ldyBEYXRlKDE5ODksIDYsIDEwKSwgbmV3IERhdGUoMTk4NywgMSwgMTEpKVxuICogLy89PiB0cnVlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBZnRlcihkaXJ0eURhdGUsIGRpcnR5RGF0ZVRvQ29tcGFyZSkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRhdGVUb0NvbXBhcmUgPSB0b0RhdGUoZGlydHlEYXRlVG9Db21wYXJlKTtcbiAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpID4gZGF0ZVRvQ29tcGFyZS5nZXRUaW1lKCk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc0JlZm9yZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZmlyc3QgZGF0ZSBiZWZvcmUgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZmlyc3QgZGF0ZSBiZWZvcmUgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYmVmb3JlIHRoZSBvdGhlciBvbmUgdG8gcmV0dXJuIHRydWVcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVUb0NvbXBhcmUgLSB0aGUgZGF0ZSB0byBjb21wYXJlIHdpdGhcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZmlyc3QgZGF0ZSBpcyBiZWZvcmUgdGhlIHNlY29uZCBkYXRlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElzIDEwIEp1bHkgMTk4OSBiZWZvcmUgMTEgRmVicnVhcnkgMTk4Nz9cbiAqIHZhciByZXN1bHQgPSBpc0JlZm9yZShuZXcgRGF0ZSgxOTg5LCA2LCAxMCksIG5ldyBEYXRlKDE5ODcsIDEsIDExKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0JlZm9yZShkaXJ0eURhdGUsIGRpcnR5RGF0ZVRvQ29tcGFyZSkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRhdGVUb0NvbXBhcmUgPSB0b0RhdGUoZGlydHlEYXRlVG9Db21wYXJlKTtcbiAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpIDwgZGF0ZVRvQ29tcGFyZS5nZXRUaW1lKCk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc1NhbWVNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgbW9udGggKGFuZCB5ZWFyKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgbW9udGggKGFuZCB5ZWFyKT9cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVMZWZ0IC0gdGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVSaWdodCAtIHRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuICogQHJldHVybnMge0Jvb2xlYW59IHRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgbW9udGggKGFuZCB5ZWFyKVxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBTZXB0ZW1iZXIgMjAxNCBhbmQgMjUgU2VwdGVtYmVyIDIwMTQgaW4gdGhlIHNhbWUgbW9udGg/XG4gKiB2YXIgcmVzdWx0ID0gaXNTYW1lTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTQsIDgsIDI1KSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBTZXB0ZW1iZXIgMjAxNCBhbmQgMjUgU2VwdGVtYmVyIDIwMTUgaW4gdGhlIHNhbWUgbW9udGg/XG4gKiB2YXIgcmVzdWx0ID0gaXNTYW1lTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTUsIDgsIDI1KSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1NhbWVNb250aChkaXJ0eURhdGVMZWZ0LCBkaXJ0eURhdGVSaWdodCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGVMZWZ0ID0gdG9EYXRlKGRpcnR5RGF0ZUxlZnQpO1xuICB2YXIgZGF0ZVJpZ2h0ID0gdG9EYXRlKGRpcnR5RGF0ZVJpZ2h0KTtcbiAgcmV0dXJuIGRhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgPT09IGRhdGVSaWdodC5nZXRGdWxsWWVhcigpICYmIGRhdGVMZWZ0LmdldE1vbnRoKCkgPT09IGRhdGVSaWdodC5nZXRNb250aCgpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgaXNTYW1lWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSB5ZWFyP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSB5ZWFyP1xuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZUxlZnQgLSB0aGUgZmlyc3QgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZVJpZ2h0IC0gdGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSB5ZWFyXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIFNlcHRlbWJlciAyMDE0IGFuZCAyNSBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSB5ZWFyP1xuICogdmFyIHJlc3VsdCA9IGlzU2FtZVllYXIobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTQsIDgsIDI1KSlcbiAqIC8vPT4gdHJ1ZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2FtZVllYXIoZGlydHlEYXRlTGVmdCwgZGlydHlEYXRlUmlnaHQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlTGVmdCA9IHRvRGF0ZShkaXJ0eURhdGVMZWZ0KTtcbiAgdmFyIGRhdGVSaWdodCA9IHRvRGF0ZShkaXJ0eURhdGVSaWdodCk7XG4gIHJldHVybiBkYXRlTGVmdC5nZXRGdWxsWWVhcigpID09PSBkYXRlUmlnaHQuZ2V0RnVsbFllYXIoKTtcbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0RGF5c0luTW9udGggZnJvbSBcIi4uL2dldERheXNJbk1vbnRoL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzZXRNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgbW9udGggdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIG1vbnRoIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBtb250aCAtIHRoZSBtb250aCBvZiB0aGUgbmV3IGRhdGVcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbW9udGggc2V0XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCBGZWJydWFyeSB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0TW9udGgobmV3IERhdGUoMjAxNCwgOCwgMSksIDEpXG4gKiAvLz0+IFNhdCBGZWIgMDEgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldE1vbnRoKGRpcnR5RGF0ZSwgZGlydHlNb250aCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIG1vbnRoID0gdG9JbnRlZ2VyKGRpcnR5TW9udGgpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICB2YXIgZGF0ZVdpdGhEZXNpcmVkTW9udGggPSBuZXcgRGF0ZSgwKTtcbiAgZGF0ZVdpdGhEZXNpcmVkTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIDE1KTtcbiAgZGF0ZVdpdGhEZXNpcmVkTW9udGguc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBkYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoKGRhdGVXaXRoRGVzaXJlZE1vbnRoKTsgLy8gU2V0IHRoZSBsYXN0IGRheSBvZiB0aGUgbmV3IG1vbnRoXG4gIC8vIGlmIHRoZSBvcmlnaW5hbCBkYXRlIHdhcyB0aGUgbGFzdCBkYXkgb2YgdGhlIGxvbmdlciBtb250aFxuXG4gIGRhdGUuc2V0TW9udGgobW9udGgsIE1hdGgubWluKGRheSwgZGF5c0luTW9udGgpKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgc2V0WWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSB5ZWFyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSB5ZWFyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5ZWFyIC0gdGhlIHllYXIgb2YgdGhlIG5ldyBkYXRlXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIG5ldyBkYXRlIHdpdGggdGhlIHllYXIgc2V0XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB5ZWFyIDIwMTMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFllYXIobmV3IERhdGUoMjAxNCwgOCwgMSksIDIwMTMpXG4gKiAvLz0+IFN1biBTZXAgMDEgMjAxMyAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldFllYXIoZGlydHlEYXRlLCBkaXJ0eVllYXIpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciB5ZWFyID0gdG9JbnRlZ2VyKGRpcnR5WWVhcik7IC8vIENoZWNrIGlmIGRhdGUgaXMgSW52YWxpZCBEYXRlIGJlY2F1c2UgRGF0ZS5wcm90b3R5cGUuc2V0RnVsbFllYXIgaWdub3JlcyB0aGUgdmFsdWUgb2YgSW52YWxpZCBEYXRlXG5cbiAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG5cbiAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzU2FtZVllYXIsIHNldE1vbnRoIGFzIHNldERhdGVNb250aCwgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbi8qKlxuICogUmVuZGVyIHRoZSBkcm9wZG93biB0byBuYXZpZ2F0ZSBiZXR3ZWVuIG1vbnRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1vbnRoc0Ryb3Bkb3duKHByb3BzKSB7XG4gICAgdmFyIGRpc3BsYXlNb250aCA9IHByb3BzLmRpc3BsYXlNb250aDtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgZnJvbURhdGUgPSBfYS5mcm9tRGF0ZSwgdG9EYXRlID0gX2EudG9EYXRlLCBzdHlsZXMgPSBfYS5zdHlsZXMsIGxvY2FsZSA9IF9hLmxvY2FsZSwgZm9ybWF0TW9udGhDYXB0aW9uID0gX2EuZm9ybWF0dGVycy5mb3JtYXRNb250aENhcHRpb24sIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBEcm9wZG93biA9IF9hLmNvbXBvbmVudHMuRHJvcGRvd24sIGxhYmVsTW9udGhEcm9wZG93biA9IF9hLmxhYmVscy5sYWJlbE1vbnRoRHJvcGRvd247XG4gICAgaWYgKCFmcm9tRGF0ZSAmJiAhdG9EYXRlKSB7XG4gICAgICAgIC8vIFRPRE86IHVzZSB0eXBlIGd1YXJkc1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCk7XG4gICAgfVxuICAgIHZhciBkcm9wZG93bk1vbnRocyA9IFtdO1xuICAgIGlmIChmcm9tRGF0ZSAmJiB0b0RhdGUpIHtcbiAgICAgICAgaWYgKGlzU2FtZVllYXIoZnJvbURhdGUsIHRvRGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgbW9udGhzIGluY2x1ZGVkIGluIHRoZSByYW5nZVxuICAgICAgICAgICAgZm9yICh2YXIgbW9udGggPSBmcm9tRGF0ZS5nZXRNb250aCgpOyBtb250aCA8PSB0b0RhdGUuZ2V0TW9udGgoKTsgbW9udGgrKykge1xuICAgICAgICAgICAgICAgIGRyb3Bkb3duTW9udGhzLnB1c2goc2V0RGF0ZU1vbnRoKHN0YXJ0T2ZNb250aChmcm9tRGF0ZSksIG1vbnRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBkaXNwbGF5IGFsbCB0aGUgMTIgbW9udGhzXG4gICAgICAgICAgICBmb3IgKHZhciBtb250aCA9IDA7IG1vbnRoIDw9IDExOyBtb250aCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFueURhdGUgPSBuZXcgRGF0ZSgpOyAvLyBhbnkgZGF0ZSBpcyBPSywgd2UganVzdCBuZWVkIHRoZSB5ZWFyXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Nb250aHMucHVzaChzZXREYXRlTW9udGgoc3RhcnRPZk1vbnRoKGFueURhdGUpLCBtb250aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbmV3TW9udGggPSBzZXREYXRlTW9udGgobmV3IERhdGUoZGlzcGxheU1vbnRoKSwgTnVtYmVyKGUudGFyZ2V0LnZhbHVlKSk7XG4gICAgICAgIHByb3BzLm9uQ2hhbmdlKG5ld01vbnRoKTtcbiAgICB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChEcm9wZG93biwgeyBcImFyaWEtbGFiZWxcIjogbGFiZWxNb250aERyb3Bkb3duKCksIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5kcm9wZG93bl9tb250aCwgc3R5bGU6IHN0eWxlcy5kcm9wZG93bl9tb250aCwgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZSwgdmFsdWU6IGRpc3BsYXlNb250aC5nZXRNb250aCgpLCBjYXB0aW9uOiBmb3JtYXRNb250aENhcHRpb24oZGlzcGxheU1vbnRoLCB7IGxvY2FsZTogbG9jYWxlIH0pIH0sIGRyb3Bkb3duTW9udGhzLm1hcChmdW5jdGlvbiAobSkgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIiwgeyBrZXk6IG0uZ2V0TW9udGgoKSwgdmFsdWU6IG0uZ2V0TW9udGgoKSB9LCBmb3JtYXRNb250aENhcHRpb24obSwgeyBsb2NhbGU6IGxvY2FsZSB9KSkpOyB9KSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW9udGhzRHJvcGRvd24uanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqXG4gKiBSZW5kZXIgYSBidXR0b24gSFRNTCBlbGVtZW50IGFwcGx5aW5nIHRoZSByZXNldCBjbGFzcyBuYW1lLlxuICovXG5leHBvcnQgdmFyIEJ1dHRvbiA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgY2xhc3NOYW1lcyA9IF9hLmNsYXNzTmFtZXMsIHN0eWxlcyA9IF9hLnN0eWxlcztcbiAgICB2YXIgY2xhc3NOYW1lc0FyciA9IFtjbGFzc05hbWVzLmJ1dHRvbl9yZXNldCwgY2xhc3NOYW1lcy5idXR0b25dO1xuICAgIGlmIChwcm9wcy5jbGFzc05hbWUpIHtcbiAgICAgICAgY2xhc3NOYW1lc0Fyci5wdXNoKHByb3BzLmNsYXNzTmFtZSk7XG4gICAgfVxuICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzQXJyLmpvaW4oJyAnKTtcbiAgICB2YXIgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzLmJ1dHRvbl9yZXNldCksIHN0eWxlcy5idXR0b24pO1xuICAgIGlmIChwcm9wcy5zdHlsZSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCBwcm9wcy5zdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHsgcmVmOiByZWYsIHR5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogY2xhc3NOYW1lLCBzdHlsZTogc3R5bGUgfSkpKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnV0dG9uLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnLi4vQnV0dG9uJztcbi8qKiBBIGNvbXBvbmVudCByZW5kZXJpbmcgdGhlIG5hdmlnYXRpb24gYnV0dG9ucyBvciB0aGUgZHJvcC1kb3ducy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOYXZpZ2F0aW9uKHByb3BzKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBfYiA9IHVzZURheVBpY2tlcigpLCBkaXIgPSBfYi5kaXIsIGxvY2FsZSA9IF9iLmxvY2FsZSwgY2xhc3NOYW1lcyA9IF9iLmNsYXNzTmFtZXMsIHN0eWxlcyA9IF9iLnN0eWxlcywgX2MgPSBfYi5sYWJlbHMsIGxhYmVsUHJldmlvdXMgPSBfYy5sYWJlbFByZXZpb3VzLCBsYWJlbE5leHQgPSBfYy5sYWJlbE5leHQsIF9kID0gX2IuY29tcG9uZW50cywgSWNvblJpZ2h0ID0gX2QuSWNvblJpZ2h0LCBJY29uTGVmdCA9IF9kLkljb25MZWZ0O1xuICAgIHZhciBvblByZXZpb3VzQ2xpY2sgPSBwcm9wcy5vblByZXZpb3VzQ2xpY2ssIG9uTmV4dENsaWNrID0gcHJvcHMub25OZXh0Q2xpY2s7XG4gICAgaWYgKGRpciA9PT0gJ3J0bCcpIHtcbiAgICAgICAgX2EgPSBbb25QcmV2aW91c0NsaWNrLCBvbk5leHRDbGlja10sIG9uTmV4dENsaWNrID0gX2FbMF0sIG9uUHJldmlvdXNDbGljayA9IF9hWzFdO1xuICAgIH1cbiAgICB2YXIgcHJldmlvdXNNb250aCA9IHByb3BzLnByZXZpb3VzTW9udGgsIG5leHRNb250aCA9IHByb3BzLm5leHRNb250aDtcbiAgICB2YXIgcHJldmlvdXNMYWJlbCA9IGxhYmVsUHJldmlvdXMocHJldmlvdXNNb250aCwgeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgICB2YXIgcHJldmlvdXNDbGFzc05hbWUgPSBbXG4gICAgICAgIGNsYXNzTmFtZXMubmF2X2J1dHRvbixcbiAgICAgICAgY2xhc3NOYW1lcy5uYXZfYnV0dG9uX3ByZXZpb3VzXG4gICAgXS5qb2luKCcgJyk7XG4gICAgdmFyIG5leHRMYWJlbCA9IGxhYmVsTmV4dChuZXh0TW9udGgsIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgdmFyIG5leHRDbGFzc05hbWUgPSBbXG4gICAgICAgIGNsYXNzTmFtZXMubmF2X2J1dHRvbixcbiAgICAgICAgY2xhc3NOYW1lcy5uYXZfYnV0dG9uX25leHRcbiAgICBdLmpvaW4oJyAnKTtcbiAgICBpZiAoIW5leHRNb250aCAmJiAhcHJldmlvdXNNb250aCkge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5uYXYsIHN0eWxlOiBzdHlsZXMubmF2IH0sXG4gICAgICAgICFwcm9wcy5oaWRlUHJldmlvdXMgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7IFwiYXJpYS1sYWJlbFwiOiBwcmV2aW91c0xhYmVsLCBjbGFzc05hbWU6IHByZXZpb3VzQ2xhc3NOYW1lLCBzdHlsZTogc3R5bGVzLm5hdl9idXR0b25fbmV4dCwgZGlzYWJsZWQ6ICFwcmV2aW91c01vbnRoLCBvbkNsaWNrOiBkaXIgPT09ICdydGwnID8gb25OZXh0Q2xpY2sgOiBvblByZXZpb3VzQ2xpY2sgfSwgZGlyID09PSAncnRsJyA/IChSZWFjdC5jcmVhdGVFbGVtZW50KEljb25SaWdodCwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMubmF2X2ljb24sIHN0eWxlOiBzdHlsZXMubmF2X2ljb24gfSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbkxlZnQsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLm5hdl9pY29uLCBzdHlsZTogc3R5bGVzLm5hdl9pY29uIH0pKSkpLFxuICAgICAgICAhcHJvcHMuaGlkZU5leHQgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7IFwiYXJpYS1sYWJlbFwiOiBuZXh0TGFiZWwsIGNsYXNzTmFtZTogbmV4dENsYXNzTmFtZSwgc3R5bGU6IHN0eWxlcy5uYXZfYnV0dG9uX25leHQsIGRpc2FibGVkOiAhbmV4dE1vbnRoLCBvbkNsaWNrOiBkaXIgPT09ICdydGwnID8gb25QcmV2aW91c0NsaWNrIDogb25OZXh0Q2xpY2sgfSwgZGlyID09PSAncnRsJyA/IChSZWFjdC5jcmVhdGVFbGVtZW50KEljb25MZWZ0LCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5uYXZfaWNvbiwgc3R5bGU6IHN0eWxlcy5uYXZfaWNvbiB9KSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChJY29uUmlnaHQsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLm5hdl9pY29uLCBzdHlsZTogc3R5bGVzLm5hdl9pY29uIH0pKSkpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXZpZ2F0aW9uLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzZXRZZWFyLCBzdGFydE9mWWVhciB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG4vKipcbiAqIFJlbmRlciBhIGRyb3Bkb3duIHRvIGNoYW5nZSB0aGUgeWVhci4gVGFrZSBpbiBhY2NvdW50IHRoZSBgbmF2LmZyb21EYXRlYCBhbmRcbiAqIGB0b0RhdGVgIGZyb20gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFllYXJzRHJvcGRvd24ocHJvcHMpIHtcbiAgICB2YXIgZGlzcGxheU1vbnRoID0gcHJvcHMuZGlzcGxheU1vbnRoO1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBmcm9tRGF0ZSA9IF9hLmZyb21EYXRlLCB0b0RhdGUgPSBfYS50b0RhdGUsIGxvY2FsZSA9IF9hLmxvY2FsZSwgc3R5bGVzID0gX2Euc3R5bGVzLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgRHJvcGRvd24gPSBfYS5jb21wb25lbnRzLkRyb3Bkb3duLCBmb3JtYXRZZWFyQ2FwdGlvbiA9IF9hLmZvcm1hdHRlcnMuZm9ybWF0WWVhckNhcHRpb24sIGxhYmVsWWVhckRyb3Bkb3duID0gX2EubGFiZWxzLmxhYmVsWWVhckRyb3Bkb3duO1xuICAgIHZhciB5ZWFycyA9IFtdO1xuICAgIGlmIChmcm9tRGF0ZSAmJiB0b0RhdGUpIHtcbiAgICAgICAgdmFyIGZyb21ZZWFyID0gZnJvbURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgdmFyIHRvWWVhciA9IHRvRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBmb3IgKHZhciB5ZWFyID0gZnJvbVllYXI7IHllYXIgPD0gdG9ZZWFyOyB5ZWFyKyspIHtcbiAgICAgICAgICAgIHllYXJzLnB1c2goc2V0WWVhcihzdGFydE9mWWVhcihuZXcgRGF0ZSgpKSwgeWVhcikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbmV3TW9udGggPSBzZXRZZWFyKG5ldyBEYXRlKGRpc3BsYXlNb250aCksIE51bWJlcihlLnRhcmdldC52YWx1ZSkpO1xuICAgICAgICBwcm9wcy5vbkNoYW5nZShuZXdNb250aCk7XG4gICAgfTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRHJvcGRvd24sIHsgXCJhcmlhLWxhYmVsXCI6IGxhYmVsWWVhckRyb3Bkb3duKCksIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5kcm9wZG93bl9tb250aCwgc3R5bGU6IHN0eWxlcy5kcm9wZG93bl9tb250aCwgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZSwgdmFsdWU6IGRpc3BsYXlNb250aC5nZXRGdWxsWWVhcigpLCBjYXB0aW9uOiBmb3JtYXRZZWFyQ2FwdGlvbihkaXNwbGF5TW9udGgsIHsgbG9jYWxlOiBsb2NhbGUgfSkgfSwgeWVhcnMubWFwKGZ1bmN0aW9uICh5ZWFyKSB7IHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLCB7IGtleTogeWVhci5nZXRGdWxsWWVhcigpLCB2YWx1ZTogeWVhci5nZXRGdWxsWWVhcigpIH0sIGZvcm1hdFllYXJDYXB0aW9uKHllYXIsIHsgbG9jYWxlOiBsb2NhbGUgfSkpKTsgfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVllYXJzRHJvcGRvd24uanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogSGVscGVyIGhvb2sgZm9yIHVzaW5nIGNvbnRyb2xsZWQvdW5jb250cm9sbGVkIHZhbHVlcyBmcm9tIGEgY29tcG9uZW50IHByb3BzLlxuICpcbiAqIFdoZW4gdGhlIHZhbHVlIGlzIG5vdCBjb250cm9sbGVkLCBwYXNzIGB1bmRlZmluZWRgIGFzIGBjb250cm9sbGVkVmFsdWVgIGFuZFxuICogdXNlIHRoZSByZXR1cm5lZCBzZXR0ZXIgdG8gdXBkYXRlIGl0LlxuICpcbiAqIFdoZW4gdGhlIHZhbHVlIGlzIGNvbnRyb2xsZWQsIHBhc3MgdGhlIGNvbnRyb2xsZWQgdmFsdWUgYXMgc2Vjb25kXG4gKiBhcmd1bWVudCwgd2hpY2ggd2lsbCBiZSBhbHdheXMgcmV0dXJuZWQgYXMgYHZhbHVlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRyb2xsZWRWYWx1ZShkZWZhdWx0VmFsdWUsIGNvbnRyb2xsZWRWYWx1ZSkge1xuICAgIHZhciBfYSA9IFJlYWN0LnVzZVN0YXRlKGRlZmF1bHRWYWx1ZSksIHVuY29udHJvbGxlZFZhbHVlID0gX2FbMF0sIHNldFZhbHVlID0gX2FbMV07XG4gICAgdmFyIHZhbHVlID0gY29udHJvbGxlZFZhbHVlID09PSB1bmRlZmluZWQgPyB1bmNvbnRyb2xsZWRWYWx1ZSA6IGNvbnRyb2xsZWRWYWx1ZTtcbiAgICByZXR1cm4gW3ZhbHVlLCBzZXRWYWx1ZV07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VDb250cm9sbGVkVmFsdWUuanMubWFwIiwiaW1wb3J0IHsgYWRkTW9udGhzLCBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocywgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqIFJldHVybiB0aGUgaW5pdGlhbCBtb250aCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5pdGlhbE1vbnRoKGNvbnRleHQpIHtcbiAgICB2YXIgbW9udGggPSBjb250ZXh0Lm1vbnRoLCBkZWZhdWx0TW9udGggPSBjb250ZXh0LmRlZmF1bHRNb250aCwgdG9kYXkgPSBjb250ZXh0LnRvZGF5O1xuICAgIHZhciBpbml0aWFsTW9udGggPSBtb250aCB8fCBkZWZhdWx0TW9udGggfHwgdG9kYXkgfHwgbmV3IERhdGUoKTtcbiAgICB2YXIgdG9EYXRlID0gY29udGV4dC50b0RhdGUsIGZyb21EYXRlID0gY29udGV4dC5mcm9tRGF0ZSwgX2EgPSBjb250ZXh0Lm51bWJlck9mTW9udGhzLCBudW1iZXJPZk1vbnRocyA9IF9hID09PSB2b2lkIDAgPyAxIDogX2E7XG4gICAgLy8gRml4IHRoZSBpbml0aWFsTW9udGggaWYgaXMgYWZ0ZXIgdGhlIHRvLWRhdGVcbiAgICBpZiAodG9EYXRlICYmIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKHRvRGF0ZSwgaW5pdGlhbE1vbnRoKSA8IDApIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IC0xICogKG51bWJlck9mTW9udGhzIC0gMSk7XG4gICAgICAgIGluaXRpYWxNb250aCA9IGFkZE1vbnRocyh0b0RhdGUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8vIEZpeCB0aGUgaW5pdGlhbE1vbnRoIGlmIGlzIGJlZm9yZSB0aGUgZnJvbS1kYXRlXG4gICAgaWYgKGZyb21EYXRlICYmIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKGluaXRpYWxNb250aCwgZnJvbURhdGUpIDwgMCkge1xuICAgICAgICBpbml0aWFsTW9udGggPSBmcm9tRGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0T2ZNb250aChpbml0aWFsTW9udGgpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0SW5pdGlhbE1vbnRoLmpzLm1hcCIsImltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVkVmFsdWUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VDb250cm9sbGVkVmFsdWUnO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbE1vbnRoIH0gZnJvbSAnLi91dGlscy9nZXRJbml0aWFsTW9udGgnO1xuLyoqIENvbnRyb2xzIHRoZSBuYXZpZ2F0aW9uIHN0YXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU5hdmlnYXRpb25TdGF0ZSgpIHtcbiAgICB2YXIgY29udGV4dCA9IHVzZURheVBpY2tlcigpO1xuICAgIHZhciBpbml0aWFsTW9udGggPSBnZXRJbml0aWFsTW9udGgoY29udGV4dCk7XG4gICAgdmFyIF9hID0gdXNlQ29udHJvbGxlZFZhbHVlKGluaXRpYWxNb250aCwgY29udGV4dC5tb250aCksIG1vbnRoID0gX2FbMF0sIHNldE1vbnRoID0gX2FbMV07XG4gICAgdmFyIGdvVG9Nb250aCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIGlmIChjb250ZXh0LmRpc2FibGVOYXZpZ2F0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzZXRNb250aChkYXRlKTtcbiAgICB9O1xuICAgIHJldHVybiBbbW9udGgsIGdvVG9Nb250aF07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VOYXZpZ2F0aW9uU3RhdGUuanMubWFwIiwiaW1wb3J0IHsgYWRkTW9udGhzLCBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocywgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqXG4gKiBSZXR1cm4gdGhlIG1vbnRocyB0byBkaXNwbGF5IGluIHRoZSBjb21wb25lbnQgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2ZcbiAqIG1vbnRocyBhbmQgdGhlIGZyb20vdG8gZGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3BsYXlNb250aHMobW9udGgsIF9hKSB7XG4gICAgdmFyIHJldmVyc2VNb250aHMgPSBfYS5yZXZlcnNlTW9udGhzLCBudW1iZXJPZk1vbnRocyA9IF9hLm51bWJlck9mTW9udGhzO1xuICAgIHZhciBzdGFydCA9IHN0YXJ0T2ZNb250aChtb250aCk7XG4gICAgdmFyIGVuZCA9IHN0YXJ0T2ZNb250aChhZGRNb250aHMoc3RhcnQsIG51bWJlck9mTW9udGhzKSk7XG4gICAgdmFyIG1vbnRoc0RpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhlbmQsIHN0YXJ0KTtcbiAgICB2YXIgbW9udGhzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb250aHNEaWZmOyBpKyspIHtcbiAgICAgICAgdmFyIG5leHRNb250aCA9IGFkZE1vbnRocyhzdGFydCwgaSk7XG4gICAgICAgIG1vbnRocy5wdXNoKG5leHRNb250aCk7XG4gICAgfVxuICAgIGlmIChyZXZlcnNlTW9udGhzKVxuICAgICAgICBtb250aHMgPSBtb250aHMucmV2ZXJzZSgpO1xuICAgIHJldHVybiBtb250aHM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXREaXNwbGF5TW9udGhzLmpzLm1hcCIsImltcG9ydCB7IGFkZE1vbnRocywgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsIHN0YXJ0T2ZNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogUmV0dXJucyB0aGUgbmV4dCBtb250aCB0aGUgdXNlciBjYW4gbmF2aWdhdGUgdG8gYWNjb3JkaW5nIHRvIHRoZSBnaXZlblxuICogb3B0aW9ucy5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBuZXh0IG1vbnRoIGlzIG5vdCBhbHdheXMgdGhlIG5leHQgY2FsZW5kYXIgbW9udGg6XG4gKlxuICogLSBpZiBhZnRlciB0aGUgYHRvRGF0ZWAgcmFuZ2UsIGlzIHVuZGVmaW5lZDtcbiAqIC0gaWYgdGhlIG5hdmlnYXRpb24gaXMgcGFnZWQsIGlzIHRoZSBudW1iZXIgb2YgbW9udGhzIGRpc3BsYXllZCBhaGVhZC5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0TW9udGgoc3RhcnRpbmdNb250aCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmRpc2FibGVOYXZpZ2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciB0b0RhdGUgPSBvcHRpb25zLnRvRGF0ZSwgcGFnZWROYXZpZ2F0aW9uID0gb3B0aW9ucy5wYWdlZE5hdmlnYXRpb24sIF9hID0gb3B0aW9ucy5udW1iZXJPZk1vbnRocywgbnVtYmVyT2ZNb250aHMgPSBfYSA9PT0gdm9pZCAwID8gMSA6IF9hO1xuICAgIHZhciBvZmZzZXQgPSBwYWdlZE5hdmlnYXRpb24gPyBudW1iZXJPZk1vbnRocyA6IDE7XG4gICAgdmFyIG1vbnRoID0gc3RhcnRPZk1vbnRoKHN0YXJ0aW5nTW9udGgpO1xuICAgIGlmICghdG9EYXRlKSB7XG4gICAgICAgIHJldHVybiBhZGRNb250aHMobW9udGgsIG9mZnNldCk7XG4gICAgfVxuICAgIHZhciBtb250aHNEaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHModG9EYXRlLCBzdGFydGluZ01vbnRoKTtcbiAgICBpZiAobW9udGhzRGlmZiA8IG51bWJlck9mTW9udGhzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEp1bXAgZm9yd2FyZCBhcyB0aGUgbnVtYmVyIG9mIG1vbnRocyB3aGVuIHBhZ2VkIG5hdmlnYXRpb25cbiAgICByZXR1cm4gYWRkTW9udGhzKG1vbnRoLCBvZmZzZXQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0TmV4dE1vbnRoLmpzLm1hcCIsImltcG9ydCB7IGFkZE1vbnRocywgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsIHN0YXJ0T2ZNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogUmV0dXJucyB0aGUgbmV4dCBwcmV2aW91cyB0aGUgdXNlciBjYW4gbmF2aWdhdGUgdG8sIGFjY29yZGluZyB0byB0aGUgZ2l2ZW5cbiAqIG9wdGlvbnMuXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgcHJldmlvdXMgbW9udGggaXMgbm90IGFsd2F5cyB0aGUgcHJldmlvdXMgY2FsZW5kYXJcbiAqIG1vbnRoOlxuICpcbiAqIC0gaWYgYmVmb3JlIHRoZSBgZnJvbURhdGVgIGRhdGUsIGlzIGB1bmRlZmluZWRgO1xuICogLSBpZiB0aGUgbmF2aWdhdGlvbiBpcyBwYWdlZCwgaXMgdGhlIG51bWJlciBvZiBtb250aHMgZGlzcGxheWVkIGJlZm9yZS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2aW91c01vbnRoKHN0YXJ0aW5nTW9udGgsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5kaXNhYmxlTmF2aWdhdGlvbikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgZnJvbURhdGUgPSBvcHRpb25zLmZyb21EYXRlLCBwYWdlZE5hdmlnYXRpb24gPSBvcHRpb25zLnBhZ2VkTmF2aWdhdGlvbiwgX2EgPSBvcHRpb25zLm51bWJlck9mTW9udGhzLCBudW1iZXJPZk1vbnRocyA9IF9hID09PSB2b2lkIDAgPyAxIDogX2E7XG4gICAgdmFyIG9mZnNldCA9IHBhZ2VkTmF2aWdhdGlvbiA/IG51bWJlck9mTW9udGhzIDogMTtcbiAgICB2YXIgbW9udGggPSBzdGFydE9mTW9udGgoc3RhcnRpbmdNb250aCk7XG4gICAgaWYgKCFmcm9tRGF0ZSkge1xuICAgICAgICByZXR1cm4gYWRkTW9udGhzKG1vbnRoLCAtb2Zmc2V0KTtcbiAgICB9XG4gICAgdmFyIG1vbnRoc0RpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhtb250aCwgZnJvbURhdGUpO1xuICAgIGlmIChtb250aHNEaWZmIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gSnVtcCBiYWNrIGFzIHRoZSBudW1iZXIgb2YgbW9udGhzIHdoZW4gcGFnZWQgbmF2aWdhdGlvblxuICAgIHJldHVybiBhZGRNb250aHMobW9udGgsIC1vZmZzZXQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0UHJldmlvdXNNb250aC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZU5hdmlnYXRpb25TdGF0ZSB9IGZyb20gJy4vdXNlTmF2aWdhdGlvblN0YXRlJztcbmltcG9ydCB7IGdldERpc3BsYXlNb250aHMgfSBmcm9tICcuL3V0aWxzL2dldERpc3BsYXlNb250aHMnO1xuaW1wb3J0IHsgZ2V0TmV4dE1vbnRoIH0gZnJvbSAnLi91dGlscy9nZXROZXh0TW9udGgnO1xuaW1wb3J0IHsgZ2V0UHJldmlvdXNNb250aCB9IGZyb20gJy4vdXRpbHMvZ2V0UHJldmlvdXNNb250aCc7XG4vKipcbiAqIFRoZSBOYXZpZ2F0aW9uIGNvbnRleHQgc2hhcmVzIGRldGFpbHMgYWJvdXQgdGhlIG1vbnRocyBiZWluZyBuYXZpZ2F0ZWQgaW4gRGF5UGlja2VyLlxuICpcbiAqIEFjY2VzcyB0aGlzIGNvbnRleHQgZnJvbSB0aGUgW1t1c2VOYXZpZ2F0aW9uXV0gaG9vay5cbiAqL1xuZXhwb3J0IHZhciBOYXZpZ2F0aW9uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbi8qKiBQcm92aWRlcyB0aGUgdmFsdWVzIGZvciB0aGUgW1tOYXZpZ2F0aW9uQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE5hdmlnYXRpb25Qcm92aWRlcihwcm9wcykge1xuICAgIHZhciBjb250ZXh0ID0gdXNlRGF5UGlja2VyKCk7XG4gICAgdmFyIF9hID0gdXNlTmF2aWdhdGlvblN0YXRlKCksIG1vbnRoID0gX2FbMF0sIGdvVG9Nb250aCA9IF9hWzFdO1xuICAgIHZhciBkaXNwbGF5TW9udGhzID0gZ2V0RGlzcGxheU1vbnRocyhtb250aCwgY29udGV4dCk7XG4gICAgdmFyIG5leHRNb250aCA9IGdldE5leHRNb250aChtb250aCwgY29udGV4dCk7XG4gICAgdmFyIHByZXZpb3VzTW9udGggPSBnZXRQcmV2aW91c01vbnRoKG1vbnRoLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTmF2aWdhdGlvbkNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHtcbiAgICAgICAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgICAgICAgIGRpc3BsYXlNb250aHM6IGRpc3BsYXlNb250aHMsXG4gICAgICAgICAgICBnb1RvTW9udGg6IGdvVG9Nb250aCxcbiAgICAgICAgICAgIHByZXZpb3VzTW9udGg6IHByZXZpb3VzTW9udGgsXG4gICAgICAgICAgICBuZXh0TW9udGg6IG5leHRNb250aFxuICAgICAgICB9IH0sIHByb3BzLmNoaWxkcmVuKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXZpZ2F0aW9uQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkNvbnRleHQgfSBmcm9tICcuL05hdmlnYXRpb25Db250ZXh0Jztcbi8qKiBIb29rIHRvIGFjY2VzcyB0aGUgW1tOYXZpZ2F0aW9uQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU5hdmlnYXRpb24oKSB7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VOYXZpZ2F0aW9uIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBOYXZpZ2F0aW9uUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VOYXZpZ2F0aW9uLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc1NhbWVNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IE1vbnRoc0Ryb3Bkb3duIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Nb250aHNEcm9wZG93bic7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9OYXZpZ2F0aW9uJztcbmltcG9ydCB7IFllYXJzRHJvcGRvd24gfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL1llYXJzRHJvcGRvd24nO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZU5hdmlnYXRpb24gfSBmcm9tICcuLi8uLi9jb250ZXh0cy9OYXZpZ2F0aW9uJztcbi8qKlxuICogUmVuZGVyIHRoZSBjYXB0aW9uIG9mIGEgbW9udGgsIHdoaWNoIGluY2x1ZGVzIHRpdGxlIGFuZCBuYXZpZ2F0aW9uIGJ1dHRvbnMuXG4gKiBUaGUgY2FwdGlvbiBoYXMgYSBkaWZmZXJlbnQgbGF5b3V0IHdoZW4gc2V0dGluZyB0aGUgW1tEYXlQaWNrZXJQcm9wcy5jYXB0aW9uTGF5b3V0XV0gcHJvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENhcHRpb24ocHJvcHMpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGRpc3BsYXlNb250aCA9IHByb3BzLmRpc3BsYXlNb250aDtcbiAgICB2YXIgY29udGV4dCA9IHVzZURheVBpY2tlcigpO1xuICAgIHZhciBjbGFzc05hbWVzID0gY29udGV4dC5jbGFzc05hbWVzLCBudW1iZXJPZk1vbnRocyA9IGNvbnRleHQubnVtYmVyT2ZNb250aHMsIGRpc2FibGVOYXZpZ2F0aW9uID0gY29udGV4dC5kaXNhYmxlTmF2aWdhdGlvbiwgc3R5bGVzID0gY29udGV4dC5zdHlsZXMsIGNhcHRpb25MYXlvdXQgPSBjb250ZXh0LmNhcHRpb25MYXlvdXQsIG9uTW9udGhDaGFuZ2UgPSBjb250ZXh0Lm9uTW9udGhDaGFuZ2UsIGRpciA9IGNvbnRleHQuZGlyLCBDYXB0aW9uTGFiZWwgPSBjb250ZXh0LmNvbXBvbmVudHMuQ2FwdGlvbkxhYmVsO1xuICAgIHZhciBfYiA9IHVzZU5hdmlnYXRpb24oKSwgcHJldmlvdXNNb250aCA9IF9iLnByZXZpb3VzTW9udGgsIG5leHRNb250aCA9IF9iLm5leHRNb250aCwgZ29Ub01vbnRoID0gX2IuZ29Ub01vbnRoLCBkaXNwbGF5TW9udGhzID0gX2IuZGlzcGxheU1vbnRocztcbiAgICB2YXIgaGFuZGxlUHJldmlvdXNDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFwcmV2aW91c01vbnRoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBnb1RvTW9udGgocHJldmlvdXNNb250aCk7XG4gICAgICAgIG9uTW9udGhDaGFuZ2UgPT09IG51bGwgfHwgb25Nb250aENoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Nb250aENoYW5nZShwcmV2aW91c01vbnRoKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVOZXh0Q2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghbmV4dE1vbnRoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBnb1RvTW9udGgobmV4dE1vbnRoKTtcbiAgICAgICAgb25Nb250aENoYW5nZSA9PT0gbnVsbCB8fCBvbk1vbnRoQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vbnRoQ2hhbmdlKG5leHRNb250aCk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlTW9udGhDaGFuZ2UgPSBmdW5jdGlvbiAobmV3TW9udGgpIHtcbiAgICAgICAgZ29Ub01vbnRoKG5ld01vbnRoKTtcbiAgICAgICAgb25Nb250aENoYW5nZSA9PT0gbnVsbCB8fCBvbk1vbnRoQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vbnRoQ2hhbmdlKG5ld01vbnRoKTtcbiAgICB9O1xuICAgIHZhciBkaXNwbGF5SW5kZXggPSBkaXNwbGF5TW9udGhzLmZpbmRJbmRleChmdW5jdGlvbiAobW9udGgpIHtcbiAgICAgICAgcmV0dXJuIGlzU2FtZU1vbnRoKGRpc3BsYXlNb250aCwgbW9udGgpO1xuICAgIH0pO1xuICAgIHZhciBpc0ZpcnN0ID0gZGlzcGxheUluZGV4ID09PSAwO1xuICAgIHZhciBpc0xhc3QgPSBkaXNwbGF5SW5kZXggPT09IGRpc3BsYXlNb250aHMubGVuZ3RoIC0gMTtcbiAgICBpZiAoZGlyID09PSAncnRsJykge1xuICAgICAgICBfYSA9IFtpc0ZpcnN0LCBpc0xhc3RdLCBpc0xhc3QgPSBfYVswXSwgaXNGaXJzdCA9IF9hWzFdO1xuICAgIH1cbiAgICB2YXIgaGlkZU5leHQgPSBudW1iZXJPZk1vbnRocyA+IDEgJiYgKGlzRmlyc3QgfHwgIWlzTGFzdCk7XG4gICAgdmFyIGhpZGVQcmV2aW91cyA9IG51bWJlck9mTW9udGhzID4gMSAmJiAoaXNMYXN0IHx8ICFpc0ZpcnN0KTtcbiAgICB2YXIgY2FwdGlvbkxhYmVsID0gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2FwdGlvbkxhYmVsLCB7IGlkOiBwcm9wcy5pZCwgZGlzcGxheU1vbnRoOiBkaXNwbGF5TW9udGggfSkpO1xuICAgIHZhciBjYXB0aW9uQ29udGVudDtcbiAgICBpZiAoZGlzYWJsZU5hdmlnYXRpb24pIHtcbiAgICAgICAgY2FwdGlvbkNvbnRlbnQgPSBjYXB0aW9uTGFiZWw7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNhcHRpb25MYXlvdXQgPT09ICdkcm9wZG93bicpIHtcbiAgICAgICAgY2FwdGlvbkNvbnRlbnQgPSAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jYXB0aW9uX2Ryb3Bkb3ducywgc3R5bGU6IHN0eWxlcy5jYXB0aW9uX2Ryb3Bkb3ducyB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy52aGlkZGVuIH0sIGNhcHRpb25MYWJlbCksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KE1vbnRoc0Ryb3Bkb3duLCB7IG9uQ2hhbmdlOiBoYW5kbGVNb250aENoYW5nZSwgZGlzcGxheU1vbnRoOiBkaXNwbGF5TW9udGggfSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFllYXJzRHJvcGRvd24sIHsgb25DaGFuZ2U6IGhhbmRsZU1vbnRoQ2hhbmdlLCBkaXNwbGF5TW9udGg6IGRpc3BsYXlNb250aCB9KSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdGlvbkNvbnRlbnQgPSAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgIGNhcHRpb25MYWJlbCxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTmF2aWdhdGlvbiwgeyBkaXNwbGF5TW9udGg6IGRpc3BsYXlNb250aCwgaGlkZU5leHQ6IGhpZGVOZXh0LCBoaWRlUHJldmlvdXM6IGhpZGVQcmV2aW91cywgbmV4dE1vbnRoOiBuZXh0TW9udGgsIHByZXZpb3VzTW9udGg6IHByZXZpb3VzTW9udGgsIG9uUHJldmlvdXNDbGljazogaGFuZGxlUHJldmlvdXNDbGljaywgb25OZXh0Q2xpY2s6IGhhbmRsZU5leHRDbGljayB9KSkpO1xuICAgIH1cbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuY2FwdGlvbiwgc3R5bGU6IHN0eWxlcy5jYXB0aW9uIH0sIGNhcHRpb25Db250ZW50KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYXB0aW9uLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqIFJlbmRlciB0aGUgY2FwdGlvbiBmb3IgdGhlIGRpc3BsYXllZCBtb250aC4gVGhpcyBjb21wb25lbnQgaXMgdXNlZCB3aGVuIGBjYXB0aW9uTGF5b3V0PVwiYnV0dG9uc1wiYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYXB0aW9uTGFiZWwocHJvcHMpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgbG9jYWxlID0gX2EubG9jYWxlLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Euc3R5bGVzLCBmb3JtYXRDYXB0aW9uID0gX2EuZm9ybWF0dGVycy5mb3JtYXRDYXB0aW9uO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNhcHRpb25fbGFiZWwsIHN0eWxlOiBzdHlsZXMuY2FwdGlvbl9sYWJlbCwgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIiwgXCJhcmlhLWF0b21pY1wiOiBcInRydWVcIiwgaWQ6IHByb3BzLmlkIH0sIGZvcm1hdENhcHRpb24ocHJvcHMuZGlzcGxheU1vbnRoLCB7IGxvY2FsZTogbG9jYWxlIH0pKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYXB0aW9uTGFiZWwuanMubWFwIiwiLyoqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcm9wcyBhcmUgb2YgdHlwZSBbW0RheVBpY2tlck11bHRpcGxlXV0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXlQaWNrZXJNdWx0aXBsZShwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy5tb2RlID09PSAnbXVsdGlwbGUnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5UGlja2VyTXVsdGlwbGUuanMubWFwIiwiaW1wb3J0IHsgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzU2FtZURheSB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGlzRGF5UGlja2VyTXVsdGlwbGUgfSBmcm9tICcuLi8uLi90eXBlcy9EYXlQaWNrZXJNdWx0aXBsZSc7XG4vKipcbiAqIFRoZSBTZWxlY3RNdWx0aXBsZSBjb250ZXh0IHNoYXJlcyBkZXRhaWxzIGFib3V0IHRoZSBzZWxlY3RlZCBkYXlzIHdoZW4gaW5cbiAqIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlLlxuICpcbiAqIEFjY2VzcyB0aGlzIGNvbnRleHQgZnJvbSB0aGUgW1t1c2VTZWxlY3RNdWx0aXBsZV1dIGhvb2suXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0TXVsdGlwbGVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuLyoqIFByb3ZpZGVzIHRoZSB2YWx1ZXMgZm9yIHRoZSBbW1NlbGVjdE11bHRpcGxlQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdE11bHRpcGxlUHJvdmlkZXIocHJvcHMpIHtcbiAgICBpZiAoIWlzRGF5UGlja2VyTXVsdGlwbGUocHJvcHMuaW5pdGlhbFByb3BzKSkge1xuICAgICAgICB2YXIgZW1wdHlDb250ZXh0VmFsdWUgPSB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RNdWx0aXBsZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGVtcHR5Q29udGV4dFZhbHVlIH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RNdWx0aXBsZVByb3ZpZGVySW50ZXJuYWwsIHsgaW5pdGlhbFByb3BzOiBwcm9wcy5pbml0aWFsUHJvcHMsIGNoaWxkcmVuOiBwcm9wcy5jaGlsZHJlbiB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0TXVsdGlwbGVQcm92aWRlckludGVybmFsKF9hKSB7XG4gICAgdmFyIGluaXRpYWxQcm9wcyA9IF9hLmluaXRpYWxQcm9wcywgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgc2VsZWN0ZWQgPSBpbml0aWFsUHJvcHMuc2VsZWN0ZWQ7XG4gICAgdmFyIG9uRGF5Q2xpY2sgPSBmdW5jdGlvbiAoZGF5LCBtb2RpZmllcnMsIGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgKF9hID0gaW5pdGlhbFByb3BzLm9uRGF5Q2xpY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGluaXRpYWxQcm9wcywgZGF5LCBtb2RpZmllcnMsIGUpO1xuICAgICAgICB2YXIgaXNNaW5TZWxlY3RlZCA9IEJvb2xlYW4oaW5pdGlhbFByb3BzLm1pbiAmJlxuICAgICAgICAgICAgbW9kaWZpZXJzLnNlbGVjdGVkICYmXG4gICAgICAgICAgICBzZWxlY3RlZCAmJlxuICAgICAgICAgICAgc2VsZWN0ZWQubGVuZ3RoID09PSBpbml0aWFsUHJvcHMubWluKTtcbiAgICAgICAgaWYgKGlzTWluU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaXNNYXhTZWxlY3RlZCA9IEJvb2xlYW4oaW5pdGlhbFByb3BzLm1heCAmJlxuICAgICAgICAgICAgIW1vZGlmaWVycy5zZWxlY3RlZCAmJlxuICAgICAgICAgICAgc2VsZWN0ZWQgJiZcbiAgICAgICAgICAgIHNlbGVjdGVkLmxlbmd0aCA9PT0gaW5pdGlhbFByb3BzLm1heCk7XG4gICAgICAgIGlmIChpc01heFNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheXMgPSBzZWxlY3RlZCA/IF9fc3ByZWFkQXJyYXkoW10sIHNlbGVjdGVkLCB0cnVlKSA6IFtdO1xuICAgICAgICBpZiAobW9kaWZpZXJzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBkYXlzLmZpbmRJbmRleChmdW5jdGlvbiAoc2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNTYW1lRGF5KGRheSwgc2VsZWN0ZWREYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXlzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkYXlzLnB1c2goZGF5KTtcbiAgICAgICAgfVxuICAgICAgICAoX2IgPSBpbml0aWFsUHJvcHMub25TZWxlY3QpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKGluaXRpYWxQcm9wcywgZGF5cywgZGF5LCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIG1vZGlmaWVycyA9IHtcbiAgICAgICAgZGlzYWJsZWQ6IFtdXG4gICAgfTtcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgbW9kaWZpZXJzLmRpc2FibGVkID0gW1xuICAgICAgICAgICAgZnVuY3Rpb24gZGlzYWJsZURheShkYXkpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNNYXhTZWxlY3RlZCA9IGluaXRpYWxQcm9wcy5tYXggJiZcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQubGVuZ3RoID4gaW5pdGlhbFByb3BzLm1heCAtIDE7XG4gICAgICAgICAgICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBzZWxlY3RlZCA9PT0gbnVsbCB8fCBzZWxlY3RlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWQuc29tZShmdW5jdGlvbiAoc2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU2FtZURheShzZWxlY3RlZERheSwgZGF5KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihpc01heFNlbGVjdGVkICYmICFpc1NlbGVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG4gICAgdmFyIGNvbnRleHRWYWx1ZSA9IHsgc2VsZWN0ZWQ6IHNlbGVjdGVkLCBvbkRheUNsaWNrOiBvbkRheUNsaWNrLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RNdWx0aXBsZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHRWYWx1ZSB9LCBjaGlsZHJlbikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0TXVsdGlwbGVDb250ZXh0LmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBTZWxlY3RNdWx0aXBsZUNvbnRleHQgfSBmcm9tICcuL1NlbGVjdE11bHRpcGxlQ29udGV4dCc7XG4vKiogSG9vayB0byBhY2Nlc3MgdGhlIFtbU2VsZWN0TXVsdGlwbGVDb250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU2VsZWN0TXVsdGlwbGUoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNlbGVjdE11bHRpcGxlQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlU2VsZWN0TXVsdGlwbGUgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFNlbGVjdE11bHRpcGxlUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VTZWxlY3RNdWx0aXBsZS5qcy5tYXAiLCIvKiogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHByb3BzIGFyZSBvZiB0eXBlIFtbRGF5UGlja2VyUmFuZ2VdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RheVBpY2tlclJhbmdlKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLm1vZGUgPT09ICdyYW5nZSc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXlQaWNrZXJSYW5nZS5qcy5tYXAiLCJpbXBvcnQgeyBpc0FmdGVyLCBpc0JlZm9yZSwgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqXG4gKiBBZGQgYSBkYXkgdG8gYW4gZXhpc3RpbmcgcmFuZ2UuXG4gKlxuICogVGhlIHJldHVybmVkIHJhbmdlIHRha2VzIGluIGFjY291bnQgdGhlIGB1bmRlZmluZWRgIHZhbHVlcyBhbmQgaWYgdGhlIGFkZGVkXG4gKiBkYXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSByYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvUmFuZ2UoZGF5LCByYW5nZSkge1xuICAgIHZhciBfYSA9IHJhbmdlIHx8IHt9LCBmcm9tID0gX2EuZnJvbSwgdG8gPSBfYS50bztcbiAgICBpZiAoIWZyb20pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogZGF5LCB0bzogZGF5IH07XG4gICAgfVxuICAgIGlmICghdG8gJiYgaXNTYW1lRGF5KGZyb20sIGRheSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0byAmJiBpc0JlZm9yZShkYXksIGZyb20pKSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IGRheSwgdG86IGZyb20gfTtcbiAgICB9XG4gICAgaWYgKCF0bykge1xuICAgICAgICByZXR1cm4geyBmcm9tOiBmcm9tLCB0bzogZGF5IH07XG4gICAgfVxuICAgIGlmIChpc1NhbWVEYXkodG8sIGRheSkgJiYgaXNTYW1lRGF5KGZyb20sIGRheSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGlzU2FtZURheSh0bywgZGF5KSkge1xuICAgICAgICByZXR1cm4geyBmcm9tOiB0bywgdG86IHRvIH07XG4gICAgfVxuICAgIGlmIChpc1NhbWVEYXkoZnJvbSwgZGF5KSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaXNBZnRlcihmcm9tLCBkYXkpKSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IGRheSwgdG86IHRvIH07XG4gICAgfVxuICAgIHJldHVybiB7IGZyb206IGZyb20sIHRvOiBkYXkgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkZFRvUmFuZ2UuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywgaXNBZnRlciwgaXNCZWZvcmUgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBpc0RheVBpY2tlclJhbmdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvRGF5UGlja2VyUmFuZ2UnO1xuaW1wb3J0IHsgYWRkVG9SYW5nZSB9IGZyb20gJy4vdXRpbHMvYWRkVG9SYW5nZSc7XG4vKipcbiAqIFRoZSBTZWxlY3RSYW5nZSBjb250ZXh0IHNoYXJlcyBkZXRhaWxzIGFib3V0IHRoZSBzZWxlY3RlZCBkYXlzIHdoZW4gaW5cbiAqIHJhbmdlIHNlbGVjdGlvbiBtb2RlLlxuICpcbiAqIEFjY2VzcyB0aGlzIGNvbnRleHQgZnJvbSB0aGUgW1t1c2VTZWxlY3RSYW5nZV1dIGhvb2suXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0UmFuZ2VDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuLyoqIFByb3ZpZGVzIHRoZSB2YWx1ZXMgZm9yIHRoZSBbW1NlbGVjdFJhbmdlUHJvdmlkZXJdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3RSYW5nZVByb3ZpZGVyKHByb3BzKSB7XG4gICAgaWYgKCFpc0RheVBpY2tlclJhbmdlKHByb3BzLmluaXRpYWxQcm9wcykpIHtcbiAgICAgICAgdmFyIGVtcHR5Q29udGV4dFZhbHVlID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgICAgICAgIHJhbmdlX3N0YXJ0OiBbXSxcbiAgICAgICAgICAgICAgICByYW5nZV9lbmQ6IFtdLFxuICAgICAgICAgICAgICAgIHJhbmdlX21pZGRsZTogW10sXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RSYW5nZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGVtcHR5Q29udGV4dFZhbHVlIH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RSYW5nZVByb3ZpZGVySW50ZXJuYWwsIHsgaW5pdGlhbFByb3BzOiBwcm9wcy5pbml0aWFsUHJvcHMsIGNoaWxkcmVuOiBwcm9wcy5jaGlsZHJlbiB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0UmFuZ2VQcm92aWRlckludGVybmFsKF9hKSB7XG4gICAgdmFyIGluaXRpYWxQcm9wcyA9IF9hLmluaXRpYWxQcm9wcywgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgc2VsZWN0ZWQgPSBpbml0aWFsUHJvcHMuc2VsZWN0ZWQ7XG4gICAgdmFyIG1pbiA9IGluaXRpYWxQcm9wcy5taW47XG4gICAgdmFyIG1heCA9IGluaXRpYWxQcm9wcy5tYXg7XG4gICAgdmFyIG9uRGF5Q2xpY2sgPSBmdW5jdGlvbiAoZGF5LCBtb2RpZmllcnMsIGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgKF9hID0gaW5pdGlhbFByb3BzLm9uRGF5Q2xpY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGluaXRpYWxQcm9wcywgZGF5LCBtb2RpZmllcnMsIGUpO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBhZGRUb1JhbmdlKGRheSwgc2VsZWN0ZWQpO1xuICAgICAgICBpZiAoKG1pbiB8fCBtYXgpICYmXG4gICAgICAgICAgICBzZWxlY3RlZCAmJlxuICAgICAgICAgICAgKG5ld1ZhbHVlID09PSBudWxsIHx8IG5ld1ZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXdWYWx1ZS50bykgJiZcbiAgICAgICAgICAgIG5ld1ZhbHVlLmZyb20gJiZcbiAgICAgICAgICAgIG5ld1ZhbHVlLmZyb20gIT09IG5ld1ZhbHVlLnRvKSB7XG4gICAgICAgICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhuZXdWYWx1ZSA9PT0gbnVsbCB8fCBuZXdWYWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmV3VmFsdWUudG8sIG5ld1ZhbHVlID09PSBudWxsIHx8IG5ld1ZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXdWYWx1ZS5mcm9tKSk7XG4gICAgICAgICAgICBpZiAobWluICYmIGRpZmYgPCBtaW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF4ICYmIGRpZmYgPj0gbWF4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIChfYiA9IGluaXRpYWxQcm9wcy5vblNlbGVjdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoaW5pdGlhbFByb3BzLCBuZXdWYWx1ZSwgZGF5LCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIG1vZGlmaWVycyA9IHtcbiAgICAgICAgcmFuZ2Vfc3RhcnQ6IFtdLFxuICAgICAgICByYW5nZV9lbmQ6IFtdLFxuICAgICAgICByYW5nZV9taWRkbGU6IFtdLFxuICAgICAgICBkaXNhYmxlZDogW11cbiAgICB9O1xuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBpZiAoc2VsZWN0ZWQuZnJvbSkge1xuICAgICAgICAgICAgbW9kaWZpZXJzLnJhbmdlX3N0YXJ0ID0gW3NlbGVjdGVkLmZyb21dO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkLnRvKSB7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzLnJhbmdlX21pZGRsZSA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IHNlbGVjdGVkLmZyb20sXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmU6IHNlbGVjdGVkLnRvXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGlmIChtYXggfHwgbWluKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycy5kaXNhYmxlZCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC50byAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5mcm9tICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQmVmb3JlKGRhdGUsIHNlbGVjdGVkLmZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHNlbGVjdGVkLnRvLCBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPj0gbWF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnRvICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLmZyb20gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlcihkYXRlLCBzZWxlY3RlZC50bykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZSwgc2VsZWN0ZWQuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID49IG1heCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiAmJiBzZWxlY3RlZC5mcm9tICYmIGlzQmVmb3JlKGRhdGUsIHNlbGVjdGVkLmZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHNlbGVjdGVkLmZyb20sIGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IG1pbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC50byAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5mcm9tICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXIoZGF0ZSwgc2VsZWN0ZWQudG8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGRhdGUsIHNlbGVjdGVkLmZyb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IG1pbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtb2RpZmllcnMucmFuZ2VfZW5kID0gW3NlbGVjdGVkLnRvXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVycy5yYW5nZV9lbmQgPSBbc2VsZWN0ZWQuZnJvbV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFJhbmdlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogeyBzZWxlY3RlZDogc2VsZWN0ZWQsIG9uRGF5Q2xpY2s6IG9uRGF5Q2xpY2ssIG1vZGlmaWVyczogbW9kaWZpZXJzIH0gfSwgY2hpbGRyZW4pKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNlbGVjdFJhbmdlQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgU2VsZWN0UmFuZ2VDb250ZXh0IH0gZnJvbSAnLi9TZWxlY3RSYW5nZUNvbnRleHQnO1xuLyoqIEhvb2sgdG8gYWNjZXNzIHRoZSBbW1NlbGVjdFJhbmdlQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlbGVjdFJhbmdlKCkge1xuICAgIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTZWxlY3RSYW5nZUNvbnRleHQpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZVNlbGVjdFJhbmdlIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBTZWxlY3RSYW5nZVByb3ZpZGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlU2VsZWN0UmFuZ2UuanMubWFwIiwiLyoqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcm9wcyBhcmUgb2YgdHlwZSBbW0RheVBpY2tlclNpbmdsZV1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF5UGlja2VyU2luZ2xlKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLm1vZGUgPT09ICdzaW5nbGUnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5UGlja2VyU2luZ2xlLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0RheVBpY2tlclNpbmdsZSB9IGZyb20gJy4uLy4uL3R5cGVzL0RheVBpY2tlclNpbmdsZSc7XG4vKipcbiAqIFRoZSBTZWxlY3RTaW5nbGUgY29udGV4dCBzaGFyZXMgZGV0YWlscyBhYm91dCB0aGUgc2VsZWN0ZWQgZGF5cyB3aGVuIGluXG4gKiBzaW5nbGUgc2VsZWN0aW9uIG1vZGUuXG4gKlxuICogQWNjZXNzIHRoaXMgY29udGV4dCBmcm9tIHRoZSBbW3VzZVNlbGVjdFNpbmdsZV1dIGhvb2suXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0U2luZ2xlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbi8qKiBQcm92aWRlcyB0aGUgdmFsdWVzIGZvciB0aGUgW1tTZWxlY3RTaW5nbGVQcm92aWRlcl1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdFNpbmdsZVByb3ZpZGVyKHByb3BzKSB7XG4gICAgaWYgKCFpc0RheVBpY2tlclNpbmdsZShwcm9wcy5pbml0aWFsUHJvcHMpKSB7XG4gICAgICAgIHZhciBlbXB0eUNvbnRleHRWYWx1ZSA9IHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFNpbmdsZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGVtcHR5Q29udGV4dFZhbHVlIH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RTaW5nbGVQcm92aWRlckludGVybmFsLCB7IGluaXRpYWxQcm9wczogcHJvcHMuaW5pdGlhbFByb3BzLCBjaGlsZHJlbjogcHJvcHMuY2hpbGRyZW4gfSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdFNpbmdsZVByb3ZpZGVySW50ZXJuYWwoX2EpIHtcbiAgICB2YXIgaW5pdGlhbFByb3BzID0gX2EuaW5pdGlhbFByb3BzLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuO1xuICAgIHZhciBvbkRheUNsaWNrID0gZnVuY3Rpb24gKGRheSwgZGF5TW9kaWZpZXJzLCBlKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmIChkYXlNb2RpZmllcnMuc2VsZWN0ZWQgJiYgIWluaXRpYWxQcm9wcy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgKF9hID0gaW5pdGlhbFByb3BzLm9uU2VsZWN0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChpbml0aWFsUHJvcHMsIHVuZGVmaW5lZCwgZGF5LCBkYXlNb2RpZmllcnMsIGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIChfYiA9IGluaXRpYWxQcm9wcy5vblNlbGVjdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoaW5pdGlhbFByb3BzLCBkYXksIGRheSwgZGF5TW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBjb250ZXh0VmFsdWUgPSB7XG4gICAgICAgIHNlbGVjdGVkOiBpbml0aWFsUHJvcHMuc2VsZWN0ZWQsXG4gICAgICAgIG9uRGF5Q2xpY2s6IG9uRGF5Q2xpY2tcbiAgICB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RTaW5nbGVDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjb250ZXh0VmFsdWUgfSwgY2hpbGRyZW4pKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNlbGVjdFNpbmdsZUNvbnRleHQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNlbGVjdFNpbmdsZUNvbnRleHQgfSBmcm9tICcuL1NlbGVjdFNpbmdsZUNvbnRleHQnO1xuLyoqIEhvb2sgdG8gYWNjZXNzIHRoZSBbW1NlbGVjdFNpbmdsZUNvbnRleHRdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTZWxlY3RTaW5nbGUoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNlbGVjdFNpbmdsZUNvbnRleHQpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZVNlbGVjdFNpbmdsZSBtdXN0IGJlIHVzZWQgd2l0aGluIGEgU2VsZWN0U2luZ2xlUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VTZWxlY3RTaW5nbGUuanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIHRvTWF0Y2hlckFycmF5KG1vZGlmaWVyRnJvbVByb3ApIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RpZmllckZyb21Qcm9wKSkge1xuICAgICAgICByZXR1cm4gbW9kaWZpZXJGcm9tUHJvcDtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kaWZpZXJGcm9tUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbbW9kaWZpZXJGcm9tUHJvcF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG9NYXRjaGVyQXJyYXkuanMubWFwIiwiaW1wb3J0IHsgdG9NYXRjaGVyQXJyYXkgfSBmcm9tICcuL3RvTWF0Y2hlckFycmF5Jztcbi8qKiBSZXR1cm4gdGhlIFtbQ3VzdG9tTW9kaWZpZXJzXV0gZnJvbSB0aGUgRGF5UGlja2VyIGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VzdG9tTW9kaWZpZXJzKGRheVBpY2tlcikge1xuICAgIHZhciBjdXN0b21Nb2RpZmllcnMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhkYXlQaWNrZXIubW9kaWZpZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbW9kaWZpZXIgPSBfYVswXSwgbWF0Y2hlciA9IF9hWzFdO1xuICAgICAgICBjdXN0b21Nb2RpZmllcnNbbW9kaWZpZXJdID0gdG9NYXRjaGVyQXJyYXkobWF0Y2hlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGN1c3RvbU1vZGlmaWVycztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldEN1c3RvbU1vZGlmaWVycy5qcy5tYXAiLCIvKiogVGhlIG1vZGlmaWVycyB0aGF0IGFyZSB1c2VkIGludGVybmFsbHkgYnkgRGF5UGlja2VyLiAqL1xuZXhwb3J0IHZhciBJbnRlcm5hbE1vZGlmaWVyO1xuKGZ1bmN0aW9uIChJbnRlcm5hbE1vZGlmaWVyKSB7XG4gICAgLyoqIE5hbWUgb2YgdGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIGRpc2FibGVkIGRheXMsIHVzaW5nIHRoZSBgZGlzYWJsZWRgIHByb3AuICovXG4gICAgSW50ZXJuYWxNb2RpZmllcltcIkRpc2FibGVkXCJdID0gXCJkaXNhYmxlZFwiO1xuICAgIC8qKiBOYW1lIG9mIHRoZSBtb2RpZmllciBhcHBsaWVkIHRvIHRoZSBzZWxlY3RlZCBkYXlzIHVzaW5nIHRoZSBgc2VsZWN0ZWRgIHByb3ApLiAqL1xuICAgIEludGVybmFsTW9kaWZpZXJbXCJTZWxlY3RlZFwiXSA9IFwic2VsZWN0ZWRcIjtcbiAgICAvKiogTmFtZSBvZiB0aGUgbW9kaWZpZXIgYXBwbGllZCB0byB0aGUgaGlkZGVuIGRheXMgdXNpbmcgdGhlIGBoaWRkZW5gIHByb3ApLiAqL1xuICAgIEludGVybmFsTW9kaWZpZXJbXCJIaWRkZW5cIl0gPSBcImhpZGRlblwiO1xuICAgIC8qKiBOYW1lIG9mIHRoZSBtb2RpZmllciBhcHBsaWVkIHRvIHRoZSBkYXkgc3BlY2lmaWVkIHVzaW5nIHRoZSBgdG9kYXlgIHByb3ApLiAqL1xuICAgIEludGVybmFsTW9kaWZpZXJbXCJUb2RheVwiXSA9IFwidG9kYXlcIjtcbiAgICAvKiogVGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIGRheSBzdGFydGluZyBhIHNlbGVjdGVkIHJhbmdlLCB3aGVuIGluIHJhbmdlIHNlbGVjdGlvbiBtb2RlLiAgKi9cbiAgICBJbnRlcm5hbE1vZGlmaWVyW1wiUmFuZ2VTdGFydFwiXSA9IFwicmFuZ2Vfc3RhcnRcIjtcbiAgICAvKiogVGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIGRheSBlbmRpbmcgYSBzZWxlY3RlZCByYW5nZSwgd2hlbiBpbiByYW5nZSBzZWxlY3Rpb24gbW9kZS4gICovXG4gICAgSW50ZXJuYWxNb2RpZmllcltcIlJhbmdlRW5kXCJdID0gXCJyYW5nZV9lbmRcIjtcbiAgICAvKiogVGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIGRheXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgYSBzZWxlY3RlZCByYW5nZSwgd2hlbiBpbiByYW5nZSBzZWxlY3Rpb24gbW9kZS4gICovXG4gICAgSW50ZXJuYWxNb2RpZmllcltcIlJhbmdlTWlkZGxlXCJdID0gXCJyYW5nZV9taWRkbGVcIjtcbn0pKEludGVybmFsTW9kaWZpZXIgfHwgKEludGVybmFsTW9kaWZpZXIgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW9kaWZpZXJzLmpzLm1hcCIsImltcG9ydCB7IGlzRGF5UGlja2VyTXVsdGlwbGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9EYXlQaWNrZXJNdWx0aXBsZSc7XG5pbXBvcnQgeyBpc0RheVBpY2tlclJhbmdlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvRGF5UGlja2VyUmFuZ2UnO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2RpZmllciB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL01vZGlmaWVycyc7XG5pbXBvcnQgeyB0b01hdGNoZXJBcnJheSB9IGZyb20gJy4vdG9NYXRjaGVyQXJyYXknO1xuLyoqIFJldHVybiB0aGUgW1tJbnRlcm5hbE1vZGlmaWVyc11dIGZyb20gdGhlIERheVBpY2tlciBhbmQgc2VsZWN0IGNvbnRleHRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsTW9kaWZpZXJzKGRheVBpY2tlciwgc2VsZWN0TXVsdGlwbGUsIHNlbGVjdFJhbmdlKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBpbnRlcm5hbE1vZGlmaWVycyA9IChfYSA9IHt9LFxuICAgICAgICBfYVtJbnRlcm5hbE1vZGlmaWVyLlNlbGVjdGVkXSA9IHRvTWF0Y2hlckFycmF5KGRheVBpY2tlci5zZWxlY3RlZCksXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuRGlzYWJsZWRdID0gdG9NYXRjaGVyQXJyYXkoZGF5UGlja2VyLmRpc2FibGVkKSxcbiAgICAgICAgX2FbSW50ZXJuYWxNb2RpZmllci5IaWRkZW5dID0gdG9NYXRjaGVyQXJyYXkoZGF5UGlja2VyLmhpZGRlbiksXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuVG9kYXldID0gW2RheVBpY2tlci50b2RheV0sXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuUmFuZ2VFbmRdID0gW10sXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuUmFuZ2VNaWRkbGVdID0gW10sXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuUmFuZ2VTdGFydF0gPSBbXSxcbiAgICAgICAgX2EpO1xuICAgIGlmIChkYXlQaWNrZXIuZnJvbURhdGUpIHtcbiAgICAgICAgaW50ZXJuYWxNb2RpZmllcnMuZGlzYWJsZWQucHVzaCh7IGJlZm9yZTogZGF5UGlja2VyLmZyb21EYXRlIH0pO1xuICAgIH1cbiAgICBpZiAoZGF5UGlja2VyLnRvRGF0ZSkge1xuICAgICAgICBpbnRlcm5hbE1vZGlmaWVycy5kaXNhYmxlZC5wdXNoKHsgYWZ0ZXI6IGRheVBpY2tlci50b0RhdGUgfSk7XG4gICAgfVxuICAgIGlmIChpc0RheVBpY2tlck11bHRpcGxlKGRheVBpY2tlcikpIHtcbiAgICAgICAgaW50ZXJuYWxNb2RpZmllcnMuZGlzYWJsZWQgPSBpbnRlcm5hbE1vZGlmaWVycy5kaXNhYmxlZC5jb25jYXQoc2VsZWN0TXVsdGlwbGUubW9kaWZpZXJzLmRpc2FibGVkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNEYXlQaWNrZXJSYW5nZShkYXlQaWNrZXIpKSB7XG4gICAgICAgIGludGVybmFsTW9kaWZpZXJzLmRpc2FibGVkID0gaW50ZXJuYWxNb2RpZmllcnMuZGlzYWJsZWQuY29uY2F0KHNlbGVjdFJhbmdlLm1vZGlmaWVycy5kaXNhYmxlZCk7XG4gICAgICAgIGludGVybmFsTW9kaWZpZXJzLnJhbmdlX3N0YXJ0ID0gc2VsZWN0UmFuZ2UubW9kaWZpZXJzLnJhbmdlX3N0YXJ0O1xuICAgICAgICBpbnRlcm5hbE1vZGlmaWVycy5yYW5nZV9taWRkbGUgPSBzZWxlY3RSYW5nZS5tb2RpZmllcnMucmFuZ2VfbWlkZGxlO1xuICAgICAgICBpbnRlcm5hbE1vZGlmaWVycy5yYW5nZV9lbmQgPSBzZWxlY3RSYW5nZS5tb2RpZmllcnMucmFuZ2VfZW5kO1xuICAgIH1cbiAgICByZXR1cm4gaW50ZXJuYWxNb2RpZmllcnM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRJbnRlcm5hbE1vZGlmaWVycy5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VTZWxlY3RNdWx0aXBsZSB9IGZyb20gJy4uLy4uL2NvbnRleHRzL1NlbGVjdE11bHRpcGxlJztcbmltcG9ydCB7IHVzZVNlbGVjdFJhbmdlIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvU2VsZWN0UmFuZ2UnO1xuaW1wb3J0IHsgZ2V0Q3VzdG9tTW9kaWZpZXJzIH0gZnJvbSAnLi91dGlscy9nZXRDdXN0b21Nb2RpZmllcnMnO1xuaW1wb3J0IHsgZ2V0SW50ZXJuYWxNb2RpZmllcnMgfSBmcm9tICcuL3V0aWxzL2dldEludGVybmFsTW9kaWZpZXJzJztcbi8qKiBUaGUgTW9kaWZpZXJzIGNvbnRleHQgc3RvcmUgdGhlIG1vZGlmaWVycyB1c2VkIGluIERheVBpY2tlci4gVG8gYWNjZXNzIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbnRleHQsIHVzZSBbW3VzZU1vZGlmaWVyc11dLiAqL1xuZXhwb3J0IHZhciBNb2RpZmllcnNDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuLyoqIFByb3ZpZGUgdGhlIHZhbHVlIGZvciB0aGUgW1tNb2RpZmllcnNDb250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gTW9kaWZpZXJzUHJvdmlkZXIocHJvcHMpIHtcbiAgICB2YXIgZGF5UGlja2VyID0gdXNlRGF5UGlja2VyKCk7XG4gICAgdmFyIHNlbGVjdE11bHRpcGxlID0gdXNlU2VsZWN0TXVsdGlwbGUoKTtcbiAgICB2YXIgc2VsZWN0UmFuZ2UgPSB1c2VTZWxlY3RSYW5nZSgpO1xuICAgIHZhciBpbnRlcm5hbE1vZGlmaWVycyA9IGdldEludGVybmFsTW9kaWZpZXJzKGRheVBpY2tlciwgc2VsZWN0TXVsdGlwbGUsIHNlbGVjdFJhbmdlKTtcbiAgICB2YXIgY3VzdG9tTW9kaWZpZXJzID0gZ2V0Q3VzdG9tTW9kaWZpZXJzKGRheVBpY2tlcik7XG4gICAgdmFyIG1vZGlmaWVycyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBpbnRlcm5hbE1vZGlmaWVycyksIGN1c3RvbU1vZGlmaWVycyk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KE1vZGlmaWVyc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IG1vZGlmaWVycyB9LCBwcm9wcy5jaGlsZHJlbikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW9kaWZpZXJzQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTW9kaWZpZXJzQ29udGV4dCB9IGZyb20gJy4vTW9kaWZpZXJzQ29udGV4dCc7XG4vKiogSG9vayB0byBhY2Nlc3MgdGhlIFtbTW9kaWZpZXJzQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1vZGlmaWVycygpIHtcbiAgICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTW9kaWZpZXJzQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlTW9kaWZpZXJzIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBNb2RpZmllcnNQcm92aWRlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZU1vZGlmaWVycy5qcy5tYXAiLCIvKiogUmV0dXJucyB0cnVlIGlmIGBtYXRjaGVyYCBpcyBvZiB0eXBlIFtbRGF0ZUludGVydmFsXV0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlSW50ZXJ2YWwobWF0Y2hlcikge1xuICAgIHJldHVybiBCb29sZWFuKG1hdGNoZXIgJiZcbiAgICAgICAgdHlwZW9mIG1hdGNoZXIgPT09ICdvYmplY3QnICYmXG4gICAgICAgICdiZWZvcmUnIGluIG1hdGNoZXIgJiZcbiAgICAgICAgJ2FmdGVyJyBpbiBtYXRjaGVyKTtcbn1cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhIFtbRGF0ZVJhbmdlXV0gdHlwZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVSYW5nZSh2YWx1ZSkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIGRhdGVzPyFcbiAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdmcm9tJyBpbiB2YWx1ZSk7XG59XG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgb2YgdHlwZSBbW0RhdGVBZnRlcl1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZUFmdGVyVHlwZSh2YWx1ZSkge1xuICAgIHJldHVybiBCb29sZWFuKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2FmdGVyJyBpbiB2YWx1ZSk7XG59XG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgb2YgdHlwZSBbW0RhdGVCZWZvcmVdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVCZWZvcmVUeXBlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnYmVmb3JlJyBpbiB2YWx1ZSk7XG59XG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBbW0RheU9mV2Vla11dIHR5cGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXlPZldlZWtUeXBlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnZGF5T2ZXZWVrJyBpbiB2YWx1ZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXRjaGVycy5qcy5tYXAiLCJpbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsIGlzU2FtZURheSB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKiBSZXR1cm4gYHRydWVgIHdoZXRoZXIgdGhlIGdpdmVuIGRhdGUgaXMgaW5zaWRlIHRoZSByYW5nZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVJblJhbmdlKGRhdGUsIHJhbmdlKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBmcm9tID0gcmFuZ2UuZnJvbSwgdG8gPSByYW5nZS50bztcbiAgICBpZiAoIWZyb20pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRvICYmIGlzU2FtZURheShmcm9tLCBkYXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0bykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBpc1RvQmVmb3JlRnJvbSA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyh0bywgZnJvbSkgPCAwO1xuICAgIGlmICh0byAmJiBpc1RvQmVmb3JlRnJvbSkge1xuICAgICAgICBfYSA9IFt0bywgZnJvbV0sIGZyb20gPSBfYVswXSwgdG8gPSBfYVsxXTtcbiAgICB9XG4gICAgcmV0dXJuIChkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZSwgZnJvbSkgPj0gMCAmJlxuICAgICAgICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXModG8sIGRhdGUpID49IDApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNEYXRlSW5SYW5nZS5qcy5tYXAiLCJpbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsIGlzRGF0ZSwgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgaXNEYXRlQWZ0ZXJUeXBlLCBpc0RhdGVCZWZvcmVUeXBlLCBpc0RhdGVJbnRlcnZhbCwgaXNEYXRlUmFuZ2UsIGlzRGF5T2ZXZWVrVHlwZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL01hdGNoZXJzJztcbmltcG9ydCB7IGlzRGF0ZUluUmFuZ2UgfSBmcm9tICcuL2lzRGF0ZUluUmFuZ2UnO1xuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgRGF0ZSB0eXBlLiAqL1xuZnVuY3Rpb24gaXNEYXRlVHlwZSh2YWx1ZSkge1xuICAgIHJldHVybiBpc0RhdGUodmFsdWUpO1xufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IG9mIHZhbGlkIGRhdGVzLiAqL1xuZnVuY3Rpb24gaXNBcnJheU9mRGF0ZXModmFsdWUpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoaXNEYXRlKTtcbn1cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgd2hldGhlciB0aGUgZGF5IG1hdGNoZXMgYWdhaW5zdCB0aGUgZ2l2ZW4gbWF0Y2hlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoKGRheSwgbWF0Y2hlcnMpIHtcbiAgICByZXR1cm4gbWF0Y2hlcnMuc29tZShmdW5jdGlvbiAobWF0Y2hlcikge1xuICAgICAgICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGF0ZVR5cGUobWF0Y2hlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBpc1NhbWVEYXkoZGF5LCBtYXRjaGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBcnJheU9mRGF0ZXMobWF0Y2hlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLmluY2x1ZGVzKGRheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGF0ZVJhbmdlKG1hdGNoZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNEYXRlSW5SYW5nZShkYXksIG1hdGNoZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RheU9mV2Vla1R5cGUobWF0Y2hlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLmRheU9mV2Vlay5pbmNsdWRlcyhkYXkuZ2V0RGF5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RhdGVJbnRlcnZhbChtYXRjaGVyKSkge1xuICAgICAgICAgICAgdmFyIGlzQmVmb3JlID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKG1hdGNoZXIuYmVmb3JlLCBkYXkpID4gMDtcbiAgICAgICAgICAgIHZhciBpc0FmdGVyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGRheSwgbWF0Y2hlci5hZnRlcikgPiAwO1xuICAgICAgICAgICAgcmV0dXJuIGlzQmVmb3JlICYmIGlzQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGF0ZUFmdGVyVHlwZShtYXRjaGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhkYXksIG1hdGNoZXIuYWZ0ZXIpID4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEYXRlQmVmb3JlVHlwZShtYXRjaGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhtYXRjaGVyLmJlZm9yZSwgZGF5KSA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihkYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzTWF0Y2guanMubWFwIiwiaW1wb3J0IHsgaXNNYXRjaCB9IGZyb20gJy4vaXNNYXRjaCc7XG4vKipcbiAqIFJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBtb2RpZmllcnMgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBkYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kaWZpZXJTdGF0dXMoZGF0ZSwgXG4vKiogVGhlIG1vZGlmaWVycyB0byBtYXRjaCBmb3IgdGhlIGdpdmVuIGRhdGUuICovXG5tb2RpZmllcnMpIHtcbiAgICB2YXIgbW9kaWZpZXJzTGlzdCA9IE9iamVjdC5rZXlzKG1vZGlmaWVycykucmVkdWNlKGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBrZXkpIHtcbiAgICAgICAgdmFyIG1vZGlmaWVyID0gbW9kaWZpZXJzW2tleV07XG4gICAgICAgIGlmIChpc01hdGNoKGRhdGUsIG1vZGlmaWVyKSkge1xuICAgICAgICAgICAgcHJldmlvdXNWYWx1ZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzVmFsdWU7XG4gICAgfSwgW10pO1xuICAgIHZhciBtb2RpZmllcnNTdGF0dXMgPSB7fTtcbiAgICBtb2RpZmllcnNMaXN0LmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7IHJldHVybiAobW9kaWZpZXJzU3RhdHVzW21vZGlmaWVyXSA9IHRydWUpOyB9KTtcbiAgICByZXR1cm4gbW9kaWZpZXJzU3RhdHVzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0TW9kaWZpZXJTdGF0dXMuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VNb2RpZmllcnMgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9Nb2RpZmllcnMnO1xuaW1wb3J0IHsgZ2V0TW9kaWZpZXJTdGF0dXMgfSBmcm9tICcuL3V0aWxzL2dldE1vZGlmaWVyU3RhdHVzJztcbi8qKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBhbmQgaXRzIHN0eWxlcyBmb3IgdGhlIHNwZWNpZmllZCBkYXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURheU1vZGlmaWVycyhkYXRlKSB7XG4gICAgdmFyIGNvbnRleHQgPSB1c2VEYXlQaWNrZXIoKTtcbiAgICB2YXIgbW9kaWZpZXJzQ29udGV4dCA9IHVzZU1vZGlmaWVycygpO1xuICAgIC8vIFRPRE86IElzIHRoZXJlIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSB0eXBlIE1vZGlmaWVyU3RhdHVzP1xuICAgIHZhciBtb2RpZmllcnMgPSBnZXRNb2RpZmllclN0YXR1cyhkYXRlLCBtb2RpZmllcnNDb250ZXh0KTtcbiAgICB2YXIgbW9kaWZpZXJDbGFzc05hbWVzID0gW107XG4gICAgT2JqZWN0LmtleXMobW9kaWZpZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICB2YXIgY3VzdG9tQ2xhc3NOYW1lID0gY29udGV4dC5tb2RpZmllckNsYXNzTmFtZXNbbW9kaWZpZXJdO1xuICAgICAgICBpZiAoY3VzdG9tQ2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBtb2RpZmllckNsYXNzTmFtZXMucHVzaChjdXN0b21DbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbW9kaWZpZXJDbGFzc05hbWVzLnB1c2goXCJcIiArIGNvbnRleHQubW9kaWZpZXJQcmVmaXggKyBtb2RpZmllcik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgbW9kaWZpZXJTdHlsZSA9IHt9O1xuICAgIGlmIChjb250ZXh0Lm1vZGlmaWVyU3R5bGVzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG1vZGlmaWVycykuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIG1vZGlmaWVyU3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbW9kaWZpZXJTdHlsZSksIChfYSA9IGNvbnRleHQubW9kaWZpZXJTdHlsZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVttb2RpZmllcl0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kaWZpZXJzOiBtb2RpZmllcnMsXG4gICAgICAgIG1vZGlmaWVyQ2xhc3NOYW1lczogbW9kaWZpZXJDbGFzc05hbWVzLFxuICAgICAgICBtb2RpZmllclN0eWxlOiBtb2RpZmllclN0eWxlXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZURheU1vZGlmaWVycy5qcy5tYXAiLCJpbXBvcnQgeyBhZGREYXlzLCBlbmRPZk1vbnRoLCBzdGFydE9mTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBnZXRNb2RpZmllclN0YXR1cyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZURheU1vZGlmaWVycy91dGlscy9nZXRNb2RpZmllclN0YXR1cyc7XG52YXIgaXNGb2N1c2FibGUgPSBmdW5jdGlvbiAobW9kaWZpZXJzKSB7XG4gICAgcmV0dXJuICFtb2RpZmllcnMuZGlzYWJsZWQgJiYgIW1vZGlmaWVycy5oaWRkZW47XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBkYXkgdGhhdCBzaG91bGQgYmUgdGhlIHRhcmdldCBvZiB0aGUgZm9jdXMgd2hlbiBpbml0aWFsbHlcbiAqIHJlbmRlcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czpcbiAqICAxLiBpZiB0aGVyZSBpcyBhIHNlbGVjdGVkIGRheSwgZm9jdXMgb24gdGhlIChmaXJzdCkgc2VsZWN0ZWQgZGF5XG4gKiAgMi4gZWxzZSBpZiB0aGUgZGlzcGxheSBtb250aHMgaW5jbHVkZSB0aGUgY3VycmVudCBkYXRlICh0b2RheSkgZm9jdXMgb24gdGhlIGN1cnJlbnQgZGF0ZVxuICogIDMuIGVsc2UgZm9jdXMgb24gdGhlIGZpcnN0IGZvY3VzYWJsZSBkYXlcbiAqICA0LiBlbHNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZm9jdXMgb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYWxGb2N1c1RhcmdldChkaXNwbGF5TW9udGhzLCBtb2RpZmllcnNDb250ZXh0KSB7XG4gICAgdmFyIGZpcnN0RGF5SW5Nb250aCA9IHN0YXJ0T2ZNb250aChkaXNwbGF5TW9udGhzWzBdKTtcbiAgICB2YXIgbGFzdERheUluTW9udGggPSBlbmRPZk1vbnRoKGRpc3BsYXlNb250aHNbZGlzcGxheU1vbnRocy5sZW5ndGggLSAxXSk7XG4gICAgdmFyIGZpcnN0Rm9jdXNhYmxlRGF5O1xuICAgIHZhciB0b2RheTtcbiAgICB2YXIgZGF0ZSA9IGZpcnN0RGF5SW5Nb250aDtcbiAgICB3aGlsZSAoZGF0ZSA8PSBsYXN0RGF5SW5Nb250aCkge1xuICAgICAgICB2YXIgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJTdGF0dXMoZGF0ZSwgbW9kaWZpZXJzQ29udGV4dCk7XG4gICAgICAgIGlmICghaXNGb2N1c2FibGUobW9kaWZpZXJzKSkge1xuICAgICAgICAgICAgZGF0ZSA9IGFkZERheXMoZGF0ZSwgMSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kaWZpZXJzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kaWZpZXJzLnRvZGF5ICYmICF0b2RheSkge1xuICAgICAgICAgICAgdG9kYXkgPSBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmlyc3RGb2N1c2FibGVEYXkpIHtcbiAgICAgICAgICAgIGZpcnN0Rm9jdXNhYmxlRGF5ID0gZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBkYXRlID0gYWRkRGF5cyhkYXRlLCAxKTtcbiAgICB9XG4gICAgaWYgKHRvZGF5KSB7XG4gICAgICAgIHJldHVybiB0b2RheTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaXJzdEZvY3VzYWJsZURheTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRJbml0aWFsRm9jdXNUYXJnZXQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGFkZERheXMsIGFkZE1vbnRocywgYWRkV2Vla3MsIGFkZFllYXJzLCBlbmRPZldlZWssIGlzU2FtZU1vbnRoLCBzdGFydE9mV2VlayB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VNb2RpZmllcnMgfSBmcm9tICcuLi9Nb2RpZmllcnMnO1xuaW1wb3J0IHsgdXNlTmF2aWdhdGlvbiB9IGZyb20gJy4uL05hdmlnYXRpb24vdXNlTmF2aWdhdGlvbic7XG5pbXBvcnQgeyBnZXRJbml0aWFsRm9jdXNUYXJnZXQgfSBmcm9tICcuL2dldEluaXRpYWxGb2N1c1RhcmdldCc7XG4vKipcbiAqIFRoZSBGb2N1cyBjb250ZXh0IHNoYXJlcyBkZXRhaWxzIGFib3V0IHRoZSBmb2N1c2VkIGRheSBmb3IgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gKlxuICogQWNjZXNzIHRoaXMgY29udGV4dCBmcm9tIHRoZSBbW3VzZUZvY3VzXV0gaG9vay5cbiAqL1xuZXhwb3J0IHZhciBGb2N1c0NvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG4vKiogVGhlIHByb3ZpZGVyIGZvciB0aGUgW1tGb2N1c0NvbnRleHRdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBGb2N1c1Byb3ZpZGVyKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XG4gICAgdmFyIF9iID0gUmVhY3QudXNlU3RhdGUoKSwgZm9jdXNlZERheSA9IF9iWzBdLCBzZXREYXkgPSBfYlsxXTtcbiAgICB2YXIgX2MgPSB1c2VOYXZpZ2F0aW9uKCksIGdvVG9Nb250aCA9IF9jLmdvVG9Nb250aCwgZGlzcGxheU1vbnRocyA9IF9jLmRpc3BsYXlNb250aHM7XG4gICAgdmFyIG51bWJlck9mTW9udGhzID0gdXNlRGF5UGlja2VyKCkubnVtYmVyT2ZNb250aHM7XG4gICAgdmFyIG1vZGlmaWVyc0NvbnRleHQgPSB1c2VNb2RpZmllcnMoKTtcbiAgICB2YXIgaW5pdGlhbEZvY3VzVGFyZ2V0ID0gZ2V0SW5pdGlhbEZvY3VzVGFyZ2V0KGRpc3BsYXlNb250aHMsIG1vZGlmaWVyc0NvbnRleHQpO1xuICAgIHZhciBfZCA9IFJlYWN0LnVzZVN0YXRlKCksIGxhc3RGb2N1c2VkRGF5ID0gX2RbMF0sIHNldExhc3RGb2N1c2VkRGF5ID0gX2RbMV07XG4gICAgdmFyIGlzV2l0aGluRGlzcGxheU1vbnRocyA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkaXNwbGF5TW9udGhzLnNvbWUoZnVuY3Rpb24gKGRpc3BsYXlNb250aCkgeyByZXR1cm4gaXNTYW1lTW9udGgoZGF0ZSwgZGlzcGxheU1vbnRoKTsgfSk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNUYXJnZXQgPSAoZm9jdXNlZERheSAhPT0gbnVsbCAmJiBmb2N1c2VkRGF5ICE9PSB2b2lkIDAgPyBmb2N1c2VkRGF5IDogKGxhc3RGb2N1c2VkRGF5ICYmIGlzV2l0aGluRGlzcGxheU1vbnRocyhsYXN0Rm9jdXNlZERheSkpKVxuICAgICAgICA/IGxhc3RGb2N1c2VkRGF5XG4gICAgICAgIDogaW5pdGlhbEZvY3VzVGFyZ2V0O1xuICAgIHZhciBibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRMYXN0Rm9jdXNlZERheShmb2N1c2VkRGF5KTtcbiAgICAgICAgc2V0RGF5KHVuZGVmaW5lZCk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXMgPSBmdW5jdGlvbiAoZGF0ZSkgeyByZXR1cm4gc2V0RGF5KGRhdGUpOyB9O1xuICAgIHZhciBzd2l0Y2hNb250aCA9IGZ1bmN0aW9uIChkYXRlLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKGRpc3BsYXlNb250aHMuc29tZShmdW5jdGlvbiAobSkgeyByZXR1cm4gaXNTYW1lTW9udGgoZGF0ZSwgbSk7IH0pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgZ29Ub01vbnRoKGFkZE1vbnRocyhkYXRlLCAxICsgb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnb1RvTW9udGgoZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciBmb2N1c0RheUJlZm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgYmVmb3JlID0gYWRkRGF5cyhmb2N1c2VkRGF5LCAtMSk7XG4gICAgICAgIGZvY3VzKGJlZm9yZSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKGJlZm9yZSwgbnVtYmVyT2ZNb250aHMgKiAtMSk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNEYXlBZnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgYWZ0ZXIgPSBhZGREYXlzKGZvY3VzZWREYXksIDEpO1xuICAgICAgICBmb2N1cyhhZnRlcik7XG4gICAgICAgIHN3aXRjaE1vbnRoKGFmdGVyLCBudW1iZXJPZk1vbnRocyk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNXZWVrQmVmb3JlRGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciB1cCA9IGFkZFdlZWtzKGZvY3VzZWREYXksIC0xKTtcbiAgICAgICAgZm9jdXModXApO1xuICAgICAgICBzd2l0Y2hNb250aCh1cCwgbnVtYmVyT2ZNb250aHMgKiAtMSk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNXZWVrQWZ0ZXJEYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZm9jdXNlZERheSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGRvd24gPSBhZGRXZWVrcyhmb2N1c2VkRGF5LCAxKTtcbiAgICAgICAgZm9jdXMoZG93bik7XG4gICAgICAgIHN3aXRjaE1vbnRoKGRvd24sIG51bWJlck9mTW9udGhzKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c1N0YXJ0T2ZXZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBkYXlUb0ZvY3VzID0gc3RhcnRPZldlZWsoZm9jdXNlZERheSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKGRheVRvRm9jdXMsIG51bWJlck9mTW9udGhzKTtcbiAgICAgICAgZm9jdXMoZGF5VG9Gb2N1cyk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNFbmRPZldlZWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZm9jdXNlZERheSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGRheVRvRm9jdXMgPSBlbmRPZldlZWsoZm9jdXNlZERheSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKGRheVRvRm9jdXMsIG51bWJlck9mTW9udGhzKTtcbiAgICAgICAgZm9jdXMoZGF5VG9Gb2N1cyk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNNb250aEJlZm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgbW9udGhCZWZvcmUgPSBhZGRNb250aHMoZm9jdXNlZERheSwgLTEpO1xuICAgICAgICBzd2l0Y2hNb250aChtb250aEJlZm9yZSwgbnVtYmVyT2ZNb250aHMpO1xuICAgICAgICBmb2N1cyhtb250aEJlZm9yZSk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNNb250aEFmdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBtb250aEFmdGVyID0gYWRkTW9udGhzKGZvY3VzZWREYXksIDEpO1xuICAgICAgICBzd2l0Y2hNb250aChtb250aEFmdGVyLCBudW1iZXJPZk1vbnRocyk7XG4gICAgICAgIGZvY3VzKG1vbnRoQWZ0ZXIpO1xuICAgIH07XG4gICAgdmFyIGZvY3VzWWVhckJlZm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgeWVhckJlZm9yZSA9IGFkZFllYXJzKGZvY3VzZWREYXksIC0xKTtcbiAgICAgICAgc3dpdGNoTW9udGgoeWVhckJlZm9yZSwgbnVtYmVyT2ZNb250aHMpO1xuICAgICAgICBmb2N1cyh5ZWFyQmVmb3JlKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c1llYXJBZnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgeWVhckFmdGVyID0gYWRkWWVhcnMoZm9jdXNlZERheSwgMSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKHllYXJBZnRlciwgbnVtYmVyT2ZNb250aHMpO1xuICAgICAgICBmb2N1cyh5ZWFyQWZ0ZXIpO1xuICAgIH07XG4gICAgdmFyIHZhbHVlID0ge1xuICAgICAgICBmb2N1c2VkRGF5OiBmb2N1c2VkRGF5LFxuICAgICAgICBmb2N1c1RhcmdldDogZm9jdXNUYXJnZXQsXG4gICAgICAgIGJsdXI6IGJsdXIsXG4gICAgICAgIGZvY3VzOiBmb2N1cyxcbiAgICAgICAgZm9jdXNEYXlBZnRlcjogZm9jdXNEYXlBZnRlcixcbiAgICAgICAgZm9jdXNEYXlCZWZvcmU6IGZvY3VzRGF5QmVmb3JlLFxuICAgICAgICBmb2N1c1dlZWtBZnRlckRheTogZm9jdXNXZWVrQWZ0ZXJEYXksXG4gICAgICAgIGZvY3VzV2Vla0JlZm9yZURheTogZm9jdXNXZWVrQmVmb3JlRGF5LFxuICAgICAgICBmb2N1c01vbnRoQmVmb3JlOiBmb2N1c01vbnRoQmVmb3JlLFxuICAgICAgICBmb2N1c01vbnRoQWZ0ZXI6IGZvY3VzTW9udGhBZnRlcixcbiAgICAgICAgZm9jdXNZZWFyQmVmb3JlOiBmb2N1c1llYXJCZWZvcmUsXG4gICAgICAgIGZvY3VzWWVhckFmdGVyOiBmb2N1c1llYXJBZnRlcixcbiAgICAgICAgZm9jdXNTdGFydE9mV2VlazogZm9jdXNTdGFydE9mV2VlayxcbiAgICAgICAgZm9jdXNFbmRPZldlZWs6IGZvY3VzRW5kT2ZXZWVrXG4gICAgfTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiB2YWx1ZSB9LCBjaGlsZHJlbikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rm9jdXNDb250ZXh0LmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGb2N1c0NvbnRleHQgfSBmcm9tICcuL0ZvY3VzQ29udGV4dCc7XG4vKiogSG9vayB0byBhY2Nlc3MgdGhlIFtbRm9jdXNDb250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRm9jdXMoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZvY3VzQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlRm9jdXMgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIEZvY3VzUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VGb2N1cy5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZUZvY3VzIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dHMvRm9jdXMnO1xuLyoqIEhhbmRsZSB0aGUgZm9jdXMgZm9yIHRoZSBkYXkgZWxlbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXlGb2N1cyhkYXRlLCBidXR0b25SZWYpIHtcbiAgICB2YXIgX2EgPSB1c2VGb2N1cygpLCBmb2N1c2VkRGF5ID0gX2EuZm9jdXNlZERheSwgZm9jdXNUYXJnZXQgPSBfYS5mb2N1c1RhcmdldCwgZm9jdXNEYXlBZnRlciA9IF9hLmZvY3VzRGF5QWZ0ZXIsIGZvY3VzRGF5QmVmb3JlID0gX2EuZm9jdXNEYXlCZWZvcmUsIGZvY3VzV2Vla0FmdGVyRGF5ID0gX2EuZm9jdXNXZWVrQWZ0ZXJEYXksIGZvY3VzV2Vla0JlZm9yZURheSA9IF9hLmZvY3VzV2Vla0JlZm9yZURheSwgYmx1ciA9IF9hLmJsdXIsIGZvY3VzID0gX2EuZm9jdXMsIGZvY3VzTW9udGhCZWZvcmUgPSBfYS5mb2N1c01vbnRoQmVmb3JlLCBmb2N1c01vbnRoQWZ0ZXIgPSBfYS5mb2N1c01vbnRoQWZ0ZXIsIGZvY3VzWWVhckJlZm9yZSA9IF9hLmZvY3VzWWVhckJlZm9yZSwgZm9jdXNZZWFyQWZ0ZXIgPSBfYS5mb2N1c1llYXJBZnRlciwgZm9jdXNTdGFydE9mV2VlayA9IF9hLmZvY3VzU3RhcnRPZldlZWssIGZvY3VzRW5kT2ZXZWVrID0gX2EuZm9jdXNFbmRPZldlZWs7XG4gICAgdmFyIGRpciA9IHVzZURheVBpY2tlcigpLmRpcjtcbiAgICAvLyBGb2N1cyB0aGUgSFRNTCBlbGVtZW50IGlmIHRoaXMgaXMgdGhlIGZvY3VzZWQgZGF5LlxuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoaXNTYW1lRGF5KGZvY3VzZWREYXksIGRhdGUpKSB7XG4gICAgICAgICAgICAoX2EgPSBidXR0b25SZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9LCBbZm9jdXNlZERheSwgZGF0ZSwgYnV0dG9uUmVmXSk7XG4gICAgdmFyIGZvY3VzT25LZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBkaXIgPT09ICdydGwnID8gZm9jdXNEYXlBZnRlcigpIDogZm9jdXNEYXlCZWZvcmUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGRpciA9PT0gJ3J0bCcgPyBmb2N1c0RheUJlZm9yZSgpIDogZm9jdXNEYXlBZnRlcigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBmb2N1c1dlZWtBZnRlckRheSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgZm9jdXNXZWVrQmVmb3JlRGF5KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGUuc2hpZnRLZXkgPyBmb2N1c1llYXJCZWZvcmUoKSA6IGZvY3VzTW9udGhCZWZvcmUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnNoaWZ0S2V5ID8gZm9jdXNZZWFyQWZ0ZXIoKSA6IGZvY3VzTW9udGhBZnRlcigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgZm9jdXNTdGFydE9mV2VlaygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBmb2N1c0VuZE9mV2VlaygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgaXNGb2N1c1RhcmdldCA9IEJvb2xlYW4oZm9jdXNUYXJnZXQgJiYgaXNTYW1lRGF5KGZvY3VzVGFyZ2V0LCBkYXRlKSk7XG4gICAgcmV0dXJuIHsgZm9jdXM6IGZvY3VzLCBibHVyOiBibHVyLCBmb2N1c09uS2V5RG93bjogZm9jdXNPbktleURvd24sIGlzRm9jdXNUYXJnZXQ6IGlzRm9jdXNUYXJnZXQgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZURheUZvY3VzLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNTYW1lTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgdXNlU2VsZWN0TXVsdGlwbGUgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0cy9TZWxlY3RNdWx0aXBsZSc7XG5pbXBvcnQgeyB1c2VTZWxlY3RSYW5nZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHRzL1NlbGVjdFJhbmdlJztcbmltcG9ydCB7IHVzZVNlbGVjdFNpbmdsZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHRzL1NlbGVjdFNpbmdsZSc7XG5pbXBvcnQgeyB1c2VEYXlNb2RpZmllcnMgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VEYXlNb2RpZmllcnMnO1xuaW1wb3J0IHsgaXNEYXlQaWNrZXJNdWx0aXBsZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0RheVBpY2tlck11bHRpcGxlJztcbmltcG9ydCB7IGlzRGF5UGlja2VyUmFuZ2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9EYXlQaWNrZXJSYW5nZSc7XG5pbXBvcnQgeyBpc0RheVBpY2tlclNpbmdsZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0RheVBpY2tlclNpbmdsZSc7XG5pbXBvcnQgeyB1c2VEYXlGb2N1cyB9IGZyb20gJy4vdXNlRGF5Rm9jdXMnO1xuLyoqXG4gKiBUaGlzIGhvb2sgcmV0dXJucyBkZXRhaWxzIGFib3V0IHRoZSBjb250ZW50IHRvIHJlbmRlciBpbiB0aGUgZGF5IGNlbGwuXG4gKlxuICpcbiAqIFdoZW4gYSBkYXkgY2VsbCBpcyByZW5kZXJlZCBpbiB0aGUgdGFibGUsIERheVBpY2tlciBjYW4gZWl0aGVyOlxuICpcbiAqIC0gcmVuZGVyIG5vdGhpbmc6IHdoZW4gdGhlIGRheSBpcyBvdXRzaWRlIHRoZSBtb250aCBvciBoYXMgbWF0Y2hlZCB0aGVcbiAqICAgXCJoaWRkZW5cIiBtb2RpZmllci5cbiAqIC0gcmVuZGVyIGEgYnV0dG9uLiBXaGVuIGEgc2VsZWN0aW9uIG1vZGUgaXMgc2V0LCBEYXlQaWNrZXIgcmVuZGVycyBhIGJ1dHRvblxuICogICB0byBhbGxvdyB0aGUgZm9jdXMgYW5kIHRoZSBzZWxlY3Rpb24uIEluIGNhc2Ugb2YgYGN1c3RvbWAgc2VsZWN0aW9uXG4gKiAgIG1vZGUsIERheVBpY2tlciBleHBlY3RzIGEgYG9uRGF5Q2xpY2tgIHByb3AgdG8gcmVuZGVyIGEgYnV0dG9uLlxuICogLSByZW5kZXIgYSBub24taW50ZXJhY3RpdmUgZWxlbWVudDogd2hlbiBubyBzZWxlY3Rpb24gbW9kZSBpcyBzZXQsIHRoZSBkYXlcbiAqICAgY2VsbCBzaG91bGRu4oCZdCByZXNwb25kIHRvIGFueSBpbnRlcmFjdGlvbi4gRGF5UGlja2VyIHNob3VsZCByZW5kZXIgYSBgZGl2YFxuICogICBvciBhIGBzcGFuYC5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBVc2UgdGhpcyBob29rIHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIFtbRGF5XV0gY29tcG9uZW50LiBDcmVhdGUgYVxuICogbmV3IGBEYXlgIGNvbXBvbmVudCB1c2luZyB0aGlzIGhvb2sgYW5kIHBhc3MgaXQgdG8gdGhlIGBjb21wb25lbnRzYCBwcm9wLlxuICogVGhlIHNvdXJjZSBvZiBbW0RheV1dIGNhbiBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXkoXG4vKiogVGhlIGRheSByZW5kZXJlZCBpbiB0aGUgbW9udGguICovXG5kYXRlLCBcbi8qKiBUaGUgbW9udGggd2hlcmUgdGhlIGRhdGUgaXMgZGlzcGxheWVkLiBEYXlQaWNrZXIgcmVuZGVycyBkYXlzIG91dHNpZGUgdGhlIGRpc3BsYXkgbW9udGggd2hlbiBgc2hvd091dHNpZGVEYXlzYCBpcyB0cnVlLiAqL1xuZGlzcGxheU1vbnRoLCBcbi8qKiBBIHJlZiB0byB0aGUgYnV0dG9uIGVsZW1lbnQuICovXG5idXR0b25SZWYpIHtcbiAgICB2YXIgY29udGV4dCA9IHVzZURheVBpY2tlcigpO1xuICAgIHZhciBzaW5nbGUgPSB1c2VTZWxlY3RTaW5nbGUoKTtcbiAgICB2YXIgbXVsdGlwbGUgPSB1c2VTZWxlY3RNdWx0aXBsZSgpO1xuICAgIHZhciByYW5nZSA9IHVzZVNlbGVjdFJhbmdlKCk7XG4gICAgdmFyIF9hID0gdXNlRGF5Rm9jdXMoZGF0ZSwgYnV0dG9uUmVmKSwgZm9jdXMgPSBfYS5mb2N1cywgYmx1ciA9IF9hLmJsdXIsIGZvY3VzT25LZXlEb3duID0gX2EuZm9jdXNPbktleURvd24sIGlzRm9jdXNUYXJnZXQgPSBfYS5pc0ZvY3VzVGFyZ2V0O1xuICAgIHZhciBfYiA9IHVzZURheU1vZGlmaWVycyhkYXRlKSwgbW9kaWZpZXJzID0gX2IubW9kaWZpZXJzLCBtb2RpZmllckNsYXNzTmFtZXMgPSBfYi5tb2RpZmllckNsYXNzTmFtZXMsIG1vZGlmaWVyU3R5bGUgPSBfYi5tb2RpZmllclN0eWxlO1xuICAgIHZhciBpc091dHNpZGUgPSAhaXNTYW1lTW9udGgoZGF0ZSwgZGlzcGxheU1vbnRoKTtcbiAgICB2YXIgcmV0dXJuVmFsdWUgPSB7XG4gICAgICAgIGlzT3V0c2lkZTogaXNPdXRzaWRlLFxuICAgICAgICBtb2RpZmllcnM6IG1vZGlmaWVycyxcbiAgICAgICAgc2VsZWN0ZWQ6IGlzRGF5UGlja2VyU2luZ2xlKGNvbnRleHQpXG4gICAgICAgICAgICA/IHNpbmdsZS5zZWxlY3RlZFxuICAgICAgICAgICAgOiBpc0RheVBpY2tlck11bHRpcGxlKGNvbnRleHQpXG4gICAgICAgICAgICAgICAgPyBtdWx0aXBsZS5zZWxlY3RlZFxuICAgICAgICAgICAgICAgIDogaXNEYXlQaWNrZXJSYW5nZShjb250ZXh0KVxuICAgICAgICAgICAgICAgICAgICA/IHJhbmdlLnNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBzaW5nbGU6IHNpbmdsZSxcbiAgICAgICAgbXVsdGlwbGU6IG11bHRpcGxlLFxuICAgICAgICByYW5nZTogcmFuZ2VcbiAgICB9O1xuICAgIGlmIChpc091dHNpZGUgJiYgIWNvbnRleHQuc2hvd091dHNpZGVEYXlzKSB7XG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVycy5oaWRkZW4pIHtcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cbiAgICB2YXIgY2xhc3NOYW1lcyA9IFtjb250ZXh0LmNsYXNzTmFtZXMuZGF5XS5jb25jYXQobW9kaWZpZXJDbGFzc05hbWVzKTtcbiAgICB2YXIgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29udGV4dC5zdHlsZXMuZGF5KSwgbW9kaWZpZXJTdHlsZSk7XG4gICAgaWYgKGlzT3V0c2lkZSkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goY29udGV4dC5jbGFzc05hbWVzLmRheV9vdXRzaWRlKTtcbiAgICAgICAgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29udGV4dC5zdHlsZXMpLCBjb250ZXh0LnN0eWxlcy5kYXlfb3V0c2lkZSk7XG4gICAgfVxuICAgIHZhciBEYXlDb250ZW50ID0gY29udGV4dC5jb21wb25lbnRzLkRheUNvbnRlbnQ7XG4gICAgdmFyIGNoaWxkcmVuID0gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGF5Q29udGVudCwgeyBkYXRlOiBkYXRlLCBkaXNwbGF5TW9udGg6IGRpc3BsYXlNb250aCwgbW9kaWZpZXJzOiBtb2RpZmllcnMgfSkpO1xuICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzLmpvaW4oJyAnKTtcbiAgICBpZiAoIWNvbnRleHQubW9kZSAmJiAhY29udGV4dC5vbkRheUNsaWNrKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmV0dXJuVmFsdWUpLCB7IG5vbkludGVyYWN0aXZlUHJvcHM6IHtcbiAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgICAgICB9IH0pO1xuICAgIH1cbiAgICAvLyAjcmVnaW9uIEV2ZW50IGhhbmRsZXJzXG4gICAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBpZiAoaXNEYXlQaWNrZXJTaW5nbGUoY29udGV4dCkpIHtcbiAgICAgICAgICAgIChfYSA9IHNpbmdsZS5vbkRheUNsaWNrKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChzaW5nbGUsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNEYXlQaWNrZXJNdWx0aXBsZShjb250ZXh0KSkge1xuICAgICAgICAgICAgKF9iID0gbXVsdGlwbGUub25EYXlDbGljaykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwobXVsdGlwbGUsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNEYXlQaWNrZXJSYW5nZShjb250ZXh0KSkge1xuICAgICAgICAgICAgKF9jID0gcmFuZ2Uub25EYXlDbGljaykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNhbGwocmFuZ2UsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgKF9kID0gY29udGV4dC5vbkRheUNsaWNrKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZUZvY3VzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBmb2N1cyhkYXRlKTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheUZvY3VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZUJsdXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGJsdXIoKTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheUJsdXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgZm9jdXNPbktleURvd24oZSk7XG4gICAgICAgIChfYSA9IGNvbnRleHQub25EYXlLZXlEb3duKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZUtleVVwID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5S2V5VXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlTW91c2VFbnRlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheU1vdXNlRW50ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheU1vdXNlTGVhdmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlVG91Y2hDYW5jZWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGNvbnRleHQub25EYXlUb3VjaENhbmNlbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVUb3VjaEVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheVRvdWNoRW5kKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZVRvdWNoTW92ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheVRvdWNoTW92ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVUb3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5VG91Y2hTdGFydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIGlmIChpc091dHNpZGUpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKGNvbnRleHQuY2xhc3NOYW1lcy5kYXlfb3V0c2lkZSk7XG4gICAgICAgIHN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbnRleHQuc3R5bGVzKSwgY29udGV4dC5zdHlsZXMuZGF5X291dHNpZGUpO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWVzLmpvaW4oJyAnKTtcbiAgICB2YXIgc2VsZWN0ZWQgPSBtb2RpZmllcnMuc2VsZWN0ZWQsIGRpc2FibGVkID0gbW9kaWZpZXJzLmRpc2FibGVkO1xuICAgIHZhciB0YWJJbmRleCA9IGlzRm9jdXNUYXJnZXQgPyAwIDogLTE7XG4gICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXR1cm5WYWx1ZSksIHsgYnV0dG9uUHJvcHM6IHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgICAgICAgICdhcmlhLXByZXNzZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgICAgICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgICAgICAgICBvbkZvY3VzOiBoYW5kbGVGb2N1cyxcbiAgICAgICAgICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICAgICAgICAgIG9uS2V5RG93bjogaGFuZGxlS2V5RG93bixcbiAgICAgICAgICAgIG9uS2V5VXA6IGhhbmRsZUtleVVwLFxuICAgICAgICAgICAgb25Nb3VzZUVudGVyOiBoYW5kbGVNb3VzZUVudGVyLFxuICAgICAgICAgICAgb25Nb3VzZUxlYXZlOiBoYW5kbGVNb3VzZUxlYXZlLFxuICAgICAgICAgICAgb25Ub3VjaENhbmNlbDogaGFuZGxlVG91Y2hDYW5jZWwsXG4gICAgICAgICAgICBvblRvdWNoRW5kOiBoYW5kbGVUb3VjaEVuZCxcbiAgICAgICAgICAgIG9uVG91Y2hNb3ZlOiBoYW5kbGVUb3VjaE1vdmUsXG4gICAgICAgICAgICBvblRvdWNoU3RhcnQ6IGhhbmRsZVRvdWNoU3RhcnRcbiAgICAgICAgfSB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZURheS5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4uL0J1dHRvbic7XG5pbXBvcnQgeyB1c2VEYXkgfSBmcm9tICcuL2hvb2tzL3VzZURheSc7XG4vKipcbiAqIFRoZSBjb250ZW50IG9mIGEgZGF5IGNlbGwg4oCTIGFzIGEgYnV0dG9uIG9yIHNwYW4gZWxlbWVudCBhY2NvcmRpbmcgdG8gaXRzXG4gKiBtb2RpZmllcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEYXkocHJvcHMpIHtcbiAgICB2YXIgYnV0dG9uUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIHZhciBkYXkgPSB1c2VEYXkocHJvcHMuZGF0ZSwgcHJvcHMuZGlzcGxheU1vbnRoLCBidXR0b25SZWYpO1xuICAgIHZhciBidXR0b25Qcm9wcyA9IGRheS5idXR0b25Qcm9wcywgbm9uSW50ZXJhY3RpdmVQcm9wcyA9IGRheS5ub25JbnRlcmFjdGl2ZVByb3BzO1xuICAgIGlmICghYnV0dG9uUHJvcHMgJiYgIW5vbkludGVyYWN0aXZlUHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwpO1xuICAgIH1cbiAgICBpZiAobm9uSW50ZXJhY3RpdmVQcm9wcykge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfX2Fzc2lnbih7fSwgbm9uSW50ZXJhY3RpdmVQcm9wcykpO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b24sIF9fYXNzaWduKHsgcmVmOiBidXR0b25SZWYgfSwgYnV0dG9uUHJvcHMpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURheS5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbi8qKlxuICogUmVuZGVyIHRoZSBjb250ZW50IG9mIHRoZSBkYXkgY2VsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERheUNvbnRlbnQocHJvcHMpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgbG9jYWxlID0gX2EubG9jYWxlLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Euc3R5bGVzLCBsYWJlbERheSA9IF9hLmxhYmVscy5sYWJlbERheSwgZm9ybWF0RGF5ID0gX2EuZm9ybWF0dGVycy5mb3JtYXREYXk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIgfSwgZm9ybWF0RGF5KHByb3BzLmRhdGUsIHsgbG9jYWxlOiBsb2NhbGUgfSkpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy52aGlkZGVuLCBzdHlsZTogc3R5bGVzLnZoaWRkZW4gfSwgbGFiZWxEYXkocHJvcHMuZGF0ZSwgcHJvcHMubW9kaWZpZXJzLCB7IGxvY2FsZTogbG9jYWxlIH0pKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5Q29udGVudC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbi8qKlxuICogUmVuZGVyIGEgc3R5bGVkIHNlbGVjdCBjb21wb25lbnQg4oCTIGRpc3BsYXlpbmcgYSBjYXB0aW9uIGFuZCBhIGN1c3RvbVxuICogZHJvcC1kb3duIGljb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEcm9wZG93bihwcm9wcykge1xuICAgIHZhciBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLCB2YWx1ZSA9IHByb3BzLnZhbHVlLCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLCBjYXB0aW9uID0gcHJvcHMuY2FwdGlvbiwgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLCBzdHlsZSA9IHByb3BzLnN0eWxlO1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Euc3R5bGVzLCBJY29uRHJvcGRvd24gPSBfYS5jb21wb25lbnRzLkljb25Ecm9wZG93bjtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZSwgc3R5bGU6IHN0eWxlIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnZoaWRkZW4gfSwgcHJvcHNbJ2FyaWEtbGFiZWwnXSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIiwgeyBcImFyaWEtbGFiZWxcIjogcHJvcHNbJ2FyaWEtbGFiZWwnXSwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmRyb3Bkb3duLCBzdHlsZTogc3R5bGVzLmRyb3Bkb3duLCB2YWx1ZTogdmFsdWUsIG9uQ2hhbmdlOiBvbkNoYW5nZSB9LCBjaGlsZHJlbiksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuY2FwdGlvbl9sYWJlbCwgc3R5bGU6IHN0eWxlcy5jYXB0aW9uX2xhYmVsLCBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiIH0sXG4gICAgICAgICAgICBjYXB0aW9uLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChJY29uRHJvcGRvd24sIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmRyb3Bkb3duX2ljb24sIHN0eWxlOiBzdHlsZXMuZHJvcGRvd25faWNvbiB9KSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURyb3Bkb3duLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqIFJlbmRlciB0aGUgRm9vdGVyIGNvbXBvbmVudCAoZW1wdHkgYXMgZGVmYXVsdCkuKi9cbmV4cG9ydCBmdW5jdGlvbiBGb290ZXIoKSB7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGZvb3RlciA9IF9hLmZvb3Rlciwgc3R5bGVzID0gX2Euc3R5bGVzLCB0Zm9vdCA9IF9hLmNsYXNzTmFtZXMudGZvb3Q7XG4gICAgaWYgKCFmb290ZXIpXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0Zm9vdFwiLCB7IGNsYXNzTmFtZTogdGZvb3QsIHN0eWxlOiBzdHlsZXMudGZvb3QgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIG51bGwsXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyBjb2xTcGFuOiA4IH0sIGZvb3RlcikpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Gb290ZXIuanMubWFwIiwiaW1wb3J0IHsgYWRkRGF5cywgc3RhcnRPZldlZWsgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIEdlbmVyYXRlIGEgc2VyaWVzIG9mIDcgZGF5cywgc3RhcnRpbmcgZnJvbSB0aGUgd2VlaywgdG8gdXNlIGZvciBmb3JtYXR0aW5nXG4gKiB0aGUgd2Vla2RheSBuYW1lcyAoTW9uZGF5LCBUdWVzZGF5LCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtkYXlzKGxvY2FsZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKCksIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgdmFyIGRheXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICB2YXIgZGF5ID0gYWRkRGF5cyhzdGFydCwgaSk7XG4gICAgICAgIGRheXMucHVzaChkYXkpO1xuICAgIH1cbiAgICByZXR1cm4gZGF5cztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldFdlZWtkYXlzLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgZ2V0V2Vla2RheXMgfSBmcm9tICcuL3V0aWxzJztcbi8qKlxuICogUmVuZGVyIHRoZSBIZWFkIGNvbXBvbmVudCAtIGkuZS4gdGhlIHRhYmxlIGhlYWQgd2l0aCB0aGUgd2Vla2RheSBuYW1lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhlYWQoKSB7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBzdHlsZXMgPSBfYS5zdHlsZXMsIHNob3dXZWVrTnVtYmVyID0gX2Euc2hvd1dlZWtOdW1iZXIsIGxvY2FsZSA9IF9hLmxvY2FsZSwgZm9ybWF0V2Vla2RheU5hbWUgPSBfYS5mb3JtYXR0ZXJzLmZvcm1hdFdlZWtkYXlOYW1lLCBsYWJlbFdlZWtkYXkgPSBfYS5sYWJlbHMubGFiZWxXZWVrZGF5O1xuICAgIHZhciB3ZWVrZGF5cyA9IGdldFdlZWtkYXlzKGxvY2FsZSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwidGhlYWRcIiwgeyBzdHlsZTogc3R5bGVzLmhlYWQsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5oZWFkIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IHN0eWxlOiBzdHlsZXMuaGVhZF9yb3csIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5oZWFkX3JvdyB9LFxuICAgICAgICAgICAgc2hvd1dlZWtOdW1iZXIgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB7IHNjb3BlOiBcImNvbFwiLCBzdHlsZTogc3R5bGVzLmhlYWRfY2VsbCwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmhlYWRfY2VsbCB9KSksXG4gICAgICAgICAgICB3ZWVrZGF5cy5tYXAoZnVuY3Rpb24gKHdlZWtkYXksIGkpIHsgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwidGhcIiwgeyBrZXk6IGksIHNjb3BlOiBcImNvbFwiLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuaGVhZF9jZWxsLCBzdHlsZTogc3R5bGVzLmhlYWRfY2VsbCB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgXCJhcmlhLWhpZGRlblwiOiB0cnVlIH0sIGZvcm1hdFdlZWtkYXlOYW1lKHdlZWtkYXksIHsgbG9jYWxlOiBsb2NhbGUgfSkpLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnZoaWRkZW4gfSwgbGFiZWxXZWVrZGF5KHdlZWtkYXksIHsgbG9jYWxlOiBsb2NhbGUgfSkpKSk7IH0pKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SGVhZC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogUmVuZGVyIHRoZSBpY29uIGluIHRoZSBzdHlsZWQgZHJvcC1kb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSWNvbkRyb3Bkb3duKHByb3BzKSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9fYXNzaWduKHsgd2lkdGg6IFwiOHB4XCIsIGhlaWdodDogXCI4cHhcIiwgdmlld0JveDogXCIwIDAgMTIwIDEyMFwiLCBcImRhdGEtdGVzdGlkXCI6IFwiaWNvbkRyb3Bkb3duXCIgfSwgcHJvcHMpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTQuMjIxODI1NDEsNDguMjIxODI1NCBDOC40NDIyMjgyOCw0NC4wMDE0MjI1IDE1LjIzODg0OTQsNDMuOTI3MzgwNCAxOS41NDk2NDU5LDQ3Ljk5OTY5ODkgTDE5Ljc3ODE3NDYsNDguMjIxODI1NCBMNjAsODguNDQzIEwxMDAuMjIxODI1LDQ4LjIyMTgyNTQgQzEwNC40NDIyMjgsNDQuMDAxNDIyNSAxMTEuMjM4ODQ5LDQzLjkyNzM4MDQgMTE1LjU0OTY0Niw0Ny45OTk2OTg5IEwxMTUuNzc4MTc1LDQ4LjIyMTgyNTQgQzExOS45OTg1NzcsNTIuNDQyMjI4MyAxMjAuMDcyNjIsNTkuMjM4ODQ5NCAxMTYuMDAwMzAxLDYzLjU0OTY0NTkgTDExNS43NzgxNzUsNjMuNzc4MTc0NiBMNjcuNzc4MTc0NiwxMTEuNzc4MTc1IEM2My41NTc3NzE3LDExNS45OTg1NzcgNTYuNzYxMTUwNiwxMTYuMDcyNjIgNTIuNDUwMzU0MSwxMTIuMDAwMzAxIEw1Mi4yMjE4MjU0LDExMS43NzgxNzUgTDQuMjIxODI1NDEsNjMuNzc4MTc0NiBDLTAuMDczOTQxODAyMyw1OS40ODI0MDc0IC0wLjA3Mzk0MTgwMjMsNTIuNTE3NTkyNiA0LjIyMTgyNTQxLDQ4LjIyMTgyNTQgWlwiLCBmaWxsOiBcImN1cnJlbnRDb2xvclwiLCBmaWxsUnVsZTogXCJub256ZXJvXCIgfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUljb25Ecm9wZG93bi5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogUmVuZGVyIHRoZSBcInByZXZpb3VzIG1vbnRoXCIgYnV0dG9uIGluIHRoZSBuYXZpZ2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSWNvbkxlZnQocHJvcHMpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19hc3NpZ24oeyB3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCIsIHZpZXdCb3g6IFwiMCAwIDEyMCAxMjBcIiwgXCJkYXRhLXRlc3RpZFwiOiBcImljb25MZWZ0XCIgfSwgcHJvcHMpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTY5LjQ5MDMzMiwzLjM0MzE0NTc1IEM3Mi42MTQ1MjYzLDAuMjE4OTUxNDE2IDc3LjY3OTg0NjIsMC4yMTg5NTE0MTYgODAuODA0MDQwNSwzLjM0MzE0NTc1IEM4My44NjE3NjI2LDYuNDAwODY3ODYgODMuOTI2ODIwNSwxMS4zMTc5OTMxIDgwLjk5OTIxNDMsMTQuNDU0ODM4OCBMODAuODA0MDQwNSwxNC42NTY4NTQyIEwzNS40NjEsNjAgTDgwLjgwNDA0MDUsMTA1LjM0MzE0NiBDODMuODYxNzYyNiwxMDguNDAwODY4IDgzLjkyNjgyMDUsMTEzLjMxNzk5MyA4MC45OTkyMTQzLDExNi40NTQ4MzkgTDgwLjgwNDA0MDUsMTE2LjY1Njg1NCBDNzcuNzQ2MzE4NCwxMTkuNzE0NTc2IDcyLjgyOTE5MzEsMTE5Ljc3OTYzNCA2OS42OTIzNDc1LDExNi44NTIwMjggTDY5LjQ5MDMzMiwxMTYuNjU2ODU0IEwxOC40OTAzMzIsNjUuNjU2ODU0MiBDMTUuNDMyNjA5OSw2Mi41OTkxMzIxIDE1LjM2NzU1Miw1Ny42ODIwMDY5IDE4LjI5NTE1ODMsNTQuNTQ1MTYxMiBMMTguNDkwMzMyLDU0LjM0MzE0NTggTDY5LjQ5MDMzMiwzLjM0MzE0NTc1IFpcIiwgZmlsbDogXCJjdXJyZW50Q29sb3JcIiwgZmlsbFJ1bGU6IFwibm9uemVyb1wiIH0pKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JY29uTGVmdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogUmVuZGVyIHRoZSBcIm5leHQgbW9udGhcIiBidXR0b24gaW4gdGhlIG5hdmlnYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJY29uUmlnaHQocHJvcHMpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19hc3NpZ24oeyB3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCIsIHZpZXdCb3g6IFwiMCAwIDEyMCAxMjBcIiB9LCBwcm9wcywgeyBcImRhdGEtdGVzdGlkXCI6IFwiaWNvblJpZ2h0XCIgfSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZDogXCJNNDkuODA0MDQwNSwzLjM0MzE0NTc1IEM0Ni42Nzk4NDYyLDAuMjE4OTUxNDE2IDQxLjYxNDUyNjMsMC4yMTg5NTE0MTYgMzguNDkwMzMyLDMuMzQzMTQ1NzUgQzM1LjQzMjYwOTksNi40MDA4Njc4NiAzNS4zNjc1NTIsMTEuMzE3OTkzMSAzOC4yOTUxNTgzLDE0LjQ1NDgzODggTDM4LjQ5MDMzMiwxNC42NTY4NTQyIEw4My44MzMzNzI1LDYwIEwzOC40OTAzMzIsMTA1LjM0MzE0NiBDMzUuNDMyNjA5OSwxMDguNDAwODY4IDM1LjM2NzU1MiwxMTMuMzE3OTkzIDM4LjI5NTE1ODMsMTE2LjQ1NDgzOSBMMzguNDkwMzMyLDExNi42NTY4NTQgQzQxLjU0ODA1NDEsMTE5LjcxNDU3NiA0Ni40NjUxNzk0LDExOS43Nzk2MzQgNDkuNjAyMDI1LDExNi44NTIwMjggTDQ5LjgwNDA0MDUsMTE2LjY1Njg1NCBMMTAwLjgwNDA0MSw2NS42NTY4NTQyIEMxMDMuODYxNzYzLDYyLjU5OTEzMjEgMTAzLjkyNjgyMSw1Ny42ODIwMDY5IDEwMC45OTkyMTQsNTQuNTQ1MTYxMiBMMTAwLjgwNDA0MSw1NC4zNDMxNDU4IEw0OS44MDQwNDA1LDMuMzQzMTQ1NzUgWlwiLCBmaWxsOiBcImN1cnJlbnRDb2xvclwiIH0pKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JY29uUmlnaHQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldFVuaXhUaW1lIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbi8qKlxuICogUmVuZGVyIGEgcm93IGluIHRoZSBjYWxlbmRhciwgd2l0aCB0aGUgZGF5cyBhbmQgb3B0aW9uYWxseSB0aGUgd2VlayBudW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSb3cocHJvcHMpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgc3R5bGVzID0gX2Euc3R5bGVzLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc2hvd1dlZWtOdW1iZXIgPSBfYS5zaG93V2Vla051bWJlciwgX2IgPSBfYS5jb21wb25lbnRzLCBEYXkgPSBfYi5EYXksIFdlZWtOdW1iZXIgPSBfYi5XZWVrTnVtYmVyO1xuICAgIHZhciB3ZWVrTnVtYmVyQ2VsbDtcbiAgICBpZiAoc2hvd1dlZWtOdW1iZXIpIHtcbiAgICAgICAgd2Vla051bWJlckNlbGwgPSAoUmVhY3QuY3JlYXRlRWxlbWVudChcInRkXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNlbGwsIHN0eWxlOiBzdHlsZXMuY2VsbCB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChXZWVrTnVtYmVyLCB7IG51bWJlcjogcHJvcHMud2Vla051bWJlciwgZGF0ZXM6IHByb3BzLmRhdGVzIH0pKSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnJvdywgc3R5bGU6IHN0eWxlcy5yb3cgfSxcbiAgICAgICAgd2Vla051bWJlckNlbGwsXG4gICAgICAgIHByb3BzLmRhdGVzLm1hcChmdW5jdGlvbiAoZGF0ZSkgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jZWxsLCBzdHlsZTogc3R5bGVzLmNlbGwsIGtleTogZ2V0VW5peFRpbWUoZGF0ZSkgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGF5LCB7IGRpc3BsYXlNb250aDogcHJvcHMuZGlzcGxheU1vbnRoLCBkYXRlOiBkYXRlIH0pKSk7IH0pKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb3cuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuLi9CdXR0b24nO1xuLyoqXG4gKiBSZW5kZXIgdGhlIHdlZWsgbnVtYmVyIGVsZW1lbnQuIElmIGBvbldlZWtOdW1iZXJDbGlja2AgaXMgcGFzc2VkIHRvIERheVBpY2tlciwgaXRcbiAqIHJlbmRlcnMgYSBidXR0b24sIG90aGVyd2lzZSBhIHNwYW4gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdlZWtOdW1iZXIocHJvcHMpIHtcbiAgICB2YXIgd2Vla051bWJlciA9IHByb3BzLm51bWJlciwgZGF0ZXMgPSBwcm9wcy5kYXRlcztcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgb25XZWVrTnVtYmVyQ2xpY2sgPSBfYS5vbldlZWtOdW1iZXJDbGljaywgc3R5bGVzID0gX2Euc3R5bGVzLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgbG9jYWxlID0gX2EubG9jYWxlLCBsYWJlbFdlZWtOdW1iZXIgPSBfYS5sYWJlbHMubGFiZWxXZWVrTnVtYmVyLCBmb3JtYXRXZWVrTnVtYmVyID0gX2EuZm9ybWF0dGVycy5mb3JtYXRXZWVrTnVtYmVyO1xuICAgIHZhciBoYW5kbGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIG9uV2Vla051bWJlckNsaWNrID09PSBudWxsIHx8IG9uV2Vla051bWJlckNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbldlZWtOdW1iZXJDbGljayh3ZWVrTnVtYmVyLCBkYXRlcywgZSk7XG4gICAgfTtcbiAgICB2YXIgY29udGVudCA9IGZvcm1hdFdlZWtOdW1iZXIoTnVtYmVyKHdlZWtOdW1iZXIpLCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgIGlmICghb25XZWVrTnVtYmVyQ2xpY2spIHtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy53ZWVrbnVtYmVyLCBzdHlsZTogc3R5bGVzLndlZWtudW1iZXIgfSwgY29udGVudCkpO1xuICAgIH1cbiAgICB2YXIgbGFiZWwgPSBsYWJlbFdlZWtOdW1iZXIoTnVtYmVyKHdlZWtOdW1iZXIpLCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b24sIHsgXCJhcmlhLWxhYmVsXCI6IGxhYmVsLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMud2Vla251bWJlciwgc3R5bGU6IHN0eWxlcy53ZWVrbnVtYmVyLCBvbkNsaWNrOiBoYW5kbGVDbGljayB9LCBjb250ZW50KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWVrTnVtYmVyLmpzLm1hcCIsIi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgQ1NTIGNsYXNzZXMuXG4gKi9cbmV4cG9ydCB2YXIgZGVmYXVsdENsYXNzTmFtZXMgPSB7XG4gICAgcm9vdDogJ3JkcCcsXG4gICAgbXVsdGlwbGVfbW9udGhzOiAncmRwLW11bHRpcGxlX21vbnRocycsXG4gICAgd2l0aF93ZWVrbnVtYmVyOiAncmRwLXdpdGhfd2Vla251bWJlcicsXG4gICAgdmhpZGRlbjogJ3JkcC12aGlkZGVuJyxcbiAgICBidXR0b25fcmVzZXQ6ICdyZHAtYnV0dG9uX3Jlc2V0JyxcbiAgICBidXR0b246ICdyZHAtYnV0dG9uJyxcbiAgICBjYXB0aW9uOiAncmRwLWNhcHRpb24nLFxuICAgIGNhcHRpb25fc3RhcnQ6ICdyZHAtY2FwdGlvbl9zdGFydCcsXG4gICAgY2FwdGlvbl9lbmQ6ICdyZHAtY2FwdGlvbl9lbmQnLFxuICAgIGNhcHRpb25fYmV0d2VlbjogJ3JkcC1jYXB0aW9uX2JldHdlZW4nLFxuICAgIGNhcHRpb25fbGFiZWw6ICdyZHAtY2FwdGlvbl9sYWJlbCcsXG4gICAgY2FwdGlvbl9kcm9wZG93bnM6ICdyZHAtY2FwdGlvbl9kcm9wZG93bnMnLFxuICAgIGRyb3Bkb3duOiAncmRwLWRyb3Bkb3duJyxcbiAgICBkcm9wZG93bl9tb250aDogJ3JkcC1kcm9wZG93bl9tb250aCcsXG4gICAgZHJvcGRvd25feWVhcjogJ3JkcC1kcm9wZG93bl95ZWFyJyxcbiAgICBkcm9wZG93bl9pY29uOiAncmRwLWRyb3Bkb3duX2ljb24nLFxuICAgIG1vbnRoczogJ3JkcC1tb250aHMnLFxuICAgIG1vbnRoOiAncmRwLW1vbnRoJyxcbiAgICB0YWJsZTogJ3JkcC10YWJsZScsXG4gICAgdGJvZHk6ICdyZHAtdGJvZHknLFxuICAgIHRmb290OiAncmRwLXRmb290JyxcbiAgICBoZWFkOiAncmRwLWhlYWQnLFxuICAgIGhlYWRfcm93OiAncmRwLWhlYWRfcm93JyxcbiAgICBoZWFkX2NlbGw6ICdyZHAtaGVhZF9jZWxsJyxcbiAgICBuYXY6ICdyZHAtbmF2JyxcbiAgICBuYXZfYnV0dG9uOiAncmRwLW5hdl9idXR0b24nLFxuICAgIG5hdl9idXR0b25fcHJldmlvdXM6ICdyZHAtbmF2X2J1dHRvbl9wcmV2aW91cycsXG4gICAgbmF2X2J1dHRvbl9uZXh0OiAncmRwLW5hdl9idXR0b25fbmV4dCcsXG4gICAgbmF2X2ljb246ICdyZHAtbmF2X2ljb24nLFxuICAgIHJvdzogJ3JkcC1yb3cnLFxuICAgIHdlZWtudW1iZXI6ICdyZHAtd2Vla251bWJlcicsXG4gICAgY2VsbDogJ3JkcC1jZWxsJyxcbiAgICBkYXk6ICdyZHAtZGF5JyxcbiAgICBkYXlfb3V0c2lkZTogJ3JkcC1kYXlfb3V0c2lkZSdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZhdWx0Q2xhc3NOYW1lcy5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIGNhcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDYXB0aW9uKG1vbnRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZvcm1hdChtb250aCwgJ0xMTEwgeScsIG9wdGlvbnMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0Q2FwdGlvbi5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIERheSBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXkoZGF5LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZvcm1hdChkYXksICdkJywgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXREYXkuanMubWFwIiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqXG4gKiBUaGUgZGVmYXVsdCBmb3JtYXR0ZXIgZm9yIHRoZSBNb250aCBjYXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TW9udGhDYXB0aW9uKG1vbnRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZvcm1hdChtb250aCwgJ0xMTEwnLCBvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1hdE1vbnRoQ2FwdGlvbi5qcy5tYXAiLCIvKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIHdlZWsgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlcih3ZWVrTnVtYmVyKSB7XG4gICAgcmV0dXJuIFwiXCIgKyB3ZWVrTnVtYmVyO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0V2Vla051bWJlci5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIG5hbWUgb2YgdGhlIHdlZWtkYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRXZWVrZGF5TmFtZSh3ZWVrZGF5LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZvcm1hdCh3ZWVrZGF5LCAnY2NjY2NjJywgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXRXZWVrZGF5TmFtZS5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIFllYXIgY2FwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFllYXJDYXB0aW9uKHllYXIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0KHllYXIsICd5eXl5Jywgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXRZZWFyQ2FwdGlvbi5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIHRoZSBkYXkgYnV0dG9uLlxuICovXG5leHBvcnQgdmFyIGxhYmVsRGF5ID0gZnVuY3Rpb24gKGRheSwgbW9kaWZlcnMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0KGRheSwgJ2RvIE1NTU0gKEVFRUUpJywgb3B0aW9ucyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFiZWxEYXkuanMubWFwIiwiLyoqXG4gKiBUaGUgZGVmYXVsdCBBUklBIGxhYmVsIGZvciB0aGUgV2Vla051bWJlciBlbGVtZW50LlxuICovXG5leHBvcnQgdmFyIGxhYmVsTW9udGhEcm9wZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ01vbnRoOiAnO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhYmVsTW9udGhEcm9wZG93bi5qcy5tYXAiLCIvKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIG5leHQgbW9udGggYnV0dG9uIGluIG5hdmlnYXRpb25cbiAqL1xuZXhwb3J0IHZhciBsYWJlbE5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdHbyB0byBuZXh0IG1vbnRoJztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYWJlbE5leHQuanMubWFwIiwiLyoqXG4gKiBUaGUgZGVmYXVsdCBBUklBIGxhYmVsIGZvciBwcmV2aW91cyBtb250aCBidXR0b24gaW4gbmF2aWdhdGlvblxuICovXG5leHBvcnQgdmFyIGxhYmVsUHJldmlvdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdHbyB0byBwcmV2aW91cyBtb250aCc7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFiZWxQcmV2aW91cy5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIHRoZSBXZWVrZGF5IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgbGFiZWxXZWVrZGF5ID0gZnVuY3Rpb24gKGRheSwgb3B0aW9ucykge1xuICAgIHJldHVybiBmb3JtYXQoZGF5LCAnY2NjYycsIG9wdGlvbnMpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhYmVsV2Vla2RheS5qcy5tYXAiLCIvKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIHRoZSBXZWVrTnVtYmVyIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgbGFiZWxXZWVrTnVtYmVyID0gZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gXCJXZWVrIG4uIFwiICsgbjtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYWJlbFdlZWtOdW1iZXIuanMubWFwIiwiLyoqXG4gKiBUaGUgZGVmYXVsdCBBUklBIGxhYmVsIGZvciB0aGUgV2Vla051bWJlciBlbGVtZW50LlxuICovXG5leHBvcnQgdmFyIGxhYmVsWWVhckRyb3Bkb3duID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnWWVhcjogJztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYWJlbFllYXJEcm9wZG93bi5qcy5tYXAiLCJpbXBvcnQgeyBzdGFydE9mRGF5LCBzdGFydE9mTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIEJ1aWxkIHRoZSBgZnJvbURhdGVgIGFuZCBgdG9EYXRlYCB2YWx1ZXMsIGdpdmVuIHRoZSBmcm9tTW9udGgvdG9Nb250aFxuICogb3IgZnJvbVllYXIvdG9ZZWFyIHByb3BzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9tVG9Qcm9wcyhwcm9wcykge1xuICAgIHZhciBmcm9tWWVhciA9IHByb3BzLmZyb21ZZWFyLCB0b1llYXIgPSBwcm9wcy50b1llYXIsIGZyb21Nb250aCA9IHByb3BzLmZyb21Nb250aCwgdG9Nb250aCA9IHByb3BzLnRvTW9udGg7XG4gICAgdmFyIGZyb21EYXRlID0gcHJvcHMuZnJvbURhdGUsIHRvRGF0ZSA9IHByb3BzLnRvRGF0ZTtcbiAgICBpZiAoZnJvbU1vbnRoKSB7XG4gICAgICAgIGZyb21EYXRlID0gc3RhcnRPZk1vbnRoKGZyb21Nb250aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb21ZZWFyKSB7XG4gICAgICAgIGZyb21EYXRlID0gbmV3IERhdGUoZnJvbVllYXIsIDAsIDEpO1xuICAgIH1cbiAgICBpZiAodG9Nb250aCkge1xuICAgICAgICB0b0RhdGUgPSBzdGFydE9mTW9udGgodG9Nb250aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRvWWVhcikge1xuICAgICAgICB0b0RhdGUgPSBuZXcgRGF0ZSh0b1llYXIsIDExLCAzMSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGZyb21EYXRlOiBmcm9tRGF0ZSA/IHN0YXJ0T2ZEYXkoZnJvbURhdGUpIDogdW5kZWZpbmVkLFxuICAgICAgICB0b0RhdGU6IHRvRGF0ZSA/IHN0YXJ0T2ZEYXkodG9EYXRlKSA6IHVuZGVmaW5lZFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZUZyb21Ub1Byb3BzLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBlblVTIH0gZnJvbSAnZGF0ZS1mbnMvbG9jYWxlJztcbmltcG9ydCB7IENhcHRpb24gfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0NhcHRpb24nO1xuaW1wb3J0IHsgQ2FwdGlvbkxhYmVsIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DYXB0aW9uTGFiZWwnO1xuaW1wb3J0IHsgRGF5IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9EYXknO1xuaW1wb3J0IHsgRGF5Q29udGVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvRGF5Q29udGVudCc7XG5pbXBvcnQgeyBEcm9wZG93biB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvRHJvcGRvd24nO1xuaW1wb3J0IHsgRm9vdGVyIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Gb290ZXInO1xuaW1wb3J0IHsgSGVhZCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvSGVhZCc7XG5pbXBvcnQgeyBJY29uRHJvcGRvd24gfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0ljb25Ecm9wZG93bic7XG5pbXBvcnQgeyBJY29uTGVmdCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvSWNvbkxlZnQnO1xuaW1wb3J0IHsgSWNvblJpZ2h0IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9JY29uUmlnaHQnO1xuaW1wb3J0IHsgUm93IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Sb3cnO1xuaW1wb3J0IHsgV2Vla051bWJlciB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvV2Vla051bWJlcic7XG5pbXBvcnQgeyBkZWZhdWx0Q2xhc3NOYW1lcyB9IGZyb20gJy4vZGVmYXVsdENsYXNzTmFtZXMnO1xuaW1wb3J0ICogYXMgZm9ybWF0dGVycyBmcm9tICcuL2Zvcm1hdHRlcnMnO1xuaW1wb3J0ICogYXMgbGFiZWxzIGZyb20gJy4vbGFiZWxzJztcbmltcG9ydCB7IHBhcnNlRnJvbVRvUHJvcHMgfSBmcm9tICcuL3V0aWxzJztcbi8qKlxuICogVGhlIERheVBpY2tlciBDb250ZXh0IHNoYXJlcyB0aGUgcHJvcHMgcGFzc2VkIHRvIERheVBpY2tlciB3aXRoaW4gaW50ZXJuYWxcbiAqIGFuZCBjdXN0b20gY29tcG9uZW50cy4gSXQgaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGFuZCBwZXJmb3JtXG4gKiBvbmUtdGltZSBjYWxjdWxhdGlvbnMgcmVxdWlyZWQgdG8gcmVuZGVyIHRoZSBkYXlzLlxuICpcbiAqIERldmVsb3BlcnMgbWF5IGFjY2VzcyB0byB0aGlzIGNvbnRleHQgZnJvbSB0aGUgW1t1c2VEYXlQaWNrZXJdXSBob29rIHdoZW5cbiAqIHVzaW5nIGN1c3RvbSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdmFyIERheVBpY2tlckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG4vKipcbiAqIFRoZSBwcm92aWRlciBmb3IgdGhlIFtbRGF5UGlja2VyQ29udGV4dF1dLlxuICpcbiAqIFRoZSBjb250ZXh0IHZhbHVlIGlzIHNldCBieSBhc3NpZ25pbmcgZGVmYXVsdHMgZnJvbSB0aGUgaW5pdGlhbCBEYXlQaWNrZXJcbiAqIHByb3BzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBEYXlQaWNrZXJQcm92aWRlcihwcm9wcykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbiwgaW5pdGlhbFByb3BzID0gcHJvcHMuaW5pdGlhbFByb3BzO1xuICAgIHZhciBsb2NhbGUgPSAoX2EgPSBpbml0aWFsUHJvcHMubG9jYWxlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBlblVTO1xuICAgIHZhciBudW1iZXJPZk1vbnRocyA9IChfYiA9IGluaXRpYWxQcm9wcy5udW1iZXJPZk1vbnRocykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMTtcbiAgICB2YXIgdG9kYXkgPSAoX2MgPSBpbml0aWFsUHJvcHMudG9kYXkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBEYXRlKCk7XG4gICAgLy8gTGltaXQgbmF2aWdhdGlvblxuICAgIHZhciBfaCA9IHBhcnNlRnJvbVRvUHJvcHMoaW5pdGlhbFByb3BzKSwgZnJvbURhdGUgPSBfaC5mcm9tRGF0ZSwgdG9EYXRlID0gX2gudG9EYXRlO1xuICAgIC8vIERlZmF1bHQgY2FwdGlvbiBsYXlvdXQuIElmIGNhbGVuZGFyIG5hdmlnYXRpb24gaXMgdW5saW1pdGVkLCBpdCBtdXN0IGJlXG4gICAgLy8gYWx3YXlzIGBidXR0b25zYCDigJMgYXMgd2UgY2Fubm90IGRpc3BsYXkgeWV0IGluZmluaXRlIG9wdGlvbnMgaW4gdGhlIGRyb3Bkb3duLlxuICAgIHZhciBjYXB0aW9uTGF5b3V0ID0gKF9kID0gaW5pdGlhbFByb3BzLmNhcHRpb25MYXlvdXQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICdidXR0b25zJztcbiAgICBpZiAoIWZyb21EYXRlICYmICF0b0RhdGUpXG4gICAgICAgIGNhcHRpb25MYXlvdXQgPSAnYnV0dG9ucyc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHZhciB0b1llYXIgPSBpbml0aWFsUHJvcHMudG9ZZWFyLCBmcm9tWWVhciA9IGluaXRpYWxQcm9wcy5mcm9tWWVhciwgdG9Nb250aCA9IGluaXRpYWxQcm9wcy50b01vbnRoLCBmcm9tTW9udGggPSBpbml0aWFsUHJvcHMuZnJvbU1vbnRoLCBjb250ZXh0UHJvcHMgPSBfX3Jlc3QoaW5pdGlhbFByb3BzLCBbXCJ0b1llYXJcIiwgXCJmcm9tWWVhclwiLCBcInRvTW9udGhcIiwgXCJmcm9tTW9udGhcIl0pO1xuICAgIHZhciBjb250ZXh0ID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbnRleHRQcm9wcyksIHsgY2FwdGlvbkxheW91dDogY2FwdGlvbkxheW91dCwgZnJvbURhdGU6IGZyb21EYXRlLCB0b0RhdGU6IHRvRGF0ZSwgdG9kYXk6IHRvZGF5LCBsb2NhbGU6IGxvY2FsZSwgbW9kaWZpZXJDbGFzc05hbWVzOiAoX2UgPSBpbml0aWFsUHJvcHMubW9kaWZpZXJDbGFzc05hbWVzKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB7fSwgXG4gICAgICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGJlIGluaXRpYWxQcm9wcy5tb2RpZmllclByZWZpeCA/PyAncmRwLWRheV8nP1xuICAgICAgICBtb2RpZmllclByZWZpeDogJ3JkcC1kYXlfJywgbW9kaWZpZXJzOiAoX2YgPSBpbml0aWFsUHJvcHMubW9kaWZpZXJzKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiB7fSwgbnVtYmVyT2ZNb250aHM6IG51bWJlck9mTW9udGhzLCBzdHlsZXM6IChfZyA9IGluaXRpYWxQcm9wcy5zdHlsZXMpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHt9LCBjbGFzc05hbWVzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdENsYXNzTmFtZXMpLCBpbml0aWFsUHJvcHMuY2xhc3NOYW1lcyksIGZvcm1hdHRlcnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBmb3JtYXR0ZXJzKSwgaW5pdGlhbFByb3BzLmZvcm1hdHRlcnMpLCBsYWJlbHM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBsYWJlbHMpLCBpbml0aWFsUHJvcHMubGFiZWxzKSwgY29tcG9uZW50czogX19hc3NpZ24oeyBDYXB0aW9uOiBDYXB0aW9uLCBDYXB0aW9uTGFiZWw6IENhcHRpb25MYWJlbCwgRGF5OiBEYXksIERheUNvbnRlbnQ6IERheUNvbnRlbnQsIERyb3Bkb3duOiBEcm9wZG93biwgRm9vdGVyOiBGb290ZXIsIEhlYWQ6IEhlYWQsIEljb25Ecm9wZG93bjogSWNvbkRyb3Bkb3duLCBJY29uUmlnaHQ6IEljb25SaWdodCwgSWNvbkxlZnQ6IEljb25MZWZ0LCBSb3c6IFJvdywgV2Vla051bWJlcjogV2Vla051bWJlciB9LCBpbml0aWFsUHJvcHMuY29tcG9uZW50cykgfSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KERheVBpY2tlckNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHQgfSwgY2hpbGRyZW4pKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURheVBpY2tlckNvbnRleHQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERheVBpY2tlckNvbnRleHQgfSBmcm9tICcuL0RheVBpY2tlckNvbnRleHQnO1xuLyoqXG4gKiBIb29rIHRvIGFjY2VzcyB0aGUgW1tEYXlQaWNrZXJDb250ZXh0XV0uXG4gKlxuICogVG8gdXNlIHRoaXMgaG9vayBtYWtlIHN1cmUgdG8gd3JhcCB0aGUgY29tcG9uZW50cyB3aXRoIGEgb25lXG4gKiBbW0RheVBpY2tlclByb3ZpZGVyXV0uXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURheVBpY2tlcigpIHtcbiAgICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRGF5UGlja2VyQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgaXMgbm90IGRlZmluZWQuIHVzZURheVBpY2tlciBtdXN0IGJlIHVzZWQgd2l0aGluIGEgRGF5UGlja2VyUHJvdmlkZXIgd2l0aCBhIHZhbGlkIHZhbHVlcy5cIik7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlRGF5UGlja2VyLmpzLm1hcCIsImltcG9ydCB7IGFkZERheXMsIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywgZW5kT2ZXZWVrIH0gZnJvbSAnZGF0ZS1mbnMnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE91dHNpZGVFbmREYXlzKG1vbnRoLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheXMgPSBbXTtcbiAgICB2YXIgbGFzdERheU9mV2VlayA9IGVuZE9mV2Vlayhtb250aCwgb3B0aW9ucyk7XG4gICAgdmFyIGVuZERpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGFzdERheU9mV2VlaywgbW9udGgpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IGVuZERpZmY7IGkrKykge1xuICAgICAgICB2YXIgZGF5RGF0ZSA9IGFkZERheXMobW9udGgsIGkpO1xuICAgICAgICBkYXlzLnB1c2goZGF5RGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBkYXlzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0T3V0c2lkZUVuZERheXMuanMubWFwIiwiaW1wb3J0IHsgYWRkRGF5cywgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLCBzdGFydE9mV2VlayB9IGZyb20gJ2RhdGUtZm5zJztcbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRzaWRlU3RhcnREYXlzKG1vbnRoLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheXMgPSBbXTtcbiAgICB2YXIgZmlyc3REYXlPZldlZWsgPSBzdGFydE9mV2Vlayhtb250aCwgb3B0aW9ucyk7XG4gICAgdmFyIHN0YXJ0RGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhtb250aCwgZmlyc3REYXlPZldlZWspO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhcnREaWZmOyBpKyspIHtcbiAgICAgICAgdmFyIG5ld0RheSA9IGFkZERheXMoZmlyc3REYXlPZldlZWssIGkpO1xuICAgICAgICBkYXlzLnB1c2gobmV3RGF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRPdXRzaWRlU3RhcnREYXlzLmpzLm1hcCIsImltcG9ydCB7IGFkZERheXMsIGFkZFdlZWtzLCBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsIGVuZE9mTW9udGgsIGdldFdlZWssIGdldFdlZWtzSW5Nb250aCwgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgZ2V0T3V0c2lkZUVuZERheXMgfSBmcm9tICcuL2dldE91dHNpZGVFbmREYXlzJztcbmltcG9ydCB7IGdldE91dHNpZGVTdGFydERheXMgfSBmcm9tICcuL2dldE91dHNpZGVTdGFydERheXMnO1xuLyoqXG4gKiBSZXR1cm4gdGhlIHdlZWtzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gbW9udGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrcyhtb250aCwgX2EpIHtcbiAgICB2YXIgbG9jYWxlID0gX2EubG9jYWxlLCBmaXhlZFdlZWtzID0gX2EuZml4ZWRXZWVrcztcbiAgICB2YXIgbW9udGhTdGFydCA9IHN0YXJ0T2ZNb250aChtb250aCk7XG4gICAgdmFyIG1vbnRoRW5kID0gZW5kT2ZNb250aChtb250aCk7XG4gICAgdmFyIGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobW9udGhFbmQsIG1vbnRoU3RhcnQpO1xuICAgIHZhciB3ZWVrcyA9IFtdO1xuICAgIHZhciBsYXN0V2VlayA9IHsgd2Vla051bWJlcjogMCwgZGF0ZXM6IFtdIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gZGlmZjsgaSsrKSB7XG4gICAgICAgIHZhciBkYXRlID0gYWRkRGF5cyhtb250aFN0YXJ0LCBpKTtcbiAgICAgICAgdmFyIHdlZWsgPSBnZXRXZWVrKGRhdGUsIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgICAgIGlmIChsYXN0V2Vlay53ZWVrTnVtYmVyICE9PSB3ZWVrKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgd2VlayBieSBhZGRpbmcgb3V0c2lkZSBzdGFydCBkYXlzXG4gICAgICAgICAgICB2YXIgc3RhcnREYXlzID0gZ2V0T3V0c2lkZVN0YXJ0RGF5cyhkYXRlLCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgICAgICAgICAgbGFzdFdlZWsgPSB7IHdlZWtOdW1iZXI6IHdlZWssIGRhdGVzOiBzdGFydERheXMgfTtcbiAgICAgICAgICAgIHdlZWtzLnB1c2gobGFzdFdlZWspO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RXZWVrLmRhdGVzLnB1c2goZGF0ZSk7XG4gICAgfVxuICAgIHZhciBsYXN0RGF5ID0gbGFzdFdlZWsuZGF0ZXNbbGFzdFdlZWsuZGF0ZXMubGVuZ3RoIC0gMV07XG4gICAgdmFyIGVuZERheXMgPSBnZXRPdXRzaWRlRW5kRGF5cyhsYXN0RGF5LCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgIGxhc3RXZWVrLmRhdGVzID0gbGFzdFdlZWsuZGF0ZXMuY29uY2F0KGVuZERheXMpO1xuICAgIC8vIEFkZCBleHRyYSB3ZWVrcyB0byB0aGUgbW9udGgsIHVwIHRvIDYgd2Vla3NcbiAgICBpZiAoZml4ZWRXZWVrcykge1xuICAgICAgICB2YXIgbGFzdFdlZWtEYXRlID0gbGFzdFdlZWsuZGF0ZXNbbGFzdFdlZWsuZGF0ZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHZhciB3ZWVrc0luTW9udGggPSBnZXRXZWVrc0luTW9udGgobW9udGgsIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgICAgIGlmICh3ZWVrc0luTW9udGggPCA2KSB7XG4gICAgICAgICAgICB2YXIgZGlmZkRheXMgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoYWRkV2Vla3MobGFzdFdlZWtEYXRlLCA2IC0gd2Vla3NJbk1vbnRoKSwgbGFzdFdlZWtEYXRlKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZkRheXM7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBkYXRlID0gYWRkRGF5cyhsYXN0V2Vla0RhdGUsIGkgKyAxKTtcbiAgICAgICAgICAgICAgICB2YXIgd2VlayA9IGdldFdlZWsoZGF0ZSwgeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFdlZWsud2Vla051bWJlciAhPT0gd2Vlaykge1xuICAgICAgICAgICAgICAgICAgICBsYXN0V2VlayA9IHsgd2Vla051bWJlcjogd2VlaywgZGF0ZXM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgIHdlZWtzLnB1c2gobGFzdFdlZWspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0V2Vlay5kYXRlcy5wdXNoKGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3ZWVrcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldFdlZWtzLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgZ2V0V2Vla3MgfSBmcm9tICcuL3V0aWxzL2dldFdlZWtzJztcbi8qKlxuICogUmVuZGVyIHRoZSB0YWJsZSB3aXRoIHRoZSBjYWxlbmRhci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRhYmxlKHByb3BzKSB7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGxvY2FsZSA9IF9hLmxvY2FsZSwgY2xhc3NOYW1lcyA9IF9hLmNsYXNzTmFtZXMsIHN0eWxlcyA9IF9hLnN0eWxlcywgaGlkZUhlYWQgPSBfYS5oaWRlSGVhZCwgZml4ZWRXZWVrcyA9IF9hLmZpeGVkV2Vla3MsIF9iID0gX2EuY29tcG9uZW50cywgSGVhZCA9IF9iLkhlYWQsIFJvdyA9IF9iLlJvdywgRm9vdGVyID0gX2IuRm9vdGVyO1xuICAgIHZhciB3ZWVrcyA9IGdldFdlZWtzKHByb3BzLmRpc3BsYXlNb250aCwgeyBsb2NhbGU6IGxvY2FsZSwgZml4ZWRXZWVrczogZml4ZWRXZWVrcyB9KTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy50YWJsZSwgc3R5bGU6IHN0eWxlcy50YWJsZSwgcm9sZTogXCJncmlkXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHByb3BzWydhcmlhLWxhYmVsbGVkYnknXSB9LFxuICAgICAgICAhaGlkZUhlYWQgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkLCBudWxsKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnRib2R5LCBzdHlsZTogc3R5bGVzLnRib2R5IH0sIHdlZWtzLm1hcChmdW5jdGlvbiAod2VlaykgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm93LCB7IGRpc3BsYXlNb250aDogcHJvcHMuZGlzcGxheU1vbnRoLCBrZXk6IHdlZWsud2Vla051bWJlciwgZGF0ZXM6IHdlZWsuZGF0ZXMsIHdlZWtOdW1iZXI6IHdlZWsud2Vla051bWJlciB9KSk7IH0pKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChGb290ZXIsIG51bGwpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUlkIH0gZnJvbSAnQHJlYWNoL2F1dG8taWQnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL1RhYmxlJztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvTmF2aWdhdGlvbic7XG4vKiogUmVuZGVyIGEgbW9udGguICovXG5leHBvcnQgZnVuY3Rpb24gTW9udGgocHJvcHMpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIF9iID0gdXNlRGF5UGlja2VyKCksIGRpciA9IF9iLmRpciwgY2xhc3NOYW1lcyA9IF9iLmNsYXNzTmFtZXMsIHN0eWxlcyA9IF9iLnN0eWxlcywgQ2FwdGlvbiA9IF9iLmNvbXBvbmVudHMuQ2FwdGlvbjtcbiAgICB2YXIgZGlzcGxheU1vbnRocyA9IHVzZU5hdmlnYXRpb24oKS5kaXNwbGF5TW9udGhzO1xuICAgIHZhciBjYXB0aW9uSWQgPSB1c2VJZCgpO1xuICAgIHZhciBjbGFzc05hbWUgPSBbY2xhc3NOYW1lcy5tb250aF07XG4gICAgdmFyIHN0eWxlID0gc3R5bGVzLm1vbnRoO1xuICAgIHZhciBpc1N0YXJ0ID0gcHJvcHMuZGlzcGxheUluZGV4ID09PSAwO1xuICAgIHZhciBpc0VuZCA9IHByb3BzLmRpc3BsYXlJbmRleCA9PT0gZGlzcGxheU1vbnRocy5sZW5ndGggLSAxO1xuICAgIHZhciBpc0NlbnRlciA9ICFpc1N0YXJ0ICYmICFpc0VuZDtcbiAgICBpZiAoZGlyID09PSAncnRsJykge1xuICAgICAgICBfYSA9IFtpc1N0YXJ0LCBpc0VuZF0sIGlzRW5kID0gX2FbMF0sIGlzU3RhcnQgPSBfYVsxXTtcbiAgICB9XG4gICAgaWYgKGlzU3RhcnQpIHtcbiAgICAgICAgY2xhc3NOYW1lLnB1c2goY2xhc3NOYW1lcy5jYXB0aW9uX3N0YXJ0KTtcbiAgICAgICAgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGUpLCBzdHlsZXMuY2FwdGlvbl9zdGFydCk7XG4gICAgfVxuICAgIGlmIChpc0VuZCkge1xuICAgICAgICBjbGFzc05hbWUucHVzaChjbGFzc05hbWVzLmNhcHRpb25fZW5kKTtcbiAgICAgICAgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGUpLCBzdHlsZXMuY2FwdGlvbl9lbmQpO1xuICAgIH1cbiAgICBpZiAoaXNDZW50ZXIpIHtcbiAgICAgICAgY2xhc3NOYW1lLnB1c2goY2xhc3NOYW1lcy5jYXB0aW9uX2JldHdlZW4pO1xuICAgICAgICBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZSksIHN0eWxlcy5jYXB0aW9uX2JldHdlZW4pO1xuICAgIH1cbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBrZXk6IHByb3BzLmRpc3BsYXlJbmRleCwgY2xhc3NOYW1lOiBjbGFzc05hbWUuam9pbignICcpLCBzdHlsZTogc3R5bGUgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChDYXB0aW9uLCB7IGlkOiBjYXB0aW9uSWQsIGRpc3BsYXlNb250aDogcHJvcHMuZGlzcGxheU1vbnRoIH0pLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFRhYmxlLCB7IFwiYXJpYS1sYWJlbGxlZGJ5XCI6IGNhcHRpb25JZCwgZGlzcGxheU1vbnRoOiBwcm9wcy5kaXNwbGF5TW9udGggfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1vbnRoLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTW9udGggfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL01vbnRoJztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VGb2N1cyB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0ZvY3VzJztcbmltcG9ydCB7IHVzZU5hdmlnYXRpb24gfSBmcm9tICcuLi8uLi9jb250ZXh0cy9OYXZpZ2F0aW9uJztcbi8qKlxuICogUmVuZGVyIHRoZSBjb250YWluZXIgd2l0aCB0aGUgbW9udGhzIGFuZCB0aGVpciBjYXB0aW9ucy4gVGhlIG51bWJlciBvZiBtb250aHNcbiAqIHJlbmRlcmVkIGRlcGVuZHMgYnkgdGhlIGBudW1iZXJPZk1vbnRoc2AgcHJvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJvb3QoKSB7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGRpciA9IF9hLmRpciwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGUgPSBfYS5zdHlsZSwgc3R5bGVzID0gX2Euc3R5bGVzLCBudW1iZXJPZk1vbnRocyA9IF9hLm51bWJlck9mTW9udGhzLCBzaG93V2Vla051bWJlciA9IF9hLnNob3dXZWVrTnVtYmVyLCBpbml0aWFsRm9jdXMgPSBfYS5pbml0aWFsRm9jdXM7XG4gICAgdmFyIF9iID0gdXNlRm9jdXMoKSwgZm9jdXNUYXJnZXQgPSBfYi5mb2N1c1RhcmdldCwgZm9jdXMgPSBfYi5mb2N1cztcbiAgICB2YXIgX2MgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksIGhhc0luaXRpYWxGb2N1cyA9IF9jWzBdLCBzZXRIYXNJbml0aWFsRm9jdXMgPSBfY1sxXTtcbiAgICB2YXIgZGlzcGxheU1vbnRocyA9IHVzZU5hdmlnYXRpb24oKS5kaXNwbGF5TW9udGhzO1xuICAgIHZhciByb290Q2xhc3NOYW1lcyA9IFtjbGFzc05hbWUgIT09IG51bGwgJiYgY2xhc3NOYW1lICE9PSB2b2lkIDAgPyBjbGFzc05hbWUgOiBjbGFzc05hbWVzLnJvb3RdO1xuICAgIGlmIChudW1iZXJPZk1vbnRocyA+IDEpIHtcbiAgICAgICAgcm9vdENsYXNzTmFtZXMucHVzaChjbGFzc05hbWVzLm11bHRpcGxlX21vbnRocyk7XG4gICAgfVxuICAgIGlmIChzaG93V2Vla051bWJlcikge1xuICAgICAgICByb290Q2xhc3NOYW1lcy5wdXNoKGNsYXNzTmFtZXMud2l0aF93ZWVrbnVtYmVyKTtcbiAgICB9XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGluaXRpYWxGb2N1cyAmJiAhaGFzSW5pdGlhbEZvY3VzICYmIGZvY3VzVGFyZ2V0KSB7XG4gICAgICAgICAgICBmb2N1cyhmb2N1c1RhcmdldCk7XG4gICAgICAgICAgICBzZXRIYXNJbml0aWFsRm9jdXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9LCBbaW5pdGlhbEZvY3VzLCBoYXNJbml0aWFsRm9jdXMsIGZvY3VzLCBmb2N1c1RhcmdldF0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogcm9vdENsYXNzTmFtZXMuam9pbignICcpLCBzdHlsZTogX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcy5yb290KSwgc3R5bGUpLCBkaXI6IGRpciB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLm1vbnRocywgc3R5bGU6IHN0eWxlcy5tb250aHMgfSwgZGlzcGxheU1vbnRocy5tYXAoZnVuY3Rpb24gKG1vbnRoLCBpKSB7IHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChNb250aCwgeyBrZXk6IGksIGRpc3BsYXlJbmRleDogaSwgZGlzcGxheU1vbnRoOiBtb250aCB9KSk7IH0pKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um9vdC5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBEYXlQaWNrZXJQcm92aWRlciB9IGZyb20gJy4vRGF5UGlja2VyJztcbmltcG9ydCB7IEZvY3VzUHJvdmlkZXIgfSBmcm9tICcuL0ZvY3VzJztcbmltcG9ydCB7IE1vZGlmaWVyc1Byb3ZpZGVyIH0gZnJvbSAnLi9Nb2RpZmllcnMnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblByb3ZpZGVyIH0gZnJvbSAnLi9OYXZpZ2F0aW9uJztcbmltcG9ydCB7IFNlbGVjdE11bHRpcGxlUHJvdmlkZXIgfSBmcm9tICcuL1NlbGVjdE11bHRpcGxlJztcbmltcG9ydCB7IFNlbGVjdFJhbmdlUHJvdmlkZXIgfSBmcm9tICcuL1NlbGVjdFJhbmdlJztcbmltcG9ydCB7IFNlbGVjdFNpbmdsZVByb3ZpZGVyIH0gZnJvbSAnLi9TZWxlY3RTaW5nbGUnO1xuLyoqIFByb3ZpZGUgdGhlIHZhbHVlIGZvciBhbGwgdGhlIGNvbnRleHQgcHJvdmlkZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJvb3RQcm92aWRlcihwcm9wcykge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLCBpbml0aWFsUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcImNoaWxkcmVuXCJdKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGF5UGlja2VyUHJvdmlkZXIsIHsgaW5pdGlhbFByb3BzOiBpbml0aWFsUHJvcHMgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChOYXZpZ2F0aW9uUHJvdmlkZXIsIG51bGwsXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFNpbmdsZVByb3ZpZGVyLCB7IGluaXRpYWxQcm9wczogaW5pdGlhbFByb3BzIH0sXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RNdWx0aXBsZVByb3ZpZGVyLCB7IGluaXRpYWxQcm9wczogaW5pdGlhbFByb3BzIH0sXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VsZWN0UmFuZ2VQcm92aWRlciwgeyBpbml0aWFsUHJvcHM6IGluaXRpYWxQcm9wcyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChNb2RpZmllcnNQcm92aWRlciwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzUHJvdmlkZXIsIG51bGwsIGNoaWxkcmVuKSkpKSkpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb290UHJvdmlkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSb290IH0gZnJvbSAnLi9jb21wb25lbnRzL1Jvb3QnO1xuaW1wb3J0IHsgUm9vdFByb3ZpZGVyIH0gZnJvbSAnLi9jb250ZXh0cy9Sb290UHJvdmlkZXInO1xuLyoqXG4gKiBEYXlQaWNrZXIgcmVuZGVyIGEgZGF0ZSBwaWNrZXIgY29tcG9uZW50IHRvIGxldCB1c2VycyBwaWNrIGRhdGVzIGZyb20gYVxuICogY2FsZW5kYXIuIFNlZSBodHRwOi8vcmVhY3QtZGF5LXBpY2tlci5qcy5vcmcgZm9yIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBhbmRcbiAqIGV4YW1wbGVzLlxuICpcbiAqICMjIyBDdXN0b21pemF0aW9uXG4gKlxuICogRGF5UGlja2VyIG9mZmVycyBkaWZmZXJlbnQgY3VzdG9taXphdGlvbiBwcm9wcy4gRm9yIGV4YW1wbGUsXG4gKlxuICogLSBzaG93IG11bHRpcGxlIG1vbnRocyB1c2luZyBgbnVtYmVyT2ZNb250aHNgXG4gKiAtIGRpc3BsYXkgYSBkcm9wZG93biB0byBuYXZpZ2F0ZSB0aGUgbW9udGhzIHZpYSBgY2FwdGlvbkxheW91dGBcbiAqIC0gZGlzcGxheSB0aGUgd2VlayBudW1iZXJzIHdpdGggYHNob3dXZWVrTnVtYmVyc2BcbiAqIC0gZGlzYWJsZSBvciBoaWRlIGRheXMgd2l0aCBgZGlzYWJsZWRgIG9yIGBoaWRkZW5gXG4gKlxuICogIyMjIENvbnRyb2xsaW5nIHRoZSBtb250aHNcbiAqXG4gKiBDaGFuZ2UgdGhlIGluaXRpYWxseSBkaXNwbGF5ZWQgbW9udGggdXNpbmcgdGhlIGBkZWZhdWx0TW9udGhgIHByb3AuIFRoZVxuICogZGlzcGxheWVkIG1vbnRocyBhcmUgY29udHJvbGxlZCBieSBEYXlQaWNrZXIgYW5kIHN0b3JlZCBpbiBpdHMgaW50ZXJuYWxcbiAqIHN0YXRlLiBUbyBjb250cm9sIHRoZSBtb250aHMgeW91cnNlbGYsIHVzZSBgbW9udGhgIGluc3RlYWQgb2YgYGRlZmF1bHRNb250aGBcbiAqIGFuZCB1c2UgdGhlIGBvbk1vbnRoQ2hhbmdlYCBldmVudCB0byBzZXQgaXQuXG4gKlxuICogVG8gbGltaXQgdGhlIG1vbnRocyB0aGUgdXNlciBjYW4gbmF2aWdhdGUgdG8sIHVzZVxuICogYGZyb21EYXRlYC9gZnJvbU1vbnRoYC9gZnJvbVllYXJgIG9yIGB0b0RhdGVgL2B0b01vbnRoYC9gdG9ZZWFyYC5cbiAqXG4gKiAjIyMgU2VsZWN0aW9uIG1vZGVzXG4gKlxuICogRGF5UGlja2VyIHN1cHBvcnRzIGRpZmZlcmVudCBzZWxlY3Rpb24gbW9kZSB0aGF0IGNhbiBiZSB0b2dnbGVkIHVzaW5nIHRoZVxuICogYG1vZGVgIHByb3A6XG4gKlxuICogLSBgbW9kZT1cInNpbmdsZVwiYDogb25seSBvbmUgZGF5IGNhbiBiZSBzZWxlY3RlZC4gVXNlIGByZXF1aXJlZGAgdG8gbWFrZSB0aGVcbiAqICAgc2VsZWN0aW9uIHJlcXVpcmVkLiBVc2UgdGhlIGBvblNlbGVjdGAgZXZlbnQgaGFuZGxlciB0byBnZXQgdGhlIHNlbGVjdGVkXG4gKiAgIGRheXMuXG4gKiAtIGBtb2RlPVwibXVsdGlwbGVcImA6IHVzZXJzIGNhbiBzZWxlY3Qgb25lIG9yIG1vcmUgZGF5cy4gTGltaXQgdGhlIGFtb3VudCBvZlxuICogICBkYXlzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIHdpdGggdGhlIGBtaW5gIG9yIHRoZSBgbWF4YCBwcm9wcy5cbiAqIC0gYG1vZGU9XCJyYW5nZVwiYDogdXNlcnMgY2FuIHNlbGVjdCBhIHJhbmdlIG9mIGRheXMuIExpbWl0IHRoZSBhbW91bnQgb2YgZGF5c1xuICogICBpbiB0aGUgcmFuZ2Ugd2l0aCB0aGUgYG1pbmAgb3IgdGhlIGBtYXhgIHByb3BzLlxuICogLSBgbW9kZT1cImN1c3RvbVwiYDogaW1wbGVtZW50IHlvdXIgb3duIHNlbGVjdGlvbiBtb2RlIHdpdGggYG9uRGF5Q2xpY2tgLlxuICpcbiAqIFRoZXNlIHNlbGVjdGlvbiBtb2RlcyBzaG91bGQgY292ZXIgdGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlcy4gSW4gY2FzZSB5b3VcbiAqIG5lZWQgYSBtb3JlIHJlZmluZWQgd2F5IG9mIHNlbGVjdGluZyBkYXlzLCB1c2UgYG1vZGU9XCJjdXN0b21cImAuIFVzZSB0aGVcbiAqIGBzZWxlY3RlZGAgcHJvcHMgYW5kIGFkZCB0aGUgZGF5IGV2ZW50IGhhbmRsZXJzIHRvIGFkZC9yZW1vdmUgZGF5cyBmcm9tIHRoZVxuICogc2VsZWN0aW9uLlxuICpcbiAqICMjIyBNb2RpZmllcnNcbiAqXG4gKiBBIF9tb2RpZmllcl8gcmVwcmVzZW50cyBkaWZmZXJlbnQgc3R5bGVzIG9yIHN0YXRlcyBmb3IgdGhlIGRheXMgZGlzcGxheWVkIGluXG4gKiB0aGUgY2FsZW5kYXIgKGxpa2UgXCJzZWxlY3RlZFwiIG9yIFwiZGlzYWJsZWRcIikuIERlZmluZSBjdXN0b20gbW9kaWZpZXJzIHVzaW5nXG4gKiB0aGUgYG1vZGlmaWVyc2AgcHJvcC5cbiAqXG4gKiAjIyMgRm9ybWF0dGVycyBhbmQgY3VzdG9tIGNvbXBvbmVudFxuICpcbiAqIFlvdSBjYW4gY3VzdG9taXplIGhvdyB0aGUgY29udGVudCBpcyBkaXNwbGF5ZWQgaW4gdGhlIGRhdGUgcGlja2VyIGJ5IHVzaW5nXG4gKiBlaXRoZXIgdGhlIGZvcm1hdHRlcnMgb3IgcmVwbGFjaW5nIHRoZSBpbnRlcm5hbCBjb21wb25lbnRzLlxuICpcbiAqIEZvciB0aGUgbW9zdCBjb21tb24gY2FzZXMgeW91IHdhbnQgdG8gdXNlIHRoZSBgZm9ybWF0dGVyc2AgcHJvcCB0byBjaGFuZ2UgaG93XG4gKiB0aGUgY29udGVudCBpcyBmb3JtYXR0ZWQgaW4gdGhlIGNhbGVuZGFyLiBVc2UgdGhlIGBjb21wb25lbnRzYCBwcm9wIHRvXG4gKiByZXBsYWNlIHRoZSBpbnRlcm5hbCBjb21wb25lbnRzLCBsaWtlIHRoZSBuYXZpZ2F0aW9uIGljb25zLlxuICpcbiAqICMjIyBTdHlsaW5nXG4gKlxuICogRGF5UGlja2VyIGNvbWVzIHdpdGggYSBkZWZhdWx0LCBiYXNpYyBzdHlsZSBpbiBgcmVhY3QtZGF5LXBpY2tlci9zdHlsZWAg4oCTIHVzZVxuICogaXQgYXMgdGVtcGxhdGUgZm9yIHlvdXIgb3duIHN0eWxlLlxuICpcbiAqIElmIHlvdSBhcmUgdXNpbmcgQ1NTIG1vZHVsZXMsIHBhc3MgdGhlIGltcG9ydGVkIHN0eWxlcyBvYmplY3QgdGhlXG4gKiBgY2xhc3NOYW1lc2AgcHJvcHMuXG4gKlxuICogWW91IGNhbiBhbHNvIHN0eWxlIHRoZSBlbGVtZW50cyB2aWEgaW5saW5lLXN0eWxlcyB1c2luZyB0aGUgYHN0eWxlc2AgcHJvcC5cbiAqXG4gKiAjIyMgRm9ybSBmaWVsZHNcbiAqXG4gKiBJZiB5b3UgbmVlZCB0byBiaW5kIHRoZSBkYXRlIHBpY2tlciB0byBhIGZvcm0gZmllbGQsIHlvdSBjYW4gdXNlIHRoZVxuICogYHVzZUlucHV0YCBob29rcyBmb3IgYSBiYXNpYyBiZWhhdmlvci4gU2VlIHRoZSBgdXNlSW5wdXRgIHNvdXJjZSBhcyBhblxuICogZXhhbXBsZSB0byBiaW5kIHRoZSBkYXRlIHBpY2tlciB3aXRoIGZvcm0gZmllbGRzLlxuICpcbiAqICMjIyBMb2NhbGl6YXRpb25cbiAqXG4gKiBUbyBsb2NhbGl6ZSBEYXlQaWNrZXIsIGltcG9ydCB0aGUgbG9jYWxlIGZyb20gYGRhdGUtZm5zYCBwYWNrYWdlIGFuZCB1c2UgdGhlXG4gKiBgbG9jYWxlYCBwcm9wLlxuICpcbiAqIEZvciBleGFtcGxlLCB0byB1c2UgU3BhbmlzaCBsb2NhbGU6XG4gKlxuICogYGBgXG4gKiBpbXBvcnQgZXMgZnJvbSAnZGF0ZS1mbnMvbG9jYWxlL2VzJztcbiAqIDxEYXlQaWNrZXIgbG9jYWxlPXtlc30gLz5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gRGF5UGlja2VyKHByb3BzKSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJvb3RQcm92aWRlciwgX19hc3NpZ24oe30sIHByb3BzKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChSb290LCBudWxsKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5UGlja2VyLmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBUYWtlcyBhbiBhcmd1bWVudCBhbmQgaWYgaXQncyBhbiBhcnJheSwgcmV0dXJucyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXksXG4gKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgYXJndW1lbnQuIFVzZWQgZm9yIFByZWFjdCBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgdmFyIHVud3JhcEFycmF5ID0gZnVuY3Rpb24gdW53cmFwQXJyYXkoYXJnKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyZykgPyBhcmdbMF0gOiBhcmc7XG59O1xuLyoqXG4gKiBUYWtlcyBhIG1heWJlLXVuZGVmaW5lZCBmdW5jdGlvbiBhbmQgYXJiaXRyYXJ5IGFyZ3MgYW5kIGludm9rZXMgdGhlIGZ1bmN0aW9uXG4gKiBvbmx5IGlmIGl0IGlzIGRlZmluZWQuXG4gKi9cblxuZXhwb3J0IHZhciBzYWZlSW52b2tlID0gZnVuY3Rpb24gc2FmZUludm9rZShmbikge1xuICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gIH1cbn07XG4vKipcbiAqIFNldHMgYSByZWYgdXNpbmcgZWl0aGVyIGEgcmVmIGNhbGxiYWNrIG9yIGEgcmVmIG9iamVjdFxuICovXG5cbmV4cG9ydCB2YXIgc2V0UmVmID0gZnVuY3Rpb24gc2V0UmVmKHJlZiwgbm9kZSkge1xuICAvLyBpZiBpdHMgYSBmdW5jdGlvbiBjYWxsIGl0XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNhZmVJbnZva2UocmVmLCBub2RlKTtcbiAgfSAvLyBvdGhlcndpc2Ugd2Ugc2hvdWxkIHRyZWF0IGl0IGFzIGEgcmVmIG9iamVjdFxuICBlbHNlIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgcmVmLmN1cnJlbnQgPSBub2RlO1xuICAgIH1cbn07XG4vKipcbiAqIFNpbXBsZSBwb255ZmlsbCBmb3IgT2JqZWN0LmZyb21FbnRyaWVzXG4gKi9cblxuZXhwb3J0IHZhciBmcm9tRW50cmllcyA9IGZ1bmN0aW9uIGZyb21FbnRyaWVzKGVudHJpZXMpIHtcbiAgcmV0dXJuIGVudHJpZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIF9yZWYpIHtcbiAgICB2YXIga2V5ID0gX3JlZlswXSxcbiAgICAgICAgdmFsdWUgPSBfcmVmWzFdO1xuICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufTtcbi8qKlxuICogU21hbGwgd3JhcHBlciBhcm91bmQgYHVzZUxheW91dEVmZmVjdGAgdG8gZ2V0IHJpZCBvZiB0aGUgd2FybmluZyBvbiBTU1IgZW52c1xuICovXG5cbmV4cG9ydCB2YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCA/IFJlYWN0LnVzZUxheW91dEVmZmVjdCA6IFJlYWN0LnVzZUVmZmVjdDsiLCJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAobm9kZS50b1N0cmluZygpICE9PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cgOiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBUaGlzIG1vZGlmaWVyIHRha2VzIHRoZSBzdHlsZXMgcHJlcGFyZWQgYnkgdGhlIGBjb21wdXRlU3R5bGVzYCBtb2RpZmllclxuLy8gYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgSFRNTEVsZW1lbnRzIHN1Y2ggYXMgcG9wcGVyIGFuZCBhcnJvd1xuXG5mdW5jdGlvbiBhcHBseVN0eWxlcyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGU7XG4gIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUuc3R5bGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgIC8vIGVmZmVjdGl2ZSB3YXkgdG8gYXBwbHkgc3R5bGVzIHRvIGFuIEhUTUxFbGVtZW50XG4gICAgLy8gJEZsb3dGaXhNZVtjYW5ub3Qtd3JpdGVdXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuICB2YXIgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICBwb3BwZXI6IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBtYXJnaW46ICcwJ1xuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSxcbiAgICByZWZlcmVuY2U6IHt9XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLCBpbml0aWFsU3R5bGVzLnBvcHBlcik7XG4gIHN0YXRlLnN0eWxlcyA9IGluaXRpYWxTdHlsZXM7XG5cbiAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5hcnJvdy5zdHlsZSwgaW5pdGlhbFN0eWxlcy5hcnJvdyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgICAgdmFyIHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHN0YXRlLnN0eWxlc1tuYW1lXSA6IGluaXRpYWxTdHlsZXNbbmFtZV0pOyAvLyBTZXQgYWxsIHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmcgdG8gdW5zZXQgdGhlbVxuXG4gICAgICB2YXIgc3R5bGUgPSBzdHlsZVByb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChzdHlsZSwgcHJvcGVydHkpIHtcbiAgICAgICAgc3R5bGVbcHJvcGVydHldID0gJyc7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0sIHt9KTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogYXBwbHlTdHlsZXMsXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07IiwiaW1wb3J0IHsgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xufSIsImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwiaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cblxuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSAxO1xuICB2YXIgc2NhbGVZID0gMTtcblxuICBpZiAoaXNIVE1MRWxlbWVudChlbGVtZW50KSAmJiBpbmNsdWRlU2NhbGUpIHtcbiAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgdmFyIG9mZnNldFdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDsgLy8gRG8gbm90IGF0dGVtcHQgdG8gZGl2aWRlIGJ5IDAsIG90aGVyd2lzZSB3ZSBnZXQgYEluZmluaXR5YCBhcyBzY2FsZVxuICAgIC8vIEZhbGxiYWNrIHRvIDEgaW4gY2FzZSBib3RoIHZhbHVlcyBhcmUgYDBgXG5cbiAgICBpZiAob2Zmc2V0V2lkdGggPiAwKSB7XG4gICAgICBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIG9mZnNldFdpZHRoIHx8IDE7XG4gICAgfVxuXG4gICAgaWYgKG9mZnNldEhlaWdodCA+IDApIHtcbiAgICAgIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIG9mZnNldEhlaWdodCB8fCAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3Qud2lkdGggLyBzY2FsZVgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodCAvIHNjYWxlWSxcbiAgICB0b3A6IHJlY3QudG9wIC8gc2NhbGVZLFxuICAgIHJpZ2h0OiByZWN0LnJpZ2h0IC8gc2NhbGVYLFxuICAgIGJvdHRvbTogcmVjdC5ib3R0b20gLyBzY2FsZVksXG4gICAgbGVmdDogcmVjdC5sZWZ0IC8gc2NhbGVYLFxuICAgIHg6IHJlY3QubGVmdCAvIHNjYWxlWCxcbiAgICB5OiByZWN0LnRvcCAvIHNjYWxlWVxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufSIsImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBpc1RhYmxlRWxlbWVudCBmcm9tIFwiLi9pc1RhYmxlRWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMTtcbiAgdmFyIGlzSUUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQnKSAhPT0gLTE7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsImltcG9ydCB7IG1heCBhcyBtYXRoTWF4LCBtaW4gYXMgbWF0aE1pbiB9IGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KSB7XG4gIHJldHVybiBtYXRoTWF4KG1pbiwgbWF0aE1pbih2YWx1ZSwgbWF4KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluLCB2YWx1ZSwgbWF4KSB7XG4gIHZhciB2ID0gd2l0aGluKG1pbiwgdmFsdWUsIG1heCk7XG4gIHJldHVybiB2ID4gbWF4ID8gbWF4IDogdjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGcmVzaFNpZGVPYmplY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwXG4gIH07XG59IiwiaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChwYWRkaW5nT2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBnZXRGcmVzaFNpZGVPYmplY3QoKSwgcGFkZGluZ09iamVjdCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4uL2RvbS11dGlscy9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4gfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICghaXNIVE1MRWxlbWVudChhcnJvd0VsZW1lbnQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImFycm93XCIgZWxlbWVudCBtdXN0IGJlIGFuIEhUTUxFbGVtZW50IChub3QgYW4gU1ZHRWxlbWVudCkuJywgJ1RvIHVzZSBhbiBTVkcgYXJyb3csIHdyYXAgaXQgaW4gYW4gSFRNTEVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgYXMnLCAndGhlIGFycm93LiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImFycm93XCIgbW9kaWZpZXJcXCdzIGBlbGVtZW50YCBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIHBvcHBlcicsICdlbGVtZW50LiddLmpvaW4oJyAnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhdGUuZWxlbWVudHMuYXJyb3cgPSBhcnJvd0VsZW1lbnQ7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcnJvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBhcnJvdyxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nXG59OyAvLyBSb3VuZCB0aGUgb2Zmc2V0cyB0byB0aGUgbmVhcmVzdCBzdWl0YWJsZSBzdWJwaXhlbCBiYXNlZCBvbiB0aGUgRFBSLlxuLy8gWm9vbWluZyBjYW4gY2hhbmdlIHRoZSBEUFIsIGJ1dCBpdCBzZWVtcyB0byByZXBvcnQgYSB2YWx1ZSB0aGF0IHdpbGxcbi8vIGNsZWFubHkgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3VicGl4ZWxzLlxuXG5mdW5jdGlvbiByb3VuZE9mZnNldHNCeURQUihfcmVmKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0pIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmNC54O1xuICB5ID0gX3JlZjQueTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgdmFyIF9PYmplY3QkYXNzaWduO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPD0gMSA/IFwidHJhbnNsYXRlKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgpXCIgOiBcInRyYW5zbGF0ZTNkKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgsIDApXCIsIF9PYmplY3QkYXNzaWduKSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24yID0ge30sIF9PYmplY3QkYXNzaWduMltzaWRlWV0gPSBoYXNZID8geSArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjJbc2lkZVhdID0gaGFzWCA/IHggKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yLnRyYW5zZm9ybSA9ICcnLCBfT2JqZWN0JGFzc2lnbjIpKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlcyhfcmVmNSkge1xuICB2YXIgc3RhdGUgPSBfcmVmNS5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmNS5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID0gb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRncHVBY2NlbGVyYXQsXG4gICAgICBfb3B0aW9ucyRhZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmUsXG4gICAgICBhZGFwdGl2ZSA9IF9vcHRpb25zJGFkYXB0aXZlID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWRhcHRpdmUsXG4gICAgICBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPSBvcHRpb25zLnJvdW5kT2Zmc2V0cyxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJvdW5kT2Zmc2V0cztcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdmFyIHRyYW5zaXRpb25Qcm9wZXJ0eSA9IGdldENvbXB1dGVkU3R5bGUoc3RhdGUuZWxlbWVudHMucG9wcGVyKS50cmFuc2l0aW9uUHJvcGVydHkgfHwgJyc7XG5cbiAgICBpZiAoYWRhcHRpdmUgJiYgWyd0cmFuc2Zvcm0nLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10uc29tZShmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiB0cmFuc2l0aW9uUHJvcGVydHkuaW5kZXhPZihwcm9wZXJ0eSkgPj0gMDtcbiAgICB9KSkge1xuICAgICAgY29uc29sZS53YXJuKFsnUG9wcGVyOiBEZXRlY3RlZCBDU1MgdHJhbnNpdGlvbnMgb24gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcnLCAnQ1NTIHByb3BlcnRpZXM6IFwidHJhbnNmb3JtXCIsIFwidG9wXCIsIFwicmlnaHRcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIuJywgJ1xcblxcbicsICdEaXNhYmxlIHRoZSBcImNvbXB1dGVTdHlsZXNcIiBtb2RpZmllclxcJ3MgYGFkYXB0aXZlYCBvcHRpb24gdG8gYWxsb3cnLCAnZm9yIHNtb290aCB0cmFuc2l0aW9ucywgb3IgcmVtb3ZlIHRoZXNlIHByb3BlcnRpZXMgZnJvbSB0aGUgQ1NTJywgJ3RyYW5zaXRpb24gZGVjbGFyYXRpb24gb24gdGhlIHBvcHBlciBlbGVtZW50IGlmIG9ubHkgdHJhbnNpdGlvbmluZycsICdvcGFjaXR5IG9yIGJhY2tncm91bmQtY29sb3IgZm9yIGV4YW1wbGUuJywgJ1xcblxcbicsICdXZSByZWNvbW1lbmQgdXNpbmcgdGhlIHBvcHBlciBlbGVtZW50IGFzIGEgd3JhcHBlciBhcm91bmQgYW4gaW5uZXInLCAnZWxlbWVudCB0aGF0IGNhbiBoYXZlIGFueSBDU1MgcHJvcGVydHkgdHJhbnNpdGlvbmVkIGZvciBhbmltYXRpb25zLiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IHtcbiAgICBwbGFjZW1lbnQ6IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KSxcbiAgICB2YXJpYXRpb246IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvbixcbiAgICBpc0ZpeGVkOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnXG4gIH07XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5wb3BwZXIsIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLFxuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBhZGFwdGl2ZTogYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLmFycm93ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLmFycm93LCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3csXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGFkYXB0aXZlOiBmYWxzZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcGxhY2VtZW50Jzogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnY29tcHV0ZVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnYmVmb3JlV3JpdGUnLFxuICBmbjogY29tcHV0ZVN0eWxlcyxcbiAgZGF0YToge31cbn07IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciBwYXNzaXZlID0ge1xuICBwYXNzaXZlOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJHNjcm9sbCA9IG9wdGlvbnMuc2Nyb2xsLFxuICAgICAgc2Nyb2xsID0gX29wdGlvbnMkc2Nyb2xsID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkc2Nyb2xsLFxuICAgICAgX29wdGlvbnMkcmVzaXplID0gb3B0aW9ucy5yZXNpemUsXG4gICAgICByZXNpemUgPSBfb3B0aW9ucyRyZXNpemUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyZXNpemU7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coc3RhdGUuZWxlbWVudHMucG9wcGVyKTtcbiAgdmFyIHNjcm9sbFBhcmVudHMgPSBbXS5jb25jYXQoc3RhdGUuc2Nyb2xsUGFyZW50cy5yZWZlcmVuY2UsIHN0YXRlLnNjcm9sbFBhcmVudHMucG9wcGVyKTtcblxuICBpZiAoc2Nyb2xsKSB7XG4gICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgIHNjcm9sbFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlc2l6ZSkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2Nyb2xsKSB7XG4gICAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgICBzY3JvbGxQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXNpemUpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH1cbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2V2ZW50TGlzdGVuZXJzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICd3cml0ZScsXG4gIGZuOiBmdW5jdGlvbiBmbigpIHt9LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgZGF0YToge31cbn07IiwidmFyIGhhc2ggPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwidmFyIGhhc2ggPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGwobm9kZSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KG5vZGUpO1xuICB2YXIgc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldDtcbiAgdmFyIHNjcm9sbFRvcCA9IHdpbi5wYWdlWU9mZnNldDtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wXG4gIH07XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIC8vIFBvcHBlciAxIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UgYW5kIG5ldmVyIGhhZCBhIGJ1ZyByZXBvcnQgc28gbGV0J3MgYXNzdW1lXG4gIC8vIGl0J3Mgbm90IGFuIGlzc3VlLiBJIGRvbid0IHRoaW5rIGFueW9uZSBldmVyIHNwZWNpZmllcyB3aWR0aCBvbiA8aHRtbD5cbiAgLy8gYW55d2F5LlxuICAvLyBCcm93c2VycyB3aGVyZSB0aGUgbGVmdCBzY3JvbGxiYXIgZG9lc24ndCBjYXVzZSBhbiBpc3N1ZSByZXBvcnQgYDBgIGZvclxuICAvLyB0aGlzIChlLmcuIEVkZ2UgMjAxOSwgSUUxMSwgU2FmYXJpKVxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldFdpbmRvd1Njcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgdmFyIHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDsgLy8gTkI6IFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIG9uIGlPUyA8PSAxMi4gSWYgdGhlIGtleWJvYXJkIGlzIG9wZW4sIHRoZSBwb3BwZXJcbiAgLy8gY2FuIGJlIG9ic2N1cmVkIHVuZGVybmVhdGggaXQuXG4gIC8vIEFsc28sIGBodG1sLmNsaWVudEhlaWdodGAgYWRkcyB0aGUgYm90dG9tIGJhciBoZWlnaHQgaW4gU2FmYXJpIGlPUywgZXZlblxuICAvLyBpZiBpdCBpc24ndCBvcGVuLCBzbyBpZiB0aGlzIGlzbid0IGF2YWlsYWJsZSwgdGhlIHBvcHBlciB3aWxsIGJlIGRldGVjdGVkXG4gIC8vIHRvIG92ZXJmbG93IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiB0b28gZWFybHkuXG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7IC8vIFVzZXMgTGF5b3V0IFZpZXdwb3J0IChsaWtlIENocm9tZTsgU2FmYXJpIGRvZXMgbm90IGN1cnJlbnRseSlcbiAgICAvLyBJbiBDaHJvbWUsIGl0IHJldHVybnMgYSB2YWx1ZSB2ZXJ5IGNsb3NlIHRvIDAgKCsvLSkgYnV0IGNvbnRhaW5zIHJvdW5kaW5nXG4gICAgLy8gZXJyb3JzIGR1ZSB0byBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHByZWNpc2lvbi5cbiAgICAvLyBTYWZhcmkgcmV0dXJucyBhIG51bWJlciA8PSAwLCB1c3VhbGx5IDwgLTEgd2hlbiBwaW5jaC16b29tZWRcbiAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmYWlscyBpbiBtb2JpbGUgZW11bGF0aW9uIG1vZGUgaW4gQ2hyb21lLlxuICAgIC8vIE1hdGguYWJzKHdpbi5pbm5lcldpZHRoIC8gdmlzdWFsVmlld3BvcnQuc2NhbGUgLSB2aXN1YWxWaWV3cG9ydC53aWR0aCkgPFxuICAgIC8vIDAuMDAxXG4gICAgLy8gRmFsbGJhY2sgaGVyZTogXCJOb3QgU2FmYXJpXCIgdXNlckFnZW50XG5cbiAgICBpZiAoIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59IiwiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCJpbXBvcnQgZ2V0U2Nyb2xsUGFyZW50IGZyb20gXCIuL2dldFNjcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZWN0LCB7XG4gICAgbGVmdDogcmVjdC54LFxuICAgIHRvcDogcmVjdC55LFxuICAgIHJpZ2h0OiByZWN0LnggKyByZWN0LndpZHRoLFxuICAgIGJvdHRvbTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgfSk7XG59IiwiaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWaWV3cG9ydFJlY3QgZnJvbSBcIi4vZ2V0Vmlld3BvcnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gXCIuL2dldERvY3VtZW50UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTtcbiAgcmVjdC50b3AgPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICByZWN0LmxlZnQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3Qud2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LmhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnggPSByZWN0LmxlZnQ7XG4gIHJlY3QueSA9IHJlY3QudG9wO1xuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50ID09PSB2aWV3cG9ydCA/IHJlY3RUb0NsaWVudFJlY3QoZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQpKSA6IGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudCkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnkpIHtcbiAgdmFyIG1haW5DbGlwcGluZ1BhcmVudHMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nUGFyZW50cycgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gW10uY29uY2F0KG1haW5DbGlwcGluZ1BhcmVudHMsIFtyb290Qm91bmRhcnldKTtcbiAgdmFyIGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG4gIHZhciBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ1BhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2NSZWN0LCBjbGlwcGluZ1BhcmVudCkge1xuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdQYXJlbnQpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsImltcG9ydCBnZXRDbGlwcGluZ1JlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4vcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgY2xpcHBpbmdQYXJlbnRzLCByZWZlcmVuY2UsIHBvcHBlciwgYm90dG9tLCB0b3AsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4vZXhwYW5kVG9IYXNoTWFwLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/IHN0YXRlLnBsYWNlbWVudCA6IF9vcHRpb25zJHBsYWNlbWVudCxcbiAgICAgIF9vcHRpb25zJGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zJGJvdW5kYXJ5ID09PSB2b2lkIDAgPyBjbGlwcGluZ1BhcmVudHMgOiBfb3B0aW9ucyRib3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9PT0gdm9pZCAwID8gdmlld3BvcnQgOiBfb3B0aW9ucyRyb290Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRlbGVtZW50Q29udGUgPSBfb3B0aW9ucy5lbGVtZW50Q29udGV4dCxcbiAgICAgIGVsZW1lbnRDb250ZXh0ID0gX29wdGlvbnMkZWxlbWVudENvbnRlID09PSB2b2lkIDAgPyBwb3BwZXIgOiBfb3B0aW9ucyRlbGVtZW50Q29udGUsXG4gICAgICBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9IF9vcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuICB2YXIgcGFkZGluZ09iamVjdCA9IG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG4gIHZhciBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHJlZmVyZW5jZSA6IHBvcHBlcjtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5KTtcbiAgdmFyIHJlZmVyZW5jZUNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc3RhdGUuZWxlbWVudHMucmVmZXJlbmNlKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgIGVsZW1lbnQ6IHBvcHBlclJlY3QsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSk7XG4gIHZhciBwb3BwZXJDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChPYmplY3QuYXNzaWduKHt9LCBwb3BwZXJSZWN0LCBwb3BwZXJPZmZzZXRzKSk7XG4gIHZhciBlbGVtZW50Q2xpZW50UmVjdCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyBwb3BwZXJDbGllbnRSZWN0IDogcmVmZXJlbmNlQ2xpZW50UmVjdDsgLy8gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgcmVjdFxuICAvLyAwIG9yIG5lZ2F0aXZlID0gd2l0aGluIHRoZSBjbGlwcGluZyByZWN0XG5cbiAgdmFyIG92ZXJmbG93T2Zmc2V0cyA9IHtcbiAgICB0b3A6IGNsaXBwaW5nQ2xpZW50UmVjdC50b3AgLSBlbGVtZW50Q2xpZW50UmVjdC50b3AgKyBwYWRkaW5nT2JqZWN0LnRvcCxcbiAgICBib3R0b206IGVsZW1lbnRDbGllbnRSZWN0LmJvdHRvbSAtIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSxcbiAgICBsZWZ0OiBjbGlwcGluZ0NsaWVudFJlY3QubGVmdCAtIGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgKyBwYWRkaW5nT2JqZWN0LmxlZnQsXG4gICAgcmlnaHQ6IGVsZW1lbnRDbGllbnRSZWN0LnJpZ2h0IC0gY2xpcHBpbmdDbGllbnRSZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodFxuICB9O1xuICB2YXIgb2Zmc2V0RGF0YSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0OyAvLyBPZmZzZXRzIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gdGhlIHBvcHBlciBlbGVtZW50XG5cbiAgaWYgKGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgJiYgb2Zmc2V0RGF0YSkge1xuICAgIHZhciBvZmZzZXQgPSBvZmZzZXREYXRhW3BsYWNlbWVudF07XG4gICAgT2JqZWN0LmtleXMob3ZlcmZsb3dPZmZzZXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBtdWx0aXBseSA9IFtyaWdodCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/IDEgOiAtMTtcbiAgICAgIHZhciBheGlzID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/ICd5JyA6ICd4JztcbiAgICAgIG92ZXJmbG93T2Zmc2V0c1trZXldICs9IG9mZnNldFtheGlzXSAqIG11bHRpcGx5O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJmbG93T2Zmc2V0cztcbn0iLCJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogVGhlIGBhbGxvd2VkQXV0b1BsYWNlbWVudHNgIG9wdGlvbiBkaWQgbm90IGFsbG93IGFueScsICdwbGFjZW1lbnRzLiBFbnN1cmUgdGhlIGBwbGFjZW1lbnRgIG9wdGlvbiBtYXRjaGVzIHRoZSB2YXJpYXRpb24nLCAnb2YgdGhlIGFsbG93ZWQgcGxhY2VtZW50cy4nLCAnRm9yIGV4YW1wbGUsIFwiYXV0b1wiIGNhbm5vdCBiZSB1c2VkIHRvIGFsbG93IFwiYm90dG9tLXN0YXJ0XCIuJywgJ1VzZSBcImF1dG8tc3RhcnRcIiBpbnN0ZWFkLiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMg4oCTIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwiaW1wb3J0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKSB7XG4gIGlmIChwcmV2ZW50ZWRPZmZzZXRzID09PSB2b2lkIDApIHtcbiAgICBwcmV2ZW50ZWRPZmZzZXRzID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdLnNvbWUoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dbc2lkZV0gPj0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhpZGUoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgcHJldmVudGVkT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93O1xuICB2YXIgcmVmZXJlbmNlT3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICB9KTtcbiAgdmFyIHBvcHBlckFsdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHJlZmVyZW5jZU92ZXJmbG93LCByZWZlcmVuY2VSZWN0KTtcbiAgdmFyIHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhwb3BwZXJBbHRPdmVyZmxvdywgcG9wcGVyUmVjdCwgcHJldmVudGVkT2Zmc2V0cyk7XG4gIHZhciBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICB2YXIgaGFzUG9wcGVyRXNjYXBlZCA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChwb3BwZXJFc2NhcGVPZmZzZXRzKTtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IHtcbiAgICByZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6IHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyxcbiAgICBwb3BwZXJFc2NhcGVPZmZzZXRzOiBwb3BwZXJFc2NhcGVPZmZzZXRzLFxuICAgIGlzUmVmZXJlbmNlSGlkZGVuOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICBoYXNQb3BwZXJFc2NhcGVkOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH07XG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2hpZGUnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxuICBmbjogaGlkZVxufTsiLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFsdEF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0SFRNTEVsZW1lbnRTY3JvbGwgZnJvbSBcIi4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldE5vZGVTY3JvbGwgZnJvbSBcIi4vZ2V0Tm9kZVNjcm9sbC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnRTY2FsZWQoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgdmFyIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHJldHVybiBzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxO1xufSAvLyBSZXR1cm5zIHRoZSBjb21wb3NpdGUgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnRJc1NjYWxlZCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50SXNTY2FsZWQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5ODc1MjU1XG5cbmZ1bmN0aW9uIG9yZGVyKG1vZGlmaWVycykge1xuICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBtYXAuc2V0KG1vZGlmaWVyLm5hbWUsIG1vZGlmaWVyKTtcbiAgfSk7IC8vIE9uIHZpc2l0aW5nIG9iamVjdCwgY2hlY2sgZm9yIGl0cyBkZXBlbmRlbmNpZXMgYW5kIHZpc2l0IHRoZW0gcmVjdXJzaXZlbHlcblxuICBmdW5jdGlvbiBzb3J0KG1vZGlmaWVyKSB7XG4gICAgdmlzaXRlZC5hZGQobW9kaWZpZXIubmFtZSk7XG4gICAgdmFyIHJlcXVpcmVzID0gW10uY29uY2F0KG1vZGlmaWVyLnJlcXVpcmVzIHx8IFtdLCBtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzIHx8IFtdKTtcbiAgICByZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICB2YXIgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChtb2RpZmllcik7XG4gIH1cblxuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9yZGVyTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAvLyBvcmRlciBiYXNlZCBvbiBkZXBlbmRlbmNpZXNcbiAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcihtb2RpZmllcnMpOyAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuXG4gIHJldHVybiBtb2RpZmllclBoYXNlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGhhc2UpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgIHJldHVybiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2U7XG4gICAgfSkpO1xuICB9LCBbXSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcbiAgdmFyIHBlbmRpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKGZuKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCB2YWxpZGF0ZU1vZGlmaWVycyBmcm9tIFwiLi91dGlscy92YWxpZGF0ZU1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IHVuaXF1ZUJ5IGZyb20gXCIuL3V0aWxzL3VuaXF1ZUJ5LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgbWVyZ2VCeU5hbWUgZnJvbSBcIi4vdXRpbHMvbWVyZ2VCeU5hbWUuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi9lbnVtcy5qc1wiO1xudmFyIElOVkFMSURfRUxFTUVOVF9FUlJPUiA9ICdQb3BwZXI6IEludmFsaWQgcmVmZXJlbmNlIG9yIHBvcHBlciBhcmd1bWVudCBwcm92aWRlZC4gVGhleSBtdXN0IGJlIGVpdGhlciBhIERPTSBlbGVtZW50IG9yIHZpcnR1YWwgZWxlbWVudC4nO1xudmFyIElORklOSVRFX0xPT1BfRVJST1IgPSAnUG9wcGVyOiBBbiBpbmZpbml0ZSBsb29wIGluIHRoZSBtb2RpZmllcnMgY3ljbGUgaGFzIGJlZW4gZGV0ZWN0ZWQhIFRoZSBjeWNsZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB0byBwcmV2ZW50IGEgYnJvd3NlciBjcmFzaC4nO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pOyAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbW9kaWZpZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyIHdpbGwgZ2V0IHdhcm5lZFxuICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIG1vZGlmaWVycyBpcyBpbnZhbGlkIGZvciBhbnkgcmVhc29uXG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIHZhciBtb2RpZmllcnMgPSB1bmlxdWVCeShbXS5jb25jYXQob3JkZXJlZE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgICAgICAgaWYgKGdldEJhc2VQbGFjZW1lbnQoc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgICAgICAgICB2YXIgZmxpcE1vZGlmaWVyID0gc3RhdGUub3JkZXJlZE1vZGlmaWVycy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYyLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBuYW1lID09PSAnZmxpcCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFmbGlwTW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhdXRvXCIgcGxhY2VtZW50cyByZXF1aXJlIHRoZSBcImZsaXBcIiBtb2RpZmllciBiZScsICdwcmVzZW50IGFuZCBlbmFibGVkIHRvIHdvcmsuJ10uam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBvcHBlciksXG4gICAgICAgICAgICAgIG1hcmdpblRvcCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblRvcCxcbiAgICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCxcbiAgICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luQm90dG9tLFxuICAgICAgICAgICAgICBtYXJnaW5MZWZ0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luTGVmdDsgLy8gV2Ugbm8gbG9uZ2VyIHRha2UgaW50byBhY2NvdW50IGBtYXJnaW5zYCBvbiB0aGUgcG9wcGVyLCBhbmQgaXQgY2FuXG4gICAgICAgICAgLy8gY2F1c2UgYnVncyB3aXRoIHBvc2l0aW9uaW5nLCBzbyB3ZSdsbCB3YXJuIHRoZSBjb25zdW1lclxuXG5cbiAgICAgICAgICBpZiAoW21hcmdpblRvcCwgbWFyZ2luUmlnaHQsIG1hcmdpbkJvdHRvbSwgbWFyZ2luTGVmdF0uc29tZShmdW5jdGlvbiAobWFyZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXJnaW4pO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IENTUyBcIm1hcmdpblwiIHN0eWxlcyBjYW5ub3QgYmUgdXNlZCB0byBhcHBseSBwYWRkaW5nJywgJ2JldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50IG9yIGJvdW5kYXJ5LicsICdUbyByZXBsaWNhdGUgbWFyZ2luLCB1c2UgdGhlIGBvZmZzZXRgIG1vZGlmaWVyLCBhcyB3ZWxsIGFzJywgJ3RoZSBgcGFkZGluZ2Agb3B0aW9uIGluIHRoZSBgcHJldmVudE92ZXJmbG93YCBhbmQgYGZsaXBgJywgJ21vZGlmaWVycy4nXS5qb2luKCcgJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9fZGVidWdfbG9vcHNfXyA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgX19kZWJ1Z19sb29wc19fICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChfX2RlYnVnX2xvb3BzX18gPiAxMDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTkZJTklURV9MT09QX0VSUk9SKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIOKAkyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXG4gICAgICAgICAgICBfcmVmMyRvcHRpb25zID0gX3JlZjMub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmMyRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYzJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmMy5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbmltcG9ydCBvZmZzZXQgZnJvbSBcIi4vbW9kaWZpZXJzL29mZnNldC5qc1wiO1xuaW1wb3J0IGZsaXAgZnJvbSBcIi4vbW9kaWZpZXJzL2ZsaXAuanNcIjtcbmltcG9ydCBwcmV2ZW50T3ZlcmZsb3cgZnJvbSBcIi4vbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGFycm93IGZyb20gXCIuL21vZGlmaWVycy9hcnJvdy5qc1wiO1xuaW1wb3J0IGhpZGUgZnJvbSBcIi4vbW9kaWZpZXJzL2hpZGUuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlcywgb2Zmc2V0LCBmbGlwLCBwcmV2ZW50T3ZlcmZsb3csIGFycm93LCBoaWRlXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckxpdGUgfSBmcm9tIFwiLi9wb3BwZXItbGl0ZS5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCAqIGZyb20gXCIuL21vZGlmaWVycy9pbmRleC5qc1wiOyIsIi8qIGdsb2JhbCBNYXA6cmVhZG9ubHksIFNldDpyZWFkb25seSwgQXJyYXlCdWZmZXI6cmVhZG9ubHkgKi9cblxudmFyIGhhc0VsZW1lbnRUeXBlID0gdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnO1xudmFyIGhhc01hcCA9IHR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbic7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBoYXNBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiAhIUFycmF5QnVmZmVyLmlzVmlldztcblxuLy8gTm90ZTogV2UgKipkb24ndCoqIG5lZWQgYGVudkhhc0JpZ0ludDY0QXJyYXlgIGluIGZkZSBlczYvaW5kZXguanNcblxuZnVuY3Rpb24gZXF1YWwoYSwgYikge1xuICAvLyBTVEFSVDogZmFzdC1kZWVwLWVxdWFsIGVzNi9pbmRleC5qcyAzLjEuMVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PSAnb2JqZWN0Jykge1xuICAgIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgbGVuZ3RoLCBpLCBrZXlzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKCFlcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU1RBUlQ6IE1vZGlmaWNhdGlvbnM6XG4gICAgLy8gMS4gRXh0cmEgYGhhczxUeXBlPiAmJmAgaGVscGVycyBpbiBpbml0aWFsIGNvbmRpdGlvbiBhbGxvdyBlczYgY29kZVxuICAgIC8vICAgIHRvIGNvLWV4aXN0IHdpdGggZXM1LlxuICAgIC8vIDIuIFJlcGxhY2UgYGZvciBvZmAgd2l0aCBlczUgY29tcGxpYW50IGl0ZXJhdGlvbiB1c2luZyBgZm9yYC5cbiAgICAvLyAgICBCYXNpY2FsbHksIHRha2U6XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGZvciAoaSBvZiBhLmVudHJpZXMoKSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgIC4uLiBhbmQgY29udmVydCB0bzpcbiAgICAvL1xuICAgIC8vICAgIGBgYGpzXG4gICAgLy8gICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAvLyAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgIC8vICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgIGBgYFxuICAgIC8vXG4gICAgLy8gICAgKipOb3RlKio6IGBpYCBhY2Nlc3Mgc3dpdGNoZXMgdG8gYGkudmFsdWVgLlxuICAgIHZhciBpdDtcbiAgICBpZiAoaGFzTWFwICYmIChhIGluc3RhbmNlb2YgTWFwKSAmJiAoYiBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWVxdWFsKGkudmFsdWVbMV0sIGIuZ2V0KGkudmFsdWVbMF0pKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NldCAmJiAoYSBpbnN0YW5jZW9mIFNldCkgJiYgKGIgaW5zdGFuY2VvZiBTZXQpKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRU5EOiBNb2RpZmljYXRpb25zXG5cbiAgICBpZiAoaGFzQXJyYXlCdWZmZXIgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGEpICYmIEFycmF5QnVmZmVyLmlzVmlldyhiKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEVORDogZmFzdC1kZWVwLWVxdWFsXG5cbiAgICAvLyBTVEFSVDogcmVhY3QtZmFzdC1jb21wYXJlXG4gICAgLy8gY3VzdG9tIGhhbmRsaW5nIGZvciBET00gZWxlbWVudHNcbiAgICBpZiAoaGFzRWxlbWVudFR5cGUgJiYgYSBpbnN0YW5jZW9mIEVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIGN1c3RvbSBoYW5kbGluZyBmb3IgUmVhY3QvUHJlYWN0XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICBpZiAoKGtleXNbaV0gPT09ICdfb3duZXInIHx8IGtleXNbaV0gPT09ICdfX3YnIHx8IGtleXNbaV0gPT09ICdfX28nKSAmJiBhLiQkdHlwZW9mKSB7XG4gICAgICAgIC8vIFJlYWN0LXNwZWNpZmljOiBhdm9pZCB0cmF2ZXJzaW5nIFJlYWN0IGVsZW1lbnRzJyBfb3duZXJcbiAgICAgICAgLy8gUHJlYWN0LXNwZWNpZmljOiBhdm9pZCB0cmF2ZXJzaW5nIFByZWFjdCBlbGVtZW50cycgX192IGFuZCBfX29cbiAgICAgICAgLy8gICAgX192ID0gJF9vcmlnaW5hbCAvICRfdm5vZGVcbiAgICAgICAgLy8gICAgX19vID0gJF9vd25lclxuICAgICAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGNvbnRhaW4gY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgYXJlIG5vdCBuZWVkZWQgd2hlblxuICAgICAgICAvLyBjb21wYXJpbmcgdGhlIGFjdHVhbCBlbGVtZW50cyAoYW5kIG5vdCB0aGVpciBvd25lcnMpXG4gICAgICAgIC8vIC4kJHR5cGVvZiBhbmQgLl9zdG9yZSBvbiBqdXN0IHJlYXNvbmFibGUgbWFya2VycyBvZiBlbGVtZW50c1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhbGwgb3RoZXIgcHJvcGVydGllcyBzaG91bGQgYmUgdHJhdmVyc2VkIGFzIHVzdWFsXG4gICAgICBpZiAoIWVxdWFsKGFba2V5c1tpXV0sIGJba2V5c1tpXV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEVORDogcmVhY3QtZmFzdC1jb21wYXJlXG5cbiAgICAvLyBTVEFSVDogZmFzdC1kZWVwLWVxdWFsXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xufVxuLy8gZW5kIGZhc3QtZGVlcC1lcXVhbFxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRXF1YWwoYSwgYikge1xuICB0cnkge1xuICAgIHJldHVybiBlcXVhbChhLCBiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKChlcnJvci5tZXNzYWdlIHx8ICcnKS5tYXRjaCgvc3RhY2t8cmVjdXJzaW9uL2kpKSkge1xuICAgICAgLy8gd2FybiBvbiBjaXJjdWxhciByZWZlcmVuY2VzLCBkb24ndCBjcmFzaFxuICAgICAgLy8gYnJvd3NlcnMgZ2l2ZSB0aGlzIGRpZmZlcmVudCBlcnJvcnMgbmFtZSBhbmQgbWVzc2FnZXM6XG4gICAgICAvLyBjaHJvbWUvc2FmYXJpOiBcIlJhbmdlRXJyb3JcIiwgXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiXG4gICAgICAvLyBmaXJlZm94OiBcIkludGVybmFsRXJyb3JcIiwgdG9vIG11Y2ggcmVjdXJzaW9uXCJcbiAgICAgIC8vIGVkZ2U6IFwiRXJyb3JcIiwgXCJPdXQgb2Ygc3RhY2sgc3BhY2VcIlxuICAgICAgY29uc29sZS53YXJuKCdyZWFjdC1mYXN0LWNvbXBhcmUgY2Fubm90IGhhbmRsZSBjaXJjdWxhciByZWZzJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIHNvbWUgb3RoZXIgZXJyb3IuIHdlIHNob3VsZCBkZWZpbml0ZWx5IGtub3cgYWJvdXQgdGhlc2VcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBkZWZhdWx0Q3JlYXRlUG9wcGVyIH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAncmVhY3QtZmFzdC1jb21wYXJlJztcbmltcG9ydCB7IGZyb21FbnRyaWVzLCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IH0gZnJvbSAnLi91dGlscyc7XG52YXIgRU1QVFlfTU9ESUZJRVJTID0gW107XG5leHBvcnQgdmFyIHVzZVBvcHBlciA9IGZ1bmN0aW9uIHVzZVBvcHBlcihyZWZlcmVuY2VFbGVtZW50LCBwb3BwZXJFbGVtZW50LCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgcHJldk9wdGlvbnMgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBvcHRpb25zV2l0aERlZmF1bHRzID0ge1xuICAgIG9uRmlyc3RVcGRhdGU6IG9wdGlvbnMub25GaXJzdFVwZGF0ZSxcbiAgICBwbGFjZW1lbnQ6IG9wdGlvbnMucGxhY2VtZW50IHx8ICdib3R0b20nLFxuICAgIHN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5IHx8ICdhYnNvbHV0ZScsXG4gICAgbW9kaWZpZXJzOiBvcHRpb25zLm1vZGlmaWVycyB8fCBFTVBUWV9NT0RJRklFUlNcbiAgfTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIHN0eWxlczoge1xuICAgICAgcG9wcGVyOiB7XG4gICAgICAgIHBvc2l0aW9uOiBvcHRpb25zV2l0aERlZmF1bHRzLnN0cmF0ZWd5LFxuICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgIHRvcDogJzAnXG4gICAgICB9LFxuICAgICAgYXJyb3c6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICAgIH1cbiAgICB9LFxuICAgIGF0dHJpYnV0ZXM6IHt9XG4gIH0pLFxuICAgICAgc3RhdGUgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICB2YXIgdXBkYXRlU3RhdGVNb2RpZmllciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAndXBkYXRlU3RhdGUnLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHBoYXNlOiAnd3JpdGUnLFxuICAgICAgZm46IGZ1bmN0aW9uIGZuKF9yZWYpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZTtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpO1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgc3R5bGVzOiBmcm9tRW50cmllcyhlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWxlbWVudCwgc3RhdGUuc3R5bGVzW2VsZW1lbnRdIHx8IHt9XTtcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgYXR0cmlidXRlczogZnJvbUVudHJpZXMoZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gW2VsZW1lbnQsIHN0YXRlLmF0dHJpYnV0ZXNbZWxlbWVudF1dO1xuICAgICAgICAgIH0pKVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbiAgICB9O1xuICB9LCBbXSk7XG4gIHZhciBwb3BwZXJPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5ld09wdGlvbnMgPSB7XG4gICAgICBvbkZpcnN0VXBkYXRlOiBvcHRpb25zV2l0aERlZmF1bHRzLm9uRmlyc3RVcGRhdGUsXG4gICAgICBwbGFjZW1lbnQ6IG9wdGlvbnNXaXRoRGVmYXVsdHMucGxhY2VtZW50LFxuICAgICAgc3RyYXRlZ3k6IG9wdGlvbnNXaXRoRGVmYXVsdHMuc3RyYXRlZ3ksXG4gICAgICBtb2RpZmllcnM6IFtdLmNvbmNhdChvcHRpb25zV2l0aERlZmF1bHRzLm1vZGlmaWVycywgW3VwZGF0ZVN0YXRlTW9kaWZpZXIsIHtcbiAgICAgICAgbmFtZTogJ2FwcGx5U3R5bGVzJyxcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgIH1dKVxuICAgIH07XG5cbiAgICBpZiAoaXNFcXVhbChwcmV2T3B0aW9ucy5jdXJyZW50LCBuZXdPcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHByZXZPcHRpb25zLmN1cnJlbnQgfHwgbmV3T3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldk9wdGlvbnMuY3VycmVudCA9IG5ld09wdGlvbnM7XG4gICAgICByZXR1cm4gbmV3T3B0aW9ucztcbiAgICB9XG4gIH0sIFtvcHRpb25zV2l0aERlZmF1bHRzLm9uRmlyc3RVcGRhdGUsIG9wdGlvbnNXaXRoRGVmYXVsdHMucGxhY2VtZW50LCBvcHRpb25zV2l0aERlZmF1bHRzLnN0cmF0ZWd5LCBvcHRpb25zV2l0aERlZmF1bHRzLm1vZGlmaWVycywgdXBkYXRlU3RhdGVNb2RpZmllcl0pO1xuICB2YXIgcG9wcGVySW5zdGFuY2VSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQuc2V0T3B0aW9ucyhwb3BwZXJPcHRpb25zKTtcbiAgICB9XG4gIH0sIFtwb3BwZXJPcHRpb25zXSk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChyZWZlcmVuY2VFbGVtZW50ID09IG51bGwgfHwgcG9wcGVyRWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0ZVBvcHBlciA9IG9wdGlvbnMuY3JlYXRlUG9wcGVyIHx8IGRlZmF1bHRDcmVhdGVQb3BwZXI7XG4gICAgdmFyIHBvcHBlckluc3RhbmNlID0gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHBvcHBlckVsZW1lbnQsIHBvcHBlck9wdGlvbnMpO1xuICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPSBwb3BwZXJJbnN0YW5jZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcG9wcGVySW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfSwgW3JlZmVyZW5jZUVsZW1lbnQsIHBvcHBlckVsZW1lbnQsIG9wdGlvbnMuY3JlYXRlUG9wcGVyXSk7XG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPyBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50LnN0YXRlIDogbnVsbCxcbiAgICBzdHlsZXM6IHN0YXRlLnN0eWxlcyxcbiAgICBhdHRyaWJ1dGVzOiBzdGF0ZS5hdHRyaWJ1dGVzLFxuICAgIHVwZGF0ZTogcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA/IHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQudXBkYXRlIDogbnVsbCxcbiAgICBmb3JjZVVwZGF0ZTogcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA/IHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQuZm9yY2VVcGRhdGUgOiBudWxsXG4gIH07XG59OyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb24oKSB7fVxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbldpdGhSZXNldCgpIHt9XG5lbXB0eUZ1bmN0aW9uV2l0aFJlc2V0LnJlc2V0V2FybmluZ0NhY2hlID0gZW1wdHlGdW5jdGlvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gc2hpbShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGlmIChzZWNyZXQgPT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAvLyBJdCBpcyBzdGlsbCBzYWZlIHdoZW4gY2FsbGVkIGZyb20gUmVhY3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAnVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICApO1xuICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIHRocm93IGVycjtcbiAgfTtcbiAgc2hpbS5pc1JlcXVpcmVkID0gc2hpbTtcbiAgZnVuY3Rpb24gZ2V0U2hpbSgpIHtcbiAgICByZXR1cm4gc2hpbTtcbiAgfTtcbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBzaGltLFxuICAgIGJpZ2ludDogc2hpbSxcbiAgICBib29sOiBzaGltLFxuICAgIGZ1bmM6IHNoaW0sXG4gICAgbnVtYmVyOiBzaGltLFxuICAgIG9iamVjdDogc2hpbSxcbiAgICBzdHJpbmc6IHNoaW0sXG4gICAgc3ltYm9sOiBzaGltLFxuXG4gICAgYW55OiBzaGltLFxuICAgIGFycmF5T2Y6IGdldFNoaW0sXG4gICAgZWxlbWVudDogc2hpbSxcbiAgICBlbGVtZW50VHlwZTogc2hpbSxcbiAgICBpbnN0YW5jZU9mOiBnZXRTaGltLFxuICAgIG5vZGU6IHNoaW0sXG4gICAgb2JqZWN0T2Y6IGdldFNoaW0sXG4gICAgb25lT2Y6IGdldFNoaW0sXG4gICAgb25lT2ZUeXBlOiBnZXRTaGltLFxuICAgIHNoYXBlOiBnZXRTaGltLFxuICAgIGV4YWN0OiBnZXRTaGltLFxuXG4gICAgY2hlY2tQcm9wVHlwZXM6IGVtcHR5RnVuY3Rpb25XaXRoUmVzZXQsXG4gICAgcmVzZXRXYXJuaW5nQ2FjaGU6IGVtcHR5RnVuY3Rpb25cbiAgfTtcblxuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwiLyohXG4qIHRhYmJhYmxlIDUuMi4xXG4qIEBsaWNlbnNlIE1JVCwgaHR0cHM6Ly9naXRodWIuY29tL2ZvY3VzLXRyYXAvdGFiYmFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRVxuKi9cbnZhciBjYW5kaWRhdGVTZWxlY3RvcnMgPSBbJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYScsICdhW2hyZWZdJywgJ2J1dHRvbicsICdbdGFiaW5kZXhdJywgJ2F1ZGlvW2NvbnRyb2xzXScsICd2aWRlb1tjb250cm9sc10nLCAnW2NvbnRlbnRlZGl0YWJsZV06bm90KFtjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXSknLCAnZGV0YWlscz5zdW1tYXJ5OmZpcnN0LW9mLXR5cGUnLCAnZGV0YWlscyddO1xudmFyIGNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmpvaW4oJywnKTtcbnZhciBtYXRjaGVzID0gdHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKCkge30gOiBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzIHx8IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3RvcjtcblxudmFyIGdldENhbmRpZGF0ZXMgPSBmdW5jdGlvbiBnZXRDYW5kaWRhdGVzKGVsLCBpbmNsdWRlQ29udGFpbmVyLCBmaWx0ZXIpIHtcbiAgdmFyIGNhbmRpZGF0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoZWwucXVlcnlTZWxlY3RvckFsbChjYW5kaWRhdGVTZWxlY3RvcikpO1xuXG4gIGlmIChpbmNsdWRlQ29udGFpbmVyICYmIG1hdGNoZXMuY2FsbChlbCwgY2FuZGlkYXRlU2VsZWN0b3IpKSB7XG4gICAgY2FuZGlkYXRlcy51bnNoaWZ0KGVsKTtcbiAgfVxuXG4gIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLmZpbHRlcihmaWx0ZXIpO1xuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbnZhciBpc0NvbnRlbnRFZGl0YWJsZSA9IGZ1bmN0aW9uIGlzQ29udGVudEVkaXRhYmxlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZSc7XG59O1xuXG52YXIgZ2V0VGFiaW5kZXggPSBmdW5jdGlvbiBnZXRUYWJpbmRleChub2RlKSB7XG4gIHZhciB0YWJpbmRleEF0dHIgPSBwYXJzZUludChub2RlLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgMTApO1xuXG4gIGlmICghaXNOYU4odGFiaW5kZXhBdHRyKSkge1xuICAgIHJldHVybiB0YWJpbmRleEF0dHI7XG4gIH0gLy8gQnJvd3NlcnMgZG8gbm90IHJldHVybiBgdGFiSW5kZXhgIGNvcnJlY3RseSBmb3IgY29udGVudEVkaXRhYmxlIG5vZGVzO1xuICAvLyBzbyBpZiB0aGV5IGRvbid0IGhhdmUgYSB0YWJpbmRleCBhdHRyaWJ1dGUgc3BlY2lmaWNhbGx5IHNldCwgYXNzdW1lIGl0J3MgMC5cblxuXG4gIGlmIChpc0NvbnRlbnRFZGl0YWJsZShub2RlKSkge1xuICAgIHJldHVybiAwO1xuICB9IC8vIGluIENocm9tZSwgPGRldGFpbHMvPiwgPGF1ZGlvIGNvbnRyb2xzLz4gYW5kIDx2aWRlbyBjb250cm9scy8+IGVsZW1lbnRzIGdldCBhIGRlZmF1bHRcbiAgLy8gIGB0YWJJbmRleGAgb2YgLTEgd2hlbiB0aGUgJ3RhYmluZGV4JyBhdHRyaWJ1dGUgaXNuJ3Qgc3BlY2lmaWVkIGluIHRoZSBET00sXG4gIC8vICB5ZXQgdGhleSBhcmUgc3RpbGwgcGFydCBvZiB0aGUgcmVndWxhciB0YWIgb3JkZXI7IGluIEZGLCB0aGV5IGdldCBhIGRlZmF1bHRcbiAgLy8gIGB0YWJJbmRleGAgb2YgMDsgc2luY2UgQ2hyb21lIHN0aWxsIHB1dHMgdGhvc2UgZWxlbWVudHMgaW4gdGhlIHJlZ3VsYXIgdGFiXG4gIC8vICBvcmRlciwgY29uc2lkZXIgdGhlaXIgdGFiIGluZGV4IHRvIGJlIDAuXG5cblxuICBpZiAoKG5vZGUubm9kZU5hbWUgPT09ICdBVURJTycgfHwgbm9kZS5ub2RlTmFtZSA9PT0gJ1ZJREVPJyB8fCBub2RlLm5vZGVOYW1lID09PSAnREVUQUlMUycpICYmIG5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpID09PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gbm9kZS50YWJJbmRleDtcbn07XG5cbnZhciBzb3J0T3JkZXJlZFRhYmJhYmxlcyA9IGZ1bmN0aW9uIHNvcnRPcmRlcmVkVGFiYmFibGVzKGEsIGIpIHtcbiAgcmV0dXJuIGEudGFiSW5kZXggPT09IGIudGFiSW5kZXggPyBhLmRvY3VtZW50T3JkZXIgLSBiLmRvY3VtZW50T3JkZXIgOiBhLnRhYkluZGV4IC0gYi50YWJJbmRleDtcbn07XG5cbnZhciBpc0lucHV0ID0gZnVuY3Rpb24gaXNJbnB1dChub2RlKSB7XG4gIHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdJTlBVVCc7XG59O1xuXG52YXIgaXNIaWRkZW5JbnB1dCA9IGZ1bmN0aW9uIGlzSGlkZGVuSW5wdXQobm9kZSkge1xuICByZXR1cm4gaXNJbnB1dChub2RlKSAmJiBub2RlLnR5cGUgPT09ICdoaWRkZW4nO1xufTtcblxudmFyIGlzRGV0YWlsc1dpdGhTdW1tYXJ5ID0gZnVuY3Rpb24gaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkge1xuICB2YXIgciA9IG5vZGUudGFnTmFtZSA9PT0gJ0RFVEFJTFMnICYmIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShub2RlLmNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50YWdOYW1lID09PSAnU1VNTUFSWSc7XG4gIH0pO1xuICByZXR1cm4gcjtcbn07XG5cbnZhciBnZXRDaGVja2VkUmFkaW8gPSBmdW5jdGlvbiBnZXRDaGVja2VkUmFkaW8obm9kZXMsIGZvcm0pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChub2Rlc1tpXS5jaGVja2VkICYmIG5vZGVzW2ldLmZvcm0gPT09IGZvcm0pIHtcbiAgICAgIHJldHVybiBub2Rlc1tpXTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBpc1RhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc1RhYmJhYmxlUmFkaW8obm9kZSkge1xuICBpZiAoIW5vZGUubmFtZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIHJhZGlvU2NvcGUgPSBub2RlLmZvcm0gfHwgbm9kZS5vd25lckRvY3VtZW50O1xuXG4gIHZhciBxdWVyeVJhZGlvcyA9IGZ1bmN0aW9uIHF1ZXJ5UmFkaW9zKG5hbWUpIHtcbiAgICByZXR1cm4gcmFkaW9TY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cIicgKyBuYW1lICsgJ1wiXScpO1xuICB9O1xuXG4gIHZhciByYWRpb1NldDtcblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5DU1MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQ1NTLmVzY2FwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mod2luZG93LkNTUy5lc2NhcGUobm9kZS5uYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mobm9kZS5uYW1lKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKCdMb29rcyBsaWtlIHlvdSBoYXZlIGEgcmFkaW8gYnV0dG9uIHdpdGggYSBuYW1lIGF0dHJpYnV0ZSBjb250YWluaW5nIGludmFsaWQgQ1NTIHNlbGVjdG9yIGNoYXJhY3RlcnMgYW5kIG5lZWQgdGhlIENTUy5lc2NhcGUgcG9seWZpbGw6ICVzJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGVja2VkID0gZ2V0Q2hlY2tlZFJhZGlvKHJhZGlvU2V0LCBub2RlLmZvcm0pO1xuICByZXR1cm4gIWNoZWNrZWQgfHwgY2hlY2tlZCA9PT0gbm9kZTtcbn07XG5cbnZhciBpc1JhZGlvID0gZnVuY3Rpb24gaXNSYWRpbyhub2RlKSB7XG4gIHJldHVybiBpc0lucHV0KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ3JhZGlvJztcbn07XG5cbnZhciBpc05vblRhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc05vblRhYmJhYmxlUmFkaW8obm9kZSkge1xuICByZXR1cm4gaXNSYWRpbyhub2RlKSAmJiAhaXNUYWJiYWJsZVJhZGlvKG5vZGUpO1xufTtcblxudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24gaXNIaWRkZW4obm9kZSwgZGlzcGxheUNoZWNrKSB7XG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKG5vZGUpLnZpc2liaWxpdHkgPT09ICdoaWRkZW4nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgaXNEaXJlY3RTdW1tYXJ5ID0gbWF0Y2hlcy5jYWxsKG5vZGUsICdkZXRhaWxzPnN1bW1hcnk6Zmlyc3Qtb2YtdHlwZScpO1xuICB2YXIgbm9kZVVuZGVyRGV0YWlscyA9IGlzRGlyZWN0U3VtbWFyeSA/IG5vZGUucGFyZW50RWxlbWVudCA6IG5vZGU7XG5cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlVW5kZXJEZXRhaWxzLCAnZGV0YWlsczpub3QoW29wZW5dKSAqJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZGlzcGxheUNoZWNrIHx8IGRpc3BsYXlDaGVjayA9PT0gJ2Z1bGwnKSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGlzcGxheUNoZWNrID09PSAnbm9uLXplcm8tYXJlYScpIHtcbiAgICB2YXIgX25vZGUkZ2V0Qm91bmRpbmdDbGllID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgd2lkdGggPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5oZWlnaHQ7XG5cbiAgICByZXR1cm4gd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTsgLy8gZm9ybSBmaWVsZHMgKG5lc3RlZCkgaW5zaWRlIGEgZGlzYWJsZWQgZmllbGRzZXQgYXJlIG5vdCBmb2N1c2FibGUvdGFiYmFibGVcbi8vICB1bmxlc3MgdGhleSBhcmUgaW4gdGhlIF9maXJzdF8gPGxlZ2VuZD4gZWxlbWVudCBvZiB0aGUgdG9wLW1vc3QgZGlzYWJsZWRcbi8vICBmaWVsZHNldFxuXG5cbnZhciBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0ID0gZnVuY3Rpb24gaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSB7XG4gIGlmIChpc0lucHV0KG5vZGUpIHx8IG5vZGUudGFnTmFtZSA9PT0gJ1NFTEVDVCcgfHwgbm9kZS50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IG5vZGUudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50RWxlbWVudDtcblxuICAgIHdoaWxlIChwYXJlbnROb2RlKSB7XG4gICAgICBpZiAocGFyZW50Tm9kZS50YWdOYW1lID09PSAnRklFTERTRVQnICYmIHBhcmVudE5vZGUuZGlzYWJsZWQpIHtcbiAgICAgICAgLy8gbG9vayBmb3IgdGhlIGZpcnN0IDxsZWdlbmQ+IGFzIGFuIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgZGlzYWJsZWRcbiAgICAgICAgLy8gIDxmaWVsZHNldD46IGlmIHRoZSBub2RlIGlzIGluIHRoYXQgbGVnZW5kLCBpdCdsbCBiZSBlbmFibGVkIGV2ZW5cbiAgICAgICAgLy8gIHRob3VnaCB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQ7IG90aGVyd2lzZSwgdGhlIG5vZGUgaXMgaW4gYVxuICAgICAgICAvLyAgc2Vjb25kYXJ5L3N1YnNlcXVlbnQgbGVnZW5kLCBvciBzb21ld2hlcmUgZWxzZSB3aXRoaW4gdGhlIGZpZWxkc2V0XG4gICAgICAgIC8vICAoaG93ZXZlciBkZWVwIG5lc3RlZCkgYW5kIGl0J2xsIGJlIGRpc2FibGVkXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50Tm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjaGlsZCA9IHBhcmVudE5vZGUuY2hpbGRyZW4uaXRlbShpKTtcblxuICAgICAgICAgIGlmIChjaGlsZC50YWdOYW1lID09PSAnTEVHRU5EJykge1xuICAgICAgICAgICAgaWYgKGNoaWxkLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gLy8gdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGZpcnN0IGxlZ2VuZCAoaW4gZG9jIG9yZGVyKSwgc28gbm8gbWF0dGVyXG4gICAgICAgICAgICAvLyAgd2hlcmUgaXQgaXMgbm93LCBpdCdsbCBiZSBkaXNhYmxlZFxuXG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyB0aGUgbm9kZSBpc24ndCBpbiBhIGxlZ2VuZCwgc28gbm8gbWF0dGVyIHdoZXJlIGl0IGlzIG5vdywgaXQnbGwgYmUgZGlzYWJsZWRcblxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgfSAvLyBlbHNlLCBub2RlJ3MgdGFiYmFibGUvZm9jdXNhYmxlIHN0YXRlIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgYSBmaWVsZHNldCdzXG4gIC8vICBlbmFibGVkL2Rpc2FibGVkIHN0YXRlXG5cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG52YXIgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSkge1xuICBpZiAobm9kZS5kaXNhYmxlZCB8fCBpc0hpZGRlbklucHV0KG5vZGUpIHx8IGlzSGlkZGVuKG5vZGUsIG9wdGlvbnMuZGlzcGxheUNoZWNrKSB8fCAvLyBGb3IgYSBkZXRhaWxzIGVsZW1lbnQgd2l0aCBhIHN1bW1hcnksIHRoZSBzdW1tYXJ5IGVsZW1lbnQgZ2V0cyB0aGUgZm9jdXNcbiAgaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkgfHwgaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZShvcHRpb25zLCBub2RlKSB7XG4gIGlmICghaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShvcHRpb25zLCBub2RlKSB8fCBpc05vblRhYmJhYmxlUmFkaW8obm9kZSkgfHwgZ2V0VGFiaW5kZXgobm9kZSkgPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgdGFiYmFibGUgPSBmdW5jdGlvbiB0YWJiYWJsZShlbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJlZ3VsYXJUYWJiYWJsZXMgPSBbXTtcbiAgdmFyIG9yZGVyZWRUYWJiYWJsZXMgPSBbXTtcbiAgdmFyIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzKGVsLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChjYW5kaWRhdGUsIGkpIHtcbiAgICB2YXIgY2FuZGlkYXRlVGFiaW5kZXggPSBnZXRUYWJpbmRleChjYW5kaWRhdGUpO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVRhYmluZGV4ID09PSAwKSB7XG4gICAgICByZWd1bGFyVGFiYmFibGVzLnB1c2goY2FuZGlkYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3JkZXJlZFRhYmJhYmxlcy5wdXNoKHtcbiAgICAgICAgZG9jdW1lbnRPcmRlcjogaSxcbiAgICAgICAgdGFiSW5kZXg6IGNhbmRpZGF0ZVRhYmluZGV4LFxuICAgICAgICBub2RlOiBjYW5kaWRhdGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHZhciB0YWJiYWJsZU5vZGVzID0gb3JkZXJlZFRhYmJhYmxlcy5zb3J0KHNvcnRPcmRlcmVkVGFiYmFibGVzKS5tYXAoZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYS5ub2RlO1xuICB9KS5jb25jYXQocmVndWxhclRhYmJhYmxlcyk7XG4gIHJldHVybiB0YWJiYWJsZU5vZGVzO1xufTtcblxudmFyIGZvY3VzYWJsZSA9IGZ1bmN0aW9uIGZvY3VzYWJsZShlbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzKGVsLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUuYmluZChudWxsLCBvcHRpb25zKSk7XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcblxudmFyIGlzVGFiYmFibGUgPSBmdW5jdGlvbiBpc1RhYmJhYmxlKG5vZGUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cblxuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGUsIGNhbmRpZGF0ZVNlbGVjdG9yKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlKG9wdGlvbnMsIG5vZGUpO1xufTtcblxudmFyIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmNvbmNhdCgnaWZyYW1lJykuam9pbignLCcpO1xuXG52YXIgaXNGb2N1c2FibGUgPSBmdW5jdGlvbiBpc0ZvY3VzYWJsZShub2RlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gbm9kZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlLCBmb2N1c2FibGVDYW5kaWRhdGVTZWxlY3RvcikgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSk7XG59O1xuXG5leHBvcnQgeyBmb2N1c2FibGUsIGlzRm9jdXNhYmxlLCBpc1RhYmJhYmxlLCB0YWJiYWJsZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtLmpzLm1hcFxuIiwiLyohXG4qIGZvY3VzLXRyYXAgNi43LjJcbiogQGxpY2Vuc2UgTUlULCBodHRwczovL2dpdGh1Yi5jb20vZm9jdXMtdHJhcC9mb2N1cy10cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiovXG5pbXBvcnQgeyB0YWJiYWJsZSwgaXNGb2N1c2FibGUsIGlzVGFiYmFibGUgfSBmcm9tICd0YWJiYWJsZSc7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgIGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbnZhciBhY3RpdmVGb2N1c1RyYXBzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdHJhcFF1ZXVlID0gW107XG4gIHJldHVybiB7XG4gICAgYWN0aXZhdGVUcmFwOiBmdW5jdGlvbiBhY3RpdmF0ZVRyYXAodHJhcCkge1xuICAgICAgaWYgKHRyYXBRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBhY3RpdmVUcmFwID0gdHJhcFF1ZXVlW3RyYXBRdWV1ZS5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAoYWN0aXZlVHJhcCAhPT0gdHJhcCkge1xuICAgICAgICAgIGFjdGl2ZVRyYXAucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdHJhcEluZGV4ID0gdHJhcFF1ZXVlLmluZGV4T2YodHJhcCk7XG5cbiAgICAgIGlmICh0cmFwSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRyYXBRdWV1ZS5wdXNoKHRyYXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbW92ZSB0aGlzIGV4aXN0aW5nIHRyYXAgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZVxuICAgICAgICB0cmFwUXVldWUuc3BsaWNlKHRyYXBJbmRleCwgMSk7XG4gICAgICAgIHRyYXBRdWV1ZS5wdXNoKHRyYXApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVhY3RpdmF0ZVRyYXA6IGZ1bmN0aW9uIGRlYWN0aXZhdGVUcmFwKHRyYXApIHtcbiAgICAgIHZhciB0cmFwSW5kZXggPSB0cmFwUXVldWUuaW5kZXhPZih0cmFwKTtcblxuICAgICAgaWYgKHRyYXBJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdHJhcFF1ZXVlLnNwbGljZSh0cmFwSW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJhcFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdHJhcFF1ZXVlW3RyYXBRdWV1ZS5sZW5ndGggLSAxXS51bnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufSgpO1xuXG52YXIgaXNTZWxlY3RhYmxlSW5wdXQgPSBmdW5jdGlvbiBpc1NlbGVjdGFibGVJbnB1dChub2RlKSB7XG4gIHJldHVybiBub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgdHlwZW9mIG5vZGUuc2VsZWN0ID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGlzRXNjYXBlRXZlbnQgPSBmdW5jdGlvbiBpc0VzY2FwZUV2ZW50KGUpIHtcbiAgcmV0dXJuIGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycgfHwgZS5rZXlDb2RlID09PSAyNztcbn07XG5cbnZhciBpc1RhYkV2ZW50ID0gZnVuY3Rpb24gaXNUYWJFdmVudChlKSB7XG4gIHJldHVybiBlLmtleSA9PT0gJ1RhYicgfHwgZS5rZXlDb2RlID09PSA5O1xufTtcblxudmFyIGRlbGF5ID0gZnVuY3Rpb24gZGVsYXkoZm4pIHtcbiAgcmV0dXJuIHNldFRpbWVvdXQoZm4sIDApO1xufTsgLy8gQXJyYXkuZmluZC9maW5kSW5kZXgoKSBhcmUgbm90IHN1cHBvcnRlZCBvbiBJRTsgdGhpcyByZXBsaWNhdGVzIGVub3VnaFxuLy8gIG9mIEFycmF5LmZpbmRJbmRleCgpIGZvciBvdXIgbmVlZHNcblxuXG52YXIgZmluZEluZGV4ID0gZnVuY3Rpb24gZmluZEluZGV4KGFyciwgZm4pIHtcbiAgdmFyIGlkeCA9IC0xO1xuICBhcnIuZXZlcnkoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgaWYgKGZuKHZhbHVlKSkge1xuICAgICAgaWR4ID0gaTtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gYnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gbmV4dFxuICB9KTtcbiAgcmV0dXJuIGlkeDtcbn07XG4vKipcbiAqIEdldCBhbiBvcHRpb24ncyB2YWx1ZSB3aGVuIGl0IGNvdWxkIGJlIGEgcGxhaW4gdmFsdWUsIG9yIGEgaGFuZGxlciB0aGF0IHByb3ZpZGVzXG4gKiAgdGhlIHZhbHVlLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBPcHRpb24ncyB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7Li4uKn0gW3BhcmFtc10gQW55IHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgaGFuZGxlciwgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLlxuICogQHJldHVybnMgeyp9IFRoZSBgdmFsdWVgLCBvciB0aGUgaGFuZGxlcidzIHJldHVybmVkIHZhbHVlLlxuICovXG5cblxudmFyIHZhbHVlT3JIYW5kbGVyID0gZnVuY3Rpb24gdmFsdWVPckhhbmRsZXIodmFsdWUpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhcmFtcyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcGFyYW1zW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS5hcHBseSh2b2lkIDAsIHBhcmFtcykgOiB2YWx1ZTtcbn07XG5cbnZhciBnZXRBY3R1YWxUYXJnZXQgPSBmdW5jdGlvbiBnZXRBY3R1YWxUYXJnZXQoZXZlbnQpIHtcbiAgLy8gTk9URTogSWYgdGhlIHRyYXAgaXMgX2luc2lkZV8gYSBzaGFkb3cgRE9NLCBldmVudC50YXJnZXQgd2lsbCBhbHdheXMgYmUgdGhlXG4gIC8vICBzaGFkb3cgaG9zdC4gSG93ZXZlciwgZXZlbnQudGFyZ2V0LmNvbXBvc2VkUGF0aCgpIHdpbGwgYmUgYW4gYXJyYXkgb2ZcbiAgLy8gIG5vZGVzIFwiY2xpY2tlZFwiIGZyb20gaW5uZXItbW9zdCAodGhlIGFjdHVhbCBlbGVtZW50IGluc2lkZSB0aGUgc2hhZG93KSB0b1xuICAvLyAgb3V0ZXItbW9zdCAodGhlIGhvc3QgSFRNTCBkb2N1bWVudCkuIElmIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2VkUGF0aCgpLFxuICAvLyAgdGhlbiB1c2UgaXRzIGZpcnN0IGVsZW1lbnQ7IG90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIGV2ZW50LnRhcmdldCAoYW5kXG4gIC8vICB0aGlzIG9ubHkgd29ya3MgZm9yIGFuIF9vcGVuXyBzaGFkb3cgRE9NOyBvdGhlcndpc2UsXG4gIC8vICBjb21wb3NlZFBhdGgoKVswXSA9PT0gZXZlbnQudGFyZ2V0IGFsd2F5cykuXG4gIHJldHVybiBldmVudC50YXJnZXQuc2hhZG93Um9vdCAmJiB0eXBlb2YgZXZlbnQuY29tcG9zZWRQYXRoID09PSAnZnVuY3Rpb24nID8gZXZlbnQuY29tcG9zZWRQYXRoKClbMF0gOiBldmVudC50YXJnZXQ7XG59O1xuXG52YXIgY3JlYXRlRm9jdXNUcmFwID0gZnVuY3Rpb24gY3JlYXRlRm9jdXNUcmFwKGVsZW1lbnRzLCB1c2VyT3B0aW9ucykge1xuICAvLyBTU1I6IGEgbGl2ZSB0cmFwIHNob3VsZG4ndCBiZSBjcmVhdGVkIGluIHRoaXMgdHlwZSBvZiBlbnZpcm9ubWVudCBzbyB0aGlzXG4gIC8vICBzaG91bGQgYmUgc2FmZSBjb2RlIHRvIGV4ZWN1dGUgaWYgdGhlIGBkb2N1bWVudGAgb3B0aW9uIGlzbid0IHNwZWNpZmllZFxuICB2YXIgZG9jID0gKHVzZXJPcHRpb25zID09PSBudWxsIHx8IHVzZXJPcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiB1c2VyT3B0aW9ucy5kb2N1bWVudCkgfHwgZG9jdW1lbnQ7XG5cbiAgdmFyIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQyKHtcbiAgICByZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZTogdHJ1ZSxcbiAgICBlc2NhcGVEZWFjdGl2YXRlczogdHJ1ZSxcbiAgICBkZWxheUluaXRpYWxGb2N1czogdHJ1ZVxuICB9LCB1c2VyT3B0aW9ucyk7XG5cbiAgdmFyIHN0YXRlID0ge1xuICAgIC8vIEB0eXBlIHtBcnJheTxIVE1MRWxlbWVudD59XG4gICAgY29udGFpbmVyczogW10sXG4gICAgLy8gbGlzdCBvZiBvYmplY3RzIGlkZW50aWZ5aW5nIHRoZSBmaXJzdCBhbmQgbGFzdCB0YWJiYWJsZSBub2RlcyBpbiBhbGwgY29udGFpbmVycy9ncm91cHMgaW5cbiAgICAvLyAgdGhlIHRyYXBcbiAgICAvLyBOT1RFOiBpdCdzIHBvc3NpYmxlIHRoYXQgYSBncm91cCBoYXMgbm8gdGFiYmFibGUgbm9kZXMgaWYgbm9kZXMgZ2V0IHJlbW92ZWQgd2hpbGUgdGhlIHRyYXBcbiAgICAvLyAgaXMgYWN0aXZlLCBidXQgdGhlIHRyYXAgc2hvdWxkIG5ldmVyIGdldCB0byBhIHN0YXRlIHdoZXJlIHRoZXJlIGlzbid0IGF0IGxlYXN0IG9uZSBncm91cFxuICAgIC8vICB3aXRoIGF0IGxlYXN0IG9uZSB0YWJiYWJsZSBub2RlIGluIGl0ICh0aGF0IHdvdWxkIGxlYWQgdG8gYW4gZXJyb3IgY29uZGl0aW9uIHRoYXQgd291bGRcbiAgICAvLyAgcmVzdWx0IGluIGFuIGVycm9yIGJlaW5nIHRocm93bilcbiAgICAvLyBAdHlwZSB7QXJyYXk8eyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBmaXJzdFRhYmJhYmxlTm9kZTogSFRNTEVsZW1lbnR8bnVsbCwgbGFzdFRhYmJhYmxlTm9kZTogSFRNTEVsZW1lbnR8bnVsbCB9Pn1cbiAgICB0YWJiYWJsZUdyb3VwczogW10sXG4gICAgbm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uOiBudWxsLFxuICAgIG1vc3RSZWNlbnRseUZvY3VzZWROb2RlOiBudWxsLFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICAvLyB0aW1lciBJRCBmb3Igd2hlbiBkZWxheUluaXRpYWxGb2N1cyBpcyB0cnVlIGFuZCBpbml0aWFsIGZvY3VzIGluIHRoaXMgdHJhcFxuICAgIC8vICBoYXMgYmVlbiBkZWxheWVkIGR1cmluZyBhY3RpdmF0aW9uXG4gICAgZGVsYXlJbml0aWFsRm9jdXNUaW1lcjogdW5kZWZpbmVkXG4gIH07XG4gIHZhciB0cmFwOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1jb25zdCAtLSBzb21lIHByaXZhdGUgZnVuY3Rpb25zIHJlZmVyZW5jZSBpdCwgYW5kIGl0cyBtZXRob2RzIHJlZmVyZW5jZSBwcml2YXRlIGZ1bmN0aW9ucywgc28gd2UgbXVzdCBkZWNsYXJlIGhlcmUgYW5kIGRlZmluZSBsYXRlclxuXG4gIHZhciBnZXRPcHRpb24gPSBmdW5jdGlvbiBnZXRPcHRpb24oY29uZmlnT3ZlcnJpZGVPcHRpb25zLCBvcHRpb25OYW1lLCBjb25maWdPcHRpb25OYW1lKSB7XG4gICAgcmV0dXJuIGNvbmZpZ092ZXJyaWRlT3B0aW9ucyAmJiBjb25maWdPdmVycmlkZU9wdGlvbnNbb3B0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCA/IGNvbmZpZ092ZXJyaWRlT3B0aW9uc1tvcHRpb25OYW1lXSA6IGNvbmZpZ1tjb25maWdPcHRpb25OYW1lIHx8IG9wdGlvbk5hbWVdO1xuICB9O1xuXG4gIHZhciBjb250YWluZXJzQ29udGFpbiA9IGZ1bmN0aW9uIGNvbnRhaW5lcnNDb250YWluKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gISEoZWxlbWVudCAmJiBzdGF0ZS5jb250YWluZXJzLnNvbWUoZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIGNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KTtcbiAgICB9KSk7XG4gIH07XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBub2RlIGZvciB0aGUgZ2l2ZW4gb3B0aW9uLCB3aGljaCBpcyBleHBlY3RlZCB0byBiZSBhbiBvcHRpb24gdGhhdFxuICAgKiAgY2FuIGJlIGVpdGhlciBhIERPTSBub2RlLCBhIHN0cmluZyB0aGF0IGlzIGEgc2VsZWN0b3IgdG8gZ2V0IGEgbm9kZSwgYGZhbHNlYFxuICAgKiAgKGlmIGEgbm9kZSBpcyBleHBsaWNpdGx5IE5PVCBnaXZlbiksIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFueSBvZiB0aGVzZVxuICAgKiAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkIHwgZmFsc2UgfCBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnR9IFJldHVybnNcbiAgICogIGB1bmRlZmluZWRgIGlmIHRoZSBvcHRpb24gaXMgbm90IHNwZWNpZmllZDsgYGZhbHNlYCBpZiB0aGUgb3B0aW9uXG4gICAqICByZXNvbHZlZCB0byBgZmFsc2VgIChub2RlIGV4cGxpY2l0bHkgbm90IGdpdmVuKTsgb3RoZXJ3aXNlLCB0aGUgcmVzb2x2ZWRcbiAgICogIERPTSBub2RlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG9wdGlvbiBpcyBzZXQsIG5vdCBgZmFsc2VgLCBhbmQgaXMgbm90LCBvciBkb2VzIG5vdFxuICAgKiAgcmVzb2x2ZSB0byBhIG5vZGUuXG4gICAqL1xuXG5cbiAgdmFyIGdldE5vZGVGb3JPcHRpb24gPSBmdW5jdGlvbiBnZXROb2RlRm9yT3B0aW9uKG9wdGlvbk5hbWUpIHtcbiAgICB2YXIgb3B0aW9uVmFsdWUgPSBjb25maWdbb3B0aW9uTmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvblZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhcmFtcyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIHBhcmFtc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb25WYWx1ZS5hcHBseSh2b2lkIDAsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25WYWx1ZSkge1xuICAgICAgaWYgKG9wdGlvblZhbHVlID09PSB1bmRlZmluZWQgfHwgb3B0aW9uVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWx1ZTtcbiAgICAgIH0gLy8gZWxzZSwgZW1wdHkgc3RyaW5nIChpbnZhbGlkKSwgbnVsbCAoaW52YWxpZCksIDAgKGludmFsaWQpXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgd2FzIHNwZWNpZmllZCBidXQgd2FzIG5vdCBhIG5vZGUsIG9yIGRpZCBub3QgcmV0dXJuIGEgbm9kZVwiKSk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBvcHRpb25WYWx1ZTsgLy8gY291bGQgYmUgSFRNTEVsZW1lbnQsIFNWR0VsZW1lbnQsIG9yIG5vbi1lbXB0eSBzdHJpbmcgYXQgdGhpcyBwb2ludFxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5vZGUgPSBkb2MucXVlcnlTZWxlY3RvcihvcHRpb25WYWx1ZSk7IC8vIHJlc29sdmUgdG8gbm9kZSwgb3IgbnVsbCBpZiBmYWlsc1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgYXMgc2VsZWN0b3IgcmVmZXJzIHRvIG5vIGtub3duIG5vZGVcIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHZhciBnZXRJbml0aWFsRm9jdXNOb2RlID0gZnVuY3Rpb24gZ2V0SW5pdGlhbEZvY3VzTm9kZSgpIHtcbiAgICB2YXIgbm9kZSA9IGdldE5vZGVGb3JPcHRpb24oJ2luaXRpYWxGb2N1cycpOyAvLyBmYWxzZSBleHBsaWNpdGx5IGluZGljYXRlcyB3ZSB3YW50IG5vIGluaXRpYWxGb2N1cyBhdCBhbGxcblxuICAgIGlmIChub2RlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIG9wdGlvbiBub3Qgc3BlY2lmaWVkOiB1c2UgZmFsbGJhY2sgb3B0aW9uc1xuICAgICAgaWYgKGNvbnRhaW5lcnNDb250YWluKGRvYy5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICBub2RlID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmlyc3RUYWJiYWJsZUdyb3VwID0gc3RhdGUudGFiYmFibGVHcm91cHNbMF07XG4gICAgICAgIHZhciBmaXJzdFRhYmJhYmxlTm9kZSA9IGZpcnN0VGFiYmFibGVHcm91cCAmJiBmaXJzdFRhYmJhYmxlR3JvdXAuZmlyc3RUYWJiYWJsZU5vZGU7IC8vIE5PVEU6IGBmYWxsYmFja0ZvY3VzYCBvcHRpb24gZnVuY3Rpb24gY2Fubm90IHJldHVybiBgZmFsc2VgIChub3Qgc3VwcG9ydGVkKVxuXG4gICAgICAgIG5vZGUgPSBmaXJzdFRhYmJhYmxlTm9kZSB8fCBnZXROb2RlRm9yT3B0aW9uKCdmYWxsYmFja0ZvY3VzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFub2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgZm9jdXMtdHJhcCBuZWVkcyB0byBoYXZlIGF0IGxlYXN0IG9uZSBmb2N1c2FibGUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHZhciB1cGRhdGVUYWJiYWJsZU5vZGVzID0gZnVuY3Rpb24gdXBkYXRlVGFiYmFibGVOb2RlcygpIHtcbiAgICBzdGF0ZS50YWJiYWJsZUdyb3VwcyA9IHN0YXRlLmNvbnRhaW5lcnMubWFwKGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICAgIHZhciB0YWJiYWJsZU5vZGVzID0gdGFiYmFibGUoY29udGFpbmVyKTtcblxuICAgICAgaWYgKHRhYmJhYmxlTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICAgIGZpcnN0VGFiYmFibGVOb2RlOiB0YWJiYWJsZU5vZGVzWzBdLFxuICAgICAgICAgIGxhc3RUYWJiYWJsZU5vZGU6IHRhYmJhYmxlTm9kZXNbdGFiYmFibGVOb2Rlcy5sZW5ndGggLSAxXVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZ3JvdXApIHtcbiAgICAgIHJldHVybiAhIWdyb3VwO1xuICAgIH0pOyAvLyByZW1vdmUgZ3JvdXBzIHdpdGggbm8gdGFiYmFibGUgbm9kZXNcbiAgICAvLyB0aHJvdyBpZiBubyBncm91cHMgaGF2ZSB0YWJiYWJsZSBub2RlcyBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGZhbGxiYWNrIGZvY3VzIG5vZGUgZWl0aGVyXG5cbiAgICBpZiAoc3RhdGUudGFiYmFibGVHcm91cHMubGVuZ3RoIDw9IDAgJiYgIWdldE5vZGVGb3JPcHRpb24oJ2ZhbGxiYWNrRm9jdXMnKSAvLyByZXR1cm5pbmcgZmFsc2Ugbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvcHRpb25cbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91ciBmb2N1cy10cmFwIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY29udGFpbmVyIHdpdGggYXQgbGVhc3Qgb25lIHRhYmJhYmxlIG5vZGUgaW4gaXQgYXQgYWxsIHRpbWVzJyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB0cnlGb2N1cyA9IGZ1bmN0aW9uIHRyeUZvY3VzKG5vZGUpIHtcbiAgICBpZiAobm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZG9jLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUgfHwgIW5vZGUuZm9jdXMpIHtcbiAgICAgIHRyeUZvY3VzKGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiAhIWNvbmZpZy5wcmV2ZW50U2Nyb2xsXG4gICAgfSk7XG4gICAgc3RhdGUubW9zdFJlY2VudGx5Rm9jdXNlZE5vZGUgPSBub2RlO1xuXG4gICAgaWYgKGlzU2VsZWN0YWJsZUlucHV0KG5vZGUpKSB7XG4gICAgICBub2RlLnNlbGVjdCgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0UmV0dXJuRm9jdXNOb2RlID0gZnVuY3Rpb24gZ2V0UmV0dXJuRm9jdXNOb2RlKHByZXZpb3VzQWN0aXZlRWxlbWVudCkge1xuICAgIHZhciBub2RlID0gZ2V0Tm9kZUZvck9wdGlvbignc2V0UmV0dXJuRm9jdXMnLCBwcmV2aW91c0FjdGl2ZUVsZW1lbnQpO1xuICAgIHJldHVybiBub2RlID8gbm9kZSA6IG5vZGUgPT09IGZhbHNlID8gZmFsc2UgOiBwcmV2aW91c0FjdGl2ZUVsZW1lbnQ7XG4gIH07IC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBvbiBtb3VzZWRvd24gYW5kIHRvdWNoc3RhcnQgaW5zdGVhZCBvZiBjbGlja1xuICAvLyBzbyB0aGF0IGl0IHByZWNlZGVzIHRoZSBmb2N1cyBldmVudC5cblxuXG4gIHZhciBjaGVja1BvaW50ZXJEb3duID0gZnVuY3Rpb24gY2hlY2tQb2ludGVyRG93bihlKSB7XG4gICAgdmFyIHRhcmdldCA9IGdldEFjdHVhbFRhcmdldChlKTtcblxuICAgIGlmIChjb250YWluZXJzQ29udGFpbih0YXJnZXQpKSB7XG4gICAgICAvLyBhbGxvdyB0aGUgY2xpY2sgc2luY2UgaXQgb2N1cnJlZCBpbnNpZGUgdGhlIHRyYXBcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVPckhhbmRsZXIoY29uZmlnLmNsaWNrT3V0c2lkZURlYWN0aXZhdGVzLCBlKSkge1xuICAgICAgLy8gaW1tZWRpYXRlbHkgZGVhY3RpdmF0ZSB0aGUgdHJhcFxuICAgICAgdHJhcC5kZWFjdGl2YXRlKHtcbiAgICAgICAgLy8gaWYsIG9uIGRlYWN0aXZhdGlvbiwgd2Ugc2hvdWxkIHJldHVybiBmb2N1cyB0byB0aGUgbm9kZSBvcmlnaW5hbGx5LWZvY3VzZWRcbiAgICAgICAgLy8gIHdoZW4gdGhlIHRyYXAgd2FzIGFjdGl2YXRlZCAob3IgdGhlIGNvbmZpZ3VyZWQgYHNldFJldHVybkZvY3VzYCBub2RlKSxcbiAgICAgICAgLy8gIHRoZW4gYXNzdW1lIGl0J3MgYWxzbyBPSyB0byByZXR1cm4gZm9jdXMgdG8gdGhlIG91dHNpZGUgbm9kZSB0aGF0IHdhc1xuICAgICAgICAvLyAganVzdCBjbGlja2VkLCBjYXVzaW5nIGRlYWN0aXZhdGlvbiwgYXMgbG9uZyBhcyB0aGF0IG5vZGUgaXMgZm9jdXNhYmxlO1xuICAgICAgICAvLyAgaWYgaXQgaXNuJ3QgZm9jdXNhYmxlLCB0aGVuIHJldHVybiBmb2N1cyB0byB0aGUgb3JpZ2luYWwgbm9kZSBmb2N1c2VkXG4gICAgICAgIC8vICBvbiBhY3RpdmF0aW9uIChvciB0aGUgY29uZmlndXJlZCBgc2V0UmV0dXJuRm9jdXNgIG5vZGUpXG4gICAgICAgIC8vIE5PVEU6IGJ5IHNldHRpbmcgYHJldHVybkZvY3VzOiBmYWxzZWAsIGRlYWN0aXZhdGUoKSB3aWxsIGRvIG5vdGhpbmcsXG4gICAgICAgIC8vICB3aGljaCB3aWxsIHJlc3VsdCBpbiB0aGUgb3V0c2lkZSBjbGljayBzZXR0aW5nIGZvY3VzIHRvIHRoZSBub2RlXG4gICAgICAgIC8vICB0aGF0IHdhcyBjbGlja2VkLCB3aGV0aGVyIGl0J3MgZm9jdXNhYmxlIG9yIG5vdDsgYnkgc2V0dGluZ1xuICAgICAgICAvLyAgYHJldHVybkZvY3VzOiB0cnVlYCwgd2UnbGwgYXR0ZW1wdCB0byByZS1mb2N1cyB0aGUgbm9kZSBvcmlnaW5hbGx5LWZvY3VzZWRcbiAgICAgICAgLy8gIG9uIGFjdGl2YXRpb24gKG9yIHRoZSBjb25maWd1cmVkIGBzZXRSZXR1cm5Gb2N1c2Agbm9kZSlcbiAgICAgICAgcmV0dXJuRm9jdXM6IGNvbmZpZy5yZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSAmJiAhaXNGb2N1c2FibGUodGFyZ2V0KVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgbW9iaWxlIGRldmljZXMuXG4gICAgLy8gKElmIHdlJ2xsIG9ubHkgbGV0IGBjbGlja2AgZXZlbnRzIHRocm91Z2gsXG4gICAgLy8gdGhlbiBvbiBtb2JpbGUgdGhleSB3aWxsIGJlIGJsb2NrZWQgYW55d2F5cyBpZiBgdG91Y2hzdGFydGAgaXMgYmxvY2tlZC4pXG5cblxuICAgIGlmICh2YWx1ZU9ySGFuZGxlcihjb25maWcuYWxsb3dPdXRzaWRlQ2xpY2ssIGUpKSB7XG4gICAgICAvLyBhbGxvdyB0aGUgY2xpY2sgb3V0c2lkZSB0aGUgdHJhcCB0byB0YWtlIHBsYWNlXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBvdGhlcndpc2UsIHByZXZlbnQgdGhlIGNsaWNrXG5cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTsgLy8gSW4gY2FzZSBmb2N1cyBlc2NhcGVzIHRoZSB0cmFwIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uLCBwdWxsIGl0IGJhY2sgaW4uXG5cblxuICB2YXIgY2hlY2tGb2N1c0luID0gZnVuY3Rpb24gY2hlY2tGb2N1c0luKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuICAgIHZhciB0YXJnZXRDb250YWluZWQgPSBjb250YWluZXJzQ29udGFpbih0YXJnZXQpOyAvLyBJbiBGaXJlZm94IHdoZW4geW91IFRhYiBvdXQgb2YgYW4gaWZyYW1lIHRoZSBEb2N1bWVudCBpcyBicmllZmx5IGZvY3VzZWQuXG5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVkIHx8IHRhcmdldCBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBpZiAodGFyZ2V0Q29udGFpbmVkKSB7XG4gICAgICAgIHN0YXRlLm1vc3RSZWNlbnRseUZvY3VzZWROb2RlID0gdGFyZ2V0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2NhcGVkISBwdWxsIGl0IGJhY2sgaW4gdG8gd2hlcmUgaXQganVzdCBsZWZ0XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgdHJ5Rm9jdXMoc3RhdGUubW9zdFJlY2VudGx5Rm9jdXNlZE5vZGUgfHwgZ2V0SW5pdGlhbEZvY3VzTm9kZSgpKTtcbiAgICB9XG4gIH07IC8vIEhpamFjayBUYWIgZXZlbnRzIG9uIHRoZSBmaXJzdCBhbmQgbGFzdCBmb2N1c2FibGUgbm9kZXMgb2YgdGhlIHRyYXAsXG4gIC8vIGluIG9yZGVyIHRvIHByZXZlbnQgZm9jdXMgZnJvbSBlc2NhcGluZy4gSWYgaXQgZXNjYXBlcyBmb3IgZXZlbiBhXG4gIC8vIG1vbWVudCBpdCBjYW4gZW5kIHVwIHNjcm9sbGluZyB0aGUgcGFnZSBhbmQgY2F1c2luZyBjb25mdXNpb24gc28gd2VcbiAgLy8ga2luZCBvZiBuZWVkIHRvIGNhcHR1cmUgdGhlIGFjdGlvbiBhdCB0aGUga2V5ZG93biBwaGFzZS5cblxuXG4gIHZhciBjaGVja1RhYiA9IGZ1bmN0aW9uIGNoZWNrVGFiKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICB2YXIgZGVzdGluYXRpb25Ob2RlID0gbnVsbDtcblxuICAgIGlmIChzdGF0ZS50YWJiYWJsZUdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHRhcmdldCBpcyBhY3R1YWxseSBjb250YWluZWQgaW4gYSBncm91cFxuICAgICAgLy8gTk9URTogdGhlIHRhcmdldCBtYXkgYWxzbyBiZSB0aGUgY29udGFpbmVyIGl0c2VsZiBpZiBpdCdzIGZvY3VzYWJsZVxuICAgICAgLy8gIHdpdGggdGFiSW5kZXg9Jy0xJyBhbmQgd2FzIGdpdmVuIGluaXRpYWwgZm9jdXNcbiAgICAgIHZhciBjb250YWluZXJJbmRleCA9IGZpbmRJbmRleChzdGF0ZS50YWJiYWJsZUdyb3VwcywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IF9yZWYuY29udGFpbmVyO1xuICAgICAgICByZXR1cm4gY29udGFpbmVyLmNvbnRhaW5zKHRhcmdldCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGNvbnRhaW5lckluZGV4IDwgMCkge1xuICAgICAgICAvLyB0YXJnZXQgbm90IGZvdW5kIGluIGFueSBncm91cDogcXVpdGUgcG9zc2libGUgZm9jdXMgaGFzIGVzY2FwZWQgdGhlIHRyYXAsXG4gICAgICAgIC8vICBzbyBicmluZyBpdCBiYWNrIGluIHRvLi4uXG4gICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgLy8gLi4udGhlIGxhc3Qgbm9kZSBpbiB0aGUgbGFzdCBncm91cFxuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IHN0YXRlLnRhYmJhYmxlR3JvdXBzW3N0YXRlLnRhYmJhYmxlR3JvdXBzLmxlbmd0aCAtIDFdLmxhc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gLi4udGhlIGZpcnN0IG5vZGUgaW4gdGhlIGZpcnN0IGdyb3VwXG4gICAgICAgICAgZGVzdGluYXRpb25Ob2RlID0gc3RhdGUudGFiYmFibGVHcm91cHNbMF0uZmlyc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAvLyBSRVZFUlNFXG4gICAgICAgIC8vIGlzIHRoZSB0YXJnZXQgdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgaW4gYSBncm91cD9cbiAgICAgICAgdmFyIHN0YXJ0T2ZHcm91cEluZGV4ID0gZmluZEluZGV4KHN0YXRlLnRhYmJhYmxlR3JvdXBzLCBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICB2YXIgZmlyc3RUYWJiYWJsZU5vZGUgPSBfcmVmMi5maXJzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSBmaXJzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0T2ZHcm91cEluZGV4IDwgMCAmJiAoc3RhdGUudGFiYmFibGVHcm91cHNbY29udGFpbmVySW5kZXhdLmNvbnRhaW5lciA9PT0gdGFyZ2V0IHx8IGlzRm9jdXNhYmxlKHRhcmdldCkgJiYgIWlzVGFiYmFibGUodGFyZ2V0KSkpIHtcbiAgICAgICAgICAvLyBhbiBleGNlcHRpb24gY2FzZSB3aGVyZSB0aGUgdGFyZ2V0IGlzIGVpdGhlciB0aGUgY29udGFpbmVyIGl0c2VsZiwgb3JcbiAgICAgICAgICAvLyAgYSBub24tdGFiYmFibGUgbm9kZSB0aGF0IHdhcyBnaXZlbiBmb2N1cyAoaS5lLiB0YWJpbmRleCBpcyBuZWdhdGl2ZVxuICAgICAgICAgIC8vICBhbmQgdXNlciBjbGlja2VkIG9uIGl0IG9yIG5vZGUgd2FzIHByb2dyYW1tYXRpY2FsbHkgZ2l2ZW4gZm9jdXMpLCBpbiB3aGljaFxuICAgICAgICAgIC8vICBjYXNlLCB3ZSBzaG91bGQgaGFuZGxlIHNoaWZ0K3RhYiBhcyBpZiBmb2N1cyB3ZXJlIG9uIHRoZSBjb250YWluZXInc1xuICAgICAgICAgIC8vICBmaXJzdCB0YWJiYWJsZSBub2RlLCBhbmQgZ28gdG8gdGhlIGxhc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgTEFTVCBncm91cFxuICAgICAgICAgIHN0YXJ0T2ZHcm91cEluZGV4ID0gY29udGFpbmVySW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnRPZkdyb3VwSW5kZXggPj0gMCkge1xuICAgICAgICAgIC8vIFlFUzogdGhlbiBzaGlmdCt0YWIgc2hvdWxkIGdvIHRvIHRoZSBsYXN0IHRhYmJhYmxlIG5vZGUgaW4gdGhlXG4gICAgICAgICAgLy8gIHByZXZpb3VzIGdyb3VwIChhbmQgd3JhcCBhcm91bmQgdG8gdGhlIGxhc3QgdGFiYmFibGUgbm9kZSBvZlxuICAgICAgICAgIC8vICB0aGUgTEFTVCBncm91cCBpZiBpdCdzIHRoZSBmaXJzdCB0YWJiYWJsZSBub2RlIG9mIHRoZSBGSVJTVCBncm91cClcbiAgICAgICAgICB2YXIgZGVzdGluYXRpb25Hcm91cEluZGV4ID0gc3RhcnRPZkdyb3VwSW5kZXggPT09IDAgPyBzdGF0ZS50YWJiYWJsZUdyb3Vwcy5sZW5ndGggLSAxIDogc3RhcnRPZkdyb3VwSW5kZXggLSAxO1xuICAgICAgICAgIHZhciBkZXN0aW5hdGlvbkdyb3VwID0gc3RhdGUudGFiYmFibGVHcm91cHNbZGVzdGluYXRpb25Hcm91cEluZGV4XTtcbiAgICAgICAgICBkZXN0aW5hdGlvbk5vZGUgPSBkZXN0aW5hdGlvbkdyb3VwLmxhc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZPUldBUkRcbiAgICAgICAgLy8gaXMgdGhlIHRhcmdldCB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIGluIGEgZ3JvdXA/XG4gICAgICAgIHZhciBsYXN0T2ZHcm91cEluZGV4ID0gZmluZEluZGV4KHN0YXRlLnRhYmJhYmxlR3JvdXBzLCBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgICB2YXIgbGFzdFRhYmJhYmxlTm9kZSA9IF9yZWYzLmxhc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gbGFzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGxhc3RPZkdyb3VwSW5kZXggPCAwICYmIChzdGF0ZS50YWJiYWJsZUdyb3Vwc1tjb250YWluZXJJbmRleF0uY29udGFpbmVyID09PSB0YXJnZXQgfHwgaXNGb2N1c2FibGUodGFyZ2V0KSAmJiAhaXNUYWJiYWJsZSh0YXJnZXQpKSkge1xuICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiBjYXNlIHdoZXJlIHRoZSB0YXJnZXQgaXMgdGhlIGNvbnRhaW5lciBpdHNlbGYsIG9yXG4gICAgICAgICAgLy8gIGEgbm9uLXRhYmJhYmxlIG5vZGUgdGhhdCB3YXMgZ2l2ZW4gZm9jdXMgKGkuZS4gdGFiaW5kZXggaXMgbmVnYXRpdmVcbiAgICAgICAgICAvLyAgYW5kIHVzZXIgY2xpY2tlZCBvbiBpdCBvciBub2RlIHdhcyBwcm9ncmFtbWF0aWNhbGx5IGdpdmVuIGZvY3VzKSwgaW4gd2hpY2hcbiAgICAgICAgICAvLyAgY2FzZSwgd2Ugc2hvdWxkIGhhbmRsZSB0YWIgYXMgaWYgZm9jdXMgd2VyZSBvbiB0aGUgY29udGFpbmVyJ3NcbiAgICAgICAgICAvLyAgbGFzdCB0YWJiYWJsZSBub2RlLCBhbmQgZ28gdG8gdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgb2YgdGhlIEZJUlNUIGdyb3VwXG4gICAgICAgICAgbGFzdE9mR3JvdXBJbmRleCA9IGNvbnRhaW5lckluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhc3RPZkdyb3VwSW5kZXggPj0gMCkge1xuICAgICAgICAgIC8vIFlFUzogdGhlbiB0YWIgc2hvdWxkIGdvIHRvIHRoZSBmaXJzdCB0YWJiYWJsZSBub2RlIGluIHRoZSBuZXh0XG4gICAgICAgICAgLy8gIGdyb3VwIChhbmQgd3JhcCBhcm91bmQgdG8gdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgb2YgdGhlIEZJUlNUXG4gICAgICAgICAgLy8gIGdyb3VwIGlmIGl0J3MgdGhlIGxhc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgTEFTVCBncm91cClcbiAgICAgICAgICB2YXIgX2Rlc3RpbmF0aW9uR3JvdXBJbmRleCA9IGxhc3RPZkdyb3VwSW5kZXggPT09IHN0YXRlLnRhYmJhYmxlR3JvdXBzLmxlbmd0aCAtIDEgPyAwIDogbGFzdE9mR3JvdXBJbmRleCArIDE7XG5cbiAgICAgICAgICB2YXIgX2Rlc3RpbmF0aW9uR3JvdXAgPSBzdGF0ZS50YWJiYWJsZUdyb3Vwc1tfZGVzdGluYXRpb25Hcm91cEluZGV4XTtcbiAgICAgICAgICBkZXN0aW5hdGlvbk5vZGUgPSBfZGVzdGluYXRpb25Hcm91cC5maXJzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOT1RFOiB0aGUgZmFsbGJhY2tGb2N1cyBvcHRpb24gZG9lcyBub3Qgc3VwcG9ydCByZXR1cm5pbmcgZmFsc2UgdG8gb3B0LW91dFxuICAgICAgZGVzdGluYXRpb25Ob2RlID0gZ2V0Tm9kZUZvck9wdGlvbignZmFsbGJhY2tGb2N1cycpO1xuICAgIH1cblxuICAgIGlmIChkZXN0aW5hdGlvbk5vZGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRyeUZvY3VzKGRlc3RpbmF0aW9uTm9kZSk7XG4gICAgfSAvLyBlbHNlLCBsZXQgdGhlIGJyb3dzZXIgdGFrZSBjYXJlIG9mIFtzaGlmdCtddGFiIGFuZCBtb3ZlIHRoZSBmb2N1c1xuXG4gIH07XG5cbiAgdmFyIGNoZWNrS2V5ID0gZnVuY3Rpb24gY2hlY2tLZXkoZSkge1xuICAgIGlmIChpc0VzY2FwZUV2ZW50KGUpICYmIHZhbHVlT3JIYW5kbGVyKGNvbmZpZy5lc2NhcGVEZWFjdGl2YXRlcywgZSkgIT09IGZhbHNlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNUYWJFdmVudChlKSkge1xuICAgICAgY2hlY2tUYWIoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9O1xuXG4gIHZhciBjaGVja0NsaWNrID0gZnVuY3Rpb24gY2hlY2tDbGljayhlKSB7XG4gICAgaWYgKHZhbHVlT3JIYW5kbGVyKGNvbmZpZy5jbGlja091dHNpZGVEZWFjdGl2YXRlcywgZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGNvbnRhaW5lcnNDb250YWluKHRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVPckhhbmRsZXIoY29uZmlnLmFsbG93T3V0c2lkZUNsaWNrLCBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9OyAvL1xuICAvLyBFVkVOVCBMSVNURU5FUlNcbiAgLy9cblxuXG4gIHZhciBhZGRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBsaXN0ZW5pbmcgZm9jdXMgdHJhcCBhdCBhIHRpbWVcblxuXG4gICAgYWN0aXZlRm9jdXNUcmFwcy5hY3RpdmF0ZVRyYXAodHJhcCk7IC8vIERlbGF5IGVuc3VyZXMgdGhhdCB0aGUgZm9jdXNlZCBlbGVtZW50IGRvZXNuJ3QgY2FwdHVyZSB0aGUgZXZlbnRcbiAgICAvLyB0aGF0IGNhdXNlZCB0aGUgZm9jdXMgdHJhcCBhY3RpdmF0aW9uLlxuXG4gICAgc3RhdGUuZGVsYXlJbml0aWFsRm9jdXNUaW1lciA9IGNvbmZpZy5kZWxheUluaXRpYWxGb2N1cyA/IGRlbGF5KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeUZvY3VzKGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gICAgfSkgOiB0cnlGb2N1cyhnZXRJbml0aWFsRm9jdXNOb2RlKCkpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgY2hlY2tGb2N1c0luLCB0cnVlKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2hlY2tQb2ludGVyRG93biwge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBjaGVja1BvaW50ZXJEb3duLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGVja0NsaWNrLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGNoZWNrS2V5LCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhcDtcbiAgfTtcblxuICB2YXIgcmVtb3ZlTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKCkge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBjaGVja0ZvY3VzSW4sIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjaGVja1BvaW50ZXJEb3duLCB0cnVlKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGNoZWNrUG9pbnRlckRvd24sIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNoZWNrQ2xpY2ssIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2hlY2tLZXksIHRydWUpO1xuICAgIHJldHVybiB0cmFwO1xuICB9OyAvL1xuICAvLyBUUkFQIERFRklOSVRJT05cbiAgLy9cblxuXG4gIHRyYXAgPSB7XG4gICAgYWN0aXZhdGU6IGZ1bmN0aW9uIGFjdGl2YXRlKGFjdGl2YXRlT3B0aW9ucykge1xuICAgICAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG9uQWN0aXZhdGUgPSBnZXRPcHRpb24oYWN0aXZhdGVPcHRpb25zLCAnb25BY3RpdmF0ZScpO1xuICAgICAgdmFyIG9uUG9zdEFjdGl2YXRlID0gZ2V0T3B0aW9uKGFjdGl2YXRlT3B0aW9ucywgJ29uUG9zdEFjdGl2YXRlJyk7XG4gICAgICB2YXIgY2hlY2tDYW5Gb2N1c1RyYXAgPSBnZXRPcHRpb24oYWN0aXZhdGVPcHRpb25zLCAnY2hlY2tDYW5Gb2N1c1RyYXAnKTtcblxuICAgICAgaWYgKCFjaGVja0NhbkZvY3VzVHJhcCkge1xuICAgICAgICB1cGRhdGVUYWJiYWJsZU5vZGVzKCk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLmFjdGl2ZSA9IHRydWU7XG4gICAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5vZGVGb2N1c2VkQmVmb3JlQWN0aXZhdGlvbiA9IGRvYy5hY3RpdmVFbGVtZW50O1xuXG4gICAgICBpZiAob25BY3RpdmF0ZSkge1xuICAgICAgICBvbkFjdGl2YXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaW5pc2hBY3RpdmF0aW9uID0gZnVuY3Rpb24gZmluaXNoQWN0aXZhdGlvbigpIHtcbiAgICAgICAgaWYgKGNoZWNrQ2FuRm9jdXNUcmFwKSB7XG4gICAgICAgICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgaWYgKG9uUG9zdEFjdGl2YXRlKSB7XG4gICAgICAgICAgb25Qb3N0QWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKGNoZWNrQ2FuRm9jdXNUcmFwKSB7XG4gICAgICAgIGNoZWNrQ2FuRm9jdXNUcmFwKHN0YXRlLmNvbnRhaW5lcnMuY29uY2F0KCkpLnRoZW4oZmluaXNoQWN0aXZhdGlvbiwgZmluaXNoQWN0aXZhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBmaW5pc2hBY3RpdmF0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGRlYWN0aXZhdGU6IGZ1bmN0aW9uIGRlYWN0aXZhdGUoZGVhY3RpdmF0ZU9wdGlvbnMpIHtcbiAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBjbGVhclRpbWVvdXQoc3RhdGUuZGVsYXlJbml0aWFsRm9jdXNUaW1lcik7IC8vIG5vb3AgaWYgdW5kZWZpbmVkXG5cbiAgICAgIHN0YXRlLmRlbGF5SW5pdGlhbEZvY3VzVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgIHN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gICAgICBhY3RpdmVGb2N1c1RyYXBzLmRlYWN0aXZhdGVUcmFwKHRyYXApO1xuICAgICAgdmFyIG9uRGVhY3RpdmF0ZSA9IGdldE9wdGlvbihkZWFjdGl2YXRlT3B0aW9ucywgJ29uRGVhY3RpdmF0ZScpO1xuICAgICAgdmFyIG9uUG9zdERlYWN0aXZhdGUgPSBnZXRPcHRpb24oZGVhY3RpdmF0ZU9wdGlvbnMsICdvblBvc3REZWFjdGl2YXRlJyk7XG4gICAgICB2YXIgY2hlY2tDYW5SZXR1cm5Gb2N1cyA9IGdldE9wdGlvbihkZWFjdGl2YXRlT3B0aW9ucywgJ2NoZWNrQ2FuUmV0dXJuRm9jdXMnKTtcblxuICAgICAgaWYgKG9uRGVhY3RpdmF0ZSkge1xuICAgICAgICBvbkRlYWN0aXZhdGUoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJldHVybkZvY3VzID0gZ2V0T3B0aW9uKGRlYWN0aXZhdGVPcHRpb25zLCAncmV0dXJuRm9jdXMnLCAncmV0dXJuRm9jdXNPbkRlYWN0aXZhdGUnKTtcblxuICAgICAgdmFyIGZpbmlzaERlYWN0aXZhdGlvbiA9IGZ1bmN0aW9uIGZpbmlzaERlYWN0aXZhdGlvbigpIHtcbiAgICAgICAgZGVsYXkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChyZXR1cm5Gb2N1cykge1xuICAgICAgICAgICAgdHJ5Rm9jdXMoZ2V0UmV0dXJuRm9jdXNOb2RlKHN0YXRlLm5vZGVGb2N1c2VkQmVmb3JlQWN0aXZhdGlvbikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvblBvc3REZWFjdGl2YXRlKSB7XG4gICAgICAgICAgICBvblBvc3REZWFjdGl2YXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZXR1cm5Gb2N1cyAmJiBjaGVja0NhblJldHVybkZvY3VzKSB7XG4gICAgICAgIGNoZWNrQ2FuUmV0dXJuRm9jdXMoZ2V0UmV0dXJuRm9jdXNOb2RlKHN0YXRlLm5vZGVGb2N1c2VkQmVmb3JlQWN0aXZhdGlvbikpLnRoZW4oZmluaXNoRGVhY3RpdmF0aW9uLCBmaW5pc2hEZWFjdGl2YXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgZmluaXNoRGVhY3RpdmF0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHBhdXNlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIGlmIChzdGF0ZS5wYXVzZWQgfHwgIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgc3RhdGUucGF1c2VkID0gdHJ1ZTtcbiAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB1bnBhdXNlOiBmdW5jdGlvbiB1bnBhdXNlKCkge1xuICAgICAgaWYgKCFzdGF0ZS5wYXVzZWQgfHwgIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gICAgICB1cGRhdGVUYWJiYWJsZU5vZGVzKCk7XG4gICAgICBhZGRMaXN0ZW5lcnMoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgdXBkYXRlQ29udGFpbmVyRWxlbWVudHM6IGZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lckVsZW1lbnRzKGNvbnRhaW5lckVsZW1lbnRzKSB7XG4gICAgICB2YXIgZWxlbWVudHNBc0FycmF5ID0gW10uY29uY2F0KGNvbnRhaW5lckVsZW1lbnRzKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBzdGF0ZS5jb250YWluZXJzID0gZWxlbWVudHNBc0FycmF5Lm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnID8gZG9jLnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCkgOiBlbGVtZW50O1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07IC8vIGluaXRpYWxpemUgY29udGFpbmVyIGVsZW1lbnRzXG5cbiAgdHJhcC51cGRhdGVDb250YWluZXJFbGVtZW50cyhlbGVtZW50cyk7XG4gIHJldHVybiB0cmFwO1xufTtcblxuZXhwb3J0IHsgY3JlYXRlRm9jdXNUcmFwIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb2N1cy10cmFwLmVzbS5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgUmVhY3RET00gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIFByb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnZm9jdXMtdHJhcCcpLFxuICAgIGNyZWF0ZUZvY3VzVHJhcCA9IF9yZXF1aXJlLmNyZWF0ZUZvY3VzVHJhcDsgLy8gVE9ETzogVGhlc2UgaXNzdWVzIGFyZSByZWxhdGVkIHRvIG9sZGVyIFJlYWN0IGZlYXR1cmVzIHdoaWNoIHdlJ2xsIGxpa2VseSBuZWVkXG4vLyAgdG8gZml4IGluIG9yZGVyIHRvIG1vdmUgdGhlIGNvZGUgZm9yd2FyZCB0byB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIFJlYWN0LlxuLy8gIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkdGhlY2xhcmsvZm9jdXMtdHJhcC1yZWFjdC9pc3N1ZXMvNzdcblxuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tZmluZC1kb20tbm9kZSAqL1xuXG5cbnZhciBGb2N1c1RyYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEZvY3VzVHJhcCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihGb2N1c1RyYXApO1xuXG4gIGZ1bmN0aW9uIEZvY3VzVHJhcChwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb2N1c1RyYXApO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7IC8vIFdlIG5lZWQgdG8gaGlqYWNrIHRoZSByZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSBvcHRpb24sXG4gICAgLy8gYmVjYXVzZSBSZWFjdCBjYW4gbW92ZSBmb2N1cyBpbnRvIHRoZSBlbGVtZW50IGJlZm9yZSB3ZSBhcnJpdmVkIGF0XG4gICAgLy8gdGhpcyBsaWZlY3ljbGUgaG9vayAoZS5nLiB3aXRoIGF1dG9Gb2N1cyBpbnB1dHMpLiBTbyB0aGUgY29tcG9uZW50XG4gICAgLy8gY2FwdHVyZXMgdGhlIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCBpbiBjb21wb25lbnRXaWxsTW91bnQsXG4gICAgLy8gdGhlbiAob3B0aW9uYWxseSkgcmV0dXJucyBmb2N1cyB0byBpdCBpbiBjb21wb25lbnRXaWxsVW5tb3VudC5cblxuICAgIF90aGlzLnRhaWxvcmVkRm9jdXNUcmFwT3B0aW9ucyA9IHtcbiAgICAgIHJldHVybkZvY3VzT25EZWFjdGl2YXRlOiBmYWxzZVxuICAgIH07IC8vIGJlY2F1c2Ugb2YgdGhlIGFib3ZlLCB3ZSBtYWludGFpbiBvdXIgb3duIGZsYWcgZm9yIHRoaXMgb3B0aW9uLCBhbmRcbiAgICAvLyAgZGVmYXVsdCBpdCB0byBgdHJ1ZWAgYmVjYXVzZSB0aGF0J3MgZm9jdXMtdHJhcCdzIGRlZmF1bHRcblxuICAgIF90aGlzLnJldHVybkZvY3VzT25EZWFjdGl2YXRlID0gdHJ1ZTtcbiAgICB2YXIgZm9jdXNUcmFwT3B0aW9ucyA9IHByb3BzLmZvY3VzVHJhcE9wdGlvbnM7XG5cbiAgICBmb3IgKHZhciBvcHRpb25OYW1lIGluIGZvY3VzVHJhcE9wdGlvbnMpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZvY3VzVHJhcE9wdGlvbnMsIG9wdGlvbk5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9uTmFtZSA9PT0gJ3JldHVybkZvY3VzT25EZWFjdGl2YXRlJykge1xuICAgICAgICBfdGhpcy5yZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSA9ICEhZm9jdXNUcmFwT3B0aW9uc1tvcHRpb25OYW1lXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25OYW1lID09PSAnb25Qb3N0RGVhY3RpdmF0ZScpIHtcbiAgICAgICAgX3RoaXMub25Qb3N0RGVhY3RpdmF0ZSA9IGZvY3VzVHJhcE9wdGlvbnNbb3B0aW9uTmFtZV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy50YWlsb3JlZEZvY3VzVHJhcE9wdGlvbnNbb3B0aW9uTmFtZV0gPSBmb2N1c1RyYXBPcHRpb25zW29wdGlvbk5hbWVdO1xuICAgIH0gLy8gZWxlbWVudHMgZnJvbSB3aGljaCB0byBjcmVhdGUgdGhlIGZvY3VzIHRyYXAgb24gbW91bnQ7IGlmIGEgY2hpbGQgaXMgdXNlZFxuICAgIC8vICBpbnN0ZWFkIG9mIHRoZSBgY29udGFpbmVyRWxlbWVudHNgIHByb3AsIHdlJ2xsIGdldCB0aGUgY2hpbGQncyByZWxhdGVkXG4gICAgLy8gIGVsZW1lbnQgd2hlbiB0aGUgdHJhcCByZW5kZXJzIGFuZCB0aGVuIGlzIGRlY2xhcmVkICdtb3VudGVkJ1xuXG5cbiAgICBfdGhpcy5mb2N1c1RyYXBFbGVtZW50cyA9IHByb3BzLmNvbnRhaW5lckVsZW1lbnRzIHx8IFtdOyAvLyBub3cgd2UgcmVtZW1iZXIgd2hhdCB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCBpcywgbm90IHJlbHlpbmcgb24gZm9jdXMtdHJhcFxuXG4gICAgX3RoaXMudXBkYXRlUHJldmlvdXNFbGVtZW50KCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgZG9jdW1lbnQuXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudHx1bmRlZmluZWR9IENvbmZpZ3VyZWQgZG9jdW1lbnQsIGZhbGxpbmcgYmFjayB0byB0aGUgbWFpblxuICAgKiAgZG9jdW1lbnQsIGlmIGl0IGV4aXN0cy4gRHVyaW5nIFNTUiwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQgc2luY2UgdGhlXG4gICAqICBkb2N1bWVudCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhGb2N1c1RyYXAsIFt7XG4gICAga2V5OiBcImdldERvY3VtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgICAgLy8gU1NSOiBjYXJlZnVsIHRvIGNoZWNrIGlmIGBkb2N1bWVudGAgZXhpc3RzIGJlZm9yZSBhY2Nlc3NpbmcgaXQgYXMgYSB2YXJpYWJsZVxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuZm9jdXNUcmFwT3B0aW9ucy5kb2N1bWVudCB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcbiAgICB9IC8vIFRPRE86IE5lZWQgbW9yZSB0ZXN0IGNvdmVyYWdlIGZvciB0aGlzIGZ1bmN0aW9uXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXROb2RlRm9yT3B0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5vZGVGb3JPcHRpb24ob3B0aW9uTmFtZSkge1xuICAgICAgdmFyIG9wdGlvblZhbHVlID0gdGhpcy50YWlsb3JlZEZvY3VzVHJhcE9wdGlvbnNbb3B0aW9uTmFtZV07XG5cbiAgICAgIGlmICghb3B0aW9uVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBub2RlID0gb3B0aW9uVmFsdWU7XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBfdGhpcyRnZXREb2N1bWVudDtcblxuICAgICAgICBub2RlID0gKF90aGlzJGdldERvY3VtZW50ID0gdGhpcy5nZXREb2N1bWVudCgpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXREb2N1bWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZ2V0RG9jdW1lbnQucXVlcnlTZWxlY3RvcihvcHRpb25WYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgcmVmZXJzIHRvIG5vIGtub3duIG5vZGVcIikpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbm9kZSA9IG9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgZGlkIG5vdCByZXR1cm4gYSBub2RlXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmV0dXJuRm9jdXNOb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJldHVybkZvY3VzTm9kZSgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5nZXROb2RlRm9yT3B0aW9uKCdzZXRSZXR1cm5Gb2N1cycpO1xuICAgICAgcmV0dXJuIG5vZGUgPyBub2RlIDogdGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKiBVcGRhdGUgdGhlIHByZXZpb3VzbHkgZm9jdXNlZCBlbGVtZW50IHdpdGggdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQuICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVQcmV2aW91c0VsZW1lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlUHJldmlvdXNFbGVtZW50KCkge1xuICAgICAgdmFyIGN1cnJlbnREb2N1bWVudCA9IHRoaXMuZ2V0RG9jdW1lbnQoKTtcblxuICAgICAgaWYgKGN1cnJlbnREb2N1bWVudCkge1xuICAgICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGN1cnJlbnREb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWFjdGl2YXRlVHJhcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWFjdGl2YXRlVHJhcCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkdGFpbG9yZWRGb2N1c1RyID0gdGhpcy50YWlsb3JlZEZvY3VzVHJhcE9wdGlvbnMsXG4gICAgICAgICAgY2hlY2tDYW5SZXR1cm5Gb2N1cyA9IF90aGlzJHRhaWxvcmVkRm9jdXNUci5jaGVja0NhblJldHVybkZvY3VzLFxuICAgICAgICAgIF90aGlzJHRhaWxvcmVkRm9jdXNUcjIgPSBfdGhpcyR0YWlsb3JlZEZvY3VzVHIucHJldmVudFNjcm9sbCxcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsID0gX3RoaXMkdGFpbG9yZWRGb2N1c1RyMiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfdGhpcyR0YWlsb3JlZEZvY3VzVHIyO1xuXG4gICAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgICAgLy8gTk9URTogd2UgbmV2ZXIgbGV0IHRoZSB0cmFwIHJldHVybiB0aGUgZm9jdXMgc2luY2Ugd2UgZG8gdGhhdCBvdXJzZWx2ZXNcbiAgICAgICAgdGhpcy5mb2N1c1RyYXAuZGVhY3RpdmF0ZSh7XG4gICAgICAgICAgcmV0dXJuRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluaXNoRGVhY3RpdmF0aW9uID0gZnVuY3Rpb24gZmluaXNoRGVhY3RpdmF0aW9uKCkge1xuICAgICAgICB2YXIgcmV0dXJuRm9jdXNOb2RlID0gX3RoaXMyLmdldFJldHVybkZvY3VzTm9kZSgpO1xuXG4gICAgICAgIHZhciBjYW5SZXR1cm5Gb2N1cyA9IChyZXR1cm5Gb2N1c05vZGUgPT09IG51bGwgfHwgcmV0dXJuRm9jdXNOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXR1cm5Gb2N1c05vZGUuZm9jdXMpICYmIF90aGlzMi5yZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZTtcblxuICAgICAgICBpZiAoY2FuUmV0dXJuRm9jdXMpIHtcbiAgICAgICAgICAvKiogUmV0dXJucyBmb2N1cyB0byB0aGUgZWxlbWVudCB0aGF0IGhhZCBmb2N1cyB3aGVuIHRoZSB0cmFwIHdhcyBhY3RpdmF0ZWQuICovXG4gICAgICAgICAgcmV0dXJuRm9jdXNOb2RlLmZvY3VzKHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHByZXZlbnRTY3JvbGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpczIub25Qb3N0RGVhY3RpdmF0ZSkge1xuICAgICAgICAgIF90aGlzMi5vblBvc3REZWFjdGl2YXRlLmNhbGwobnVsbCk7IC8vIGRvbid0IGNhbGwgaXQgaW4gY29udGV4dCBvZiBcInRoaXNcIlxuXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChjaGVja0NhblJldHVybkZvY3VzKSB7XG4gICAgICAgIGNoZWNrQ2FuUmV0dXJuRm9jdXModGhpcy5nZXRSZXR1cm5Gb2N1c05vZGUoKSkudGhlbihmaW5pc2hEZWFjdGl2YXRpb24sIGZpbmlzaERlYWN0aXZhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5pc2hEZWFjdGl2YXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0dXBGb2N1c1RyYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0dXBGb2N1c1RyYXAoKSB7XG4gICAgICBpZiAoIXRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICAgIHZhciBmb2N1c1RyYXBFbGVtZW50RE9NTm9kZXMgPSB0aGlzLmZvY3VzVHJhcEVsZW1lbnRzLm1hcCggLy8gTk9URTogYGZpbmRET01Ob2RlKClgIGRvZXMgbm90IHN1cHBvcnQgQ1NTIHNlbGVjdG9yczsgaXQnbGwganVzdCByZXR1cm5cbiAgICAgICAgLy8gIGEgbmV3IHRleHQgbm9kZSB3aXRoIHRoZSB0ZXh0IHdyYXBwZWQgaW4gaXQgaW5zdGVhZCBvZiB0cmVhdGluZyB0aGVcbiAgICAgICAgLy8gIHN0cmluZyBhcyBhIHNlbGVjdG9yIGFuZCByZXNvbHZpbmcgaXQgdG8gYSBub2RlIGluIHRoZSBET01cbiAgICAgICAgUmVhY3RET00uZmluZERPTU5vZGUpO1xuICAgICAgICB2YXIgbm9kZXNFeGlzdCA9IGZvY3VzVHJhcEVsZW1lbnRET01Ob2Rlcy5zb21lKEJvb2xlYW4pO1xuXG4gICAgICAgIGlmIChub2Rlc0V4aXN0KSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3Byb3AtdHlwZXMgLS0gX2NyZWF0ZUZvY3VzVHJhcCBpcyBhbiBpbnRlcm5hbCBwcm9wXG4gICAgICAgICAgdGhpcy5mb2N1c1RyYXAgPSB0aGlzLnByb3BzLl9jcmVhdGVGb2N1c1RyYXAoZm9jdXNUcmFwRWxlbWVudERPTU5vZGVzLCB0aGlzLnRhaWxvcmVkRm9jdXNUcmFwT3B0aW9ucyk7XG5cbiAgICAgICAgICBpZiAodGhpcy5wcm9wcy5hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmFjdGl2YXRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMucHJvcHMucGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5wYXVzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmFjdGl2ZSkge1xuICAgICAgICB0aGlzLnNldHVwRm9jdXNUcmFwKCk7XG4gICAgICB9IC8vIGVsc2UsIHdhaXQgZm9yIGxhdGVyIGFjdGl2YXRpb24gaW4gY2FzZSB0aGUgYGZvY3VzVHJhcE9wdGlvbnNgIHdpbGwgYmUgdXBkYXRlZFxuICAgICAgLy8gIGFnYWluIGJlZm9yZSB0aGUgdHJhcCBpcyBhY3RpdmF0ZWQgKGUuZy4gaWYgd2FpdGluZyB0byBrbm93IHdoYXQgdGhlIGRvY3VtZW50XG4gICAgICAvLyAgb2JqZWN0IHdpbGwgYmUsIHNvIHRoZSBUcmFwIG11c3QgYmUgcmVuZGVyZWQsIGJ1dCB0aGUgY29uc3VtZXIgaXMgd2FpdGluZyB0b1xuICAgICAgLy8gIGFjdGl2YXRlIHVudGlsIHRoZXkgaGF2ZSBvYnRhaW5lZCB0aGUgZG9jdW1lbnQgZnJvbSBhIHJlZilcbiAgICAgIC8vICBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAtcmVhY3QvaXNzdWVzLzUzOVxuXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgICAgaWYgKHByZXZQcm9wcy5jb250YWluZXJFbGVtZW50cyAhPT0gdGhpcy5wcm9wcy5jb250YWluZXJFbGVtZW50cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLnVwZGF0ZUNvbnRhaW5lckVsZW1lbnRzKHRoaXMucHJvcHMuY29udGFpbmVyRWxlbWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhhc0FjdGl2YXRlZCA9ICFwcmV2UHJvcHMuYWN0aXZlICYmIHRoaXMucHJvcHMuYWN0aXZlO1xuICAgICAgICB2YXIgaGFzRGVhY3RpdmF0ZWQgPSBwcmV2UHJvcHMuYWN0aXZlICYmICF0aGlzLnByb3BzLmFjdGl2ZTtcbiAgICAgICAgdmFyIGhhc1BhdXNlZCA9ICFwcmV2UHJvcHMucGF1c2VkICYmIHRoaXMucHJvcHMucGF1c2VkO1xuICAgICAgICB2YXIgaGFzVW5wYXVzZWQgPSBwcmV2UHJvcHMucGF1c2VkICYmICF0aGlzLnByb3BzLnBhdXNlZDtcblxuICAgICAgICBpZiAoaGFzQWN0aXZhdGVkKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVQcmV2aW91c0VsZW1lbnQoKTtcbiAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5hY3RpdmF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0RlYWN0aXZhdGVkKSB7XG4gICAgICAgICAgdGhpcy5kZWFjdGl2YXRlVHJhcCgpO1xuICAgICAgICAgIHJldHVybjsgLy8gdW4vcGF1c2UgZG9lcyBub3RoaW5nIG9uIGFuIGluYWN0aXZlIHRyYXBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNQYXVzZWQpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5wYXVzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1VucGF1c2VkKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1RyYXAudW5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOT1RFOiBpZiB3ZSdyZSBpbiBgY29tcG9uZW50RGlkVXBkYXRlYCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHRyYXAgeWV0LFxuICAgICAgICAvLyAgaXQgZWl0aGVyIG1lYW5zIGl0IHNob3VsZG4ndCBiZSBhY3RpdmUsIG9yIGl0IHNob3VsZCBiZSBidXQgbm9uZSBvZlxuICAgICAgICAvLyAgb2YgZ2l2ZW4gYGNvbnRhaW5lckVsZW1lbnRzYCB3ZXJlIHByZXNlbnQgaW4gdGhlIERPTSB0aGUgbGFzdCB0aW1lXG4gICAgICAgIC8vICB3ZSB0cmllZCB0byBjcmVhdGUgdGhlIHRyYXBcbiAgICAgICAgaWYgKHByZXZQcm9wcy5jb250YWluZXJFbGVtZW50cyAhPT0gdGhpcy5wcm9wcy5jb250YWluZXJFbGVtZW50cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNUcmFwRWxlbWVudHMgPSB0aGlzLnByb3BzLmNvbnRhaW5lckVsZW1lbnRzO1xuICAgICAgICB9IC8vIGRvbid0IGNyZWF0ZSB0aGUgdHJhcCB1bmxlc3MgaXQgc2hvdWxkIGJlIGFjdGl2ZSBpbiBjYXNlIHRoZSBjb25zdW1lclxuICAgICAgICAvLyAgaXMgc3RpbGwgdXBkYXRpbmcgYGZvY3VzVHJhcE9wdGlvbnNgXG4gICAgICAgIC8vICBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAtcmVhY3QvaXNzdWVzLzUzOVxuXG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVQcmV2aW91c0VsZW1lbnQoKTtcbiAgICAgICAgICB0aGlzLnNldHVwRm9jdXNUcmFwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVUcmFwKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIGNoaWxkID0gdGhpcy5wcm9wcy5jaGlsZHJlbiA/IFJlYWN0LkNoaWxkcmVuLm9ubHkodGhpcy5wcm9wcy5jaGlsZHJlbikgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlID09PSBSZWFjdC5GcmFnbWVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSBmb2N1cy10cmFwIGNhbm5vdCB1c2UgYSBGcmFnbWVudCBhcyBpdHMgY2hpbGQgY29udGFpbmVyLiBUcnkgcmVwbGFjaW5nIGl0IHdpdGggYSA8ZGl2PiBlbGVtZW50LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbXBvc2VkUmVmQ2FsbGJhY2sgPSBmdW5jdGlvbiBjb21wb3NlZFJlZkNhbGxiYWNrKGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyRWxlbWVudHMgPSBfdGhpczMucHJvcHMuY29udGFpbmVyRWxlbWVudHM7XG5cbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNoaWxkLnJlZihlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQucmVmKSB7XG4gICAgICAgICAgICAgIGNoaWxkLnJlZi5jdXJyZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczMuZm9jdXNUcmFwRWxlbWVudHMgPSBjb250YWluZXJFbGVtZW50cyA/IGNvbnRhaW5lckVsZW1lbnRzIDogW2VsZW1lbnRdO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBjaGlsZFdpdGhSZWYgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAgICByZWY6IGNvbXBvc2VkUmVmQ2FsbGJhY2tcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjaGlsZFdpdGhSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGb2N1c1RyYXA7XG59KFJlYWN0LkNvbXBvbmVudCk7IC8vIHN1cHBvcnQgc2VydmVyLXNpZGUgcmVuZGVyaW5nIHdoZXJlIGBFbGVtZW50YCB3aWxsIG5vdCBiZSBkZWZpbmVkXG5cblxudmFyIEVsZW1lbnRUeXBlID0gdHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnID8gRnVuY3Rpb24gOiBFbGVtZW50O1xuRm9jdXNUcmFwLnByb3BUeXBlcyA9IHtcbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcbiAgcGF1c2VkOiBQcm9wVHlwZXMuYm9vbCxcbiAgZm9jdXNUcmFwT3B0aW9uczogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBkb2N1bWVudDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBvbkFjdGl2YXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvblBvc3RBY3RpdmF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY2hlY2tDYW5Gb2N1c1RyYXA6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uRGVhY3RpdmF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25Qb3N0RGVhY3RpdmF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY2hlY2tDYW5SZXR1cm5Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaW5pdGlhbEZvY3VzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuaW5zdGFuY2VPZihFbGVtZW50VHlwZSksIFByb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuYm9vbF0pLFxuICAgIGZhbGxiYWNrRm9jdXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5pbnN0YW5jZU9mKEVsZW1lbnRUeXBlKSwgUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBlc2NhcGVEZWFjdGl2YXRlczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgY2xpY2tPdXRzaWRlRGVhY3RpdmF0ZXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHJldHVybkZvY3VzT25EZWFjdGl2YXRlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBzZXRSZXR1cm5Gb2N1czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmluc3RhbmNlT2YoRWxlbWVudFR5cGUpLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGFsbG93T3V0c2lkZUNsaWNrOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBwcmV2ZW50U2Nyb2xsOiBQcm9wVHlwZXMuYm9vbFxuICB9KSxcbiAgY29udGFpbmVyRWxlbWVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5pbnN0YW5jZU9mKEVsZW1lbnRUeXBlKSksXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZWxlbWVudCwgLy8gUmVhY3QgZWxlbWVudFxuICBQcm9wVHlwZXMuaW5zdGFuY2VPZihFbGVtZW50VHlwZSkgLy8gRE9NIGVsZW1lbnRcbiAgXSkgLy8gTk9URTogX2NyZWF0ZUZvY3VzVHJhcCBpcyBpbnRlcm5hbCwgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSwgc28gd2UgZG9uJ3RcbiAgLy8gIHNwZWNpZnkgaXQgaGVyZS4gSXQncyBleHBlY3RlZCB0byBiZSBzZXQgdG8gdGhlIGZ1bmN0aW9uIHJldHVybmVkIGZyb21cbiAgLy8gIHJlcXVpcmUoJ2ZvY3VzLXRyYXAnKSwgb3Igb25lIHdpdGggYSBjb21wYXRpYmxlIGludGVyZmFjZS5cblxufTtcbkZvY3VzVHJhcC5kZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGl2ZTogdHJ1ZSxcbiAgcGF1c2VkOiBmYWxzZSxcbiAgZm9jdXNUcmFwT3B0aW9uczoge30sXG4gIF9jcmVhdGVGb2N1c1RyYXA6IGNyZWF0ZUZvY3VzVHJhcFxufTtcbm1vZHVsZS5leHBvcnRzID0gRm9jdXNUcmFwOyIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbi8vIFBhcmFtZXRlciBpcyB0aGUgYm9vbGVhbiwgd2l0aCBkZWZhdWx0IFwiZmFsc2VcIiB2YWx1ZVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVG9nZ2xlKGluaXRpYWxTdGF0ZSA9IGZhbHNlKTogW2Jvb2xlYW4sIChuZXh0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXSB7XG4gIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlXG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcblxuICAvLyBEZWZpbmUgYW5kIG1lbW9yaXplIHRvZ2dsZXIgZnVuY3Rpb24gaW4gY2FzZSB3ZSBwYXNzIGRvd24gdGhlIGNvbW9wbmVudCxcbiAgLy8gVGhpcyBmdW5jdGlvbiBjaGFuZ2UgdGhlIGJvb2xlYW4gdmFsdWUgdG8gaXQncyBvcHBvc2l0ZSB2YWx1ZVxuICBjb25zdCB0b2dnbGUgPSB1c2VDYWxsYmFjaygobmV4dFN0YXRlPzogYm9vbGVhbikgPT4ge1xuICAgIGlmIChuZXh0U3RhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U3RhdGUoKHN0YXRlKSA9PiAhc3RhdGUpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIHJldHVybiBbc3RhdGUsIHRvZ2dsZV07XG59XG4iLCJpbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcclxuaW1wb3J0IHtkYWlseU5vdGVzU2VydmljZSwgZ2xvYmFsU3RhdGVTZXJ2aWNlLCBsb2NhdGlvblNlcnZpY2UsIG1lbW9TZXJ2aWNlLCByZXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xyXG5pbXBvcnQge3N0b3JhZ2V9IGZyb20gJy4uL2hlbHBlcnMvc3RvcmFnZSc7XHJcbmltcG9ydCBFZGl0b3IsIHtFZGl0b3JSZWZBY3Rpb25zfSBmcm9tICcuL0VkaXRvci9FZGl0b3InO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVtby1lZGl0b3IubGVzcyc7XHJcbmltcG9ydCAnLi4vbGVzcy9zZWxlY3QtZGF0ZS1waWNrZXIubGVzcyc7XHJcbmltcG9ydCB0YWcgZnJvbSAnLi4vaWNvbnMvdGFnLnN2Zyc7XHJcbmltcG9ydCBpbWFnZVN2ZyBmcm9tICcuLi9pY29ucy9pbWFnZS5zdmcnO1xyXG5pbXBvcnQgdGFza1N2ZyBmcm9tICcuLi9pY29ucy90YXNrLnN2Zyc7XHJcbmltcG9ydCBzaG93RWRpdG9yU3ZnIGZyb20gJy4uL2ljb25zL3Nob3ctZWRpdG9yLnN2Zyc7XHJcbmltcG9ydCBqb3VybmFsU3ZnIGZyb20gJy4uL2ljb25zL2pvdXJuYWwuc3ZnJztcclxuaW1wb3J0IHtEYXlQaWNrZXJ9IGZyb20gJ3JlYWN0LWRheS1waWNrZXInO1xyXG5pbXBvcnQge3VzZVBvcHBlcn0gZnJvbSAncmVhY3QtcG9wcGVyJztcclxuLy8gaW1wb3J0IHsgY3JlYXRlUG9wcGVyIH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUnXHJcbi8vIGltcG9ydCB7IGZvcm1hdCwgaXNWYWxpZCwgcGFyc2UgfSBmcm9tICdkYXRlLWZucyc7XHJcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnZm9jdXMtdHJhcC1yZWFjdCc7XHJcbmltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7RGVmYXVsdEVkaXRvckxvY2F0aW9uLCBEZWZhdWx0UHJlZml4LCBJbnNlcnREYXRlRm9ybWF0LCBVc2VCdXR0b25Ub1Nob3dFZGl0b3IsIEZvY3VzT25FZGl0b3J9IGZyb20gJy4uL21lbW9zJztcclxuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xyXG4vLyBpbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBUYWdzU3VnZ2VzdCB9IGZyb20gXCIuLi9vYkNvbXBvbmVudHMvb2JUYWdTdWdnZXN0ZXJcIjtcclxuaW1wb3J0IHtOb3RpY2UsIFBsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7TUVNT1NfVklFV19UWVBFfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5pbXBvcnQge3R9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG5cclxuY29uc3QgZ2V0Q3Vyc29yUG9zdGlvbiA9IChpbnB1dDogSFRNTFRleHRBcmVhRWxlbWVudCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIG9mZnNldExlZnQ6IGlucHV0WCxcclxuICAgIG9mZnNldFRvcDogaW5wdXRZLFxyXG4gICAgb2Zmc2V0SGVpZ2h0OiBpbnB1dEgsXHJcbiAgICBvZmZzZXRXaWR0aDogaW5wdXRXLFxyXG4gICAgc2VsZWN0aW9uRW5kOiBzZWxlY3Rpb25Qb2ludCxcclxuICB9ID0gaW5wdXQ7XHJcbiAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gIGNvbnN0IGNvcHlTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGlucHV0KTtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29weVN0eWxlKSB7XHJcbiAgICBkaXYuc3R5bGUuc2V0UHJvcGVydHkoaXRlbSwgY29weVN0eWxlLmdldFByb3BlcnR5VmFsdWUoaXRlbSkpO1xyXG4gIH1cclxuICBkaXYuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gIGRpdi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgZGl2LnN0eWxlLndoaXRlU3BhY2UgPSAncHJlLXdyYXAnO1xyXG5cclxuICAvLyB3ZSBuZWVkIGEgY2hhcmFjdGVyIHRoYXQgd2lsbCByZXBsYWNlIHdoaXRlc3BhY2Ugd2hlbiBmaWxsaW5nIG91ciBkdW1teSBlbGVtZW50IGlmIGl0J3MgYSBzaW5nbGUgbGluZSA8aW5wdXQvPlxyXG4gIGNvbnN0IHN3YXAgPSAnLic7XHJcbiAgY29uc3QgaW5wdXRWYWx1ZSA9IGlucHV0LnRhZ05hbWUgPT09ICdJTlBVVCcgPyBpbnB1dC52YWx1ZS5yZXBsYWNlKC8gL2csIHN3YXApIDogaW5wdXQudmFsdWU7XHJcbiAgY29uc3QgdGV4dENvbnRlbnQgPSBpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25Qb2ludCB8fCAwKTtcclxuICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcclxuICBpZiAoaW5wdXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xyXG4gICAgZGl2LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICB9XHJcblxyXG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgc3Bhbi50ZXh0Q29udGVudCA9IGlucHV0VmFsdWUuc3Vic3RyaW5nKHNlbGVjdGlvblBvaW50IHx8IDApIHx8ICcuJztcclxuICBkaXYuYXBwZW5kQ2hpbGQoc3Bhbik7XHJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xyXG4gIGNvbnN0IHtvZmZzZXRMZWZ0OiBzcGFuWCwgb2Zmc2V0VG9wOiBzcGFuWSwgb2Zmc2V0SGVpZ2h0OiBzcGFuSCwgb2Zmc2V0V2lkdGg6IHNwYW5XfSA9IHNwYW47XHJcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpO1xyXG4gIHJldHVybiB7XHJcbiAgICB4OiBpbnB1dFggKyBzcGFuWCxcclxuICAgIHk6IGlucHV0WSArIHNwYW5ZLFxyXG4gICAgaDogaW5wdXRIICsgc3BhbkgsXHJcbiAgICB3OiBpbnB1dFcgKyBzcGFuVyxcclxuICB9O1xyXG59O1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIHt9XHJcblxyXG5sZXQgaXNMaXN0OiBib29sZWFuO1xyXG5sZXQgaXNFZGl0b3IgPSBmYWxzZSBhcyBib29sZWFuO1xyXG5sZXQgaXNFZGl0b3JHbyA9IGZhbHNlIGFzIGJvb2xlYW47XHJcbmxldCBwb3NpdGlvblg6IG51bWJlcjtcclxuXHJcbmNvbnN0IE1lbW9FZGl0b3I6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcclxuICBjb25zdCB7Z2xvYmFsU3RhdGV9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcclxuICBjb25zdCBbaXNMaXN0U2hvd24sIHRvZ2dsZUxpc3RdID0gdXNlVG9nZ2xlKGZhbHNlKTtcclxuICBjb25zdCBbaXNFZGl0b3JTaG93biwgdG9nZ2xlRWRpdG9yXSA9IHVzZVRvZ2dsZShmYWxzZSk7XHJcbiAgY29uc3QgZWRpdG9yUmVmID0gdXNlUmVmPEVkaXRvclJlZkFjdGlvbnM+KG51bGwpO1xyXG4gIGNvbnN0IHByZXZHbG9iYWxTdGF0ZVJlZiA9IHVzZVJlZihnbG9iYWxTdGF0ZSk7XHJcbiAgY29uc3QgW3NlbGVjdGVkLCBzZXRTZWxlY3RlZF0gPSB1c2VTdGF0ZTxEYXRlPigpO1xyXG4gIGNvbnN0IFtpc1BvcHBlck9wZW4sIHNldElzUG9wcGVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3Qge2FwcH0gPSBkYWlseU5vdGVzU2VydmljZS5nZXRTdGF0ZSgpO1xyXG5cclxuICBjb25zdCBwb3BwZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IFtwb3BwZXJFbGVtZW50LCBzZXRQb3BwZXJFbGVtZW50XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gIGxldCBwb3BwZXI7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoRGVmYXVsdFByZWZpeCA9PT0gJ0xpc3QnKSB7XHJcbiAgICAgIGlzTGlzdCA9IGZhbHNlO1xyXG4gICAgICB0b2dnbGVMaXN0KGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlzTGlzdCA9IHRydWU7XHJcbiAgICAgIHRvZ2dsZUxpc3QodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKCFlZGl0b3JSZWYuY3VycmVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKChQbGF0Zm9ybS5pc01vYmlsZSA9PT0gdHJ1ZSB8fCB3aW5kb3cuaW5uZXJXaWR0aCA8IDg3NSkgJiYgVXNlQnV0dG9uVG9TaG93RWRpdG9yKSB7XHJcbiAgICAgIHRvZ2dsZUVkaXRvcih0cnVlKTtcclxuICAgIH1cclxuICAgIGlmIChGb2N1c09uRWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgVXNlQnV0dG9uVG9TaG93RWRpdG9yID09PSB0cnVlICYmXHJcbiAgICAgIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScgJiZcclxuICAgICAgUGxhdGZvcm0uaXNNb2JpbGUgPT09IHRydWUgJiZcclxuICAgICAgd2luZG93LmlubmVyV2lkdGggPCA4NzVcclxuICAgICkge1xyXG4gICAgICBjb25zdCBsZWF2ZXMgPSBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgICBsZXQgbWVtb3NIZWlnaHQ7XHJcbiAgICAgIGxldCBsZWFmVmlldztcclxuICAgICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbGVhZiA9IGxlYXZlc1swXTtcclxuICAgICAgICBsZWFmVmlldyA9IGxlYWYudmlldy5jb250YWluZXJFbDtcclxuICAgICAgICBtZW1vc0hlaWdodCA9IGxlYWZWaWV3Lm9mZnNldEhlaWdodDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZWFmVmlldyA9IGRvY3VtZW50O1xyXG4gICAgICAgIG1lbW9zSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkaXZUaGlzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgIGNvbnN0IG1lbW9FZGl0b3JEaXYgPSBsZWFmVmlldy5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgIFwiZGl2W2RhdGEtdHlwZT0nbWVtb3NfdmlldyddIC52aWV3LWNvbnRlbnQgLm1lbW8tZWRpdG9yLXdyYXBwZXJcIixcclxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgZGl2VGhpcy5zcmMgPSBgJHtzaG93RWRpdG9yU3ZnfWA7XHJcbiAgICAgIGlmIChpc0VkaXRvclNob3duKSB7XHJcbiAgICAgICAgZGl2VGhpcy5jbGFzc05hbWUgPSAnbWVtby1zaG93LWVkaXRvci1idXR0b24gaGlkZGVuJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkaXZUaGlzLmNsYXNzTmFtZSA9ICdtZW1vLXNob3ctZWRpdG9yLWJ1dHRvbic7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYnV0dG9uVG9wID0gbWVtb3NIZWlnaHQgLSAyMDA7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbkxlZnQgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSAyNTtcclxuICAgICAgZGl2VGhpcy5zdHlsZS50b3AgPSBidXR0b25Ub3AgKyAncHgnO1xyXG4gICAgICBkaXZUaGlzLnN0eWxlLmxlZnQgPSBidXR0b25MZWZ0ICsgJ3B4JztcclxuXHJcbiAgICAgIGRpdlRoaXMub25jbGljayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgc2NhbGVFbGVtZW50QW5pID0gZGl2VGhpcy5hbmltYXRlKFxyXG4gICAgICAgICAgW1xyXG4gICAgICAgICAgICAvLyBrZXlmcmFtZXNcclxuICAgICAgICAgICAge3RyYW5zZm9ybTogJ3JvdGF0ZSgwZGVnKSBzY2FsZSgxKSd9LFxyXG4gICAgICAgICAgICB7dHJhbnNmb3JtOiAncm90YXRlKDYwZGVnKSBzY2FsZSgxLjUpJ30sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyB0aW1pbmcgb3B0aW9uc1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxyXG4gICAgICAgICAgICBpdGVyYXRpb25zOiBJbmZpbml0eSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBkaXZUaGlzLmNsYXNzTmFtZSA9ICdtZW1vLXNob3ctZWRpdG9yLWJ1dHRvbiBoaWRkZW4nO1xyXG4gICAgICAgICAgaGFuZGxlU2hvd0VkaXRvcigpO1xyXG4gICAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgICAgICAgICBzY2FsZUVsZW1lbnRBbmkucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgLy8gcm90YXRlRWxlbWVudEFuaS5wYXVzZSgpO1xyXG4gICAgICAgIH0sIDMwMCk7XHJcbiAgICAgIH07XHJcbiAgICAgIGxlYWZWaWV3LnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50LXdyYXBwZXInKS5wcmVwZW5kKGRpdlRoaXMpO1xyXG5cclxuICAgICAgY29uc3QgbWVtb2xpc3RTY3JvbGwgPSBsZWFmVmlldy5xdWVyeVNlbGVjdG9yKCcubWVtb2xpc3Qtd3JhcHBlcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBtZW1vbGlzdFNjcm9sbC5vbnNjcm9sbCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoaXNFZGl0b3IgJiYgIWlzRWRpdG9yR28pIHtcclxuICAgICAgICAgIGlzRWRpdG9yR28gPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IHNjYWxlRWRpdG9yRWxlbWVudEFuaSA9IG1lbW9FZGl0b3JEaXYuYW5pbWF0ZShcclxuICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgIC8vIGtleWZyYW1lc1xyXG4gICAgICAgICAgICAgIHt0cmFuc2Zvcm06ICdzY2FsZSgxKScsIG9wYWNpdHk6IDF9LFxyXG4gICAgICAgICAgICAgIHt0cmFuc2Zvcm06ICdzY2FsZSgwLjQpJywgb3BhY2l0eTogMH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAvLyB0aW1pbmcgb3B0aW9uc1xyXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXHJcbiAgICAgICAgICAgICAgaXRlcmF0aW9uczogMSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBsZXQgc2NhbGVPbmVFbGVtZW50QW5pOiBBbmltYXRpb247XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2NhbGVPbmVFbGVtZW50QW5pID0gZGl2VGhpcy5hbmltYXRlKFxyXG4gICAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIC8vIGtleWZyYW1lc1xyXG4gICAgICAgICAgICAgICAge3RyYW5zZm9ybTogJ3JvdGF0ZSgyMGRlZykgc2NhbGUoMS41KSd9LFxyXG4gICAgICAgICAgICAgICAge3RyYW5zZm9ybTogJ3JvdGF0ZSgwZGVnKSBzY2FsZSgxKSd9LFxyXG4gICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gdGltaW5nIG9wdGlvbnNcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAsXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb25zOiAxLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGhhbmRsZVNob3dFZGl0b3IodHJ1ZSk7XHJcbiAgICAgICAgICAgIGRpdlRoaXMuY2xhc3NOYW1lID0gJ21lbW8tc2hvdy1lZGl0b3ItYnV0dG9uJztcclxuICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2NhbGVPbmVFbGVtZW50QW5pLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICBzY2FsZUVkaXRvckVsZW1lbnRBbmkucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgfSwgNzAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBVc2VCdXR0b25Ub1Nob3dFZGl0b3IgPT09IGZhbHNlICYmXHJcbiAgICAgIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScgJiZcclxuICAgICAgUGxhdGZvcm0uaXNNb2JpbGUgPT09IHRydWUgJiZcclxuICAgICAgd2luZG93LmlubmVyV2lkdGggPCA4NzVcclxuICAgICkge1xyXG4gICAgICBoYW5kbGVTaG93RWRpdG9yKGZhbHNlKTtcclxuICAgICAgaWYgKEZvY3VzT25FZGl0b3IpIHtcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFpc0VkaXRvcikge1xyXG4gICAgICAgIGhhbmRsZVNob3dFZGl0b3IoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChGb2N1c09uRWRpdG9yKSB7XHJcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LCBbXSk7XHJcblxyXG4gIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcclxuICAgIHBvcHBlciA9IHVzZVBvcHBlcihwb3BwZXJSZWYuY3VycmVudCwgcG9wcGVyRWxlbWVudCwge1xyXG4gICAgICBwbGFjZW1lbnQ6ICdyaWdodC1lbmQnLFxyXG4gICAgICBtb2RpZmllcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnZmxpcCcsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogWydib3R0b20nXSxcclxuICAgICAgICAgICAgcm9vdEJvdW5kYXJ5OiAnZG9jdW1lbnQnLCAvLyBieSBkZWZhdWx0LCBhbGwgdGhlIHBsYWNlbWVudHMgYXJlIGFsbG93ZWRcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG4gIH0gZWxzZSBpZiAoUGxhdGZvcm0uaXNNb2JpbGUgJiYgRGVmYXVsdEVkaXRvckxvY2F0aW9uICE9PSAnQm90dG9tJykge1xyXG4gICAgY29uc3Qgc2VsZXRvclBvcHVwV2lkdGggPSAyODA7XHJcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggLSBwb3NpdGlvblggPiBzZWxldG9yUG9wdXBXaWR0aCAqIDEuMikge1xyXG4gICAgICBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcclxuICAgICAgICBwbGFjZW1lbnQ6ICdyaWdodC1lbmQnLFxyXG4gICAgICAgIG1vZGlmaWVyczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnZmxpcCcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IFsnbGVmdC1lbmQnXSxcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCAtIHBvc2l0aW9uWCA8IHNlbGV0b3JQb3B1cFdpZHRoICYmIHdpbmRvdy5pbm5lcldpZHRoID4gc2VsZXRvclBvcHVwV2lkdGggKiAxLjUpIHtcclxuICAgICAgcG9wcGVyID0gdXNlUG9wcGVyKHBvcHBlclJlZi5jdXJyZW50LCBwb3BwZXJFbGVtZW50LCB7XHJcbiAgICAgICAgcGxhY2VtZW50OiAnbGVmdC1lbmQnLFxyXG4gICAgICAgIG1vZGlmaWVyczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnZmxpcCcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IFsncmlnaHQtZW5kJ10sXHJcbiAgICAgICAgICAgICAgcm9vdEJvdW5kYXJ5OiAnZG9jdW1lbnQnLCAvLyBieSBkZWZhdWx0LCBhbGwgdGhlIHBsYWNlbWVudHMgYXJlIGFsbG93ZWRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgcm9vdEJvdW5kYXJ5OiAnZG9jdW1lbnQnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBvcHBlciA9IHVzZVBvcHBlcihwb3BwZXJSZWYuY3VycmVudCwgcG9wcGVyRWxlbWVudCwge1xyXG4gICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXHJcbiAgICAgICAgbW9kaWZpZXJzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdmbGlwJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogWydib3R0b20nXSxcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoUGxhdGZvcm0uaXNNb2JpbGUgJiYgRGVmYXVsdEVkaXRvckxvY2F0aW9uID09PSAnQm90dG9tJykge1xyXG4gICAgY29uc3Qgc2VsZXRvclBvcHVwV2lkdGggPSAyODA7XHJcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggLSBwb3NpdGlvblggPiBzZWxldG9yUG9wdXBXaWR0aCAqIDEuMikge1xyXG4gICAgICBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcclxuICAgICAgICBwbGFjZW1lbnQ6ICd0b3AtZW5kJyxcclxuICAgICAgICBtb2RpZmllcnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2ZsaXAnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBbJ3RvcC1zdGFydCddLFxyXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JywgLy8gYnkgZGVmYXVsdCwgYWxsIHRoZSBwbGFjZW1lbnRzIGFyZSBhbGxvd2VkXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0gcG9zaXRpb25YIDwgc2VsZXRvclBvcHVwV2lkdGggJiYgcG9zaXRpb25YID4gc2VsZXRvclBvcHVwV2lkdGgpIHtcclxuICAgICAgcG9wcGVyID0gdXNlUG9wcGVyKHBvcHBlclJlZi5jdXJyZW50LCBwb3BwZXJFbGVtZW50LCB7XHJcbiAgICAgICAgcGxhY2VtZW50OiAndG9wLXN0YXJ0JyxcclxuICAgICAgICBtb2RpZmllcnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2ZsaXAnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBbJ3RvcC1lbmQnXSxcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcG9wcGVyID0gdXNlUG9wcGVyKHBvcHBlclJlZi5jdXJyZW50LCBwb3BwZXJFbGVtZW50LCB7XHJcbiAgICAgICAgcGxhY2VtZW50OiAndG9wJyxcclxuICAgICAgICBtb2RpZmllcnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2ZsaXAnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBbJ3RvcCddLFxyXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JywgLy8gYnkgZGVmYXVsdCwgYWxsIHRoZSBwbGFjZW1lbnRzIGFyZSBhbGxvd2VkXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcclxuICAgIC8vICAgcGxhY2VtZW50OiAndG9wJyxcclxuICAgIC8vICAgbW9kaWZpZXJzOiBbXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgbmFtZTogJ2ZsaXAnLFxyXG4gICAgLy8gICAgICAgb3B0aW9uczoge1xyXG4gICAgLy8gICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IFsndG9wJ10sXHJcbiAgICAvLyAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JywgLy8gYnkgZGVmYXVsdCwgYWxsIHRoZSBwbGFjZW1lbnRzIGFyZSBhbGxvd2VkXHJcbiAgICAvLyAgICAgICB9LFxyXG4gICAgLy8gICAgIH0sXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXHJcbiAgICAvLyAgICAgICBvcHRpb25zOiB7XHJcbiAgICAvLyAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JyxcclxuICAgIC8vICAgICAgIH0sXHJcbiAgICAvLyAgICAgfSxcclxuICAgIC8vICAgXSxcclxuICAgIC8vIH0pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xvc2VQb3BwZXIgPSAoKSA9PiB7XHJcbiAgICBzZXRJc1BvcHBlck9wZW4oZmFsc2UpO1xyXG4gICAgLy8gYnV0dG9uUmVmPy5jdXJyZW50Py5mb2N1cygpO1xyXG4gIH07XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoZ2xvYmFsU3RhdGUubWFya01lbW9JZCkge1xyXG4gICAgICBjb25zdCBlZGl0b3JDdXJyZW50VmFsdWUgPSBlZGl0b3JSZWYuY3VycmVudD8uZ2V0Q29udGVudCgpO1xyXG4gICAgICBjb25zdCBtZW1vTGlua1RleHQgPSBgJHtlZGl0b3JDdXJyZW50VmFsdWUgPyAnXFxuJyA6ICcnfSR7dCgnTUFSSycpfTogW0BNRU1PXSgke2dsb2JhbFN0YXRlLm1hcmtNZW1vSWR9KWA7XHJcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5pbnNlcnRUZXh0KG1lbW9MaW5rVGV4dCk7XHJcbiAgICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRNYXJrTWVtb0lkKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ2xvYmFsU3RhdGUuZWRpdE1lbW9JZCAmJiBnbG9iYWxTdGF0ZS5lZGl0TWVtb0lkICE9PSBwcmV2R2xvYmFsU3RhdGVSZWYuY3VycmVudC5lZGl0TWVtb0lkKSB7XHJcbiAgICAgIGNvbnN0IGVkaXRNZW1vID0gbWVtb1NlcnZpY2UuZ2V0TWVtb0J5SWQoZ2xvYmFsU3RhdGUuZWRpdE1lbW9JZCk7XHJcbiAgICAgIGlmIChlZGl0TWVtbykge1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5zZXRDb250ZW50KGVkaXRNZW1vLmNvbnRlbnQucmVwbGFjZSgvXFw8YnJcXD4vZywgJ1xcbicpID8/ICcnKTtcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByZXZHbG9iYWxTdGF0ZVJlZi5jdXJyZW50ID0gZ2xvYmFsU3RhdGU7XHJcbiAgfSwgW2dsb2JhbFN0YXRlLm1hcmtNZW1vSWQsIGdsb2JhbFN0YXRlLmVkaXRNZW1vSWRdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG5ldyBUYWdzU3VnZ2VzdChhcHAsIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQpO1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVBhc3RlRXZlbnQgPSBhc3luYyAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC5jbGlwYm9hcmREYXRhICYmIGV2ZW50LmNsaXBib2FyZERhdGEuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LmNsaXBib2FyZERhdGEuZmlsZXNbMF07XHJcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgaGFuZGxlVXBsb2FkRmlsZShmaWxlKTtcclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0VGV4dCh1cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVEcm9wRXZlbnQgPSBhc3luYyAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyICYmIGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGhhbmRsZVVwbG9hZEZpbGUoZmlsZSk7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/Lmluc2VydFRleHQodXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaGFuZGxlQ2xpY2tFdmVudCA9ICgpID0+IHtcclxuICAgICAgaGFuZGxlQ29udGVudENoYW5nZShlZGl0b3JSZWYuY3VycmVudD8uZWxlbWVudC52YWx1ZSA/PyAnJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZUtleURvd25FdmVudCA9ICgpID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaGFuZGxlQ29udGVudENoYW5nZShlZGl0b3JSZWYuY3VycmVudD8uZWxlbWVudC52YWx1ZSA/PyAnJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgaGFuZGxlUGFzdGVFdmVudCk7XHJcbiAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVEcm9wRXZlbnQpO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrRXZlbnQpO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bkV2ZW50KTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIGhhbmRsZVBhc3RlRXZlbnQpO1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRHJvcEV2ZW50KTtcclxuICAgIH07XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVVcGxvYWRGaWxlID0gdXNlQ2FsbGJhY2soYXN5bmMgKGZpbGU6IEZpbGUpID0+IHtcclxuICAgIGNvbnN0IHt0eXBlfSA9IGZpbGU7XHJcblxyXG4gICAgaWYgKCF0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgcmVzb3VyY2VTZXJ2aWNlLnVwbG9hZChmaWxlKTtcclxuICAgICAgY29uc3QgdXJsID0gYCR7aW1hZ2V9YDtcclxuXHJcbiAgICAgIHJldHVybiB1cmw7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlU2F2ZUJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soYXN5bmMgKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGNvbnRlbnQgPT09ICcnKSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoJ+WGheWuueS4jeiDveS4uuepuuWRgCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qge2VkaXRNZW1vSWR9ID0gZ2xvYmFsU3RhdGVTZXJ2aWNlLmdldFN0YXRlKCk7XHJcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKCcmbmJzcDsnLCAnICcpO1xyXG5cclxuICAgIHNldEVkaXRvckNvbnRlbnRDYWNoZSgnJyk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoZWRpdE1lbW9JZCkge1xyXG4gICAgICAgIGNvbnN0IHByZXZNZW1vID0gbWVtb1NlcnZpY2UuZ2V0TWVtb0J5SWQoZWRpdE1lbW9JZCk7XHJcbiAgICAgICAgaWYgKHByZXZNZW1vICYmIHByZXZNZW1vLmNvbnRlbnQgIT09IGNvbnRlbnQpIHtcclxuICAgICAgICAgIGNvbnN0IGVkaXRlZE1lbW8gPSBhd2FpdCBtZW1vU2VydmljZS51cGRhdGVNZW1vKHByZXZNZW1vLmlkLCBwcmV2TWVtby5jb250ZW50LCBjb250ZW50LCBwcmV2TWVtby5tZW1vVHlwZSk7XHJcbiAgICAgICAgICBlZGl0ZWRNZW1vLnVwZGF0ZWRBdCA9IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKERhdGUubm93KCkpO1xyXG4gICAgICAgICAgbWVtb1NlcnZpY2UuZWRpdE1lbW8oZWRpdGVkTWVtbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRFZGl0TWVtb0lkKCcnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBuZXdNZW1vID0gYXdhaXQgbWVtb1NlcnZpY2UuY3JlYXRlTWVtbyhjb250ZW50LCBpc0xpc3QpO1xyXG4gICAgICAgIG1lbW9TZXJ2aWNlLnB1c2hNZW1vKG5ld01lbW8pO1xyXG4gICAgICAgIC8vIG1lbW9TZXJ2aWNlLmZldGNoQWxsTWVtb3MoKTtcclxuICAgICAgICBsb2NhdGlvblNlcnZpY2UuY2xlYXJRdWVyeSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RWRpdG9yQ29udGVudENhY2hlKCcnKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNhbmNlbEJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEVkaXRNZW1vSWQoJycpO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/LnNldENvbnRlbnQoJycpO1xyXG4gICAgc2V0RWRpdG9yQ29udGVudENhY2hlKCcnKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNvbnRlbnRDaGFuZ2UgPSB1c2VDYWxsYmFjaygoY29udGVudDogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0ZW1wRGl2LmlubmVySFRNTCA9IGNvbnRlbnQ7XHJcbiAgICBpZiAodGVtcERpdi5pbm5lclRleHQudHJpbSgpID09PSAnJykge1xyXG4gICAgICBjb250ZW50ID0gJyc7XHJcbiAgICB9XHJcbiAgICBzZXRFZGl0b3JDb250ZW50Q2FjaGUoY29udGVudCk7XHJcblxyXG4gICAgaWYgKGVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGVkaXRvclJlZi5jdXJyZW50LmdldENvbnRlbnQoKTtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnQgPSBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICBjb25zdCBwcmV2U3RyaW5nID0gY3VycmVudFZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KTtcclxuICAgICAgY29uc3QgbmV4dFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zbGljZShzZWxlY3Rpb25TdGFydCk7XHJcblxyXG4gICAgICBpZiAoKHByZXZTdHJpbmcuZW5kc1dpdGgoJ0AnKSB8fCBwcmV2U3RyaW5nLmVuZHNXaXRoKCfwn5OGJykpICYmIG5leHRTdHJpbmcuc3RhcnRzV2l0aCgnICcpKSB7XHJcbiAgICAgICAgdXBkYXRlRGF0ZVNlbGVjdG9yUG9wdXBQb3NpdGlvbigpO1xyXG4gICAgICAgIHNldElzUG9wcGVyT3Blbih0cnVlKTtcclxuICAgICAgfSBlbHNlIGlmICgocHJldlN0cmluZy5lbmRzV2l0aCgnQCcpIHx8IHByZXZTdHJpbmcuZW5kc1dpdGgoJ/Cfk4YnKSkgJiYgbmV4dFN0cmluZyA9PT0gJycpIHtcclxuICAgICAgICB1cGRhdGVEYXRlU2VsZWN0b3JQb3B1cFBvc2l0aW9uKCk7XHJcbiAgICAgICAgc2V0SXNQb3BwZXJPcGVuKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldElzUG9wcGVyT3BlbihmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZURhdGVJbnNlcnRUcmlnZ2VyID0gKGRhdGU6IERhdGUpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRlKSB7XHJcbiAgICAgIGNsb3NlUG9wcGVyKCk7XHJcbiAgICAgIGlzTGlzdCA9IHRydWU7XHJcbiAgICAgIHRvZ2dsZUxpc3QodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGVkaXRvclJlZi5jdXJyZW50LmdldENvbnRlbnQoKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IHByZXZTdHJpbmcgPSBjdXJyZW50VmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpO1xyXG4gICAgY29uc3QgbmV4dFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zbGljZShzZWxlY3Rpb25TdGFydCk7XHJcbiAgICBjb25zdCB0b2RheU1vbWVudCA9IG1vbWVudChkYXRlKTtcclxuXHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocHJldlN0cmluZy5lbmRzV2l0aCgnQCcpKSB7XHJcbiAgICAgIGlmIChJbnNlcnREYXRlRm9ybWF0ID09PSAnRGF0YXZpZXcnKSB7XHJcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC52YWx1ZSA9XHJcbiAgICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgY3VycmVudFZhbHVlLnNsaWNlKDAsIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgLSAxKSArXHJcbiAgICAgICAgICAnW2R1ZTo6JyArXHJcbiAgICAgICAgICB0b2RheU1vbWVudC5mb3JtYXQoJ1lZWVktTU0tREQnKSArXHJcbiAgICAgICAgICAnXScgK1xyXG4gICAgICAgICAgbmV4dFN0cmluZztcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMTcsIHNlbGVjdGlvblN0YXJ0ICsgMTcpO1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50LmZvY3VzKCk7XHJcbiAgICAgICAgaGFuZGxlQ29udGVudENoYW5nZShlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnZhbHVlKTtcclxuICAgICAgfSBlbHNlIGlmIChJbnNlcnREYXRlRm9ybWF0ID09PSAnVGFza3MnKSB7XHJcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC52YWx1ZSA9XHJcbiAgICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgY3VycmVudFZhbHVlLnNsaWNlKDAsIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgLSAxKSArXHJcbiAgICAgICAgICAn8J+ThicgK1xyXG4gICAgICAgICAgdG9kYXlNb21lbnQuZm9ybWF0KCdZWVlZLU1NLUREJykgK1xyXG4gICAgICAgICAgbmV4dFN0cmluZztcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMTEsIHNlbGVjdGlvblN0YXJ0ICsgMTEpO1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50LmZvY3VzKCk7XHJcbiAgICAgICAgaGFuZGxlQ29udGVudENoYW5nZShlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC52YWx1ZSA9XHJcbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICBwcmV2U3RyaW5nICsgdG9kYXlNb21lbnQuZm9ybWF0KCdZWVlZLU1NLUREJykgKyBuZXh0U3RyaW5nO1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMTAsIHNlbGVjdGlvblN0YXJ0ICsgMTApO1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC5mb2N1cygpO1xyXG4gICAgICBoYW5kbGVDb250ZW50Q2hhbmdlKGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQudmFsdWUpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNoYW5nZVN0YXR1cyA9ICgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0xpc3QpIHtcclxuICAgICAgaXNMaXN0ID0gZmFsc2U7XHJcbiAgICAgIHRvZ2dsZUxpc3QoZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaXNMaXN0ID0gdHJ1ZTtcclxuICAgICAgdG9nZ2xlTGlzdCh0cnVlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVTaG93RWRpdG9yID0gKGZsYWc/OiBib29sZWFuKSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNFZGl0b3IgfHwgZmxhZyA9PT0gdHJ1ZSkge1xyXG4gICAgICBpc0VkaXRvciA9IGZhbHNlO1xyXG4gICAgICB0b2dnbGVFZGl0b3IodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpc0VkaXRvciA9IHRydWU7XHJcbiAgICAgIGlzRWRpdG9yR28gPSBmYWxzZTtcclxuICAgICAgdG9nZ2xlRWRpdG9yKGZhbHNlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVUYWdUZXh0QnRuQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBlZGl0b3JSZWYuY3VycmVudC5nZXRDb250ZW50KCk7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25TdGFydCA9IGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICBjb25zdCBwcmV2U3RyaW5nID0gY3VycmVudFZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KTtcclxuICAgIGNvbnN0IG5leHRTdHJpbmcgPSBjdXJyZW50VmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQpO1xyXG5cclxuICAgIGxldCBuZXh0VmFsdWUgPSBwcmV2U3RyaW5nICsgJyMgJyArIG5leHRTdHJpbmc7XHJcbiAgICBsZXQgY3Vyc29ySW5kZXggPSBwcmV2U3RyaW5nLmxlbmd0aCArIDE7XHJcblxyXG4gICAgaWYgKHByZXZTdHJpbmcuZW5kc1dpdGgoJyMnKSAmJiBuZXh0U3RyaW5nLnN0YXJ0c1dpdGgoJyAnKSkge1xyXG4gICAgICBuZXh0VmFsdWUgPSBwcmV2U3RyaW5nLnNsaWNlKDAsIHByZXZTdHJpbmcubGVuZ3RoIC0gMSkgKyBuZXh0U3RyaW5nLnNsaWNlKDEpO1xyXG4gICAgICBjdXJzb3JJbmRleCA9IHByZXZTdHJpbmcubGVuZ3RoIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnZhbHVlID0gbmV4dFZhbHVlO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShjdXJzb3JJbmRleCwgY3Vyc29ySW5kZXgpO1xyXG5cclxuICAgIGVkaXRvclJlZi5jdXJyZW50LmZvY3VzKCk7XHJcbiAgICBoYW5kbGVDb250ZW50Q2hhbmdlKGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQudmFsdWUpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgdXBkYXRlRGF0ZVNlbGVjdG9yUG9wdXBQb3NpdGlvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQgfHwgIXBvcHBlclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWxldG9yUG9wdXBXaWR0aCA9IDI4MDtcclxuICAgIGNvbnN0IGVkaXRvcldpZHRoID0gZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5jbGllbnRXaWR0aDtcclxuXHJcbiAgICAvLyBwb3NpdGlvblggPSBlZGl0b3JXaWR0aDtcclxuXHJcbiAgICBjb25zdCB7eCwgeX0gPSBnZXRDdXJzb3JQb3N0aW9uKGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQpO1xyXG4gICAgLy8gY29uc3QgbGVmdCA9IHggKyBzZWxldG9yUG9wdXBXaWR0aCArIDE2ID4gZWRpdG9yV2lkdGggPyBlZGl0b3JXaWR0aCArIDIwIC0gc2VsZXRvclBvcHVwV2lkdGggOiB4ICsgMjtcclxuICAgIGxldCBsZWZ0OiBudW1iZXI7XHJcbiAgICBsZXQgdG9wOiBudW1iZXI7XHJcbiAgICBpZiAoIVBsYXRmb3JtLmlzTW9iaWxlKSB7XHJcbiAgICAgIGxlZnQgPSB4ICsgc2VsZXRvclBvcHVwV2lkdGggKyAxNiA+IGVkaXRvcldpZHRoID8geCArIDIgOiB4ICsgMjtcclxuICAgICAgdG9wID0geSArIDIwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0geCA+IHNlbGV0b3JQb3B1cFdpZHRoKSB7XHJcbiAgICAgICAgbGVmdCA9IHggKyBzZWxldG9yUG9wdXBXaWR0aCArIDE2ID4gZWRpdG9yV2lkdGggPyB4ICsgMiA6IHggKyAyO1xyXG4gICAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0geCA8IHNlbGV0b3JQb3B1cFdpZHRoKSB7XHJcbiAgICAgICAgbGVmdCA9IHggKyBzZWxldG9yUG9wdXBXaWR0aCArIDE2ID4gZWRpdG9yV2lkdGggPyB4ICsgMTggOiB4ICsgMTg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGVmdCA9IGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuY2xpZW50V2lkdGggLyAyO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChEZWZhdWx0RWRpdG9yTG9jYXRpb24gPT09ICdCb3R0b20nICYmIHdpbmRvdy5pbm5lcldpZHRoID4gODc1KSB7XHJcbiAgICAgICAgdG9wID0geSArIDIwO1xyXG4gICAgICB9IGVsc2UgaWYgKERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScgJiYgd2luZG93LmlubmVyV2lkdGggPD0gODc1KSB7XHJcbiAgICAgICAgdG9wID0geSArIDM1O1xyXG4gICAgICB9IGVsc2UgaWYgKERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ1RvcCcgJiYgd2luZG93LmlubmVyV2lkdGggPD0gODc1KSB7XHJcbiAgICAgICAgdG9wID0geSArIDIwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcG9zaXRpb25YID0geDtcclxuXHJcbiAgICBwb3BwZXJSZWYuY3VycmVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XHJcbiAgICBwb3BwZXJSZWYuY3VycmVudC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlVXBsb2FkRmlsZUJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0RWwpO1xyXG4gICAgaW5wdXRFbC50eXBlID0gJ2ZpbGUnO1xyXG4gICAgaW5wdXRFbC5tdWx0aXBsZSA9IGZhbHNlO1xyXG4gICAgaW5wdXRFbC5hY2NlcHQgPSAnaW1hZ2UvcG5nLCBpbWFnZS9naWYsIGltYWdlL2pwZWcnO1xyXG4gICAgaW5wdXRFbC5vbmNoYW5nZSA9IGFzeW5jICgpID0+IHtcclxuICAgICAgaWYgKCFpbnB1dEVsLmZpbGVzIHx8IGlucHV0RWwuZmlsZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBmaWxlID0gaW5wdXRFbC5maWxlc1swXTtcclxuICAgICAgY29uc3QgdXJsID0gYXdhaXQgaGFuZGxlVXBsb2FkRmlsZShmaWxlKTtcclxuICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5pbnNlcnRUZXh0KHVybCk7XHJcbiAgICAgIH1cclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpbnB1dEVsKTtcclxuICAgIH07XHJcbiAgICBpbnB1dEVsLmNsaWNrKCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBzaG93RWRpdFN0YXR1cyA9IEJvb2xlYW4oZ2xvYmFsU3RhdGUuZWRpdE1lbW9JZCk7XHJcblxyXG4gIGNvbnN0IGVkaXRvckNvbmZpZyA9IHVzZU1lbW8oXHJcbiAgICAoKSA9PiAoe1xyXG4gICAgICBjbGFzc05hbWU6ICdtZW1vLWVkaXRvcicsXHJcbiAgICAgIGluaXRpYWxDb250ZW50OiBnZXRFZGl0b3JDb250ZW50Q2FjaGUoKSxcclxuICAgICAgcGxhY2Vob2xkZXI6IHQoJ1doYXQgZG8geW91IHRoaW5rIG5vdy4uLicpLFxyXG4gICAgICBzaG93Q29uZmlybUJ0bjogdHJ1ZSxcclxuICAgICAgc2hvd0NhbmNlbEJ0bjogc2hvd0VkaXRTdGF0dXMsXHJcbiAgICAgIHNob3dUb29sczogdHJ1ZSxcclxuICAgICAgb25Db25maXJtQnRuQ2xpY2s6IGhhbmRsZVNhdmVCdG5DbGljayxcclxuICAgICAgb25DYW5jZWxCdG5DbGljazogaGFuZGxlQ2FuY2VsQnRuQ2xpY2ssXHJcbiAgICAgIG9uQ29udGVudENoYW5nZTogaGFuZGxlQ29udGVudENoYW5nZSxcclxuICAgIH0pLFxyXG4gICAgW3Nob3dFZGl0U3RhdHVzXSxcclxuICApO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e2BtZW1vLWVkaXRvci13cmFwcGVyICR7c2hvd0VkaXRTdGF0dXMgPyAnZWRpdC1pbmcnIDogJyd9ICR7aXNFZGl0b3JTaG93biA/ICdoaWRkZW4nIDogJyd9YH0+XHJcbiAgICAgIDxwIGNsYXNzTmFtZT17YHRpcC10ZXh0ICR7c2hvd0VkaXRTdGF0dXMgPyAnJyA6ICdoaWRkZW4nfWB9Pk1vZGlmeWluZy4uLjwvcD5cclxuICAgICAgPEVkaXRvclxyXG4gICAgICAgIHJlZj17ZWRpdG9yUmVmfVxyXG4gICAgICAgIHsuLi5lZGl0b3JDb25maWd9XHJcbiAgICAgICAgdG9vbHM9e1xyXG4gICAgICAgICAgPD5cclxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJhY3Rpb24tYnRuIGFkZC10YWdcIiBzcmM9e3RhZ30gb25DbGljaz17aGFuZGxlVGFnVGV4dEJ0bkNsaWNrfSAvPlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImFjdGlvbi1idG4gZmlsZS11cGxvYWRcIiBzcmM9e2ltYWdlU3ZnfSBvbkNsaWNrPXtoYW5kbGVVcGxvYWRGaWxlQnRuQ2xpY2t9IC8+XHJcbiAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhY3Rpb24tYnRuIGxpc3Qtb3ItdGFza1wiXHJcbiAgICAgICAgICAgICAgc3JjPXtgJHshaXNMaXN0U2hvd24gPyBqb3VybmFsU3ZnIDogdGFza1N2Z31gfVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNoYW5nZVN0YXR1c31cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgey8qIDxpbWcgY2xhc3NOYW1lPXtgYWN0aW9uLWJ0biAke2lzTGlzdFNob3duID8gXCJcIiA6IFwiaGlkZGVuXCJ9YH0gc3JjPXt0YXNrU3ZnfSBvbkNsaWNrPXtoYW5kbGVDaGFuZ2VTdGF0dXN9IC8+ICovfVxyXG4gICAgICAgICAgPC8+XHJcbiAgICAgICAgfVxyXG4gICAgICAvPlxyXG4gICAgICA8ZGl2IHJlZj17cG9wcGVyUmVmfSBjbGFzc05hbWU9XCJkYXRlLXBpY2tlclwiPlxyXG4gICAgICAgIHtpc1BvcHBlck9wZW4gJiYgKFxyXG4gICAgICAgICAgPEZvY3VzVHJhcFxyXG4gICAgICAgICAgICBhY3RpdmVcclxuICAgICAgICAgICAgZm9jdXNUcmFwT3B0aW9ucz17e1xyXG4gICAgICAgICAgICAgIGluaXRpYWxGb2N1czogZmFsc2UsXHJcbiAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IHRydWUsXHJcbiAgICAgICAgICAgICAgY2xpY2tPdXRzaWRlRGVhY3RpdmF0ZXM6IHRydWUsXHJcbiAgICAgICAgICAgICAgb25EZWFjdGl2YXRlOiBjbG9zZVBvcHBlcixcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIHRhYkluZGV4PXstMX1cclxuICAgICAgICAgICAgICBzdHlsZT17cG9wcGVyLnN0eWxlcy5wb3BwZXJ9XHJcbiAgICAgICAgICAgICAgey4uLnBvcHBlci5hdHRyaWJ1dGVzLnBvcHBlcn1cclxuICAgICAgICAgICAgICByZWY9e3NldFBvcHBlckVsZW1lbnR9XHJcbiAgICAgICAgICAgICAgcm9sZT1cImRpYWxvZ1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8RGF5UGlja2VyXHJcbiAgICAgICAgICAgICAgICBpbml0aWFsRm9jdXM9e2lzUG9wcGVyT3Blbn1cclxuICAgICAgICAgICAgICAgIG1vZGU9XCJzaW5nbGVcIlxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1vbnRoPXtzZWxlY3RlZH1cclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZH1cclxuICAgICAgICAgICAgICAgIG9uU2VsZWN0PXtoYW5kbGVEYXRlSW5zZXJ0VHJpZ2dlcn1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvRm9jdXNUcmFwPlxyXG4gICAgICAgICl9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIGdldEVkaXRvckNvbnRlbnRDYWNoZSgpOiBzdHJpbmcge1xyXG4gIHJldHVybiBzdG9yYWdlLmdldChbJ2VkaXRvckNvbnRlbnRDYWNoZSddKS5lZGl0b3JDb250ZW50Q2FjaGUgPz8gJyc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldEVkaXRvckNvbnRlbnRDYWNoZShjb250ZW50OiBzdHJpbmcpIHtcclxuICBzdG9yYWdlLnNldCh7XHJcbiAgICBlZGl0b3JDb250ZW50Q2FjaGU6IGNvbnRlbnQsXHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lbW9FZGl0b3I7XHJcbiIsImltcG9ydCB7dH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcbmltcG9ydCB7SU1BR0VfVVJMX1JFRywgTElOS19SRUcsIE1FTU9fTElOS19SRUcsIE5PUF9GSVJTVF9UQUdfUkVHLCBUQUdfUkVHfSBmcm9tICcuL2NvbnN0cyc7XHJcblxyXG5leHBvcnQgY29uc3QgcmVsYXRpb25Db25zdHMgPSBbXHJcbiAge3RleHQ6ICdBTkQnLCB2YWx1ZTogJ0FORCd9LFxyXG4gIHt0ZXh0OiAnT1InLCB2YWx1ZTogJ09SJ30sXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgZmlsdGVyQ29uc3RzID0ge1xyXG4gIFRBRzoge1xyXG4gICAgdmFsdWU6ICdUQUcnLFxyXG4gICAgdGV4dDogdCgnVEFHJyksXHJcbiAgICBvcGVyYXRvcnM6IFtcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6IHQoJ0lOQ0xVREUnKSxcclxuICAgICAgICB2YWx1ZTogJ0NPTlRBSU4nLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogdCgnRVhDTFVERScpLFxyXG4gICAgICAgIHZhbHVlOiAnTk9UX0NPTlRBSU4nLFxyXG4gICAgICB9LFxyXG4gICAgXSxcclxuICB9LFxyXG4gIFRZUEU6IHtcclxuICAgIHZhbHVlOiAnVFlQRScsXHJcbiAgICB0ZXh0OiB0KCdUWVBFJyksXHJcbiAgICBvcGVyYXRvcnM6IFtcclxuICAgICAge1xyXG4gICAgICAgIHZhbHVlOiAnSVMnLFxyXG4gICAgICAgIHRleHQ6IHQoJ0lTJyksXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWx1ZTogJ0lTX05PVCcsXHJcbiAgICAgICAgdGV4dDogdCgnSVNOT1QnKSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgICB2YWx1ZXM6IFtcclxuICAgICAge1xyXG4gICAgICAgIHZhbHVlOiAnQ09OTkVDVEVEJyxcclxuICAgICAgICB0ZXh0OiB0KCdMSU5LRUQnKSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbHVlOiAnTk9UX1RBR0dFRCcsXHJcbiAgICAgICAgdGV4dDogdCgnTk8gVEFHUycpLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsdWU6ICdMSU5LRUQnLFxyXG4gICAgICAgIHRleHQ6IHQoJ0hBUyBMSU5LUycpLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsdWU6ICdJTUFHRUQnLFxyXG4gICAgICAgIHRleHQ6IHQoJ0hBUyBJTUFHRVMnKSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgfSxcclxuICBURVhUOiB7XHJcbiAgICB2YWx1ZTogJ1RFWFQnLFxyXG4gICAgdGV4dDogdCgnVEVYVCcpLFxyXG4gICAgb3BlcmF0b3JzOiBbXHJcbiAgICAgIHtcclxuICAgICAgICB2YWx1ZTogJ0NPTlRBSU4nLFxyXG4gICAgICAgIHRleHQ6IHQoJ0lOQ0xVREUnKSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbHVlOiAnTk9UX0NPTlRBSU4nLFxyXG4gICAgICAgIHRleHQ6IHQoJ0VYQ0xVREUnKSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgfSxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtZW1vU3BlY2lhbFR5cGVzID0gZmlsdGVyQ29uc3RzWydUWVBFJ10udmFsdWVzO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFRleHRXaXRoTWVtb1R5cGUgPSAodHlwZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBmb3IgKGNvbnN0IHQgb2YgbWVtb1NwZWNpYWxUeXBlcykge1xyXG4gICAgaWYgKHQudmFsdWUgPT09IHR5cGUpIHtcclxuICAgICAgcmV0dXJuIHQudGV4dDtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuICcnO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRGaWx0ZXIgPSAoKTogQmFzZUZpbHRlciA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHR5cGU6ICdUQUcnLFxyXG4gICAgdmFsdWU6IHtcclxuICAgICAgb3BlcmF0b3I6ICdDT05UQUlOJyxcclxuICAgICAgdmFsdWU6ICcnLFxyXG4gICAgfSxcclxuICAgIHJlbGF0aW9uOiAnQU5EJyxcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGNoZWNrU2hvdWxkU2hvd01lbW9XaXRoRmlsdGVycyA9IChtZW1vOiBNb2RlbC5NZW1vLCBmaWx0ZXJzOiBGaWx0ZXJbXSkgPT4ge1xyXG4gIGxldCBzaG91bGRTaG93ID0gdHJ1ZTtcclxuXHJcbiAgZm9yIChjb25zdCBmIG9mIGZpbHRlcnMpIHtcclxuICAgIGNvbnN0IHtyZWxhdGlvbn0gPSBmO1xyXG4gICAgY29uc3QgciA9IGNoZWNrU2hvdWxkU2hvd01lbW8obWVtbywgZik7XHJcbiAgICBpZiAocmVsYXRpb24gPT09ICdPUicpIHtcclxuICAgICAgc2hvdWxkU2hvdyA9IHNob3VsZFNob3cgfHwgcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNob3VsZFNob3cgPSBzaG91bGRTaG93ICYmIHI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gc2hvdWxkU2hvdztcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBjaGVja1Nob3VsZFNob3dNZW1vID0gKG1lbW86IE1vZGVsLk1lbW8sIGZpbHRlcjogRmlsdGVyKSA9PiB7XHJcbiAgY29uc3Qge1xyXG4gICAgdHlwZSxcclxuICAgIHZhbHVlOiB7b3BlcmF0b3IsIHZhbHVlfSxcclxuICB9ID0gZmlsdGVyO1xyXG5cclxuICBpZiAodmFsdWUgPT09ICcnKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGxldCBzaG91bGRTaG93ID0gdHJ1ZTtcclxuXHJcbiAgaWYgKHR5cGUgPT09ICdUQUcnKSB7XHJcbiAgICBsZXQgY29udGFpbmVkID0gdHJ1ZTtcclxuICAgIGNvbnN0IHRhZ3NTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA/PyBbXSkpIHtcclxuICAgICAgY29uc3QgdGFnID0gdC5yZXBsYWNlKFRBR19SRUcsICckMScpLnRyaW0oKTtcclxuICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgbGV0IHRlbXAgPSAnJztcclxuICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xyXG4gICAgICAgIHRlbXAgKz0gJy8nO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTk9QX0ZJUlNUX1RBR19SRUcpID8/IFtdKSkge1xyXG4gICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoTk9QX0ZJUlNUX1RBR19SRUcsICckMScpLnRyaW0oKTtcclxuICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgbGV0IHRlbXAgPSAnJztcclxuICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xyXG4gICAgICAgIHRlbXAgKz0gJy8nO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXRhZ3NTZXQuaGFzKHZhbHVlKSkge1xyXG4gICAgICBjb250YWluZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChvcGVyYXRvciA9PT0gJ05PVF9DT05UQUlOJykge1xyXG4gICAgICBjb250YWluZWQgPSAhY29udGFpbmVkO1xyXG4gICAgfVxyXG4gICAgc2hvdWxkU2hvdyA9IGNvbnRhaW5lZDtcclxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdUWVBFJykge1xyXG4gICAgbGV0IG1hdGNoZWQgPSBmYWxzZTtcclxuICAgIGlmICh2YWx1ZSA9PT0gJ05PVF9UQUdHRUQnICYmIG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICBtYXRjaGVkID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdMSU5LRUQnICYmIG1lbW8uY29udGVudC5tYXRjaChMSU5LX1JFRykgIT09IG51bGwpIHtcclxuICAgICAgbWF0Y2hlZCA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnSU1BR0VEJyAmJiBtZW1vLmNvbnRlbnQubWF0Y2goSU1BR0VfVVJMX1JFRykgIT09IG51bGwpIHtcclxuICAgICAgbWF0Y2hlZCA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnQ09OTkVDVEVEJyAmJiBtZW1vLmNvbnRlbnQubWF0Y2goTUVNT19MSU5LX1JFRykgIT09IG51bGwpIHtcclxuICAgICAgbWF0Y2hlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAob3BlcmF0b3IgPT09ICdJU19OT1QnKSB7XHJcbiAgICAgIG1hdGNoZWQgPSAhbWF0Y2hlZDtcclxuICAgIH1cclxuICAgIHNob3VsZFNob3cgPSBtYXRjaGVkO1xyXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1RFWFQnKSB7XHJcbiAgICBsZXQgY29udGFpbmVkID0gbWVtby5jb250ZW50LmluY2x1ZGVzKHZhbHVlKTtcclxuICAgIGlmIChvcGVyYXRvciA9PT0gJ05PVF9DT05UQUlOJykge1xyXG4gICAgICBjb250YWluZWQgPSAhY29udGFpbmVkO1xyXG4gICAgfVxyXG4gICAgc2hvdWxkU2hvdyA9IGNvbnRhaW5lZDtcclxuICB9XHJcblxyXG4gIHJldHVybiBzaG91bGRTaG93O1xyXG59O1xyXG4iLCJpbXBvcnQge3VzZUNvbnRleHR9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xyXG5pbXBvcnQge2xvY2F0aW9uU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5pbXBvcnQge21lbW9TcGVjaWFsVHlwZXN9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcclxuaW1wb3J0ICcuLi9sZXNzL3NlYXJjaC1iYXIubGVzcyc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBzZWFyY2ggZnJvbSAnLi4vaWNvbnMvc2VhcmNoLnN2Zyc7XHJcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xyXG4vLyBpbXBvcnQgdXNlVG9nZ2xlIGZyb20gXCIuLi9ob29rcy91c2VUb2dnbGVcIjtcclxuXHJcbmludGVyZmFjZSBQcm9wcyB7fVxyXG5cclxuZXhwb3J0IGxldCBzZWFyY2hCb3hJbnB1dDogSFRNTElucHV0RWxlbWVudDtcclxuLy8gbGV0IGlzU2VhcmNoQmFyID0gZmFsc2UgYXMgYm9vbGVhbjtcclxuXHJcbmNvbnN0IFNlYXJjaEJhcjogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIGxvY2F0aW9uU3RhdGU6IHtcclxuICAgICAgcXVlcnk6IHt0eXBlOiBtZW1vVHlwZX0sXHJcbiAgICB9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG4gIGNvbnN0IFtpc1NlYXJjaEJhclNob3csIHRvZ2dsZVNlYXJjaGJhcl0gPSB1c2VUb2dnbGUoZmFsc2UpO1xyXG5cclxuICBjb25zdCBoYW5kbGVNZW1vVHlwZUl0ZW1DbGljayA9ICh0eXBlOiBNZW1vU3BlY1R5cGUgfCAnJykgPT4ge1xyXG4gICAgY29uc3Qge3R5cGU6IHByZXZUeXBlfSA9IGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5O1xyXG4gICAgaWYgKHR5cGUgPT09IHByZXZUeXBlKSB7XHJcbiAgICAgIHR5cGUgPSAnJztcclxuICAgIH1cclxuICAgIGxvY2F0aW9uU2VydmljZS5zZXRNZW1vVHlwZVF1ZXJ5KHR5cGUpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVRleHRRdWVyeUlucHV0ID0gKGV2ZW50OiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcclxuICAgIGNvbnN0IHRleHQgPSBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlO1xyXG4gICAgbG9jYXRpb25TZXJ2aWNlLnNldFRleHRRdWVyeSh0ZXh0KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBtb3VzZUluID0gKCkgPT4ge1xyXG4gICAgdG9nZ2xlU2VhcmNoYmFyKHRydWUpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG1vdXNlT3V0ID0gKCkgPT4ge1xyXG4gICAgdG9nZ2xlU2VhcmNoYmFyKGZhbHNlKTtcclxuICB9O1xyXG5cclxuICAvLyBjb25zdCBoYW5kbGVTZWFyY2hCYXJTdGF0dXMgPSAoKSA9PiB7XHJcbiAgLy8gICBpZihpc1NlYXJjaEJhcil7XHJcbiAgLy8gICAgIGlzU2VhcmNoQmFyID0gZmFsc2U7XHJcbiAgLy8gICAgIHRvZ2dsZVNlYXJjaGJhcihmYWxzZSk7XHJcbiAgLy8gICB9ZWxzZXtcclxuICAvLyAgICAgaXNTZWFyY2hCYXIgPSB0cnVlO1xyXG4gIC8vICAgICB0b2dnbGVTZWFyY2hiYXIodHJ1ZSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgLy8gPGRpdiBjbGFzc05hbWU9e2Ake2lzU2VhcmNoQmFyU2hvd24gPyBcInNlYXJjaC1iYXItY29udGFpbmVyLWxvbmdcIiA6IFwic2VhcmNoLWJhci1jb250YWluZXItc2hvcnRcIn1gfT5cclxuICAgIC8vICAgPGRpdiBjbGFzc05hbWU9e2Ake2lzU2VhcmNoQmFyU2hvd24gPyBcInNlYXJjaC1iYXItaW5wdXRlci1sb25nXCIgOiBcInNlYXJjaC1iYXItaW5wdXRlci1zaG9ydFwifWB9PlxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJzZWFyY2gtYmFyLWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlYXJjaC1iYXItaW5wdXRlclwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e3NlYXJjaH0gLz5cclxuICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwidGV4dC1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgb25Nb3VzZU92ZXI9e21vdXNlSW59IG9uTW91c2VPdXQ9e21vdXNlT3V0fSBwbGFjZWhvbGRlcj17aXNTZWFyY2hCYXJTaG93ID8gXCJUeXBlIEhlcmVcIiA6IFwiXCJ9IG9uQ2hhbmdlPXtoYW5kbGVUZXh0UXVlcnlJbnB1dH0gLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicXVpY2tseS1hY3Rpb24td3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicXVpY2tseS1hY3Rpb24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+e3QoJ1F1aWNrIGZpbHRlcicpfTwvcD5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbi1jb250YWluZXIgdHlwZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNlY3Rpb24tdGV4dFwiPnt0KCdUWVBFJyl9Ojwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ2YWx1ZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAge21lbW9TcGVjaWFsVHlwZXMubWFwKCh0LCBpZHgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXt0LnZhbHVlfT5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdHlwZS1pdGVtICR7bWVtb1R5cGUgPT09IHQudmFsdWUgPyAnc2VsZWN0ZWQnIDogJyd9YH1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWVtb1R5cGVJdGVtQ2xpY2sodC52YWx1ZSBhcyBNZW1vU3BlY1R5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7dC50ZXh0fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB7aWR4ICsgMSA8IG1lbW9TcGVjaWFsVHlwZXMubGVuZ3RoID8gPHNwYW4gY2xhc3NOYW1lPVwic3BsaXQtdGV4dFwiPi88L3NwYW4+IDogbnVsbH1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTZWFyY2hCYXI7XHJcbiIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcbmltcG9ydCBTZWFyY2hCYXIgZnJvbSAnLi9TZWFyY2hCYXInO1xuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIG1lbW9TZXJ2aWNlLCBxdWVyeVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCBPbmx5IGZyb20gJy4vY29tbW9uL09ubHlXaGVuJztcbmltcG9ydCAnLi4vbGVzcy9tZW1vcy1oZWFkZXIubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1lbnVTdmcgZnJvbSAnLi4vaWNvbnMvbWVudS5zdmcnO1xuXG5sZXQgcHJldlJlcXVlc3RUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG5pbnRlcmZhY2UgUHJvcHMge31cblxuY29uc3QgTWVtb3NIZWFkZXI6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIGxvY2F0aW9uU3RhdGU6IHtcbiAgICAgIHF1ZXJ5OiB7ZmlsdGVyfSxcbiAgICB9LFxuICAgIGdsb2JhbFN0YXRlOiB7aXNNb2JpbGVWaWV3fSxcbiAgICBxdWVyeVN0YXRlOiB7cXVlcmllc30sXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xuXG4gIGNvbnN0IFt0aXRsZVRleHQsIHNldFRpdGxlVGV4dF0gPSB1c2VTdGF0ZSgnTUVNT1MnKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gcXVlcnlTZXJ2aWNlLmdldFF1ZXJ5QnlJZChmaWx0ZXIpO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgc2V0VGl0bGVUZXh0KHF1ZXJ5LnRpdGxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGl0bGVUZXh0KCdNRU1PUycpO1xuICAgIH1cbiAgfSwgW2ZpbHRlciwgcXVlcmllc10pO1xuXG4gIGNvbnN0IGhhbmRsZU1lbW9UZXh0Q2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gcHJldlJlcXVlc3RUaW1lc3RhbXAgPiAxMCAqIDEwMDApIHtcbiAgICAgIHByZXZSZXF1ZXN0VGltZXN0YW1wID0gbm93O1xuICAgICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gZG8gbnRoXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVTaG93U2lkZWJhckJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcodHJ1ZSk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbi1oZWFkZXItY29udGFpbmVyIG1lbW9zLWhlYWRlci1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiIG9uQ2xpY2s9e2hhbmRsZU1lbW9UZXh0Q2xpY2t9PlxuICAgICAgICA8T25seSB3aGVuPXtpc01vYmlsZVZpZXd9PlxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYWN0aW9uLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNob3dTaWRlYmFyQnRuQ2xpY2t9PlxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17bWVudVN2Z30gYWx0PVwibWVudVwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvT25seT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj57dGl0bGVUZXh0fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPFNlYXJjaEJhciAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWVtb3NIZWFkZXI7XG4iLCIvLyBpbXBvcnQgeyBnZXRGaWxlIH0gZnJvbSBcIi4uL29iQ29tcG9uZW50cy9vYlVwZGF0ZU1lbW9cIjtcbmltcG9ydCB7VEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG4vKipcbiAqIOWunueOsOS4gOS4queugOaYk+eJiOeahCBtYXJrZG93biDop6PmnpBcbiAqIC0g5YiX6KGo6Kej5p6Q77ybXG4gKiAtIOS7o+eggeWdl++8m1xuICogLSDliqDnspcv5pac5L2T77ybXG4gKiAtIFRPRE87XG4gKi9cbmNvbnN0IENPREVfQkxPQ0tfUkVHID0gL2BgYChbXFxzXFxTXSo/KWBgYC9nO1xuY29uc3QgQk9MRF9URVhUX1JFRyA9IC9cXCpcXCooLis/KVxcKlxcKi9nO1xuY29uc3QgRU1fVEVYVF9SRUcgPSAvXFwqKC4rPylcXCovZztcbmNvbnN0IFRPRE9fQkxPQ0tfUkVHID0gL1xcWyBcXF0gL2c7XG5jb25zdCBET05FX0JMT0NLX1JFRyA9IC9cXFt4XFxdIC9nO1xuY29uc3QgRE9UX0xJX1JFRyA9IC9bKl0gL2c7XG5jb25zdCBOVU1fTElfUkVHID0gLyhcXGQrKVxcLiAvZztcbi8vIGNvbnN0IEJSX1JFRyA9IC9cXDxiclxcPi9nO1xuXG5jb25zdCBJTlRFUk5BTF9NRF9SRUcgPSAvXFxbXFxbKFteXFxdXSspXFxdXFxdL2c7XG5jb25zdCBFWFJFUk5BTF9NRF9SRUcgPSAvXFxbKFteXFxdXSspXFxdXFwoKChbXlxcXV0rKS5tZClcXCkvZztcblxuY29uc3QgcGFyc2VNYXJrZWRUb0h0bWwgPSAobWFya2VkU3RyOiBzdHJpbmcsIG1lbW9pZD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGh0bWxUZXh0ID0gbWFya2VkU3RyXG4gICAgLnJlcGxhY2UoQ09ERV9CTE9DS19SRUcsIFwiPHByZSBsYW5nPScnPiQxPC9wcmU+XCIpXG4gICAgLnJlcGxhY2UoRE9UX0xJX1JFRywgXCI8c3BhbiBjbGFzcz0nY291bnRlci1ibG9jayc+4oCiPC9zcGFuPlwiKVxuICAgIC5yZXBsYWNlKE5VTV9MSV9SRUcsIFwiPHNwYW4gY2xhc3M9J2NvdW50ZXItYmxvY2snPiQxLjwvc3Bhbj5cIilcbiAgICAucmVwbGFjZShUT0RPX0JMT0NLX1JFRywgXCI8c3BhbiBjbGFzcz0ndG9kby1ibG9jaycgZGF0YS10eXBlPSd0b2RvJz7irJw8L3NwYW4+XCIpXG4gICAgLnJlcGxhY2UoRE9ORV9CTE9DS19SRUcsIFwiPHNwYW4gY2xhc3M9J3RvZG8tYmxvY2snIGRhdGEtdHlwZT0nZG9uZSc+4pyFPC9zcGFuPlwiKVxuICAgIC5yZXBsYWNlKEJPTERfVEVYVF9SRUcsICc8c3Ryb25nPiQxPC9zdHJvbmc+JylcbiAgICAucmVwbGFjZShFTV9URVhUX1JFRywgJzxlbT4kMTwvZW0+JylcbiAgICAucmVwbGFjZSgvJmx0O2JyJmd0Oy9nLCAnPC9wPjxwPicpXG4gICAgLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7XG5cbiAgbGV0IG5ld0h0bWxUZXh0ID0gaHRtbFRleHQ7XG5cbiAgaWYgKG1lbW9pZCkge1xuICAgIGlmIChJTlRFUk5BTF9NRF9SRUcudGVzdChodG1sVGV4dCkpIHtcbiAgICAgIGNvbnN0IGludGVybmFsTUQgPSBodG1sVGV4dC5tYXRjaChJTlRFUk5BTF9NRF9SRUcpO1xuICAgICAgLy8gY29uc3QgcGF0aCA9IGdldEZpbGUobWVtb2lkKS5wYXRoO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbE1ELmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghLyhqcGVnfGpwZ3xnaWZ8cG5nfHN2Z3xibXB8d2VwZykvZy50ZXN0KGludGVybmFsTURbaV0pKSB7XG4gICAgICAgICAgY29uc3QgaW50ZXJuYWxDb250ZW50ID0gZ2V0Q29udGVudEZyb21JbnRlcm5hbExpbmsoaW50ZXJuYWxNRFtpXSk7XG4gICAgICAgICAgaWYgKC9cXHwvZy50ZXN0KGludGVybmFsQ29udGVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtsaW5rLCBsYWJlbF0gPSBpbnRlcm5hbENvbnRlbnQuc3BsaXQoJ3wnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VNZW50ID0gcmVwbGFjZU1kKGxpbmssIGxhYmVsKTtcbiAgICAgICAgICAgIG5ld0h0bWxUZXh0ID0gaHRtbFRleHQucmVwbGFjZShpbnRlcm5hbE1EW2ldLCByZXBsYWNlTWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBpbnRlcm5hbENvbnRlbnQ7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9ICcnO1xuICAgICAgICAgICAgY29uc3QgcmVwbGFjZU1lbnQgPSByZXBsYWNlTWQobGluaywgbGFiZWwpO1xuICAgICAgICAgICAgbmV3SHRtbFRleHQgPSBuZXdIdG1sVGV4dC5yZXBsYWNlKGludGVybmFsTURbaV0sIHJlcGxhY2VNZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKEVYUkVSTkFMX01EX1JFRy50ZXN0KGh0bWxUZXh0KSkge1xuICAgICAgY29uc3QgZXh0ZXJuYWxNRCA9IGh0bWxUZXh0Lm1hdGNoKEVYUkVSTkFMX01EX1JFRyk7XG4gICAgICAvLyBjb25zdCBwYXRoID0gZ2V0RmlsZShtZW1vaWQpLnBhdGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVybmFsTUQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCEvKGpwZWd8anBnfGdpZnxwbmd8c3ZnfGJtcHx3ZXBnKS9nLnRlc3QoZXh0ZXJuYWxNRFtpXSkpIHtcbiAgICAgICAgICBjb25zdCBsaW5rID0gZ2V0Q29udGVudEZyb21FeHRlcm5hbExpbmsoZXh0ZXJuYWxNRFtpXSk7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBnZXRMYWJlbEZyb21FeHRlcm5hbExpbmsoZXh0ZXJuYWxNRFtpXSk7XG4gICAgICAgICAgY29uc3QgcmVwbGFjZU1lbnQgPSByZXBsYWNlTWQobGluaywgbGFiZWwpO1xuICAgICAgICAgIG5ld0h0bWxUZXh0ID0gaHRtbFRleHQucmVwbGFjZShleHRlcm5hbE1EW2ldLCByZXBsYWNlTWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBjb25zdCBleHRlcm5hbE1EID0gbWFya2VkU3RyLm1hdGNoKEVYUkVSTkFMX01EX1JFRyk7XG5cbiAgcmV0dXJuIG5ld0h0bWxUZXh0O1xufTtcblxuY29uc3QgcmVwbGFjZU1kID0gKGludGVybmFsTGluazogc3RyaW5nLCBsYWJlbDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGV9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbExpbmspLCAnJyk7XG5cbiAgLy8gbGV0IGZpbGVQYXRoO1xuXG4gIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAvLyBmaWxlUGF0aCA9IGZpbGUucGF0aDtcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGA8YSBkYXRhLWhyZWY9XCIke2ludGVybmFsTGlua31cIiBkYXRhLXR5cGU9XCJsaW5rXCIgZGF0YS1maWxlcGF0aD1cIiR7aW50ZXJuYWxMaW5rfVwiIGNsYXNzPVwiaW50ZXJuYWwtbGlua1wiPiR7bGFiZWx9PC9hPmApO1xuICAgICAgcmV0dXJuIGA8YSBkYXRhLWhyZWY9XCIke2ludGVybmFsTGlua31cIiBkYXRhLXR5cGU9XCJsaW5rXCIgZGF0YS1maWxlcGF0aD1cIiR7aW50ZXJuYWxMaW5rfVwiIGNsYXNzPVwiaW50ZXJuYWwtbGlua1wiPiR7bGFiZWx9PC9hPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgPGEgZGF0YS1ocmVmPVwiJHtpbnRlcm5hbExpbmt9XCIgZGF0YS10eXBlPVwibGlua1wiIGRhdGEtZmlsZXBhdGg9XCIke2ludGVybmFsTGlua31cIiBjbGFzcz1cImludGVybmFsLWxpbmtcIj4ke2ludGVybmFsTGlua308L2E+YDtcbiAgICB9XG4gIH0gZWxzZSBpZiAobGFiZWwpIHtcbiAgICByZXR1cm4gYDxhIGRhdGEtaHJlZj1cIiR7aW50ZXJuYWxMaW5rfVwiIGRhdGEtdHlwZT1cImxpbmtcIiBkYXRhLWZpbGVwYXRoPVwiJHtpbnRlcm5hbExpbmt9XCIgY2xhc3M9XCJpbnRlcm5hbC1saW5rIGlzLXVucmVzb2x2ZWRcIj4ke2xhYmVsfTwvYT5gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgPGEgZGF0YS1ocmVmPVwiJHtpbnRlcm5hbExpbmt9XCIgZGF0YS10eXBlPVwibGlua1wiIGRhdGEtZmlsZXBhdGg9XCIke2ludGVybmFsTGlua31cIiBjbGFzcz1cImludGVybmFsLWxpbmsgaXMtdW5yZXNvbHZlZFwiPiR7aW50ZXJuYWxMaW5rfTwvYT5gO1xuICB9XG59O1xuXG5jb25zdCBnZXRDb250ZW50RnJvbUludGVybmFsTGluayA9IChsaW5lOiBzdHJpbmcpID0+IC9cXFtcXFsoW15cXF1dKylcXF1cXF0vZy5leGVjKGxpbmUpPy5bMV07XG5cbmNvbnN0IGdldExhYmVsRnJvbUV4dGVybmFsTGluayA9IChsaW5lOiBzdHJpbmcpID0+IEVYUkVSTkFMX01EX1JFRy5leGVjKGxpbmUpPy5bMV07XG5cbmNvbnN0IGdldENvbnRlbnRGcm9tRXh0ZXJuYWxMaW5rID0gKGxpbmU6IHN0cmluZykgPT4gL1xcWyhbXlxcXV0rKVxcXVxcKCgoW15cXF1dKykubWQpXFwpL2cuZXhlYyhsaW5lKT8uWzNdO1xuXG5jb25zdCBwYXJzZUh0bWxUb1Jhd1RleHQgPSAoaHRtbFN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGVtcEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRlbXBFbC5jbGFzc05hbWUgPSAnbWVtby1jb250ZW50LXRleHQnO1xuICB0ZW1wRWwuaW5uZXJIVE1MID0gaHRtbFN0cjtcbiAgY29uc3QgdGV4dCA9IHRlbXBFbC5pbm5lclRleHQ7XG4gIHJldHVybiB0ZXh0O1xufTtcblxuY29uc3QgcGFyc2VSYXdUZXh0VG9IdG1sID0gKHJhd1RleHRTdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGh0bWxUZXh0ID0gcmF3VGV4dFN0ci5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTtcbiAgcmV0dXJuIGh0bWxUZXh0O1xufTtcblxuY29uc3QgZW5jb2RlSHRtbCA9IChodG1sU3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHQudGV4dENvbnRlbnQgPSBodG1sU3RyO1xuICByZXR1cm4gdC5pbm5lckhUTUw7XG59O1xuXG5leHBvcnQge2VuY29kZUh0bWwsIHBhcnNlTWFya2VkVG9IdG1sLCBwYXJzZUh0bWxUb1Jhd1RleHQsIHBhcnNlUmF3VGV4dFRvSHRtbH07XG4iLCJpbXBvcnQge3VzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7U3RvcmV9IGZyb20gJy4vY3JlYXRlU3RvcmUnO1xuXG5pbnRlcmZhY2UgUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3RFbGVtZW50O1xuICBzdG9yZTogU3RvcmU8YW55LCBhbnk+O1xuICBjb250ZXh0OiBSZWFjdC5Db250ZXh0PGFueT47XG59XG5cbi8qKlxuICogVG95LVJlZHV4IFByb3ZpZGVyXG4gKiBKdXN0IGZvciBkZWJ1ZyB3aXRoIHRoZSBhcHAgc3RvcmVcbiAqL1xuY29uc3QgUHJvdmlkZXI6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcbiAgY29uc3Qge2NoaWxkcmVuLCBzdG9yZSwgY29udGV4dDogQ29udGV4dH0gPSBwcm9wcztcbiAgY29uc3QgW2FwcFN0YXRlLCBzZXRBcHBTdGF0ZV0gPSB1c2VTdGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKChucykgPT4ge1xuICAgICAgc2V0QXBwU3RhdGUobnMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiA8Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17YXBwU3RhdGV9PntjaGlsZHJlbn08L0NvbnRleHQuUHJvdmlkZXI+O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvdmlkZXI7XG4iLCJpbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcclxuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xyXG5pbXBvcnQgUHJvdmlkZXIgZnJvbSAnLi4vbGFicy9Qcm92aWRlcic7XHJcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xyXG5pbXBvcnQge0FOSU1BVElPTl9EVVJBVElPTn0gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgJy4uL2xlc3MvZGlhbG9nLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QsIHtLZXlib2FyZEV2ZW50LCB1c2VSZWZ9IGZyb20gJ3JlYWN0JztcclxuXHJcbmludGVyZmFjZSBEaWFsb2dDb25maWcge1xyXG4gIGNsYXNzTmFtZTogc3RyaW5nO1xyXG4gIHVzZUFwcENvbnRleHQ/OiBib29sZWFuO1xyXG4gIGNsaWNrU3BhY2VEZXN0cm95PzogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIFByb3BzIGV4dGVuZHMgRGlhbG9nQ29uZmlnLCBEaWFsb2dQcm9wcyB7XHJcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcclxufVxyXG5cclxuY29uc3QgQmFzZURpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHtjaGlsZHJlbiwgY2xhc3NOYW1lLCBjbGlja1NwYWNlRGVzdHJveSwgZGVzdHJveX0gPSBwcm9wcztcclxuXHJcbiAgY29uc3QgaGFuZGxlU3BhY2VDbGlja2VkID0gKCkgPT4ge1xyXG4gICAgaWYgKGNsaWNrU3BhY2VEZXN0cm95KSB7XHJcbiAgICAgIGRlc3Ryb3koKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVFc2NDbGlja2VkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgY29uc3Qge2tleX0gPSBlOyBcclxuICAgIGlmIChrZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIGRlc3Ryb3koKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e2BkaWFsb2ctd3JhcHBlciAke2NsYXNzTmFtZX1gfSBvbkNsaWNrPXtoYW5kbGVTcGFjZUNsaWNrZWR9IG9uS2V5UHJlc3M9e2hhbmRsZUVzY0NsaWNrZWR9PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1jb250YWluZXJcIiBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX0+XHJcbiAgICAgICAge2NoaWxkcmVufVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2hvd0RpYWxvZzxUIGV4dGVuZHMgRGlhbG9nUHJvcHM+KFxyXG4gIGNvbmZpZzogRGlhbG9nQ29uZmlnLFxyXG4gIERpYWxvZ0NvbXBvbmVudDogUmVhY3QuRkM8VD4sXHJcbiAgcHJvcHM/OiBPbWl0PFQsICdkZXN0cm95Jz4sXHJcbik6IERpYWxvZ0NhbGxiYWNrIHtcclxuICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGVtcERpdik7XHJcblxyXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgdGVtcERpdi5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LmFkZCgnc2hvd3VwJyk7XHJcbiAgfSwgMCk7XHJcblxyXG4gIGNvbnN0IGNiczogRGlhbG9nQ2FsbGJhY2sgPSB7XHJcbiAgICBkZXN0cm95OiAoKSA9PiB7XHJcbiAgICAgIHRlbXBEaXYuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3d1cCcpO1xyXG4gICAgICB0ZW1wRGl2LmZpcnN0RWxlbWVudENoaWxkPy5jbGFzc0xpc3QuYWRkKCdzaG93b2ZmJyk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRlbXBEaXYucmVtb3ZlKCk7XHJcbiAgICAgICAgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0ZW1wRGl2KTtcclxuICAgICAgfSwgQU5JTUFUSU9OX0RVUkFUSU9OKTtcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZGlhbG9nUHJvcHMgPSB7XHJcbiAgICAuLi5wcm9wcyxcclxuICAgIGRlc3Ryb3k6IGNicy5kZXN0cm95LFxyXG4gIH0gYXMgVDtcclxuXHJcbiAgbGV0IEZyYWdtZW50ID0gKFxyXG4gICAgPEJhc2VEaWFsb2cgZGVzdHJveT17Y2JzLmRlc3Ryb3l9IGNsaWNrU3BhY2VEZXN0cm95PXt0cnVlfSB7Li4uY29uZmlnfT5cclxuICAgICAgPERpYWxvZ0NvbXBvbmVudCB7Li4uZGlhbG9nUHJvcHN9IC8+XHJcbiAgICA8L0Jhc2VEaWFsb2c+XHJcbiAgKTtcclxuXHJcbiAgaWYgKGNvbmZpZy51c2VBcHBDb250ZXh0KSB7XHJcbiAgICBGcmFnbWVudCA9IChcclxuICAgICAgPFByb3ZpZGVyIHN0b3JlPXthcHBTdG9yZX0gY29udGV4dD17YXBwQ29udGV4dH0+XHJcbiAgICAgICAge0ZyYWdtZW50fVxyXG4gICAgICA8L1Byb3ZpZGVyPlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIFJlYWN0RE9NLnJlbmRlcihGcmFnbWVudCwgdGVtcERpdik7XHJcblxyXG4gIHJldHVybiBjYnM7XHJcbn1cclxuIiwiaW1wb3J0IHt1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xyXG5pbXBvcnQge3Nob3dEaWFsb2d9IGZyb20gJy4vRGlhbG9nJztcclxuaW1wb3J0ICcuLi9sZXNzL3ByZXZpZXctaW1hZ2UtZGlhbG9nLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IGNsb3NlIGZyb20gJy4uL2ljb25zL2Nsb3NlLnN2Zyc7XHJcbmltcG9ydCB7Tm90aWNlfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7dH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMgZXh0ZW5kcyBEaWFsb2dQcm9wcyB7XHJcbiAgaW1nVXJsOiBzdHJpbmc7XHJcbiAgZmlsZXBhdGg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IFByZXZpZXdJbWFnZURpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHtkZXN0cm95LCBpbWdVcmwsIGZpbGVwYXRofTogUHJvcHMpID0+IHtcclxuICBjb25zdCBpbWdSZWYgPSB1c2VSZWY8SFRNTEltYWdlRWxlbWVudD4obnVsbCk7XHJcbiAgY29uc3QgW2ltZ1dpZHRoLCBzZXRJbWdXaWR0aF0gPSB1c2VTdGF0ZTxudW1iZXI+KC0xKTtcclxuICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgdXRpbHMuZ2V0SW1hZ2VTaXplKGltZ1VybCkudGhlbigoe3dpZHRofSkgPT4ge1xyXG4gICAgICBpZiAod2lkdGggIT09IDApIHtcclxuICAgICAgICBzZXRJbWdXaWR0aCg4MCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0SW1nV2lkdGgoMCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQ2xvc2VCdG5DbGljayA9ICgpID0+IHtcclxuICAgIGRlc3Ryb3koKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVEZWNyZWFzZUltYWdlU2l6ZSA9ICgpID0+IHtcclxuICAgIGlmIChpbWdXaWR0aCA+IDMwKSB7XHJcbiAgICAgIHNldEltZ1dpZHRoKGltZ1dpZHRoIC0gMTApO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUluY3JlYXNlSW1hZ2VTaXplID0gKCkgPT4ge1xyXG4gICAgc2V0SW1nV2lkdGgoaW1nV2lkdGggKyAxMCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgY29udmVydEJhc2U2NFRvQmxvYiA9IChiYXNlNjQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICB2YXIgYnl0ZXMgPSB3aW5kb3cuYXRvYihiYXNlNjQpO1xyXG4gICAgdmFyIGFiID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVzLmxlbmd0aCk7XHJcbiAgICB2YXIgaWEgPSBuZXcgVWludDhBcnJheShhYik7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlhW2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbYWJdLCB7dHlwZTogdHlwZX0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGNvcHlJbWFnZVRvQ2xpcGJvYXJkID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKChmaWxlcGF0aCA9PT0gbnVsbCB8fCBmaWxlcGF0aCA9PT0gdW5kZWZpbmVkKSAmJiBpbWdVcmwgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgbXlCYXNlNjQgPSBpbWdVcmwuc3BsaXQoJ2Jhc2U2NCwnKVsxXTtcclxuICAgICAgY29uc3QgYmxvYklucHV0ID0gY29udmVydEJhc2U2NFRvQmxvYihteUJhc2U2NCwgJ2ltYWdlL3BuZycpO1xyXG4gICAgICBjb25zdCBjbGlwYm9hcmRJdGVtSW5wdXQgPSBuZXcgQ2xpcGJvYXJkSXRlbSh7J2ltYWdlL3BuZyc6IGJsb2JJbnB1dH0pO1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3JbJ2NsaXBib2FyZCddLndyaXRlKFtjbGlwYm9hcmRJdGVtSW5wdXRdKTtcclxuICAgICAgbmV3IE5vdGljZSgnU2VuZCB0byBjbGlwYm9hcmQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgYnVmZmVyID0gYXdhaXQgdmF1bHQuYWRhcHRlci5yZWFkQmluYXJ5KGZpbGVwYXRoKTtcclxuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcblxyXG4gICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFthcnJdLCB7dHlwZTogJ2ltYWdlL3BuZyd9KTtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBjb25zdCBpdGVtID0gbmV3IENsaXBib2FyZEl0ZW0oeydpbWFnZS9wbmcnOiBibG9ifSk7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgd2luZG93Lm5hdmlnYXRvclsnY2xpcGJvYXJkJ10ud3JpdGUoW2l0ZW1dKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPD5cclxuICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gY2xvc2UtYnRuXCIgb25DbGljaz17aGFuZGxlQ2xvc2VCdG5DbGlja30+XHJcbiAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17Y2xvc2V9IC8+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWctY29udGFpbmVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3NOYW1lPXtpbWdXaWR0aCA8PSAwID8gJ2hpZGRlbicgOiAnJ30gcmVmPXtpbWdSZWZ9IHdpZHRoPXtpbWdXaWR0aCArICclJ30gc3JjPXtpbWdVcmx9IC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnbG9hZGluZy10ZXh0ICcgKyAoaW1nV2lkdGggPT09IC0xID8gJycgOiAnaGlkZGVuJyl9Pnt0KCdJbWFnZSBpcyBsb2FkaW5nLi4uJyl9PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2xvYWRpbmctdGV4dCAnICsgKGltZ1dpZHRoID09PSAwID8gJycgOiAnaGlkZGVuJyl9PlxyXG4gICAgICAgICAge3QoJ/CfmJ8gQ2Fubm90IGxvYWQgaW1hZ2UsIGltYWdlIGxpbmsgbWF5YmUgYnJva2VuJyl9XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWN0aW9uLWJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVEZWNyZWFzZUltYWdlU2l6ZX0+XHJcbiAgICAgICAgICDinpZcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9e2hhbmRsZUluY3JlYXNlSW1hZ2VTaXplfT5cclxuICAgICAgICAgIOKelVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17KCkgPT4gc2V0SW1nV2lkdGgoODApfT5cclxuICAgICAgICAgIOKtlVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17Y29weUltYWdlVG9DbGlwYm9hcmR9PlxyXG4gICAgICAgICAg8J+ThFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93UHJldmlld0ltYWdlRGlhbG9nKGltZ1VybDogc3RyaW5nLCBmaWxlcGF0aD86IHN0cmluZyk6IHZvaWQge1xyXG4gIGlmIChmaWxlcGF0aCkge1xyXG4gICAgc2hvd0RpYWxvZyhcclxuICAgICAge1xyXG4gICAgICAgIGNsYXNzTmFtZTogJ3ByZXZpZXctaW1hZ2UtZGlhbG9nJyxcclxuICAgICAgfSxcclxuICAgICAgUHJldmlld0ltYWdlRGlhbG9nLFxyXG4gICAgICB7aW1nVXJsLCBmaWxlcGF0aH0sXHJcbiAgICApO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBzaG93RGlhbG9nKFxyXG4gICAgICB7XHJcbiAgICAgICAgY2xhc3NOYW1lOiAncHJldmlldy1pbWFnZS1kaWFsb2cnLFxyXG4gICAgICB9LFxyXG4gICAgICBQcmV2aWV3SW1hZ2VEaWFsb2csXHJcbiAgICAgIHtpbWdVcmx9LFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gIC8vICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5wcmV2aWV3LWltYWdlLWRpYWxvZ1wiKS5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgY2xvc2VXaW5kb3dCeUVzYyk7XHJcbiAgLy8gfSwgMCk7XHJcbn1cclxuXHJcbi8vIGZ1bmN0aW9uIGNsb3NlV2luZG93KCkge1xyXG4vLyAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJldmlldy1pbWFnZS1kaWFsb2cgLmNsb3NlLWJ0blwiKS5jbGljaygpO1xyXG4vLyB9XHJcblxyXG4vLyBmdW5jdGlvbiBjbG9zZVdpbmRvd0J5RXNjKGUpIHtcclxuLy8gICBpZiAoIWUpIGUgPSB3aW5kb3cuZXZlbnQ7XHJcbi8vICAgdmFyIGtleUNvZGUgPSBlLmtleUNvZGUgfHwgZS53aGljaDtcclxuLy8gICBpZiAoa2V5Q29kZSA9PSAnMjcnKSB7XHJcbi8vICAgICBjbG9zZVdpbmRvdygpO1xyXG4vLyAgIH1cclxuLy8gfVxyXG4iLCJpbXBvcnQgc2hvd1ByZXZpZXdJbWFnZURpYWxvZyBmcm9tICcuL1ByZXZpZXdJbWFnZURpYWxvZyc7XG5pbXBvcnQgJy4uL2xlc3MvaW1hZ2UubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbnRlcmZhY2UgUHJvcHMge1xuICBpbWdVcmw6IHN0cmluZztcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBhbHQ6IHN0cmluZztcbiAgcmVmZXJyZXJQb2xpY3k/OiBzdHJpbmc7XG4gIGZpbGVwYXRoPzogc3RyaW5nO1xufVxuXG5jb25zdCBJbWFnZTogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCB7Y2xhc3NOYW1lLCBpbWdVcmwsIGFsdCwgcmVmZXJyZXJQb2xpY3ksIGZpbGVwYXRofSA9IHByb3BzO1xuXG4gIGNvbnN0IGhhbmRsZUltYWdlQ2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKGZpbGVwYXRoKSB7XG4gICAgICBzaG93UHJldmlld0ltYWdlRGlhbG9nKGltZ1VybCwgZmlsZXBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93UHJldmlld0ltYWdlRGlhbG9nKGltZ1VybCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9eydpbWFnZS1jb250YWluZXIgJyArIGNsYXNzTmFtZX0gb25DbGljaz17aGFuZGxlSW1hZ2VDbGlja30gcmVmZXJyZXJQb2xpY3k9e3JlZmVycmVyUG9saWN5fT5cbiAgICAgIDxpbWcgc3JjPXtpbWdVcmx9IGFsdD17YWx0fSBkZWNvZGluZz1cImFzeW5jXCIgbG9hZGluZz1cImxhenlcIiAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2U7XG4iLCJpbXBvcnQge3VzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7XHJcbiAgSU1BR0VfVVJMX1JFRyxcclxuICBNQVJLRE9XTl9VUkxfUkVHLFxyXG4gIE1BUktET1dOX1dFQl9VUkxfUkVHLFxyXG4gIE1FTU9fTElOS19SRUcsXHJcbiAgV0lLSV9JTUFHRV9VUkxfUkVHLFxyXG59IGZyb20gJy4uL2hlbHBlcnMvY29uc3RzJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xyXG5pbXBvcnQge2dsb2JhbFN0YXRlU2VydmljZSwgbWVtb1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHtwYXJzZUh0bWxUb1Jhd1RleHR9IGZyb20gJy4uL2hlbHBlcnMvbWFya2VkJztcclxuaW1wb3J0IHtmb3JtYXRNZW1vQ29udGVudH0gZnJvbSAnLi9NZW1vJztcclxuaW1wb3J0IHtzaG93RGlhbG9nfSBmcm9tICcuL0RpYWxvZyc7XHJcbmltcG9ydCBPbmx5IGZyb20gJy4vY29tbW9uL09ubHlXaGVuJztcclxuaW1wb3J0IEltYWdlIGZyb20gJy4vSW1hZ2UnO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVtby1jYXJkLWRpYWxvZy5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtOb3RpY2UsIFRGaWxlLCBWYXVsdH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IGNsb3NlIGZyb20gJy4uL2ljb25zL2Nsb3NlLnN2Zyc7XHJcbmltcG9ydCBlZGl0IGZyb20gJy4uL2ljb25zL2VkaXQuc3ZnJztcclxuaW1wb3J0IHsgdCB9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG5cclxuaW50ZXJmYWNlIExpbmtlZE1lbW8gZXh0ZW5kcyBGb3JtYXR0ZWRNZW1vIHtcclxuICBkYXRlU3RyOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIERpYWxvZ1Byb3BzIHtcclxuICBtZW1vOiBNb2RlbC5NZW1vO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTGlua01hdGNoIHtcclxuICBsaW5rVGV4dDogc3RyaW5nO1xyXG4gIGFsdFRleHQ6IHN0cmluZztcclxuICBwYXRoOiBzdHJpbmc7XHJcbiAgZmlsZXBhdGg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQYXRoT2ZJbWFnZSA9ICh2YXVsdDogVmF1bHQsIGltYWdlOiBURmlsZSkgPT4ge1xyXG4gIHJldHVybiB2YXVsdC5nZXRSZXNvdXJjZVBhdGgoaW1hZ2UpO1xyXG59O1xyXG5cclxuY29uc3QgZGV0ZWN0V2lraUludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XHJcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcclxuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gV0lLSV9JTUFHRV9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMV07XHJcbiAgY29uc3QgaW50ZXJuYWxBbHROYW1lID0gV0lLSV9JTUFHRV9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bNV07XHJcbiAgY29uc3QgZmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVjb2RlVVJJQ29tcG9uZW50KGludGVybmFsRmlsZU5hbWUpLCAnJyk7XHJcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgIHBhdGg6ICcnLFxyXG4gICAgICBmaWxlcGF0aDogJycsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUucGF0aDtcclxuICAgIGlmIChpbnRlcm5hbEFsdE5hbWUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxyXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogJycsXHJcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxyXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RNREludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XHJcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcclxuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xyXG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IE1BUktET1dOX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsyXTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuICBpZiAoZmlsZSA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgcGF0aDogJycsXHJcbiAgICAgIGZpbGVwYXRoOiAnJyxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKHZhdWx0LCBmaWxlKTtcclxuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5wYXRoO1xyXG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IE1lbW9DYXJkRGlhbG9nOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHM6IFByb3BzKSA9PiB7XHJcbiAgY29uc3QgW21lbW8sIHNldE1lbW9dID0gdXNlU3RhdGU8Rm9ybWF0dGVkTWVtbz4oe1xyXG4gICAgLi4ucHJvcHMubWVtbyxcclxuICAgIGNyZWF0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHMubWVtby5jcmVhdGVkQXQpLFxyXG4gIH0pO1xyXG4gIGNvbnN0IFtsaW5rTWVtb3MsIHNldExpbmtNZW1vc10gPSB1c2VTdGF0ZTxMaW5rZWRNZW1vW10+KFtdKTtcclxuICBjb25zdCBbbGlua2VkTWVtb3MsIHNldExpbmtlZE1lbW9zXSA9IHVzZVN0YXRlPExpbmtlZE1lbW9bXT4oW10pO1xyXG5cclxuICBsZXQgZXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcclxuICBsZXQgaW50ZXJuYWxJbWFnZVVybHMgPSBbXTtcclxuICBsZXQgYWxsTWFya2Rvd25MaW5rOiBzdHJpbmcgfCBhbnlbXSA9IFtdO1xyXG4gIGxldCBhbGxJbnRlcm5hbExpbmsgPSBbXSBhcyBhbnlbXTtcclxuICBpZiAoSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgIGxldCBhbGxFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gICAgbGV0IGFub3RoZXJFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gICAgaWYgKE1BUktET1dOX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbE1hcmtkb3duTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIGlmIChXSUtJX0lNQUdFX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc3QgYWxsSW50ZXJuYWxMaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goV0lLSV9JTUFHRV9VUkxfUkVHKSk7XHJcbiAgICBpZiAoTUFSS0RPV05fV0VCX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbEV4dGVybmFsSW1hZ2VVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTUFSS0RPV05fV0VCX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIGlmIChhbGxJbnRlcm5hbExpbmsubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsSW50ZXJuYWxMaW5rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IG9uZSA9IGFsbEludGVybmFsTGlua1tpXTtcclxuICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdFdpa2lJbnRlcm5hbExpbmsob25lKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChhbGxNYXJrZG93bkxpbmsubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsTWFya2Rvd25MaW5rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHR3byA9IGFsbE1hcmtkb3duTGlua1tpXTtcclxuICAgICAgICBpZiAoLyguKilodHRwW3NdPyguKikvLnRlc3QodHdvKSkge1xyXG4gICAgICAgICAgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzLnB1c2goTUFSS0RPV05fVVJMX1JFRy5leGVjKHR3byk/Lls1XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0TURJbnRlcm5hbExpbmsodHdvKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBleHRlcm5hbEltYWdlVXJscyA9IGFsbEV4dGVybmFsSW1hZ2VVcmxzLmNvbmNhdChhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMpO1xyXG4gICAgLy8gZXh0ZXJuYWxJbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChJTUFHRV9VUkxfUkVHKSA/PyBbXSk7XHJcbiAgfVxyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgZmV0Y2hMaW5rZWRNZW1vcyA9IGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBsaW5rTWVtb3M6IExpbmtlZE1lbW9bXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IG1hdGNoZWRBcnIgPSBbLi4ubWVtby5jb250ZW50Lm1hdGNoQWxsKE1FTU9fTElOS19SRUcpXTtcclxuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoUmVzIG9mIG1hdGNoZWRBcnIpIHtcclxuICAgICAgICAgIGlmIChtYXRjaFJlcyAmJiBtYXRjaFJlcy5sZW5ndGggPT09IDMpIHtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaFJlc1syXTtcclxuICAgICAgICAgICAgY29uc3QgbWVtb1RlbXAgPSBtZW1vU2VydmljZS5nZXRNZW1vQnlJZChpZCk7XHJcbiAgICAgICAgICAgIGlmIChtZW1vVGVtcCkge1xyXG4gICAgICAgICAgICAgIGxpbmtNZW1vcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIC4uLm1lbW9UZW1wLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0U3RyOiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhtZW1vVGVtcC5jcmVhdGVkQXQpLFxyXG4gICAgICAgICAgICAgICAgZGF0ZVN0cjogdXRpbHMuZ2V0RGF0ZVN0cmluZyhtZW1vVGVtcC5jcmVhdGVkQXQpLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldExpbmtNZW1vcyhbLi4ubGlua01lbW9zXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmtlZE1lbW9zID0gYXdhaXQgbWVtb1NlcnZpY2UuZ2V0TGlua2VkTWVtb3MobWVtby5pZCk7XHJcbiAgICAgICAgc2V0TGlua2VkTWVtb3MoXHJcbiAgICAgICAgICBsaW5rZWRNZW1vc1xyXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCkpXHJcbiAgICAgICAgICAgIC5tYXAoKG0pID0+ICh7XHJcbiAgICAgICAgICAgICAgLi4ubSxcclxuICAgICAgICAgICAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKG0uY3JlYXRlZEF0KSxcclxuICAgICAgICAgICAgICBkYXRlU3RyOiB1dGlscy5nZXREYXRlU3RyaW5nKG0uY3JlYXRlZEF0KSxcclxuICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgLy8gZG8gbnRoXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgZmV0Y2hMaW5rZWRNZW1vcygpO1xyXG4gIH0sIFttZW1vLmlkXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZU1lbW9Db250ZW50Q2xpY2sgPSB1c2VDYWxsYmFjayhhc3luYyAoZTogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgdGFyZ2V0RWwgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBpZiAodGFyZ2V0RWwuY2xhc3NOYW1lID09PSAnbWVtby1saW5rLXRleHQnKSB7XHJcbiAgICAgIGNvbnN0IG5leHRNZW1vSWQgPSB0YXJnZXRFbC5kYXRhc2V0Py52YWx1ZTtcclxuICAgICAgY29uc3QgbWVtb1RlbXAgPSBtZW1vU2VydmljZS5nZXRNZW1vQnlJZChuZXh0TWVtb0lkID8/ICcnKTtcclxuXHJcbiAgICAgIGlmIChtZW1vVGVtcCkge1xyXG4gICAgICAgIGNvbnN0IG5leHRNZW1vID0ge1xyXG4gICAgICAgICAgLi4ubWVtb1RlbXAsXHJcbiAgICAgICAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKG1lbW9UZW1wLmNyZWF0ZWRBdCksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBzZXRMaW5rTWVtb3MoW10pO1xyXG4gICAgICAgIHNldExpbmtlZE1lbW9zKFtdKTtcclxuICAgICAgICBzZXRNZW1vKG5leHRNZW1vKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXcgTm90aWNlKCdNRU1PIE5vdCBGb3VuZCcpO1xyXG4gICAgICAgIHRhcmdldEVsLmNsYXNzTGlzdC5yZW1vdmUoJ21lbW8tbGluay10ZXh0Jyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUxpbmtlZE1lbW9DbGljayA9IHVzZUNhbGxiYWNrKChtZW1vOiBGb3JtYXR0ZWRNZW1vKSA9PiB7XHJcbiAgICBzZXRMaW5rTWVtb3MoW10pO1xyXG4gICAgc2V0TGlua2VkTWVtb3MoW10pO1xyXG4gICAgc2V0TWVtbyhtZW1vKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUVkaXRNZW1vQnRuQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICBwcm9wcy5kZXN0cm95KCk7XHJcbiAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0RWRpdE1lbW9JZChtZW1vLmlkKTtcclxuICB9LCBbbWVtby5pZF0pO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPD5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLWNhcmQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoZWFkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aW1lLXRleHRcIj57bWVtby5jcmVhdGVkQXRTdHJ9PC9wPlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG5zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBlZGl0LWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUVkaXRNZW1vQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2VkaXR9IC8+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBjbG9zZS1idG5cIiBvbkNsaWNrPXtwcm9wcy5kZXN0cm95fT5cclxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtjbG9zZX0gLz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1lbW8tY29udGVudC10ZXh0XCJcclxuICAgICAgICAgICAgb25DbGljaz17aGFuZGxlTWVtb0NvbnRlbnRDbGlja31cclxuICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KG1lbW8uY29udGVudCl9fT48L2Rpdj5cclxuICAgICAgICAgIDxPbmx5IHdoZW49e2V4dGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAge2V4dGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgICAgIDxJbWFnZSBrZXk9e2lkeH0gY2xhc3NOYW1lPVwibWVtby1pbWdcIiBpbWdVcmw9e2ltZ1VybH0gYWx0PVwiXCIgcmVmZXJyZXJQb2xpY3k9XCJuby1yZWZlcnJlclwiIC8+XHJcbiAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9Pbmx5PlxyXG4gICAgICAgICAgPE9ubHkgd2hlbj17aW50ZXJuYWxJbWFnZVVybHMubGVuZ3RoID4gMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLXdyYXBwZXIgaW50ZXJuYWwtZW1iZWQgaW1hZ2UtZW1iZWQgaXMtbG9hZGVkXCI+XHJcbiAgICAgICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgICAgIDxJbWFnZVxyXG4gICAgICAgICAgICAgICAgICBrZXk9e2lkeH1cclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWVtby1pbWdcIlxyXG4gICAgICAgICAgICAgICAgICBpbWdVcmw9e2ltZ1VybC5wYXRofVxyXG4gICAgICAgICAgICAgICAgICBhbHQ9e2ltZ1VybC5hbHRUZXh0fVxyXG4gICAgICAgICAgICAgICAgICBmaWxlcGF0aD17aW1nVXJsLmZpbGVwYXRofVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICApKX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L09ubHk+XHJcbiAgICAgICAgICB7LyogPE9ubHkgd2hlbj17aW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAge2ltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgICAgICA8SW1hZ2UgY2xhc3NOYW1lPVwibWVtby1pbWdcIiBrZXk9e2lkeH0gaW1nVXJsPXtpbWdVcmx9IC8+XHJcbiAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9Pbmx5PiAqL31cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxheWVyLWNvbnRhaW5lclwiPjwvZGl2PlxyXG4gICAgICAgIHtsaW5rTWVtb3MubWFwKChfLCBpZHgpID0+IHtcclxuICAgICAgICAgIGlmIChpZHggPCA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmFja2dyb3VuZC1sYXllci1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAga2V5PXtpZHh9XHJcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICBib3R0b206IChpZHggKyAxKSAqIC0zICsgJ3B4JyxcclxuICAgICAgICAgICAgICAgICAgbGVmdDogKGlkeCArIDEpICogNSArICdweCcsXHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygxMDAlIC0gJHsoaWR4ICsgMSkgKiAxMH1weClgLFxyXG4gICAgICAgICAgICAgICAgICB6SW5kZXg6IC1pZHggLSAxLFxyXG4gICAgICAgICAgICAgICAgfX0+PC9kaXY+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIHtsaW5rTWVtb3MubGVuZ3RoID4gMCA/IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxpbmtlZC1tZW1vcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPnt0KCdMSU5LRUQnKX0ge2xpbmtNZW1vcy5sZW5ndGh9IE1FTU8gPC9wPlxyXG4gICAgICAgICAge2xpbmtNZW1vcy5tYXAoKG0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmF3dGV4dCA9IHBhcnNlSHRtbFRvUmF3VGV4dChmb3JtYXRNZW1vQ29udGVudChtLmNvbnRlbnQpKS5yZXBsYWNlQWxsKCdcXG4nLCAnICcpO1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlua2VkLW1lbW8tY29udGFpbmVyXCIga2V5PXttLmlkfSBvbkNsaWNrPXsoKSA9PiBoYW5kbGVMaW5rZWRNZW1vQ2xpY2sobSl9PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGltZS10ZXh0XCI+e20uZGF0ZVN0cn0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAge3Jhd3RleHR9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKSA6IG51bGx9XHJcbiAgICAgIHtsaW5rZWRNZW1vcy5sZW5ndGggPiAwID8gKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlua2VkLW1lbW9zLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+e2xpbmtlZE1lbW9zLmxlbmd0aH0gTUVNTyB7dCgnTElOSyBUTyBUSEUnKX0gTUVNTzwvcD5cclxuICAgICAgICAgIHtsaW5rZWRNZW1vcy5tYXAoKG0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmF3dGV4dCA9IHBhcnNlSHRtbFRvUmF3VGV4dChmb3JtYXRNZW1vQ29udGVudChtLmNvbnRlbnQpKS5yZXBsYWNlQWxsKCdcXG4nLCAnICcpO1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlua2VkLW1lbW8tY29udGFpbmVyXCIga2V5PXttLmlkfSBvbkNsaWNrPXsoKSA9PiBoYW5kbGVMaW5rZWRNZW1vQ2xpY2sobSl9PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGltZS10ZXh0XCI+e20uZGF0ZVN0cn0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAge3Jhd3RleHR9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKSA6IG51bGx9XHJcbiAgICA8Lz5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hvd01lbW9DYXJkRGlhbG9nKG1lbW86IE1vZGVsLk1lbW8pOiB2b2lkIHtcclxuICBzaG93RGlhbG9nKFxyXG4gICAge1xyXG4gICAgICBjbGFzc05hbWU6ICdtZW1vLWNhcmQtZGlhbG9nJyxcclxuICAgIH0sXHJcbiAgICBNZW1vQ2FyZERpYWxvZyxcclxuICAgIHttZW1vfSxcclxuICApO1xyXG59XHJcbiIsImltcG9ydCB7ZGFpbHlOb3Rlc1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcclxuLy8gaW1wb3J0IHtyZXF1ZXN0fSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5jb25zdCBjYWNoZWRSZXNvdXJjZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcblxyXG5jb25zdCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkwgPSBhc3luYyAodXJsOiBzdHJpbmcsIHVzZUNhY2hlID0gdHJ1ZSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgY29uc3Qge3ZhdWx0fSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCkuYXBwO1xyXG5cclxuICBpZiAodXNlQ2FjaGUgJiYgY2FjaGVkUmVzb3VyY2VNYXAuaGFzKHVybCkpIHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FjaGVkUmVzb3VyY2VNYXAuZ2V0KHVybCkgYXMgc3RyaW5nKTtcclxuICB9XHJcblxyXG4gIC8vIGxldCByZXM7XHJcblxyXG4gIGlmICghLyhodHRwfGh0dHBzKS9nLnRlc3QodXJsKSkge1xyXG4gICAgaWYgKGF3YWl0IHZhdWx0LmFkYXB0ZXIuZXhpc3RzKHVybCkpIHtcclxuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgdmF1bHQuYWRhcHRlci5yZWFkQmluYXJ5KHVybCk7XHJcbiAgICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcblxyXG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2Fycl0sIHt0eXBlOiAnaW1hZ2UvcG5nJ30pO1xyXG4gICAgICAvLyB2YXIgbGVuID0gYXJyLmJ5dGVMZW5ndGg7XHJcbiAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgLy8gICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBhcnJbIGkgXSApO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICAvLyByZXR1cm4gd2luZG93LmJ0b2EoIGJpbmFyeSApO1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlNjRVcmwgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcclxuICAgICAgICAgIGNhY2hlZFJlc291cmNlTWFwLnNldCh1cmwsIGJhc2U2NFVybCk7XHJcbiAgICAgICAgICByZXNvbHZlKGJhc2U2NFVybCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGdldEJhc2U2NEltYWdlKHVybCk7XHJcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IChhd2FpdCBkb3dubG9hZEZpbGUodXJsKSkuYnVmZmVyO1xyXG4gICAgICAvLyBjb25zdCBkb3dubG9hZCA9IGF3YWl0IHJlcXVlc3Qoe1xyXG4gICAgICAvLyAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgIC8vICAgdXJsOiB1cmwsXHJcbiAgICAgIC8vICAgY29udGVudFR5cGU6ICdpbWFnZS9hdmlmLGltYWdlL3dlYnAsaW1hZ2UvYXBuZyxpbWFnZS9zdmcreG1sLGltYWdlLyosKi8qO3E9MC44JyxcclxuICAgICAgLy8gICAvLyBoZWFkZXJzOiB7XHJcbiAgICAgIC8vICAgLy8gICBcIkNvbnRlbnQtVHlwZVwiOiBcImltYWdlL2F2aWYsaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLGltYWdlL3N2Zyt4bWwsaW1hZ2UvKiwqLyo7cT0wLjhcIixcclxuICAgICAgLy8gICAvLyAgIEFjY2VwdDogXCJpbWFnZS9hdmlmLGltYWdlL3dlYnAsaW1hZ2UvYXBuZyxpbWFnZS9zdmcreG1sLGltYWdlLyosKi8qO3E9MC44XCIsXHJcbiAgICAgIC8vICAgLy8gICBcIlByb3h5LUNvbm5lY3Rpb25cIjogXCJrZWVwLWFsaXZlXCIsXHJcbiAgICAgIC8vICAgLy8gICBQcmFnbWE6IFwibm8tY2FjaGVcIixcclxuICAgICAgLy8gICAvLyAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLWNhY2hlXCIsXHJcbiAgICAgIC8vICAgLy8gICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBvYnNpZGlhbi8wLjEyLjE5IENocm9tZS85MS4wLjQ0NzIuMTY0IEVsZWN0cm9uLzEzLjUuMiBTYWZhcmkvNTM3LjM2XCIsXHJcbiAgICAgIC8vICAgLy8gfSxcclxuICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAvLyBjb25zdCBlbmMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZG93bmxvYWQpOyAvLyBhbHdheXMgdXRmLThcclxuICAgICAgLy8gY29uc3QgYmYgPSBlbmM7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge3R5cGU6ICdpbWFnZS9wbmcnfSk7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGJhc2U2NFVybCA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgY2FjaGVkUmVzb3VyY2VNYXAuc2V0KHVybCwgYmFzZTY0VXJsKTtcclxuICAgICAgICAgIHJlc29sdmUoYmFzZTY0VXJsKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xyXG4gICAgICB9KTtcclxuICAgICAgLy8gcmV0dXJuICgoZG93bmxvYWQgPT09IFwiTm90IEZvdW5kXCIgfHwgZG93bmxvYWQgPT09IGB7XCJlcnJvclwiOlwiTm90IEZvdW5kXCJ9YCkgPyBudWxsIDogZG93bmxvYWQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGluIGdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5JywgVVJMLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuLy8gY29uc3QgZ2V0QmFzZTY0SW1hZ2UgPSAoaW1nOiBhbnkpID0+IHtcclxuXHJcbi8vICAgaW1nLmNyb3NzT3JpZ2luID0gJyc7XHJcblxyXG4vLyAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4vLyAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcclxuLy8gICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuXHJcbi8vICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbi8vICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xyXG5cclxuLy8gICB2YXIgZGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XHJcblxyXG4vLyAgIGNvbnNvbGUubG9nKGRhdGFVUkwucmVwbGFjZSgvXmRhdGE6aW1hZ2VcXC8ocG5nfGpwZyk7YmFzZTY0LC8sIFwiXCIpKTtcclxuXHJcbi8vICAgcmV0dXJuIDA7XHJcbi8vIH1cclxuXHJcbmNvbnN0IGRvd25sb2FkRmlsZSA9IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAvLyBtZXRob2Q6ICdHRVQnLFxyXG4gICAgbW9kZTogJ25vLWNvcnMnLFxyXG4gIH0pO1xyXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgb2s6IGZhbHNlLFxyXG4gICAgICBtc2c6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdCBidWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBvazogdHJ1ZSxcclxuICAgICAgbXNnOiAnb2snLFxyXG4gICAgICBidWZmZXI6IGJ1ZmZlcixcclxuICAgIH07XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBvazogZmFsc2UsXHJcbiAgICAgIG1zZzogZXJyLFxyXG4gICAgfTtcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkw7XHJcbiIsIi8vIGltcG9ydCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkwgZnJvbSBcIi4vY29udmVydFJlc291cmNlVG9EYXRhVVJMXCI7XHJcbi8vIGltcG9ydCB7IGRhaWx5Tm90ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xyXG5cclxuaW1wb3J0IGNvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTCBmcm9tICcuL2NvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTCc7XHJcblxyXG5jb25zdCBnZXRDbG9uZVN0eWxlZEVsZW1lbnQgPSBhc3luYyAoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcclxuICBjb25zdCBjbG9uZWRFbGVtZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50LnRhZ05hbWUpO1xyXG4gIC8vIGNvbnN0IHsgdmF1bHQgfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCkuYXBwO1xyXG4gIGNsb25lZEVsZW1lbnRDb250YWluZXIuaW5uZXJIVE1MID0gZWxlbWVudC5pbm5lckhUTUw7XHJcblxyXG4gIGNvbnN0IGFwcGx5U3R5bGVzID0gYXN5bmMgKHNvdXJjZUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbG9uZWRFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKCFzb3VyY2VFbGVtZW50IHx8ICFjbG9uZWRFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzb3VyY2VTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzb3VyY2VFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoc291cmNlRWxlbWVudC50YWdOYW1lID09PSAnSU1HJykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGNvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTChcclxuICAgICAgICAgIHNvdXJjZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdwYXRoJykgPz8gc291cmNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3NyYycpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgKGNsb25lZEVsZW1lbnQgYXMgSFRNTEltYWdlRWxlbWVudCkuc3JjID0gdXJsO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIC8vIGRvIG50aFxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHNvdXJjZUVsZW1lbnQuY2xhc3NOYW1lID09PSAncHJvcGVydHktaW1hZ2UnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSBzb3VyY2VFbGVtZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZTtcclxuICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkwoaW1hZ2VVcmwpO1xyXG4gICAgICAgIChjbG9uZWRFbGVtZW50IGFzIEhUTUxJbWFnZUVsZW1lbnQpLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IHVybDtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAvLyBkbyBudGhcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBzb3VyY2VTdHlsZXMpIHtcclxuICAgICAgY2xvbmVkRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcclxuICAgICAgICBpdGVtLFxyXG4gICAgICAgIHNvdXJjZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKGl0ZW0pLFxyXG4gICAgICAgIHNvdXJjZVN0eWxlcy5nZXRQcm9wZXJ0eVByaW9yaXR5KGl0ZW0pLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvbmVkRWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudDsgaSsrKSB7XHJcbiAgICAgIGF3YWl0IGFwcGx5U3R5bGVzKHNvdXJjZUVsZW1lbnQuY2hpbGRyZW5baV0gYXMgSFRNTEVsZW1lbnQsIGNsb25lZEVsZW1lbnQuY2hpbGRyZW5baV0gYXMgSFRNTEVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGF3YWl0IGFwcGx5U3R5bGVzKGVsZW1lbnQsIGNsb25lZEVsZW1lbnRDb250YWluZXIpO1xyXG5cclxuICByZXR1cm4gY2xvbmVkRWxlbWVudENvbnRhaW5lcjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGdldENsb25lU3R5bGVkRWxlbWVudDtcclxuIiwiLy8gaW1wb3J0IGNvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTCBmcm9tIFwiLi9jb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkxcIjtcblxuY29uc3QgZ2V0Rm9udHNTdHlsZUVsZW1lbnQgPSBhc3luYyAoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgY29uc3Qgc3R5bGVTaGVldHMgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHM7XG4gIGNvbnN0IGZvbnRGYW1pbHlTdHlsZXM6IENTU1N0eWxlRGVjbGFyYXRpb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qgc2hlZXQgb2Ygc3R5bGVTaGVldHMpIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2Ygc2hlZXQuY3NzUnVsZXMpIHtcbiAgICAgIGlmIChydWxlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdDU1NGb250RmFjZVJ1bGUnKSB7XG4gICAgICAgIGZvbnRGYW1pbHlTdHlsZXMucHVzaCgocnVsZSBhcyBDU1NGb250RmFjZVJ1bGUpLnN0eWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXG4gIC8vIGZvciAoY29uc3QgZiBvZiBmb250RmFtaWx5U3R5bGVzKSB7XG4gIC8vIGNvbnN0IGZvbnRGYW1pbHkgPSBmLmdldFByb3BlcnR5VmFsdWUoXCJmb250LWZhbWlseVwiKTtcbiAgLy8gY29uc3QgZm9udFdlaWdodCA9IGYuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtd2VpZ2h0XCIpO1xuICAvLyBjb25zdCBzcmMgPSBmLmdldFByb3BlcnR5VmFsdWUoXCJzcmNcIik7XG4gIC8vIGNvbnN0IHJlc291cmNlVXJscyA9IHNyYy5zcGxpdChcIixcIikubWFwKChzKSA9PiB7XG4gIC8vICAgcmV0dXJuIHMucmVwbGFjZSgvdXJsXFwoXCI/KC4rPylcIj9cXCkvLCBcIiQxXCIpO1xuICAvLyB9KTtcbiAgLy8gY29uc3QgYmFzZTY0VXJsczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBmb3IgKGNvbnN0IHVybCBvZiByZXNvdXJjZVVybHMpIHtcbiAgLy8gICB0cnkge1xuICAvLyAgICAgY29uc3QgYmFzZTY0VXJsID0gYXdhaXQgY29udmVydFJlc291cmNlVG9EYXRhVVJMKHVybCk7XG4gIC8vICAgICBiYXNlNjRVcmxzLnB1c2goYHVybChcIiR7YmFzZTY0VXJsfVwiKWApO1xuICAvLyAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gIC8vICAgICAvLyBkbyBudGhcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBzdHlsZUVsZW1lbnQuaW5uZXJIVE1MICs9IGBcbiAgLy8gICBAZm9udC1mYWNlIHtcbiAgLy8gICAgIGZvbnQtZmFtaWx5OiBcIiR7Zm9udEZhbWlseX1cIjtcbiAgLy8gICAgIHNyYzogJHtiYXNlNjRVcmxzLmpvaW4oXCIsXCIpfTtcbiAgLy8gICAgIGZvbnQtd2VpZ2h0OiAke2ZvbnRXZWlnaHR9O1xuICAvLyAgIH1gO1xuICAvLyB9XG5cbiAgcmV0dXJuIHN0eWxlRWxlbWVudDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdldEZvbnRzU3R5bGVFbGVtZW50O1xuIiwiLyoqXG4gKiBIVE1MIHRvIEltYWdlXG4gKlxuICogUmVmZXJlbmNlczpcbiAqIDEuIGh0bWwtdG8taW1hZ2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9idWJrb28vaHRtbC10by1pbWFnZVxuICogMi4gPGZvcmVpZ25PYmplY3Q+OiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvRWxlbWVudC9mb3JlaWduT2JqZWN0XG4gKi9cbmltcG9ydCBnZXRDbG9uZVN0eWxlZEVsZW1lbnQgZnJvbSAnLi9nZXRDbG9uZVN0eWxlZEVsZW1lbnQnO1xuaW1wb3J0IGdldEZvbnRzU3R5bGVFbGVtZW50IGZyb20gJy4vZ2V0Rm9udHNTdHlsZUVsZW1lbnQnO1xuXG50eXBlIE9wdGlvbnMgPSBQYXJ0aWFsPHtcbiAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIHBpeGVsUmF0aW86IG51bWJlcjtcbn0+O1xuXG5jb25zdCBnZXRFbGVtZW50U2l6ZSA9IChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBwYXJzZUludCh3aWR0aC5yZXBsYWNlKCdweCcsICcnKSksXG4gICAgaGVpZ2h0OiBwYXJzZUludChoZWlnaHQucmVwbGFjZSgncHgnLCAnJykpLFxuICB9O1xufTtcblxuY29uc3QgY29udmVydFNWR1RvRGF0YVVSTCA9IChzdmc6IFNWR0VsZW1lbnQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB4bWwgPSBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHN2Zyk7XG4gIGNvbnN0IHVybCA9IGVuY29kZVVSSUNvbXBvbmVudCh4bWwpO1xuICByZXR1cm4gYGRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCR7dXJsfWA7XG59O1xuXG5jb25zdCBnZW5lcmF0ZVNWR0VsZW1lbnQgPSAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU1ZHU1ZHRWxlbWVudCA9PiB7XG4gIGNvbnN0IHhtbE5TID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgY29uc3Qgc3ZnRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh4bWxOUywgJ3N2ZycpO1xuXG4gIHN2Z0VsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGAke3dpZHRofWApO1xuICBzdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYCR7aGVpZ2h0fWApO1xuICBzdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgndmlld0JveCcsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG5cbiAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh4bWxOUywgJ2ZvcmVpZ25PYmplY3QnKTtcblxuICBmb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTAwJScpO1xuICBmb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzEwMCUnKTtcbiAgZm9yZWlnbk9iamVjdC5zZXRBdHRyaWJ1dGUoJ3gnLCAnMCcpO1xuICBmb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgneScsICcwJyk7XG4gIGZvcmVpZ25PYmplY3Quc2V0QXR0cmlidXRlKCdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywgJ3RydWUnKTtcblxuICBmb3JlaWduT2JqZWN0LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICBzdmdFbGVtZW50LmFwcGVuZENoaWxkKGZvcmVpZ25PYmplY3QpO1xuXG4gIHJldHVybiBzdmdFbGVtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvU1ZHID0gYXN5bmMgKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogT3B0aW9ucykgPT4ge1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBnZXRFbGVtZW50U2l6ZShlbGVtZW50KTtcblxuICBjb25zdCBjbG9uZWRFbGVtZW50ID0gYXdhaXQgZ2V0Q2xvbmVTdHlsZWRFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGlmIChvcHRpb25zPy5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICBjbG9uZWRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgY29uc3Qgc3ZnID0gZ2VuZXJhdGVTVkdFbGVtZW50KHdpZHRoLCBoZWlnaHQsIGNsb25lZEVsZW1lbnQpO1xuICBzdmcucHJlcGVuZChhd2FpdCBnZXRGb250c1N0eWxlRWxlbWVudChlbGVtZW50KSk7XG5cbiAgY29uc3QgdXJsID0gY29udmVydFNWR1RvRGF0YVVSTChzdmcpO1xuXG4gIHJldHVybiB1cmw7XG59O1xuXG5leHBvcnQgY29uc3QgdG9DYW52YXMgPSBhc3luYyAoZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBPcHRpb25zKTogUHJvbWlzZTxIVE1MQ2FudmFzRWxlbWVudD4gPT4ge1xuICBjb25zdCB1cmwgPSBhd2FpdCB0b1NWRyhlbGVtZW50LCBvcHRpb25zKTtcblxuICBjb25zdCBpbWFnZUVsID0gbmV3IEltYWdlKCk7XG4gIGltYWdlRWwuc3JjID0gdXJsO1xuXG4gIGNvbnN0IHJhdGlvID0gb3B0aW9ucz8ucGl4ZWxSYXRpbyB8fCAxO1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBnZXRFbGVtZW50U2l6ZShlbGVtZW50KTtcblxuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gIGlmICghY29udGV4dCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnQ2FudmFzIGVycm9yJyk7XG4gIH1cblxuICBjYW52YXMud2lkdGggPSB3aWR0aCAqIHJhdGlvO1xuICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogcmF0aW87XG5cbiAgY2FudmFzLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9YDtcbiAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1gO1xuXG4gIGlmIChvcHRpb25zPy5iYWNrZ3JvdW5kQ29sb3IgfHwgZG9jdW1lbnQuYm9keS5jbGFzc05hbWUuY29udGFpbnMoJ3RoZW1lLWRhcmsnKSkge1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgfHwgJyMxZjFmMWYnO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGltYWdlRWwub25sb2FkID0gKCkgPT4ge1xuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2VFbCwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgICAgcmVzb2x2ZShjYW52YXMpO1xuICAgIH07XG4gIH0pO1xufTtcblxuY29uc3QgdG9JbWFnZSA9IGFzeW5jIChlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IE9wdGlvbnMpID0+IHtcbiAgY29uc3QgY2FudmFzID0gYXdhaXQgdG9DYW52YXMoZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgLy8gY2FudmFzLnRvQmxvYihmdW5jdGlvbiBkZWFsKGJsb2IpIHtcbiAgLy8gICB2YXIgY2xpcGJvYXJkSXRlbSA9IG5ldyBDbGlwYm9hcmRJdGVtKHtbYGltYWdlL3BuZ2BdOiBibG9ifSk7XG4gIC8vICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZShbY2xpcGJvYXJkSXRlbV0pLnRoZW4oKCkgPT4ge1xuICAvLyAgICAgICBhbGVydCgn5aSN5Yi25oiQ5YqfJyk7XG4gIC8vICAgfSk7XG4gIC8vIH0sKTtcbiAgLy8gY29uc29sZS5sb2coY2FudmFzKTtcblxuICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgdG9JbWFnZTtcbiIsImltcG9ydCB7dXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XHJcbi8vIGltcG9ydCB7IHVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzXCI7XHJcbmltcG9ydCB0b0ltYWdlIGZyb20gJy4uL2xhYnMvaHRtbDJpbWFnZSc7XHJcbmltcG9ydCB7XHJcbiAgQU5JTUFUSU9OX0RVUkFUSU9OLFxyXG4gIElNQUdFX1VSTF9SRUcsXHJcbiAgTUFSS0RPV05fVVJMX1JFRyxcclxuICBNQVJLRE9XTl9XRUJfVVJMX1JFRyxcclxuICBXSUtJX0lNQUdFX1VSTF9SRUcsXHJcbn0gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB7c2hvd0RpYWxvZ30gZnJvbSAnLi9EaWFsb2cnO1xyXG5pbXBvcnQge2Zvcm1hdE1lbW9Db250ZW50fSBmcm9tICcuL01lbW8nO1xyXG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XHJcbmltcG9ydCAnLi4vbGVzcy9zaGFyZS1tZW1vLWltYWdlLWRpYWxvZy5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtOb3RpY2UsIFRGaWxlLCBWYXVsdCwgbW9tZW50LCBQbGF0Zm9ybX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IHtcclxuICBTaGFyZUZvb3RlckVuZCxcclxuICBVc2VyTmFtZSxcclxuICBTaGFyZUZvb3RlclN0YXJ0LFxyXG4gIEF1dG9TYXZlV2hlbk9uTW9iaWxlLFxyXG4gIERlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZSxcclxuICBEZWZhdWx0RGFya0JhY2tncm91bmRJbWFnZSxcclxufSBmcm9tICcuLi9tZW1vcyc7XHJcbmltcG9ydCBjbG9zZSBmcm9tICcuLi9pY29ucy9jbG9zZS5zdmcnO1xyXG5pbXBvcnQgc2hhcmUgZnJvbSAnLi4vaWNvbnMvc2hhcmUuc3ZnJztcclxuaW1wb3J0IGxpZ2h0QmFja2dyb3VuZCBmcm9tICcuLi9pY29ucy9saWdodEJhY2tncm91bmQuc3ZnJztcclxuaW1wb3J0IGRhcmtCYWNrZ3JvdW5kIGZyb20gJy4uL2ljb25zL2RhcmtCYWNrZ3JvdW5kLnN2Zyc7XHJcbmltcG9ydCB7Z2V0QWxsRGFpbHlOb3Rlc30gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuaW1wb3J0IHtkYWlseU5vdGVzU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIGV4dGVuZHMgRGlhbG9nUHJvcHMge1xyXG4gIG1lbW86IE1vZGVsLk1lbW87XHJcbn1cclxuXHJcbmludGVyZmFjZSBMaW5rTWF0Y2gge1xyXG4gIGxpbmtUZXh0OiBzdHJpbmc7XHJcbiAgYWx0VGV4dDogc3RyaW5nO1xyXG4gIHBhdGg6IHN0cmluZztcclxuICBmaWxlUGF0aD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFBhdGhPZkltYWdlID0gKHZhdWx0OiBWYXVsdCwgaW1hZ2U6IFRGaWxlKSA9PiB7XHJcbiAgcmV0dXJuIHZhdWx0LmdldFJlc291cmNlUGF0aChpbWFnZSk7XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RXaWtpSW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcpOiBMaW5rTWF0Y2ggfCBudWxsID0+IHtcclxuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gIGNvbnN0IGludGVybmFsRmlsZU5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsxXTtcclxuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/Lls1XTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuXHJcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgIHBhdGg6ICcnLFxyXG4gICAgICBmaWxlUGF0aDogJycsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XHJcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxyXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcclxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUucGF0aCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RNREludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XHJcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcclxuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xyXG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IE1BUktET1dOX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsyXTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuXHJcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgIHBhdGg6ICcnLFxyXG4gICAgICBmaWxlUGF0aDogJycsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XHJcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxyXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcclxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUucGF0aCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBTaGFyZU1lbW9JbWFnZURpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHttZW1vOiBwcm9wc01lbW8sIGRlc3Ryb3l9ID0gcHJvcHM7XHJcbiAgY29uc3Qge21lbW9zfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkubWVtb1N0YXRlO1xyXG4gIGxldCBtZW1vc0xlbmd0aDtcclxuICBsZXQgY3JlYXRlZERheXM7XHJcbiAgaWYgKG1lbW9zLmxlbmd0aCkge1xyXG4gICAgbWVtb3NMZW5ndGggPSBtZW1vcy5sZW5ndGggLSAxO1xyXG4gICAgY3JlYXRlZERheXMgPSBtZW1vc1xyXG4gICAgICA/IE1hdGguY2VpbCgoRGF0ZS5ub3coKSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShtZW1vc1ttZW1vc0xlbmd0aF0uY3JlYXRlZEF0KSkgLyAxMDAwIC8gMzYwMCAvIDI0KVxyXG4gICAgICA6IDA7XHJcbiAgfVxyXG4gIC8vIGNvbnN0IHsgdXNlcjogdXNlcmluZm8gfSA9IHVzZXJTZXJ2aWNlLmdldFN0YXRlKCk7XHJcbiAgY29uc3QgbWVtbzogRm9ybWF0dGVkTWVtbyA9IHtcclxuICAgIC4uLnByb3BzTWVtbyxcclxuICAgIGNyZWF0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHNNZW1vLmNyZWF0ZWRBdCksXHJcbiAgfTtcclxuICAvLyBjb25zdCBtZW1vSW1nVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcclxuICAvLyBjb25zdCBtZW1vc051bSA9IG1lbW9zLmxlbmd0aDtcclxuXHJcbiAgY29uc3QgZm9vdGVyRW5kID0gU2hhcmVGb290ZXJFbmQucmVwbGFjZSgne1VzZXJOYW1lfScsIFVzZXJOYW1lKTtcclxuICBjb25zdCBmb290ZXJTdGFydCA9IFNoYXJlRm9vdGVyU3RhcnQucmVwbGFjZSgne01lbW9zTnVtfScsIG1lbW9zLmxlbmd0aC50b1N0cmluZygpKS5yZXBsYWNlKFxyXG4gICAgJ3tVc2VkRGF5fScsXHJcbiAgICBjcmVhdGVkRGF5cy50b1N0cmluZygpLFxyXG4gICk7XHJcblxyXG4gIGxldCBleHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gIGxldCBpbnRlcm5hbEltYWdlVXJscyA9IFtdO1xyXG4gIGxldCBhbGxNYXJrZG93bkxpbms6IHN0cmluZyB8IGFueVtdID0gW107XHJcbiAgbGV0IGFsbEludGVybmFsTGluayA9IFtdIGFzIGFueVtdO1xyXG4gIGlmIChJTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xyXG4gICAgbGV0IGFsbEV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XHJcbiAgICBsZXQgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XHJcbiAgICBpZiAoTUFSS0RPV05fVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgICAgYWxsTWFya2Rvd25MaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTUFSS0RPV05fVVJMX1JFRykpO1xyXG4gICAgfVxyXG4gICAgaWYgKFdJS0lfSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgICAgYWxsSW50ZXJuYWxMaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goV0lLSV9JTUFHRV9VUkxfUkVHKSk7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcclxuICAgIGlmIChNQVJLRE9XTl9XRUJfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgICAgYWxsRXh0ZXJuYWxJbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChNQVJLRE9XTl9XRUJfVVJMX1JFRykpO1xyXG4gICAgfVxyXG4gICAgaWYgKGFsbEludGVybmFsTGluay5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxJbnRlcm5hbExpbmsubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgb25lID0gYWxsSW50ZXJuYWxMaW5rW2ldO1xyXG4gICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0V2lraUludGVybmFsTGluayhvbmUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGFsbE1hcmtkb3duTGluay5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxNYXJrZG93bkxpbmsubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgdHdvID0gYWxsTWFya2Rvd25MaW5rW2ldO1xyXG4gICAgICAgIGlmICgvKC4qKWh0dHBbc10/KC4qKS8udGVzdCh0d28pKSB7XHJcbiAgICAgICAgICBhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMucHVzaChNQVJLRE9XTl9VUkxfUkVHLmV4ZWModHdvKT8uWzVdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaW50ZXJuYWxJbWFnZVVybHMucHVzaChkZXRlY3RNREludGVybmFsTGluayh0d28pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGV4dGVybmFsSW1hZ2VVcmxzID0gYWxsRXh0ZXJuYWxJbWFnZVVybHMuY29uY2F0KGFub3RoZXJFeHRlcm5hbEltYWdlVXJscyk7XHJcbiAgICAvLyBleHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IFtzaG9ydGN1dEltZ1VybCwgc2V0U2hvcnRjdXRJbWdVcmxdID0gdXNlU3RhdGUoJycpO1xyXG4gIGNvbnN0IFtpbWdBbW91bnQsIHNldEltZ0Ftb3VudF0gPSB1c2VTdGF0ZShleHRlcm5hbEltYWdlVXJscy5sZW5ndGgpO1xyXG4gIGNvbnN0IG1lbW9FbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoaW1nQW1vdW50ID4gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQmFja2dyb3VuZEltYWdlKCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghbWVtb0VsUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzaGFyZURpYWxvZ0JhY2tncm91bmRDb2xvcjtcclxuXHJcbiAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTmFtZS5jb250YWlucygndGhlbWUtZGFyaycpKSB7XHJcbiAgICAgICAgc2hhcmVEaWFsb2dCYWNrZ3JvdW5kQ29sb3IgPSAnIzcyNzE3MSc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2hhcmVEaWFsb2dCYWNrZ3JvdW5kQ29sb3IgPSAnI2VhZWFlYSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRvSW1hZ2UobWVtb0VsUmVmLmN1cnJlbnQsIHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNoYXJlRGlhbG9nQmFja2dyb3VuZENvbG9yLFxyXG4gICAgICAgIHBpeGVsUmF0aW86IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogMixcclxuICAgICAgfSlcclxuICAgICAgICAudGhlbigodXJsKSA9PiB7XHJcbiAgICAgICAgICBzZXRTaG9ydGN1dEltZ1VybCh1cmwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgIC8vIGRvIG50aFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgQU5JTUFUSU9OX0RVUkFUSU9OKTtcclxuICB9LCBbaW1nQW1vdW50XSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNsb3NlQnRuQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICBkZXN0cm95KCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgY29udmVydEJhc2U2NFRvQmxvYiA9IChiYXNlNjQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBieXRlcyA9IHdpbmRvdy5hdG9iKGJhc2U2NCk7XHJcbiAgICBjb25zdCBhYiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xyXG4gICAgY29uc3QgaWEgPSBuZXcgVWludDhBcnJheShhYik7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlhW2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbYWJdLCB7dHlwZTogdHlwZX0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGNvbnZlcnRCYWNrZ3JvdW5kVG9CYXNlNjQgPSBhc3luYyAocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcclxuICAgIGNvbnN0IHt2YXVsdH0gPSBkYWlseU5vdGVzU2VydmljZS5nZXRTdGF0ZSgpLmFwcDtcclxuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHZhdWx0LmFkYXB0ZXIucmVhZEJpbmFyeShwYXRoKTtcclxuICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcblxyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFthcnJdLCB7dHlwZTogJ2ltYWdlL3BuZyd9KTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBiYXNlNjRVcmwgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcclxuICAgICAgICAvLyBjYWNoZWRSZXNvdXJjZU1hcC5zZXQodXJsLCBiYXNlNjRVcmwpO1xyXG4gICAgICAgIHJlc29sdmUoYmFzZTY0VXJsKTtcclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBjaGFuZ2VCYWNrZ3JvdW5kSW1hZ2UgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCB7YXBwfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XHJcbiAgICBsZXQgaW1hZ2VVcmw7XHJcbiAgICBsZXQgaW1hZ2VQYXRoO1xyXG4gICAgY29uc3QgbGlnaHRCYWNrZ3JvdW5kSW1hZ2UgPSBlbmNvZGVVUkkobGlnaHRCYWNrZ3JvdW5kKTtcclxuICAgIGNvbnN0IGRhcmtCYWNrZ3JvdW5kSW1hZ2UgPSBlbmNvZGVVUkkoZGFya0JhY2tncm91bmQpO1xyXG4gICAgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NOYW1lLmNvbnRhaW5zKCd0aGVtZS1saWdodCcpKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKERlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZSkpICYmXHJcbiAgICAgICAgL1xcLihwbmd8c3ZnfGpwZ3xqcGVnKS9nLnRlc3QoRGVmYXVsdExpZ2h0QmFja2dyb3VuZEltYWdlKVxyXG4gICAgICApIHtcclxuICAgICAgICBpbWFnZVBhdGggPSBEZWZhdWx0TGlnaHRCYWNrZ3JvdW5kSW1hZ2U7XHJcbiAgICAgICAgaW1hZ2VVcmwgPSBhd2FpdCBjb252ZXJ0QmFja2dyb3VuZFRvQmFzZTY0KGltYWdlUGF0aCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW1hZ2VVcmwgPSBsaWdodEJhY2tncm91bmRJbWFnZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTmFtZS5jb250YWlucygndGhlbWUtZGFyaycpKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKERlZmF1bHREYXJrQmFja2dyb3VuZEltYWdlKSkgJiZcclxuICAgICAgICAvXFwuKHBuZ3xzdmd8anBnfGpwZWcpL2cudGVzdChEZWZhdWx0RGFya0JhY2tncm91bmRJbWFnZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgaW1hZ2VQYXRoID0gRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2U7XHJcbiAgICAgICAgaW1hZ2VVcmwgPSBhd2FpdCBjb252ZXJ0QmFja2dyb3VuZFRvQmFzZTY0KGltYWdlUGF0aCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW1hZ2VVcmwgPSBkYXJrQmFja2dyb3VuZEltYWdlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBtZW1vU2hhcmVEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZGlhbG9nLXdyYXBwZXIgLm1lbW8tYmFja2dyb3VuZCAucHJvcGVydHktaW1hZ2UnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIG1lbW9TaGFyZURpdi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBcInVybCgnXCIgKyBpbWFnZVVybCArIFwiJylcIjtcclxuICAgIGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTmFtZS5jb250YWlucygndGhlbWUtZGFyaycpKSB7XHJcbiAgICAgIG1lbW9TaGFyZURpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnIzFmMWYxZic7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQ29weXRvQ2xpcGJvYXJkQnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gICAgY29uc3QgZGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZW1vLXNob3J0Y3V0LWltZycpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3QgbXlCYXNlNjQgPSBkaXZzLmdldEF0dHJpYnV0ZSgnc3JjJykuc3BsaXQoJ2Jhc2U2NCwnKVsxXTtcclxuICAgIGNvbnN0IGJsb2JJbnB1dCA9IGNvbnZlcnRCYXNlNjRUb0Jsb2IobXlCYXNlNjQsICdpbWFnZS9wbmcnKTtcclxuICAgIGxldCBhRmlsZTogVEZpbGU7XHJcbiAgICBsZXQgbmV3RmlsZTtcclxuICAgIGlmIChBdXRvU2F2ZVdoZW5Pbk1vYmlsZSAmJiBQbGF0Zm9ybS5pc01vYmlsZSkge1xyXG4gICAgICBibG9iSW5wdXQuYXJyYXlCdWZmZXIoKS50aGVuKGFzeW5jIChidWZmZXIpID0+IHtcclxuICAgICAgICBjb25zdCBleHQgPSAncG5nJztcclxuICAgICAgICBjb25zdCBkYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcygpO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc3RyaW5nIGluIGRhaWx5Tm90ZXMpIHtcclxuICAgICAgICAgIGlmIChkYWlseU5vdGVzW3N0cmluZ10gaW5zdGFuY2VvZiBURmlsZSkge1xyXG4gICAgICAgICAgICBhRmlsZSA9IGRhaWx5Tm90ZXNbc3RyaW5nXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhRmlsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBuZXdGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlQmluYXJ5KFxyXG4gICAgICAgICAgICAvL0B0cy1leHBlY3QtZXJyb3IsIHByaXZhdGUgbWV0aG9kXHJcbiAgICAgICAgICAgIGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhgUGFzdGVkIEltYWdlICR7bW9tZW50KCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpfWAsIGV4dCwgYUZpbGUpLFxyXG4gICAgICAgICAgICBidWZmZXIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjbGlwYm9hcmRJdGVtSW5wdXQgPSBuZXcgQ2xpcGJvYXJkSXRlbSh7J2ltYWdlL3BuZyc6IGJsb2JJbnB1dH0pO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgd2luZG93Lm5hdmlnYXRvclsnY2xpcGJvYXJkJ10ud3JpdGUoW2NsaXBib2FyZEl0ZW1JbnB1dF0pO1xyXG4gICAgbmV3IE5vdGljZSgnU2VuZCB0byBjbGlwYm9hcmQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlSW1hZ2VPbkxvYWQgPSAoZXY6IFJlYWN0LlN5bnRoZXRpY0V2ZW50PEhUTUxJbWFnZUVsZW1lbnQ+KSA9PiB7XHJcbiAgICBpZiAoZXYudHlwZSA9PT0gJ2Vycm9yJykge1xyXG4gICAgICBuZXcgTm90aWNlKCfmnInkuKrlm77niYfliqDovb3lpLHotKXkuobwn5ifJyk7XHJcbiAgICAgIChldi50YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgICBzZXRJbWdBbW91bnQoaW1nQW1vdW50IC0gMSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlhbG9nLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn6WwPC9zcGFuPlxyXG4gICAgICAgICAge3QoJ1NoYXJlIE1lbW8gSW1hZ2UnKX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG4tZ3JvdXBcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGNvcHktYnRuXCIgb25DbGljaz17aGFuZGxlQ29weXRvQ2xpcGJvYXJkQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtzaGFyZX0gLz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gY2xvc2UtYnRuXCIgb25DbGljaz17aGFuZGxlQ2xvc2VCdG5DbGlja30+XHJcbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Nsb3NlfSAvPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1jb250ZW50LWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgdGlwLXdvcmRzLWNvbnRhaW5lciAke3Nob3J0Y3V0SW1nVXJsID8gJ2ZpbmlzaCcgOiAnbG9hZGluZyd9YH0+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPntzaG9ydGN1dEltZ1VybCA/IHQoJ+KGl0NsaWNrIHRoZSBidXR0b24gdG8gc2F2ZScpIDogdCgnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLicpfTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY29udGFpbmVyXCIgcmVmPXttZW1vRWxSZWZ9PlxyXG4gICAgICAgICAgPE9ubHkgd2hlbj17c2hvcnRjdXRJbWdVcmwgIT09ICcnfT5cclxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJtZW1vLXNob3J0Y3V0LWltZ1wiIHNyYz17c2hvcnRjdXRJbWdVcmx9IC8+XHJcbiAgICAgICAgICA8L09ubHk+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tYmFja2dyb3VuZFwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicHJvcGVydHktaW1hZ2VcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kU2l6ZTogJ2NvdmVyJyxcclxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRSZXBlYXQ6ICduby1yZXBlYXQnLFxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgey8qIDxzcGFuIGNsYXNzTmFtZT1cInRpbWUtdGV4dFwiPnttZW1vLmNyZWF0ZWRBdFN0cn08L3NwYW4+ICovfVxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJiYWNrZ3JvdW5kLWNvbnRhaW5lclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1lbW8tY29udGVudC10ZXh0XCJcclxuICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogZm9ybWF0TWVtb0NvbnRlbnQobWVtby5jb250ZW50KX19XHJcbiAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgPE9ubHkgd2hlbj17ZXh0ZXJuYWxJbWFnZVVybHMubGVuZ3RoID4gMH0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICB7ZXh0ZXJuYWxJbWFnZVVybHMubWFwKChpbWdVcmwsIGlkeCkgPT4gKFxyXG4gICAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3NPcmlnaW49XCJhbm9ueW1vdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlY29kaW5nPVwiYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgIGtleT17aWR4fVxyXG4gICAgICAgICAgICAgICAgICAgIHNyYz17aW1nVXJsfVxyXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k9XCJuby1yZWZlcnJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgb25Mb2FkPXtoYW5kbGVJbWFnZU9uTG9hZH1cclxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yPXtoYW5kbGVJbWFnZU9uTG9hZH1cclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICkpfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L09ubHk+XHJcbiAgICAgICAgICAgIDxPbmx5IHdoZW49e2ludGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLWNvbnRhaW5lciBpbnRlcm5hbC1lbWJlZCBpbWFnZS1lbWJlZCBpcy1sb2FkZWRcIj5cclxuICAgICAgICAgICAgICAgIHtpbnRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgIDxpbWcga2V5PXtpZHh9IGNsYXNzTmFtZT1cIm1lbW8taW1nXCIgc3JjPXtpbWdVcmwucGF0aH0gYWx0PXtpbWdVcmwuYWx0VGV4dH0gcGF0aD17aW1nVXJsLmZpbGVQYXRofSAvPlxyXG4gICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvT25seT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3YXRlcm1hcmstY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHQgZm9vdGVyLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInByb3BlcnR5LXNvY2lhbC1pY29uc1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibmFtZS10ZXh0XCI+e2Zvb3RlclN0YXJ0fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHQgZm9vdGVyLWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibmFtZS10ZXh0XCI+e2Zvb3RlckVuZH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93U2hhcmVNZW1vSW1hZ2VEaWFsb2cobWVtbzogTW9kZWwuTWVtbyk6IHZvaWQge1xyXG4gIHNob3dEaWFsb2coXHJcbiAgICB7XHJcbiAgICAgIGNsYXNzTmFtZTogJ3NoYXJlLW1lbW8taW1hZ2UtZGlhbG9nJyxcclxuICAgIH0sXHJcbiAgICBTaGFyZU1lbW9JbWFnZURpYWxvZyxcclxuICAgIHttZW1vfSxcclxuICApO1xyXG59XHJcbiIsImltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xuaW1wb3J0IHtnZXREYWlseU5vdGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XG5cbmV4cG9ydCBjb25zdCBzaG93TWVtb0luRGFpbHlOb3RlcyA9IGFzeW5jIChtZW1vSWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHthcHAsIGRhaWx5Tm90ZXN9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcblxuICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQobWVtb0lkLnNsaWNlKDE0KSk7XG4gIGNvbnN0IG1lbW9EYXRlU3RyaW5nID0gbWVtb0lkLnNsaWNlKDAsIDE0KTtcbiAgY29uc3QgZGF0ZSA9IG1vbWVudChtZW1vRGF0ZVN0cmluZywgJ1lZWVlNTURESEhtbXNzJyk7XG4gIGNvbnN0IGZpbGUgPSBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcyk7XG4gIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5zcGxpdEFjdGl2ZUxlYWYoKTtcbiAgICBsZWFmLm9wZW5GaWxlKGZpbGUsIHtlU3RhdGU6IHtsaW5lOiBsaW5lTnVtfX0pO1xuICB9IGVsc2Uge1xuICAgIGxldCBsZWFmID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgIGlmIChsZWFmID09PSBudWxsKSB7XG4gICAgICBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpO1xuICAgIH1cbiAgICBsZWFmLm9wZW5GaWxlKGZpbGUsIHtlU3RhdGU6IHtsaW5lOiBsaW5lTnVtfX0pO1xuICB9XG4gIHJldHVybjtcbn07XG4iLCJpbXBvcnQge21lbW8sIHVzZUNhbGxiYWNrfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7XHJcbiAgRklSU1RfVEFHX1JFRyxcclxuICBJTUFHRV9VUkxfUkVHLFxyXG4gIExJTktfUkVHLFxyXG4gIE1BUktET1dOX1VSTF9SRUcsXHJcbiAgTUFSS0RPV05fV0VCX1VSTF9SRUcsXHJcbiAgTURfTElOS19SRUcsXHJcbiAgTUVNT19MSU5LX1JFRyxcclxuICBUQUdfUkVHLFxyXG4gIFdJS0lfSU1BR0VfVVJMX1JFRyxcclxufSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XHJcbmltcG9ydCB7ZW5jb2RlSHRtbCwgcGFyc2VNYXJrZWRUb0h0bWwsIHBhcnNlUmF3VGV4dFRvSHRtbH0gZnJvbSAnLi4vaGVscGVycy9tYXJrZWQnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB1c2VUb2dnbGUgZnJvbSAnLi4vaG9va3MvdXNlVG9nZ2xlJztcclxuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIG1lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCBPbmx5IGZyb20gJy4vY29tbW9uL09ubHlXaGVuJztcclxuaW1wb3J0IEltYWdlIGZyb20gJy4vSW1hZ2UnO1xyXG5pbXBvcnQgc2hvd01lbW9DYXJkRGlhbG9nIGZyb20gJy4vTWVtb0NhcmREaWFsb2cnO1xyXG5pbXBvcnQgc2hvd1NoYXJlTWVtb0ltYWdlRGlhbG9nIGZyb20gJy4vU2hhcmVNZW1vSW1hZ2VEaWFsb2cnO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVtby5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtOb3RpY2UsIFRGaWxlLCBWYXVsdH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IHtzaG93TWVtb0luRGFpbHlOb3Rlc30gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iU2hvd01lbW8nO1xyXG5pbXBvcnQgbW9yZSBmcm9tICcuLi9pY29ucy9tb3JlLnN2Zyc7XHJcbmltcG9ydCB0YXNrIGZyb20gJy4uL2ljb25zL3Rhc2suc3ZnJztcclxuaW1wb3J0IHRhc2tCbGFuayBmcm9tICcuLi9pY29ucy90YXNrLWJsYW5rLnN2Zyc7XHJcbmltcG9ydCB7VXNlQnV0dG9uVG9TaG93RWRpdG9yLCBEZWZhdWx0RWRpdG9yTG9jYXRpb24sIFNob3dUYXNrTGFiZWx9IGZyb20gJy4uL21lbW9zJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbmludGVyZmFjZSBQcm9wcyB7XHJcbiAgbWVtbzogTW9kZWwuTWVtbztcclxufVxyXG5cclxuaW50ZXJmYWNlIExpbmtNYXRjaCB7XHJcbiAgbGlua1RleHQ6IHN0cmluZztcclxuICBhbHRUZXh0OiBzdHJpbmc7XHJcbiAgcGF0aDogc3RyaW5nO1xyXG4gIGZpbGVwYXRoPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UGF0aE9mSW1hZ2UgPSAodmF1bHQ6IFZhdWx0LCBpbWFnZTogVEZpbGUpID0+IHtcclxuICByZXR1cm4gdmF1bHQuZ2V0UmVzb3VyY2VQYXRoKGltYWdlKTtcclxufTtcclxuXHJcbmNvbnN0IGRldGVjdFdpa2lJbnRlcm5hbExpbmsgPSAobGluZVRleHQ6IHN0cmluZyk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xyXG4gIGNvbnN0IHttZXRhZGF0YUNhY2hlLCB2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XHJcbiAgY29uc3QgaW50ZXJuYWxGaWxlTmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzFdO1xyXG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xyXG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbEZpbGVOYW1lKSwgJycpO1xyXG4gIC8vIGNvbnNvbGUubG9nKGZpbGUucGF0aCk7XHJcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgIHBhdGg6ICcnLFxyXG4gICAgICBmaWxlcGF0aDogJycsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUucGF0aDtcclxuICAgIGlmIChpbnRlcm5hbEFsdE5hbWUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxyXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogJycsXHJcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxyXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RNREludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XHJcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcclxuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xyXG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IE1BUktET1dOX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsyXTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuICBpZiAoZmlsZSA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgcGF0aDogJycsXHJcbiAgICAgIGZpbGVwYXRoOiAnJyxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKHZhdWx0LCBmaWxlKTtcclxuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5wYXRoO1xyXG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IE1lbW86IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcclxuICBjb25zdCB7bWVtbzogcHJvcHNNZW1vfSA9IHByb3BzO1xyXG4gIGNvbnN0IG1lbW86IEZvcm1hdHRlZE1lbW8gPSB7XHJcbiAgICAuLi5wcm9wc01lbW8sXHJcbiAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKHByb3BzTWVtby5jcmVhdGVkQXQpLFxyXG4gIH07XHJcbiAgY29uc3QgW3Nob3dDb25maXJtRGVsZXRlQnRuLCB0b2dnbGVDb25maXJtRGVsZXRlQnRuXSA9IHVzZVRvZ2dsZShmYWxzZSk7XHJcblxyXG4gIC8vIGNvbnN0IGltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcclxuXHJcbiAgbGV0IGV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XHJcbiAgbGV0IGludGVybmFsSW1hZ2VVcmxzID0gW107XHJcbiAgbGV0IGFsbE1hcmtkb3duTGluazogc3RyaW5nIHwgYW55W10gPSBbXTtcclxuICBsZXQgYWxsSW50ZXJuYWxMaW5rID0gW10gYXMgYW55W107XHJcbiAgaWYgKElNQUdFX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICBsZXQgYWxsRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcclxuICAgIGxldCBhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcclxuICAgIGlmIChNQVJLRE9XTl9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xyXG4gICAgICBhbGxNYXJrZG93bkxpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChNQVJLRE9XTl9VUkxfUkVHKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoV0lLSV9JTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xyXG4gICAgICBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIC8vIGNvbnN0IGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xyXG4gICAgaWYgKE1BUktET1dOX1dFQl9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xyXG4gICAgICBhbGxFeHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1dFQl9VUkxfUkVHKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoYWxsSW50ZXJuYWxMaW5rLmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEludGVybmFsTGluay5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBvbmUgPSBhbGxJbnRlcm5hbExpbmtbaV07XHJcbiAgICAgICAgaW50ZXJuYWxJbWFnZVVybHMucHVzaChkZXRlY3RXaWtpSW50ZXJuYWxMaW5rKG9uZSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoYWxsTWFya2Rvd25MaW5rLmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE1hcmtkb3duTGluay5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCB0d28gPSBhbGxNYXJrZG93bkxpbmtbaV07XHJcbiAgICAgICAgaWYgKC8oLiopaHR0cFtzXT8oLiopLy50ZXN0KHR3bykpIHtcclxuICAgICAgICAgIGFub3RoZXJFeHRlcm5hbEltYWdlVXJscy5wdXNoKE1BUktET1dOX1VSTF9SRUcuZXhlYyh0d28pPy5bNV0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdE1ESW50ZXJuYWxMaW5rKHR3bykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZXh0ZXJuYWxJbWFnZVVybHMgPSBhbGxFeHRlcm5hbEltYWdlVXJscy5jb25jYXQoYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzKTtcclxuICAgIC8vIGV4dGVybmFsSW1hZ2VVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goSU1BR0VfVVJMX1JFRykgPz8gW10pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaGFuZGxlU2hvd01lbW9TdG9yeURpYWxvZyA9ICgpID0+IHtcclxuICAgIHNob3dNZW1vQ2FyZERpYWxvZyhtZW1vKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVNYXJrTWVtb0NsaWNrID0gKCkgPT4ge1xyXG4gICAgaWYgKFVzZUJ1dHRvblRvU2hvd0VkaXRvciAmJiBEZWZhdWx0RWRpdG9yTG9jYXRpb24gPT09ICdCb3R0b20nKSB7XHJcbiAgICAgIGxldCBlbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICBcImRpdltkYXRhLXR5cGU9J21lbW9zX3ZpZXcnXSAudmlldy1jb250ZW50IC5tZW1vLXNob3ctZWRpdG9yLWJ1dHRvblwiLFxyXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAodHlwZW9mIGVsZW0ub25jbGljayA9PSAnZnVuY3Rpb24nICYmIGVsZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGVsZW0ub25jbGljay5hcHBseShlbGVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRNYXJrTWVtb0lkKG1lbW8uaWQpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUVkaXRNZW1vQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICBpZiAoVXNlQnV0dG9uVG9TaG93RWRpdG9yICYmIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScpIHtcclxuICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgIFwiZGl2W2RhdGEtdHlwZT0nbWVtb3NfdmlldyddIC52aWV3LWNvbnRlbnQgLm1lbW8tc2hvdy1lZGl0b3ItYnV0dG9uXCIsXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGlmICh0eXBlb2YgZWxlbS5vbmNsaWNrID09ICdmdW5jdGlvbicgJiYgZWxlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZWxlbS5vbmNsaWNrLmFwcGx5KGVsZW0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEVkaXRNZW1vSWQobWVtby5pZCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlU291cmNlTWVtb0NsaWNrID0gKCkgPT4ge1xyXG4gICAgc2hvd01lbW9JbkRhaWx5Tm90ZXMobWVtby5pZCk7XHJcbiAgfTtcclxuXHJcbiAgLy8gY29uc3QgaGFuZGxlQ3JlYXRlTmV3Tm90ZUNsaWNrID0gKCkgPT4ge1xyXG4gIC8vICAgdHVybkludG9Ob3RlKG1lbW8uaWQpO1xyXG4gIC8vIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZURlbGV0ZU1lbW9DbGljayA9IGFzeW5jICgpID0+IHtcclxuICAgIGlmIChzaG93Q29uZmlybURlbGV0ZUJ0bikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IG1lbW9TZXJ2aWNlLmhpZGVNZW1vQnlJZChtZW1vLmlkKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChnbG9iYWxTdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKS5lZGl0TWVtb0lkID09PSBtZW1vLmlkKSB7XHJcbiAgICAgICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEVkaXRNZW1vSWQoJycpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b2dnbGVDb25maXJtRGVsZXRlQnRuKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTW91c2VMZWF2ZU1lbW9XcmFwcGVyID0gKCkgPT4ge1xyXG4gICAgaWYgKHNob3dDb25maXJtRGVsZXRlQnRuKSB7XHJcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oZmFsc2UpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUdlbk1lbW9JbWFnZUJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgc2hvd1NoYXJlTWVtb0ltYWdlRGlhbG9nKG1lbW8pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZU1lbW9UeXBlU2hvdyA9ICgpID0+IHtcclxuICAgIGlmKCFTaG93VGFza0xhYmVsKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKG1lbW8ubWVtb1R5cGUgPT09ICdUQVNLLVRPRE8nKSB7XHJcbiAgICAgIHJldHVybiB0YXNrQmxhbms7XHJcbiAgICB9ZWxzZSBpZihtZW1vLm1lbW9UeXBlID09PSAnVEFTSy1ET05FJyl7XHJcbiAgICAgIHJldHVybiB0YXNrO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZU1lbW9LZXlEb3duID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XHJcbiAgICAgIGhhbmRsZVNvdXJjZU1lbW9DbGljaygpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTWVtb0RvdWJsZUNsaWNrID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgaGFuZGxlRWRpdE1lbW9DbGljaygpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTWVtb0NvbnRlbnRDbGljayA9IGFzeW5jIChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCB0YXJnZXRFbCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmICh0YXJnZXRFbC5jbGFzc05hbWUgPT09ICdtZW1vLWxpbmstdGV4dCcpIHtcclxuICAgICAgY29uc3QgbWVtb0lkID0gdGFyZ2V0RWwuZGF0YXNldD8udmFsdWU7XHJcbiAgICAgIGNvbnN0IG1lbW9UZW1wID0gbWVtb1NlcnZpY2UuZ2V0TWVtb0J5SWQobWVtb0lkID8/ICcnKTtcclxuXHJcbiAgICAgIGlmIChtZW1vVGVtcCkge1xyXG4gICAgICAgIHNob3dNZW1vQ2FyZERpYWxvZyhtZW1vVGVtcCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV3IE5vdGljZSgnTUVNTyBOb3QgRm91bmQnKTtcclxuICAgICAgICB0YXJnZXRFbC5jbGFzc0xpc3QucmVtb3ZlKCdtZW1vLWxpbmstdGV4dCcpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRhcmdldEVsLmNsYXNzTmFtZSA9PT0gJ3RvZG8tYmxvY2snKSB7XHJcbiAgICAgIC8vIGRvIG50aFxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzTmFtZT17YG1lbW8td3JhcHBlciAkeydtZW1vcy0nICsgbWVtby5pZH0gJHttZW1vLm1lbW9UeXBlfWB9XHJcbiAgICAgIG9uTW91c2VMZWF2ZT17aGFuZGxlTW91c2VMZWF2ZU1lbW9XcmFwcGVyfVxyXG4gICAgICBvbk1vdXNlRG93bj17aGFuZGxlTWVtb0tleURvd259XHJcbiAgICAgIG9uRG91YmxlQ2xpY2s9e2hhbmRsZU1lbW9Eb3VibGVDbGlja31cclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLXRvcC13cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLXRvcC1sZWZ0LXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpbWUtdGV4dFwiIG9uQ2xpY2s9e2hhbmRsZVNob3dNZW1vU3RvcnlEaWFsb2d9PlxyXG4gICAgICAgICAgICB7bWVtby5jcmVhdGVkQXRTdHJ9XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YG1lbW8tdHlwZS1pbWcgJHsobWVtby5tZW1vVHlwZSA9PT0gJ1RBU0stVE9ETycgfHwgbWVtby5tZW1vVHlwZSA9PT0gJ1RBU0stRE9ORScpICYmIFNob3dUYXNrTGFiZWwgPyAnJyA6ICdoaWRkZW4nfWB9PlxyXG4gICAgICAgICAgICA8aW1nIHNyYz17aGFuZGxlTWVtb1R5cGVTaG93KCkgPz8gJyd9IGFsdD1cIm1lbW8tdHlwZVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4gbW9yZS1hY3Rpb24tYnRuXCI+XHJcbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21vcmV9IC8+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17aGFuZGxlU2hvd01lbW9TdG9yeURpYWxvZ30+XHJcbiAgICAgICAgICAgICAgICB7dCgnUkVBRCcpfVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVNYXJrTWVtb0NsaWNrfT5cclxuICAgICAgICAgICAgICAgIHt0KCdNQVJLJyl9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9e2hhbmRsZUdlbk1lbW9JbWFnZUJ0bkNsaWNrfT5cclxuICAgICAgICAgICAgICAgIHt0KCdTSEFSRScpfVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVFZGl0TWVtb0NsaWNrfT5cclxuICAgICAgICAgICAgICAgIHt0KCdFRElUJyl9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNvdXJjZU1lbW9DbGlja30+XHJcbiAgICAgICAgICAgICAgICB7dCgnU09VUkNFJyl9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BidG4gZGVsZXRlLWJ0biAke3Nob3dDb25maXJtRGVsZXRlQnRuID8gJ2ZpbmFsLWNvbmZpcm0nIDogJyd9YH1cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZURlbGV0ZU1lbW9DbGlja31cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7c2hvd0NvbmZpcm1EZWxldGVCdG4gPyB0KCdDT05GSVJN77yBJykgOiB0KCdERUxFVEUnKX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3NOYW1lPVwibWVtby1jb250ZW50LXRleHRcIlxyXG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbW9Db250ZW50Q2xpY2t9XHJcbiAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KG1lbW8uY29udGVudCwgbWVtby5pZCl9fVxyXG4gICAgICA+PC9kaXY+XHJcbiAgICAgIDxPbmx5IHdoZW49e2V4dGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLXdyYXBwZXJcIj5cclxuICAgICAgICAgIHtleHRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgIDxJbWFnZSBhbHQ9XCJcIiBrZXk9e2lkeH0gY2xhc3NOYW1lPVwibWVtby1pbWdcIiBpbWdVcmw9e2ltZ1VybH0gcmVmZXJyZXJQb2xpY3k9XCJuby1yZWZlcnJlclwiIC8+XHJcbiAgICAgICAgICApKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9Pbmx5PlxyXG4gICAgICA8T25seSB3aGVuPXtpbnRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxyXG4gICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgPEltYWdlXHJcbiAgICAgICAgICAgICAga2V5PXtpZHh9XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWVtby1pbWdcIlxyXG4gICAgICAgICAgICAgIGltZ1VybD17aW1nVXJsLnBhdGh9XHJcbiAgICAgICAgICAgICAgYWx0PXtpbWdVcmwuYWx0VGV4dH1cclxuICAgICAgICAgICAgICBmaWxlcGF0aD17aW1nVXJsLmZpbGVwYXRofVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT5cclxuICAgICAgey8qIDxPbmx5IHdoZW49e2ltYWdlVXJscy5sZW5ndGggPiAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICB7aW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgPEltYWdlIGNsYXNzTmFtZT1cIm1lbW8taW1nXCIga2V5PXtpZHh9IGltZ1VybD17aW1nVXJsfSAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT4gKi99XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE1lbW9Db250ZW50KGNvbnRlbnQ6IHN0cmluZywgbWVtb2lkPzogc3RyaW5nKSB7XHJcbiAgY29udGVudCA9IGVuY29kZUh0bWwoY29udGVudCk7XHJcbiAgY29udGVudCA9IHBhcnNlUmF3VGV4dFRvSHRtbChjb250ZW50KVxyXG4gICAgLnNwbGl0KCc8YnI+JylcclxuICAgIC5tYXAoKHQpID0+IHtcclxuICAgICAgcmV0dXJuIGA8cD4ke3QgIT09ICcnID8gdCA6ICc8YnI+J308L3A+YDtcclxuICAgIH0pXHJcbiAgICAuam9pbignJyk7XHJcblxyXG4gIGNvbnN0IHtzaG91bGRVc2VNYXJrZG93blBhcnNlciwgc2hvdWxkSGlkZUltYWdlVXJsfSA9IGdsb2JhbFN0YXRlU2VydmljZS5nZXRTdGF0ZSgpO1xyXG5cclxuICBpZiAoc2hvdWxkVXNlTWFya2Rvd25QYXJzZXIpIHtcclxuICAgIGNvbnRlbnQgPSBwYXJzZU1hcmtlZFRvSHRtbChjb250ZW50LCBtZW1vaWQpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHNob3VsZEhpZGVJbWFnZVVybCkge1xyXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShXSUtJX0lNQUdFX1VSTF9SRUcsICcnKS5yZXBsYWNlKE1BUktET1dOX1VSTF9SRUcsICcnKS5yZXBsYWNlKElNQUdFX1VSTF9SRUcsICcnKTtcclxuICB9XHJcblxyXG4gIC8vIGNvbnNvbGUubG9nKGNvbnRlbnQpO1xyXG5cclxuICAvLyDkuK3oi7HmlofkuYvpl7TliqDnqbrmoLxcclxuICAvLyBpZiAoc2hvdWxkU3BsaXRNZW1vV29yZCkge1xyXG4gIC8vICAgY29udGVudCA9IGNvbnRlbnRcclxuICAvLyAgICAgLnJlcGxhY2UoLyhbXFx1NGUwMC1cXHU5ZmE1XSkoW0EtWmEtejAtOT8uLDtbXFxdXSspL2csIFwiJDEgJDJcIilcclxuICAvLyAgICAgLnJlcGxhY2UoLyhbQS1aYS16MC05Py4sO1tcXF1dKykoW1xcdTRlMDAtXFx1OWZhNV0pL2csIFwiJDEgJDJcIik7XHJcbiAgLy8gfVxyXG5cclxuICBjb250ZW50ID0gY29udGVudFxyXG4gICAgLnJlcGxhY2UoVEFHX1JFRywgXCI8c3BhbiBjbGFzcz0ndGFnLXNwYW4nPiMkMTwvc3Bhbj5cIilcclxuICAgIC5yZXBsYWNlKEZJUlNUX1RBR19SRUcsIFwiPHA+PHNwYW4gY2xhc3M9J3RhZy1zcGFuJz4jJDI8L3NwYW4+XCIpXHJcbiAgICAucmVwbGFjZShMSU5LX1JFRywgXCIkMTxhIGNsYXNzPSdsaW5rJyB0YXJnZXQ9J19ibGFuaycgcmVsPSdub3JlZmVycmVyJyBocmVmPSckMic+JDI8L2E+XCIpXHJcbiAgICAucmVwbGFjZShNRF9MSU5LX1JFRywgXCI8YSBjbGFzcz0nbGluaycgdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9yZWZlcnJlcicgaHJlZj0nJDInPiQxPC9hPlwiKVxyXG4gICAgLnJlcGxhY2UoTUVNT19MSU5LX1JFRywgXCI8c3BhbiBjbGFzcz0nbWVtby1saW5rLXRleHQnIGRhdGEtdmFsdWU9JyQyJz4kMTwvc3Bhbj5cIik7XHJcblxyXG4gIC8vIGNvbnN0IGNvbnRlbnRNYXJrID0gY29udGVudC5zcGxpdCgnJyk7XHJcblxyXG4gIC8vIGlmKC8oLiopPGEoLiopL2cudGVzdChjb250ZW50KSl7XHJcblxyXG4gIC8vIH1cclxuICAvLyAgIGZvcihsZXQgaT0wOyBpPGNvbnRlbnQubGVuZ3RoO2krKyl7XHJcbiAgLy8gICAgIGxldCBtYXJrID0gZmFsc2U7XHJcbiAgLy8gICAgIGxldCBhTWFyayA9IGZhbHNlO1xyXG4gIC8vICAgICBpZihjb250ZW50TWFya1tpXSlcclxuICAvLyAgIH1cclxuXHJcbiAgY29uc3QgdGVtcERpdkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gIHRlbXBEaXZDb250YWluZXIuaW5uZXJIVE1MID0gY29udGVudDtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBEaXZDb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGMgPSB0ZW1wRGl2Q29udGFpbmVyLmNoaWxkcmVuW2ldO1xyXG5cclxuICAgIGlmIChjLnRhZ05hbWUgPT09ICdQJyAmJiBjLnRleHRDb250ZW50ID09PSAnJyAmJiBjLmZpcnN0RWxlbWVudENoaWxkPy50YWdOYW1lICE9PSAnQlInKSB7XHJcbiAgICAgIGMucmVtb3ZlKCk7XHJcbiAgICAgIGktLTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGVtcERpdkNvbnRhaW5lci5pbm5lckhUTUw7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG1lbW8oTWVtbyk7XHJcbiIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlLCBtZW1vU2VydmljZSwgcXVlcnlTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7RklSU1RfVEFHX1JFRywgSU1BR0VfVVJMX1JFRywgTElOS19SRUcsIE1FTU9fTElOS19SRUcsIE5PUF9GSVJTVF9UQUdfUkVHLCBUQUdfUkVHfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0IHtjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnN9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcclxuaW1wb3J0IE1lbW8gZnJvbSAnLi9NZW1vJztcclxuLy8gaW1wb3J0IHRvYXN0SGVscGVyIGZyb20gXCIuL1RvYXN0XCI7XHJcbmltcG9ydCAnLi4vbGVzcy9tZW1vbGlzdC5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IGRhaWx5Tm90ZXNTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2RhaWx5Tm90ZXNTZXJ2aWNlJztcclxuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XHJcbmltcG9ydCB7Tm90aWNlLCBQbGF0Zm9ybX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQge0hpZGVEb25lVGFza3N9IGZyb20gJy4uL21lbW9zJztcclxuLy8gaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuLy8gaW1wb3J0IHsgRGVmYXVsdEVkaXRvckxvY2F0aW9uIH0gZnJvbSAnLi4vbWVtb3MnO1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIHt9XHJcblxyXG5leHBvcnQgbGV0IGNvcHlTaG93bk1lbW9zOiBNb2RlbC5NZW1vW107XHJcblxyXG5jb25zdCBNZW1vTGlzdDogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIGxvY2F0aW9uU3RhdGU6IHtxdWVyeX0sXHJcbiAgICBtZW1vU3RhdGU6IHttZW1vc30sXHJcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XHJcbiAgLy8gbGV0IHJldmVyc2VNZW1vczogTW9kZWwuTWVtb1tdO1xyXG4gIC8vIGlmKERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gXCJCb3R0b21cIiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDg3NSAmJiBQbGF0Zm9ybS5pc01vYmlsZSl7XHJcbiAgLy8gICByZXZlcnNlTWVtb3MgPSBtZW1vcy5yZXZlcnNlKCk7XHJcbiAgLy8gfVxyXG4gIGNvbnN0IFtpc0ZldGNoaW5nLCBzZXRGZXRjaFN0YXR1c10gPSB1c2VTdGF0ZSh0cnVlKTtcclxuICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XHJcbiAgY29uc3Qge3RhZzogdGFnUXVlcnksIGR1cmF0aW9uLCB0eXBlOiBtZW1vQ29udGVudFR5cGUsIHRleHQ6IHRleHRRdWVyeSwgZmlsdGVyOiBxdWVyeUlkfSA9IHF1ZXJ5O1xyXG4gIC8vIGNvbnN0IHNob3dNZW1vRmlsdGVyID0gQm9vbGVhbih0YWdRdWVyeSB8fCAoZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvKSB8fCBtZW1vVHlwZSB8fCB0ZXh0UXVlcnkgfHwgcXVlcnlJZCk7XHJcbiAgY29uc3QgcXVlcnlGaWx0ZXIgPSBxdWVyeVNlcnZpY2UuZ2V0UXVlcnlCeUlkKHF1ZXJ5SWQpO1xyXG4gIGNvbnN0IHNob3dNZW1vRmlsdGVyID0gQm9vbGVhbihcclxuICAgIHRhZ1F1ZXJ5IHx8IChkdXJhdGlvbiAmJiBkdXJhdGlvbi5mcm9tIDwgZHVyYXRpb24udG8pIHx8IG1lbW9Db250ZW50VHlwZSB8fCB0ZXh0UXVlcnkgfHwgcXVlcnlGaWx0ZXIsXHJcbiAgKTtcclxuXHJcbiAgY29uc3Qgc2hvd25NZW1vcyA9XHJcbiAgICBzaG93TWVtb0ZpbHRlciB8fCBxdWVyeUZpbHRlciB8fCBIaWRlRG9uZVRhc2tzXHJcbiAgICAgID8gbWVtb3MuZmlsdGVyKChtZW1vKSA9PiB7XHJcbiAgICAgICAgICBsZXQgc2hvdWxkU2hvdyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgaWYgKG1lbW8ubWVtb1R5cGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoSGlkZURvbmVUYXNrcyAmJiBtZW1vLm1lbW9UeXBlID09PSAnVEFTSy1ET05FJykge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChxdWVyeUZpbHRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gSlNPTi5wYXJzZShxdWVyeUZpbHRlci5xdWVyeXN0cmluZykgYXMgRmlsdGVyW107XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGNoZWNrU2hvdWxkU2hvd01lbW9XaXRoRmlsdGVycyhtZW1vLCBmaWx0ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0YWdRdWVyeSkge1xyXG4gICAgICAgICAgICBjb25zdCB0YWdzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA/PyBbXSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoVEFHX1JFRywgJyQxJykudHJpbSgpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGFnLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHRlbXAgPSAnJztcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRlbXAgKz0gaTtcclxuICAgICAgICAgICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSAnLyc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChOT1BfRklSU1RfVEFHX1JFRykgPz8gW10pKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFnID0gdC5yZXBsYWNlKE5PUF9GSVJTVF9UQUdfUkVHLCAnJDEnKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICBsZXQgdGVtcCA9ICcnO1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFnc1NldC5hZGQodGVtcCk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wICs9ICcvJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKEZJUlNUX1RBR19SRUcpID8/IFtdKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRhZyA9IHQucmVwbGFjZShGSVJTVF9UQUdfUkVHLCAnJDInKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICBsZXQgdGVtcCA9ICcnO1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFnc1NldC5hZGQodGVtcCk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wICs9ICcvJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0YWdzU2V0Lmhhcyh0YWdRdWVyeSkpIHtcclxuICAgICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgZHVyYXRpb24gJiZcclxuICAgICAgICAgICAgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvICYmXHJcbiAgICAgICAgICAgICh1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUobWVtby5jcmVhdGVkQXQpIDwgZHVyYXRpb24uZnJvbSB8fFxyXG4gICAgICAgICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShtZW1vLmNyZWF0ZWRBdCkgPiBkdXJhdGlvbi50bylcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobWVtb0NvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBtZW1vQ29udGVudFR5cGUgPT09ICdOT1RfVEFHR0VEJyAmJlxyXG4gICAgICAgICAgICAgIChtZW1vLmNvbnRlbnQubWF0Y2goVEFHX1JFRykgIT09IG51bGwgfHwgbWVtby5jb250ZW50Lm1hdGNoKE5PUF9GSVJTVF9UQUdfUkVHKSAhPT0gbnVsbClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lbW9Db250ZW50VHlwZSA9PT0gJ0xJTktFRCcgJiYgbWVtby5jb250ZW50Lm1hdGNoKExJTktfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1vQ29udGVudFR5cGUgPT09ICdJTUFHRUQnICYmIG1lbW8uY29udGVudC5tYXRjaChJTUFHRV9VUkxfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1vQ29udGVudFR5cGUgPT09ICdDT05ORUNURUQnICYmIG1lbW8uY29udGVudC5tYXRjaChNRU1PX0xJTktfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRleHRRdWVyeSAmJiAhbWVtby5jb250ZW50LmluY2x1ZGVzKHRleHRRdWVyeSkpIHtcclxuICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBzaG91bGRTaG93O1xyXG4gICAgICAgIH0pXHJcbiAgICAgIDogbWVtb3M7XHJcblxyXG4gIGNvcHlTaG93bk1lbW9zID0gc2hvd25NZW1vcztcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIG1lbW9TZXJ2aWNlXHJcbiAgICAgIC5mZXRjaEFsbE1lbW9zKClcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHNldEZldGNoU3RhdHVzKGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICBuZXcgTm90aWNlKCfwn5itIEZldGNoIEVycm9yJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgZGFpbHlOb3Rlc1NlcnZpY2VcclxuICAgICAgLmdldE15QWxsRGFpbHlOb3RlcygpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICBzZXRGZXRjaFN0YXR1cyhmYWxzZSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgbmV3IE5vdGljZSgn8J+YrSBGZXRjaCBEYWlseU5vdGVzIEVycm9yJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICB3cmFwcGVyRWxlbWVudC5jdXJyZW50Py5zY3JvbGxUbyh7dG9wOiAwfSk7XHJcbiAgfSwgW3F1ZXJ5XSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZU1lbW9MaXN0Q2xpY2sgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICAgIGNvbnN0IHt3b3Jrc3BhY2V9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldEVsID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKHRhcmdldEVsLnRhZ05hbWUgPT09ICdTUEFOJyAmJiB0YXJnZXRFbC5jbGFzc05hbWUgPT09ICd0YWctc3BhbicpIHtcclxuICAgICAgY29uc3QgdGFnTmFtZSA9IHRhcmdldEVsLmlubmVyVGV4dC5zbGljZSgxKTtcclxuICAgICAgY29uc3QgY3VyclRhZ1F1ZXJ5ID0gbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkudGFnO1xyXG4gICAgICBpZiAoY3VyclRhZ1F1ZXJ5ID09PSB0YWdOYW1lKSB7XHJcbiAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFRhZ1F1ZXJ5KCcnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0VGFnUXVlcnkodGFnTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGFyZ2V0RWwudGFnTmFtZSA9PT0gJ0EnICYmIHRhcmdldEVsLmNsYXNzTmFtZSA9PT0gJ2ludGVybmFsLWxpbmsnKSB7XHJcbiAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmlsZXBhdGgnKTtcclxuICAgICAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlKSB7XHJcbiAgICAgICAgd29ya3NwYWNlLm9wZW5MaW5rVGV4dChzb3VyY2VQYXRoLCBzb3VyY2VQYXRoLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgd29ya3NwYWNlLm9wZW5MaW5rVGV4dChzb3VyY2VQYXRoLCBzb3VyY2VQYXRoLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3NOYW1lPXtgbWVtb2xpc3Qtd3JhcHBlciAke2lzRmV0Y2hpbmcgPyAnJyA6ICdjb21wbGV0ZWQnfWB9XHJcbiAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbW9MaXN0Q2xpY2t9XHJcbiAgICAgIHJlZj17d3JhcHBlckVsZW1lbnR9XHJcbiAgICA+XHJcbiAgICAgIHtzaG93bk1lbW9zLm1hcCgobWVtbykgPT4gKFxyXG4gICAgICAgIDxNZW1vIGtleT17YCR7bWVtby5pZH0tJHttZW1vLnVwZGF0ZWRBdH1gfSBtZW1vPXttZW1vfSAvPlxyXG4gICAgICApKX1cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdGF0dXMtdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICA8cCBjbGFzc05hbWU9XCJzdGF0dXMtdGV4dFwiPlxyXG4gICAgICAgICAge2lzRmV0Y2hpbmdcclxuICAgICAgICAgICAgPyB0KCdGZXRjaGluZyBkYXRhLi4uJylcclxuICAgICAgICAgICAgOiBzaG93bk1lbW9zLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgICAgICA/IHQoJ05vb29vcCEnKVxyXG4gICAgICAgICAgICA6IHNob3dNZW1vRmlsdGVyXHJcbiAgICAgICAgICAgID8gJydcclxuICAgICAgICAgICAgOiB0KCdBbGwgRGF0YSBpcyBMb2FkZWQg8J+OiScpfVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVtb0xpc3Q7XHJcbiIsImltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7Z2V0RGFpbHlOb3RlU2V0dGluZ3N9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcbmltcG9ydCB7QWRkQmxhbmtMaW5lV2hlbkRhdGUsIFNob3dEYXRlLCBTaG93VGltZSwgRGVmYXVsdE1lbW9Db21wb3NpdGlvbn0gZnJvbSAnLi4vbWVtb3MnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldE1lbW9zQnlEYXRlID0gKG1lbW9zOiBNb2RlbC5NZW1vW10pID0+IHtcclxuICBjb25zdCBkYXRhQXJyID0gW10gYXMgYW55W107XHJcbiAgbWVtb3MubWFwKChtYXBJdGVtKSA9PiB7XHJcbiAgICBpZiAoZGF0YUFyci5sZW5ndGggPT0gMCkge1xyXG4gICAgICBkYXRhQXJyLnB1c2goe2RhdGU6IG1vbWVudChtYXBJdGVtLmNyZWF0ZWRBdCwgJ1lZWVkvTU0vREQgSEg6bW06c3MnKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgaGF2ZTogW21hcEl0ZW1dfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByZXMgPSBkYXRhQXJyLnNvbWUoKGl0ZW0pID0+IHtcclxuICAgICAgICAvL+WIpOaWreebuOWQjOaXpeacn++8jOacieWwsea3u+WKoOWIsOW9k+WJjemhuVxyXG4gICAgICAgIGlmIChpdGVtLmRhdGUgPT0gbW9tZW50KG1hcEl0ZW0uY3JlYXRlZEF0LCAnWVlZWS9NTS9ERCBISDptbTpzcycpLmZvcm1hdCgnWVlZWS1NTS1ERCcpKSB7XHJcbiAgICAgICAgICBpdGVtLmhhdmUucHVzaChtYXBJdGVtKTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmICghcmVzKSB7XHJcbiAgICAgICAgLy/lpoLmnpzmsqHmib7nm7jlkIzml6XmnJ/mt7vliqDkuIDkuKrmlrDlr7nosaFcclxuICAgICAgICBkYXRhQXJyLnB1c2goe2RhdGU6IG1vbWVudChtYXBJdGVtLmNyZWF0ZWRBdCwgJ1lZWVkvTU0vREQgSEg6bW06c3MnKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgaGF2ZTogW21hcEl0ZW1dfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIGRhdGFBcnI7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgdHJhbnNmZXJNZW1vc0ludG9UZXh0ID0gKGRhaWx5TWVtb3M6IEFycmF5PGFueT4pOiBzdHJpbmcgPT4ge1xyXG4gIGxldCBvdXRwdXRUZXh0ID0gJycgYXMgc3RyaW5nO1xyXG4gIGxldCBkYXRhQXJyID0gW10gYXMgYW55W107XHJcbiAgbGV0IGluZGVudCA9ICcnIGFzIHN0cmluZztcclxuICBjb25zdCB7Zm9ybWF0fSA9IGdldERhaWx5Tm90ZVNldHRpbmdzKCk7XHJcbiAgZGFpbHlNZW1vcy5tYXAoKG1hcEl0ZW0pID0+IHtcclxuICAgIGRhdGFBcnIgPSBtYXBJdGVtLmhhdmU7XHJcbiAgICBpZiAoU2hvd0RhdGUpIHtcclxuICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyAnLSBbWycgKyBtb21lbnQobWFwSXRlbS5kYXRlLCAnWVlZWS1NTS1ERCcpLmZvcm1hdChmb3JtYXQpICsgJ11dXFxuJztcclxuICAgICAgaW5kZW50ID0gJyAgICAnO1xyXG4gICAgfVxyXG4gICAgaWYgKFNob3dUaW1lKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHRpbWUgPSBtb21lbnQoZGF0YUFycltpXS5jcmVhdGVkQXQsICdZWVlZL01NL0REIEhIOm1tOnNzJykuZm9ybWF0KCdISDptbScpO1xyXG4gICAgICAgIGxldCBmb3JtYXRDb250ZW50O1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycgJiZcclxuICAgICAgICAgIC97VElNRX0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pICYmXHJcbiAgICAgICAgICAve0NPTlRFTlR9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZm9ybWF0Q29udGVudCA9IERlZmF1bHRNZW1vQ29tcG9zaXRpb24ucmVwbGFjZSgve1RJTUV9L2csIHRpbWUpLnJlcGxhY2UoL3tDT05URU5UfS9nLCBkYXRhQXJyW2ldLmNvbnRlbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmb3JtYXRDb250ZW50ID0gdGltZSArICcgJyArIGRhdGFBcnJbaV0uY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRhdGFBcnJbaV0ubWVtb1R5cGUgPT09ICdKT1VSTkFMJykge1xyXG4gICAgICAgICAgLy8gaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAvLyAgIGNvbnN0IGZvcm1hdGVkQ29udGVudCA9IGRhdGFBcnJbaV0uY29udGVudC5yZXBsYWNlKC88YnI+L2csICdcXG4gICAgJyk7XHJcbiAgICAgICAgICAvLyAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gJyArIHRpbWUgKyAnICcgKyBmb3JtYXRlZENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctICcgKyBmb3JtYXRDb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChkYXRhQXJyW2ldLm1lbW9UeXBlID09PSAnVEFTSy1UT0RPJykge1xyXG4gICAgICAgICAgICAvLyBpZiAoLzxicj4vZy50ZXN0KGRhdGFBcnJbaV0uY29udGVudCkpIHtcclxuICAgICAgICAgICAgLy8gICBjb25zdCBmb3JtYXRlZENvbnRlbnQgPSBkYXRhQXJyW2ldLmNvbnRlbnQucmVwbGFjZSgvPGJyPi9nLCAnXFxuICAgICcpO1xyXG4gICAgICAgICAgICAvLyAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gWyBdICcgKyB0aW1lICsgJyAnICsgZm9ybWF0ZWRDb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gWyBdICcgKyBmb3JtYXRDb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUFycltpXS5tZW1vVHlwZSA9PT0gJ1RBU0stRE9ORScpIHtcclxuICAgICAgICAgICAgLy8gaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgIC8vICAgY29uc3QgZm9ybWF0ZWRDb250ZW50ID0gZGF0YUFycltpXS5jb250ZW50LnJlcGxhY2UoLzxicj4vZywgJ1xcbiAgICAnKTtcclxuICAgICAgICAgICAgLy8gICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFt4XSAnICsgdGltZSArICcgJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFt4XSAnICsgZm9ybWF0Q29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0YXNrTWFyayA9IGRhdGFBcnJbaV0ubWVtb1R5cGUubWF0Y2goL1RBU0stKC4qKT8vZylbMV07XHJcbiAgICAgICAgICAgIC8vIGlmICgvPGJyPi9nLnRlc3QoZGF0YUFycltpXS5jb250ZW50KSkge1xyXG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZvcm1hdGVkQ29udGVudCA9IGRhdGFBcnJbaV0uY29udGVudC5yZXBsYWNlKC88YnI+L2csICdcXG4gICAgJyk7XHJcbiAgICAgICAgICAgIC8vICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbJyArIHRhc2tNYXJrICsgJ10gJyArIHRpbWUgKyAnICcgKyBmb3JtYXRlZENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbJyArIHRhc2tNYXJrICsgJ10gJyArIGZvcm1hdENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gY29uc3QgdGltZSA9IG1vbWVudChkYXRhQXJyW2ldLmNyZWF0ZWRBdCwgJ1lZWVkvTU0vREQgSEg6bW06c3MnKS5mb3JtYXQoJ0hIOm1tJyk7XHJcbiAgICAgICAgaWYgKGRhdGFBcnJbaV0ubWVtb1R5cGUgPT09ICdKT1VSTkFMJykge1xyXG4gICAgICAgICAgLy8gaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAvLyAgIGNvbnN0IGZvcm1hdGVkQ29udGVudCA9IGRhdGFBcnJbaV0uY29udGVudC5yZXBsYWNlKC88YnI+L2csICdcXG4gICAgJyk7XHJcbiAgICAgICAgICAvLyAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gJyArIGRhdGFBcnJbaV0uY29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZGF0YUFycltpXS5tZW1vVHlwZSA9PT0gJ1RBU0stVE9ETycpIHtcclxuICAgICAgICAgICAgLy8gaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgIC8vICAgY29uc3QgZm9ybWF0ZWRDb250ZW50ID0gZGF0YUFycltpXS5jb250ZW50LnJlcGxhY2UoLzxicj4vZywgJ1xcbiAgICAnKTtcclxuICAgICAgICAgICAgLy8gICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFsgXSAnICsgZm9ybWF0ZWRDb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gWyBdICcgKyBkYXRhQXJyW2ldLmNvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhQXJyW2ldLm1lbW9UeXBlID09PSAnVEFTSy1ET05FJykge1xyXG4gICAgICAgICAgICAvLyBpZiAoLzxicj4vZy50ZXN0KGRhdGFBcnJbaV0uY29udGVudCkpIHtcclxuICAgICAgICAgICAgLy8gICBjb25zdCBmb3JtYXRlZENvbnRlbnQgPSBkYXRhQXJyW2ldLmNvbnRlbnQucmVwbGFjZSgvPGJyPi9nLCAnXFxuICAgICcpO1xyXG4gICAgICAgICAgICAvLyAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gW3hdICcgKyBmb3JtYXRlZENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbeF0gJyArIGRhdGFBcnJbaV0uY29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0YXNrTWFyayA9IGRhdGFBcnJbaV0ubWVtb1R5cGUubWF0Y2goL1RBU0stKC4qKT8vZylbMV07XHJcbiAgICAgICAgICAgIC8vIGlmICgvPGJyPi9nLnRlc3QoZGF0YUFycltpXS5jb250ZW50KSkge1xyXG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZvcm1hdGVkQ29udGVudCA9IGRhdGFBcnJbaV0uY29udGVudC5yZXBsYWNlKC88YnI+L2csICdcXG4gICAgJyk7XHJcbiAgICAgICAgICAgIC8vICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbJyArIHRhc2tNYXJrICsgJ10gJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFsnICsgdGFza01hcmsgKyAnXSAnICsgZGF0YUFycltpXS5jb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChTaG93RGF0ZSAmJiBBZGRCbGFua0xpbmVXaGVuRGF0ZSkge1xyXG4gICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArICdcXG4nO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIGNvbnN0IHJlbW92ZUJyQ29udGVudCA9IG91dHB1dFRleHQucmVwbGFjZSgvPGJyPi9nLCAnXFxuICAgICcpO1xyXG4gIHJldHVybiByZW1vdmVCckNvbnRlbnQ7XHJcbn07XHJcbiIsImltcG9ydCB7dXNlQ29udGV4dH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlLCBxdWVyeVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xyXG5pbXBvcnQge2dldFRleHRXaXRoTWVtb1R5cGV9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcclxuaW1wb3J0ICcuLi9sZXNzL21lbW8tZmlsdGVyLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgY29weSBmcm9tICcuLi9pY29ucy9jb3B5LnN2Zyc7XHJcbmltcG9ydCB7Y29weVNob3duTWVtb3N9IGZyb20gJy4vTWVtb0xpc3QnO1xyXG5pbXBvcnQge2dldE1lbW9zQnlEYXRlLCB0cmFuc2Zlck1lbW9zSW50b1RleHR9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkNvcHlNZW1vcyc7XHJcbmltcG9ydCB7dH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgRmlsdGVyUHJvcHMge31cclxuXHJcbmNvbnN0IE1lbW9GaWx0ZXI6IFJlYWN0LkZDPEZpbHRlclByb3BzPiA9ICgpID0+IHtcclxuICBjb25zdCB7XHJcbiAgICBsb2NhdGlvblN0YXRlOiB7cXVlcnl9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG5cclxuICBjb25zdCB7dGFnOiB0YWdRdWVyeSwgZHVyYXRpb24sIHR5cGU6IG1lbW9UeXBlLCB0ZXh0OiB0ZXh0UXVlcnksIGZpbHRlcn0gPSBxdWVyeTtcclxuXHJcbiAgY29uc3QgcXVlcnlGaWx0ZXIgPSBxdWVyeVNlcnZpY2UuZ2V0UXVlcnlCeUlkKGZpbHRlcik7XHJcbiAgY29uc3Qgc2hvd0ZpbHRlciA9IEJvb2xlYW4oXHJcbiAgICB0YWdRdWVyeSB8fCAoZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvKSB8fCBtZW1vVHlwZSB8fCB0ZXh0UXVlcnkgfHwgcXVlcnlGaWx0ZXIsXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQ29weUNsaWNrID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKGNvcHlTaG93bk1lbW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgbWVtb3NCeURhdGUgPSBnZXRNZW1vc0J5RGF0ZShjb3B5U2hvd25NZW1vcyk7XHJcbiAgICAgIGNvbnN0IHF1ZXJ5RGFpbHlNZW1vcyA9IHRyYW5zZmVyTWVtb3NJbnRvVGV4dChtZW1vc0J5RGF0ZSk7XHJcbiAgICAgIGF3YWl0IHV0aWxzLmNvcHlUZXh0VG9DbGlwYm9hcmQocXVlcnlEYWlseU1lbW9zKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e2BmaWx0ZXItcXVlcnktY29udGFpbmVyICR7c2hvd0ZpbHRlciA/ICcnIDogJ2hpZGRlbid9YH0+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmlsdGVyLXF1ZXJ5XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGlwLXRleHRcIj5GSUxURVI6IDwvc3Bhbj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzc05hbWU9eydmaWx0ZXItaXRlbS1jb250YWluZXIgJyArIChxdWVyeUZpbHRlciA/ICcnIDogJ2hpZGRlbicpfVxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0TWVtb0ZpbHRlcignJyk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPvCflJY8L3NwYW4+IHtxdWVyeUZpbHRlcj8udGl0bGV9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3NOYW1lPXsnZmlsdGVyLWl0ZW0tY29udGFpbmVyICcgKyAodGFnUXVlcnkgPyAnJyA6ICdoaWRkZW4nKX1cclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFRhZ1F1ZXJ5KCcnKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvbi10ZXh0XCI+8J+Pt++4jzwvc3Bhbj4ge3RhZ1F1ZXJ5fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzTmFtZT17J2ZpbHRlci1pdGVtLWNvbnRhaW5lciAnICsgKG1lbW9UeXBlID8gJycgOiAnaGlkZGVuJyl9XHJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRNZW1vVHlwZVF1ZXJ5KCcnKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvbi10ZXh0XCI+8J+Tpjwvc3Bhbj4ge2dldFRleHRXaXRoTWVtb1R5cGUobWVtb1R5cGUgYXMgTWVtb1NwZWNUeXBlKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB7ZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvID8gKFxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmaWx0ZXItaXRlbS1jb250YWluZXJcIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldEZyb21BbmRUb1F1ZXJ5KDAsIDApO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn5eT77iPPC9zcGFuPiB7bW9tZW50KGR1cmF0aW9uLmZyb20sICd4JykuZm9ybWF0KCdZWVlZL01NL0REJyl9IHt0KCd0bycpfXsnICd9XHJcbiAgICAgICAgICAgIHttb21lbnQoZHVyYXRpb24udG8sICd4JykuYWRkKDEsICdkYXlzJykuZm9ybWF0KCdZWVlZL01NL0REJyl9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApIDogbnVsbH1cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzc05hbWU9eydmaWx0ZXItaXRlbS1jb250YWluZXIgJyArICh0ZXh0UXVlcnkgPyAnJyA6ICdoaWRkZW4nKX1cclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFRleHRRdWVyeSgnJyk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPvCflI08L3NwYW4+IHt0ZXh0UXVlcnl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvcHktbWVtb1wiPlxyXG4gICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2NvcHl9IG9uQ2xpY2s9e2hhbmRsZUNvcHlDbGlja30gLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVtb0ZpbHRlcjtcclxuIiwiaW1wb3J0IE1lbW9FZGl0b3IgZnJvbSAnLi4vY29tcG9uZW50cy9NZW1vRWRpdG9yJztcbmltcG9ydCBNZW1vc0hlYWRlciBmcm9tICcuLi9jb21wb25lbnRzL01lbW9zSGVhZGVyJztcbmltcG9ydCBNZW1vRmlsdGVyIGZyb20gJy4uL2NvbXBvbmVudHMvTWVtb0ZpbHRlcic7XG5pbXBvcnQgTWVtb0xpc3QgZnJvbSAnLi4vY29tcG9uZW50cy9NZW1vTGlzdCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtEZWZhdWx0RWRpdG9yTG9jYXRpb259IGZyb20gJy4uL21lbW9zJztcblxuZnVuY3Rpb24gTWVtb3MoKSB7XG4gIGlmIChQbGF0Zm9ybS5pc01vYmlsZSAmJiBEZWZhdWx0RWRpdG9yTG9jYXRpb24gPT09ICdCb3R0b20nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxNZW1vc0hlYWRlciAvPlxuICAgICAgICA8TWVtb0ZpbHRlciAvPlxuICAgICAgICA8TWVtb0xpc3QgLz5cbiAgICAgICAgPE1lbW9FZGl0b3IgLz5cbiAgICAgIDwvPlxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxNZW1vc0hlYWRlciAvPlxuICAgICAgICA8TWVtb0VkaXRvciAvPlxuICAgICAgICA8TWVtb0ZpbHRlciAvPlxuICAgICAgICA8TWVtb0xpc3QgLz5cbiAgICAgIDwvPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVtb3M7XG4iLCJpbXBvcnQge3VzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIHVzZUxvYWRpbmcoaW5pdGlhbFN0YXRlID0gdHJ1ZSkge1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlKHtpc0xvYWRpbmc6IGluaXRpYWxTdGF0ZSwgaXNGYWlsZWQ6IGZhbHNlLCBpc1N1Y2NlZWQ6IGZhbHNlfSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzZXRMb2FkaW5nOiAoKSA9PiB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgICAgIGlzRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgaXNTdWNjZWVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2V0RmluaXNoOiAoKSA9PiB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBpc0ZhaWxlZDogZmFsc2UsXG4gICAgICAgIGlzU3VjY2VlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2V0RXJyb3I6ICgpID0+IHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGlzRmFpbGVkOiB0cnVlLFxuICAgICAgICBpc1N1Y2NlZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlTG9hZGluZztcbiIsImltcG9ydCB7SU1BR0VfVVJMX1JFRywgTUFSS0RPV05fVVJMX1JFRywgTUFSS0RPV05fV0VCX1VSTF9SRUcsIFdJS0lfSU1BR0VfVVJMX1JFR30gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB1c2VUb2dnbGUgZnJvbSAnLi4vaG9va3MvdXNlVG9nZ2xlJztcclxuaW1wb3J0IHttZW1vU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XHJcbmltcG9ydCBJbWFnZSBmcm9tICcuL0ltYWdlJztcclxuaW1wb3J0IHtmb3JtYXRNZW1vQ29udGVudH0gZnJvbSAnLi9NZW1vJztcclxuaW1wb3J0ICcuLi9sZXNzL21lbW8ubGVzcyc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7Tm90aWNlLCBURmlsZSwgVmF1bHR9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XHJcbmltcG9ydCBtb3JlIGZyb20gJy4uL2ljb25zL21vcmUuc3ZnJztcclxuaW1wb3J0IHsgdCB9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIHtcclxuICBtZW1vOiBNb2RlbC5NZW1vO1xyXG4gIGhhbmRsZURlbGV0ZWRNZW1vQWN0aW9uOiAobWVtb0lkOiBzdHJpbmcpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBMaW5rTWF0Y2gge1xyXG4gIGxpbmtUZXh0OiBzdHJpbmc7XHJcbiAgYWx0VGV4dDogc3RyaW5nO1xyXG4gIHBhdGg6IHN0cmluZztcclxuICBmaWxlcGF0aD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFBhdGhPZkltYWdlID0gKHZhdWx0OiBWYXVsdCwgaW1hZ2U6IFRGaWxlKSA9PiB7XHJcbiAgcmV0dXJuIHZhdWx0LmdldFJlc291cmNlUGF0aChpbWFnZSk7XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RXaWtpSW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcpOiBMaW5rTWF0Y2ggfCBudWxsID0+IHtcclxuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gIGNvbnN0IGludGVybmFsRmlsZU5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsxXTtcclxuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/Lls1XTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuICBpZiAoZmlsZSA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgcGF0aDogJycsXHJcbiAgICAgIGZpbGVwYXRoOiAnJyxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKHZhdWx0LCBmaWxlKTtcclxuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5wYXRoO1xyXG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGRldGVjdE1ESW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcpOiBMaW5rTWF0Y2ggfCBudWxsID0+IHtcclxuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gIGNvbnN0IGludGVybmFsRmlsZU5hbWUgPSBNQVJLRE9XTl9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bNV07XHJcbiAgY29uc3QgaW50ZXJuYWxBbHROYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzJdO1xyXG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbEZpbGVOYW1lKSwgJycpO1xyXG4gIGlmIChmaWxlID09PSBudWxsKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxyXG4gICAgICBwYXRoOiAnJyxcclxuICAgICAgZmlsZXBhdGg6ICcnLFxyXG4gICAgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgaW1hZ2VQYXRoID0gZ2V0UGF0aE9mSW1hZ2UodmF1bHQsIGZpbGUpO1xyXG4gICAgY29uc3QgZmlsZVBhdGggPSBmaWxlLnBhdGg7XHJcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxyXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcclxuICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICAgIGFsdFRleHQ6ICcnLFxyXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcclxuICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgRGVsZXRlZE1lbW86IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcclxuICAvLyBjb25zdCB7IGFwcCB9ICA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlO1xyXG5cclxuICBjb25zdCB7bWVtbzogcHJvcHNNZW1vLCBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbn0gPSBwcm9wcztcclxuICBjb25zdCBtZW1vOiBGb3JtYXR0ZWRNZW1vID0ge1xyXG4gICAgLi4ucHJvcHNNZW1vLFxyXG4gICAgY3JlYXRlZEF0U3RyOiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhwcm9wc01lbW8uY3JlYXRlZEF0KSxcclxuICAgIGRlbGV0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHNNZW1vLmRlbGV0ZWRBdCA/PyBEYXRlLm5vdygpKSxcclxuICB9O1xyXG4gIGNvbnN0IFtzaG93Q29uZmlybURlbGV0ZUJ0biwgdG9nZ2xlQ29uZmlybURlbGV0ZUJ0bl0gPSB1c2VUb2dnbGUoZmFsc2UpO1xyXG4gIC8vIGNvbnN0IGltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcclxuICBsZXQgZXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcclxuICBsZXQgaW50ZXJuYWxJbWFnZVVybHMgPSBbXTtcclxuICBsZXQgYWxsTWFya2Rvd25MaW5rOiBzdHJpbmcgfCBhbnlbXSA9IFtdO1xyXG4gIGxldCBhbGxJbnRlcm5hbExpbmsgPSBbXSBhcyBhbnlbXTtcclxuICBpZiAoSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgIGxldCBhbGxFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gICAgbGV0IGFub3RoZXJFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gICAgaWYgKE1BUktET1dOX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbE1hcmtkb3duTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIGlmIChXSUtJX0lNQUdFX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc3QgYWxsSW50ZXJuYWxMaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goV0lLSV9JTUFHRV9VUkxfUkVHKSk7XHJcbiAgICBpZiAoTUFSS0RPV05fV0VCX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbEV4dGVybmFsSW1hZ2VVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTUFSS0RPV05fV0VCX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIGlmIChhbGxJbnRlcm5hbExpbmsubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsSW50ZXJuYWxMaW5rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IG9uZSA9IGFsbEludGVybmFsTGlua1tpXTtcclxuICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdFdpa2lJbnRlcm5hbExpbmsob25lKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChhbGxNYXJrZG93bkxpbmsubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsTWFya2Rvd25MaW5rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHR3byA9IGFsbE1hcmtkb3duTGlua1tpXTtcclxuICAgICAgICBpZiAoLyguKilodHRwW3NdPyguKikvLnRlc3QodHdvKSkge1xyXG4gICAgICAgICAgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzLnB1c2goTUFSS0RPV05fVVJMX1JFRy5leGVjKHR3byk/Lls1XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0TURJbnRlcm5hbExpbmsodHdvKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBleHRlcm5hbEltYWdlVXJscyA9IGFsbEV4dGVybmFsSW1hZ2VVcmxzLmNvbmNhdChhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMpO1xyXG4gICAgLy8gZXh0ZXJuYWxJbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChJTUFHRV9VUkxfUkVHKSA/PyBbXSk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBoYW5kbGVEZWxldGVNZW1vQ2xpY2sgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAoc2hvd0NvbmZpcm1EZWxldGVCdG4pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCBtZW1vU2VydmljZS5kZWxldGVNZW1vQnlJZChtZW1vLmlkKTtcclxuICAgICAgICBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbihtZW1vLmlkKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVSZXN0b3JlTWVtb0NsaWNrID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgbWVtb1NlcnZpY2UucmVzdG9yZU1lbW9CeUlkKG1lbW8uaWQpO1xyXG4gICAgICBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbihtZW1vLmlkKTtcclxuICAgICAgbmV3IE5vdGljZSgnUkVTVE9SRSBTVUNDRUVEJyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTW91c2VMZWF2ZU1lbW9XcmFwcGVyID0gKCkgPT4ge1xyXG4gICAgaWYgKHNob3dDb25maXJtRGVsZXRlQnRuKSB7XHJcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oZmFsc2UpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT17YG1lbW8td3JhcHBlciAkeydtZW1vcy0nICsgbWVtby5pZH1gfSBvbk1vdXNlTGVhdmU9e2hhbmRsZU1vdXNlTGVhdmVNZW1vV3JhcHBlcn0+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVtby10b3Atd3JhcHBlclwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpbWUtdGV4dFwiPnt0KCdERUxFVEUgQVQnKX0ge21lbW8uZGVsZXRlZEF0U3RyfTwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4gbW9yZS1hY3Rpb24tYnRuXCI+XHJcbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21vcmV9IC8+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuIHJlc3RvcmUtYnRuXCIgb25DbGljaz17aGFuZGxlUmVzdG9yZU1lbW9DbGlja30+XHJcbiAgICAgICAgICAgICAgICB7dCgnUkVTVE9SRScpfVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgYnRuIGRlbGV0ZS1idG4gJHtzaG93Q29uZmlybURlbGV0ZUJ0biA/ICdmaW5hbC1jb25maXJtJyA6ICcnfWB9XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVEZWxldGVNZW1vQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAge3Nob3dDb25maXJtRGVsZXRlQnRuID8gdCgnQ09ORklSTe+8gScpIDogdCgnREVMRVRFJyl9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLWNvbnRlbnQtdGV4dFwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBmb3JtYXRNZW1vQ29udGVudChtZW1vLmNvbnRlbnQpfX0+PC9kaXY+XHJcbiAgICAgIDxPbmx5IHdoZW49e2V4dGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLXdyYXBwZXJcIj5cclxuICAgICAgICAgIHtleHRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgIDxJbWFnZSBhbHQ9XCJcIiBrZXk9e2lkeH0gY2xhc3NOYW1lPVwibWVtby1pbWdcIiBpbWdVcmw9e2ltZ1VybH0gcmVmZXJyZXJQb2xpY3k9XCJuby1yZWZlcnJlclwiIC8+XHJcbiAgICAgICAgICApKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9Pbmx5PlxyXG4gICAgICA8T25seSB3aGVuPXtpbnRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxyXG4gICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgPEltYWdlXHJcbiAgICAgICAgICAgICAga2V5PXtpZHh9XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWVtby1pbWdcIlxyXG4gICAgICAgICAgICAgIGltZ1VybD17aW1nVXJsLnBhdGh9XHJcbiAgICAgICAgICAgICAgYWx0PXtpbWdVcmwuYWx0VGV4dH1cclxuICAgICAgICAgICAgICBmaWxlcGF0aD17aW1nVXJsLmZpbGVwYXRofVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT5cclxuICAgICAgey8qIDxPbmx5IHdoZW49e2ltYWdlVXJscy5sZW5ndGggPiAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICB7aW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgPEltYWdlIGNsYXNzTmFtZT1cIm1lbW8taW1nXCIga2V5PXtpZHh9IGltZ1VybD17aW1nVXJsfSAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT4gKi99XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGVsZXRlZE1lbW87XHJcbiIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xyXG5pbXBvcnQgdXNlTG9hZGluZyBmcm9tICcuLi9ob29rcy91c2VMb2FkaW5nJztcclxuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIGxvY2F0aW9uU2VydmljZSwgbWVtb1NlcnZpY2UsIHF1ZXJ5U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5pbXBvcnQge0lNQUdFX1VSTF9SRUcsIExJTktfUkVHLCBNRU1PX0xJTktfUkVHLCBOT1BfRklSU1RfVEFHX1JFRywgVEFHX1JFR30gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB7Y2hlY2tTaG91bGRTaG93TWVtb1dpdGhGaWx0ZXJzfSBmcm9tICcuLi9oZWxwZXJzL2ZpbHRlcic7XHJcbmltcG9ydCBPbmx5IGZyb20gJy4uL2NvbXBvbmVudHMvY29tbW9uL09ubHlXaGVuJztcclxuaW1wb3J0IERlbGV0ZWRNZW1vIGZyb20gJy4uL2NvbXBvbmVudHMvRGVsZXRlZE1lbW8nO1xyXG5pbXBvcnQgTWVtb0ZpbHRlciBmcm9tICcuLi9jb21wb25lbnRzL01lbW9GaWx0ZXInO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVtby10cmFzaC5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IG1lbnVTdmcgZnJvbSAnLi4vaWNvbnMvbWVudS5zdmcnO1xyXG5pbXBvcnQge05vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge31cclxuXHJcbmNvbnN0IE1lbW9UcmFzaDogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIGxvY2F0aW9uU3RhdGU6IHtxdWVyeX0sXHJcbiAgICBnbG9iYWxTdGF0ZToge2lzTW9iaWxlVmlld30sXHJcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XHJcbiAgY29uc3QgbG9hZGluZ1N0YXRlID0gdXNlTG9hZGluZygpO1xyXG4gIGNvbnN0IFtkZWxldGVkTWVtb3MsIHNldERlbGV0ZWRNZW1vc10gPSB1c2VTdGF0ZTxNb2RlbC5NZW1vW10+KFtdKTtcclxuXHJcbiAgY29uc3Qge3RhZzogdGFnUXVlcnksIGR1cmF0aW9uLCB0eXBlOiBtZW1vVHlwZSwgdGV4dDogdGV4dFF1ZXJ5LCBmaWx0ZXI6IHF1ZXJ5SWR9ID0gcXVlcnk7XHJcbiAgY29uc3QgcXVlcnlGaWx0ZXIgPSBxdWVyeVNlcnZpY2UuZ2V0UXVlcnlCeUlkKHF1ZXJ5SWQpO1xyXG4gIGNvbnN0IHNob3dNZW1vRmlsdGVyID0gQm9vbGVhbihcclxuICAgIHRhZ1F1ZXJ5IHx8IChkdXJhdGlvbiAmJiBkdXJhdGlvbi5mcm9tIDwgZHVyYXRpb24udG8pIHx8IG1lbW9UeXBlIHx8IHRleHRRdWVyeSB8fCBxdWVyeUZpbHRlcixcclxuICApO1xyXG5cclxuICBjb25zdCBzaG93bk1lbW9zID1cclxuICAgIHNob3dNZW1vRmlsdGVyIHx8IHF1ZXJ5RmlsdGVyXHJcbiAgICAgID8gZGVsZXRlZE1lbW9zLmZpbHRlcigobWVtbykgPT4ge1xyXG4gICAgICAgICAgbGV0IHNob3VsZFNob3cgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIGlmIChxdWVyeUZpbHRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gSlNPTi5wYXJzZShxdWVyeUZpbHRlci5xdWVyeXN0cmluZykgYXMgRmlsdGVyW107XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGNoZWNrU2hvdWxkU2hvd01lbW9XaXRoRmlsdGVycyhtZW1vLCBmaWx0ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0YWdRdWVyeSkge1xyXG4gICAgICAgICAgICBjb25zdCB0YWdzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA/PyBbXSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoVEFHX1JFRywgJyQxJykudHJpbSgpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGFnLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHRlbXAgPSAnJztcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRlbXAgKz0gaTtcclxuICAgICAgICAgICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSAnLyc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChOT1BfRklSU1RfVEFHX1JFRykgPz8gW10pKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFnID0gdC5yZXBsYWNlKE5PUF9GSVJTVF9UQUdfUkVHLCAnJDEnKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICBsZXQgdGVtcCA9ICcnO1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFnc1NldC5hZGQodGVtcCk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wICs9ICcvJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0YWdzU2V0Lmhhcyh0YWdRdWVyeSkpIHtcclxuICAgICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgZHVyYXRpb24gJiZcclxuICAgICAgICAgICAgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvICYmXHJcbiAgICAgICAgICAgICh1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUobWVtby5jcmVhdGVkQXQpIDwgZHVyYXRpb24uZnJvbSB8fFxyXG4gICAgICAgICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShtZW1vLmNyZWF0ZWRBdCkgPiBkdXJhdGlvbi50bylcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobWVtb1R5cGUpIHtcclxuICAgICAgICAgICAgaWYgKG1lbW9UeXBlID09PSAnTk9UX1RBR0dFRCcgJiYgbWVtby5jb250ZW50Lm1hdGNoKFRBR19SRUcpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lbW9UeXBlID09PSAnTElOS0VEJyAmJiBtZW1vLmNvbnRlbnQubWF0Y2goTElOS19SRUcpID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lbW9UeXBlID09PSAnSU1BR0VEJyAmJiBtZW1vLmNvbnRlbnQubWF0Y2goSU1BR0VfVVJMX1JFRykgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtb1R5cGUgPT09ICdDT05ORUNURUQnICYmIG1lbW8uY29udGVudC5tYXRjaChNRU1PX0xJTktfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRleHRRdWVyeSAmJiAhbWVtby5jb250ZW50LmluY2x1ZGVzKHRleHRRdWVyeSkpIHtcclxuICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBzaG91bGRTaG93O1xyXG4gICAgICAgIH0pXHJcbiAgICAgIDogZGVsZXRlZE1lbW9zO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gICAgbWVtb1NlcnZpY2VcclxuICAgICAgLmZldGNoRGVsZXRlZE1lbW9zKClcclxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICBzZXREZWxldGVkTWVtb3MocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICBuZXcgTm90aWNlKCdGYWlsZWQgdG8gZmV0Y2ggZGVsZXRlZCBtZW1vczogJywgZXJyb3IpO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgbG9hZGluZ1N0YXRlLnNldEZpbmlzaCgpO1xyXG4gICAgICB9KTtcclxuICAgIGxvY2F0aW9uU2VydmljZS5jbGVhclF1ZXJ5KCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbiA9IHVzZUNhbGxiYWNrKChtZW1vSWQ6IHN0cmluZykgPT4ge1xyXG4gICAgc2V0RGVsZXRlZE1lbW9zKChkZWxldGVkTWVtb3MpID0+IGRlbGV0ZWRNZW1vcy5maWx0ZXIoKG1lbW8pID0+IG1lbW8uaWQgIT09IG1lbW9JZCkpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlU2hvd1NpZGViYXJCdG5DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcodHJ1ZSk7XHJcbiAgfSwgW10pO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLXRyYXNoLXdyYXBwZXJcIj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZWN0aW9uLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cclxuICAgICAgICAgIDxPbmx5IHdoZW49e2lzTW9iaWxlVmlld30+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYWN0aW9uLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNob3dTaWRlYmFyQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21lbnVTdmd9IGFsdD1cIm1lbnVcIiAvPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvT25seT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+e3QoJ1JlY3ljbGUgYmluJyl9PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPE1lbW9GaWx0ZXIgLz5cclxuICAgICAge2xvYWRpbmdTdGF0ZS5pc0xvYWRpbmcgPyAoXHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0aXAtdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+e3QoJ0ZldGNoaW5nIGRhdGEuLi4nKX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICkgOiBkZWxldGVkTWVtb3MubGVuZ3RoID09PSAwID8gKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGlwLXRleHQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPnt0KCdIZXJlIGlzIE5vIFpldHRlbHMuJyl9PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVsZXRlZC1tZW1vcy1jb250YWluZXJcIj5cclxuICAgICAgICAgIHtzaG93bk1lbW9zLm1hcCgobWVtbykgPT4gKFxyXG4gICAgICAgICAgICA8RGVsZXRlZE1lbW9cclxuICAgICAgICAgICAgICBrZXk9e2Ake21lbW8uaWR9LSR7bWVtby51cGRhdGVkQXR9YH1cclxuICAgICAgICAgICAgICBtZW1vPXttZW1vfVxyXG4gICAgICAgICAgICAgIGhhbmRsZURlbGV0ZWRNZW1vQWN0aW9uPXtoYW5kbGVEZWxldGVkTWVtb0FjdGlvbn1cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICkpfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApfVxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lbW9UcmFzaDtcclxuIiwiaW1wb3J0IHt1c2VDb250ZXh0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQge2dsb2JhbFN0YXRlU2VydmljZSwgbWVtb1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7cGFyc2VIdG1sVG9SYXdUZXh0fSBmcm9tICcuLi9oZWxwZXJzL21hcmtlZCc7XG5pbXBvcnQge2Zvcm1hdE1lbW9Db250ZW50fSBmcm9tICcuL01lbW8nO1xuaW1wb3J0ICcuLi9sZXNzL3ByZWZlcmVuY2VzLXNlY3Rpb24ubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNoZWNrYm94QWN0aXZlIGZyb20gJy4uL2ljb25zL2NoZWNrYm94LWFjdGl2ZS5zdmcnO1xuaW1wb3J0IGNoZWNrYm94IGZyb20gJy4uL2ljb25zL2NoZWNrYm94LnN2Zyc7XG5cbmludGVyZmFjZSBQcm9wcyB7fVxuXG5jb25zdCBQcmVmZXJlbmNlc1NlY3Rpb246IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge2dsb2JhbFN0YXRlfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG4gIGNvbnN0IHt1c2VUaW55VW5kb0hpc3RvcnlDYWNoZSwgc2hvdWxkSGlkZUltYWdlVXJsLCBzaG91bGRTcGxpdE1lbW9Xb3JkLCBzaG91bGRVc2VNYXJrZG93blBhcnNlcn0gPSBnbG9iYWxTdGF0ZTtcblxuICBjb25zdCBkZW1vTWVtb0NvbnRlbnQgPVxuICAgICfwn5GLIOS9oOWlveWRgO+9nuasoui/juS9v+eUqG1lbW9zIVxcbiog4pyoICoq5byA5rqQ6aG555uuKirvvJtcXG4qIPCfmIsg57K+576O5LiU57uG6IqC55qE6KeG6KeJ5qC35byP77ybXFxuKiDwn5ORIOS9k+mqjOS8mOiJr+eahOS6pOS6kumAu+i+ke+8myc7XG5cbiAgY29uc3QgaGFuZGxlT3BlblRpbnlVbmRvQ2hhbmdlZCA9ICgpID0+IHtcbiAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0QXBwU2V0dGluZyh7XG4gICAgICB1c2VUaW55VW5kb0hpc3RvcnlDYWNoZTogIXVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNwbGl0V29yZHNWYWx1ZUNoYW5nZWQgPSAoKSA9PiB7XG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEFwcFNldHRpbmcoe1xuICAgICAgc2hvdWxkU3BsaXRNZW1vV29yZDogIXNob3VsZFNwbGl0TWVtb1dvcmQsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlSGlkZUltYWdlVXJsVmFsdWVDaGFuZ2VkID0gKCkgPT4ge1xuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRBcHBTZXR0aW5nKHtcbiAgICAgIHNob3VsZEhpZGVJbWFnZVVybDogIXNob3VsZEhpZGVJbWFnZVVybCxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVVc2VNYXJrZG93blBhcnNlckNoYW5nZWQgPSAoKSA9PiB7XG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEFwcFNldHRpbmcoe1xuICAgICAgc2hvdWxkVXNlTWFya2Rvd25QYXJzZXI6ICFzaG91bGRVc2VNYXJrZG93blBhcnNlcixcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVFeHBvcnRCdG5DbGljayA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmb3JtYXRlZE1lbW9zID0gbWVtb1NlcnZpY2UuZ2V0U3RhdGUoKS5tZW1vcy5tYXAoKG0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm0sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QganNvblN0ciA9IEpTT04uc3RyaW5naWZ5KGZvcm1hdGVkTWVtb3MpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChqc29uU3RyKSk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ2RhdGEuanNvbicpO1xuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICB9O1xuXG4gIC8vIGNvbnN0IGhhbmRsZUZvcm1hdE1lbW9zQnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XG4gIC8vICAgY29uc3QgbWVtb3MgPSBtZW1vU2VydmljZS5nZXRTdGF0ZSgpLm1lbW9zO1xuICAvLyAgIGZvciAoY29uc3QgbSBvZiBtZW1vcykge1xuICAvLyAgICAgbWVtb1NlcnZpY2UudXBkYXRlTWVtbyhtLmlkLCBwYXJzZUh0bWxUb1Jhd1RleHQobS5jb250ZW50KSk7XG4gIC8vICAgfVxuICAvLyB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbi1jb250YWluZXIgcHJlZmVyZW5jZXMtc2VjdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiPk1lbW8g5pi+56S655u45YWzPC9wPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZGVtby1jb250ZW50LWNvbnRhaW5lciBtZW1vLWNvbnRlbnQtdGV4dFwiXG4gICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KGRlbW9NZW1vQ29udGVudCl9fT48L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImZvcm0tbGFiZWwgY2hlY2tib3gtZm9ybS1sYWJlbFwiIG9uQ2xpY2s9e2hhbmRsZVNwbGl0V29yZHNWYWx1ZUNoYW5nZWR9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+5Lit6Iux5paH5YaF5a656Ieq5Yqo6Ze06ZqUPC9zcGFuPlxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e3Nob3VsZFNwbGl0TWVtb1dvcmQgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1sYWJlbCBjaGVja2JveC1mb3JtLWxhYmVsXCIgb25DbGljaz17aGFuZGxlVXNlTWFya2Rvd25QYXJzZXJDaGFuZ2VkfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPumDqOWIhiBtYXJrZG93biDmoLzlvI/op6PmnpA8L3NwYW4+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17c2hvdWxkVXNlTWFya2Rvd25QYXJzZXIgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1sYWJlbCBjaGVja2JveC1mb3JtLWxhYmVsXCIgb25DbGljaz17aGFuZGxlSGlkZUltYWdlVXJsVmFsdWVDaGFuZ2VkfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPumakOiXj+WbvueJh+mTvuaOpeWcsOWdgDwvc3Bhbj5cbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtzaG91bGRIaWRlSW1hZ2VVcmwgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24tY29udGFpbmVyIHByZWZlcmVuY2VzLXNlY3Rpb24tY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj7nvJbovpHlmag8L3A+XG4gICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJmb3JtLWxhYmVsIGNoZWNrYm94LWZvcm0tbGFiZWxcIiBvbkNsaWNrPXtoYW5kbGVPcGVuVGlueVVuZG9DaGFuZ2VkfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPlxuICAgICAgICAgICAg5ZCv55SoeycgJ31cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vYm9vamFjay90aW55LXVuZG9cIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlclwiPlxuICAgICAgICAgICAgICB0aW55LXVuZG9cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17dXNlVGlueVVuZG9IaXN0b3J5Q2FjaGUgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24tY29udGFpbmVyIGhpZGRlblwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+5YW25LuWPC9wPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bi1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBleHBvcnQtYnRuXCIgb25DbGljaz17aGFuZGxlRXhwb3J0QnRuQ2xpY2t9PlxuICAgICAgICAgICAg5a+85Ye65pWw5o2uKEpTT04pXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgey8qIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGZvcm1hdC1idG5cIiBvbkNsaWNrPXtoYW5kbGVGb3JtYXRNZW1vc0J0bkNsaWNrfT5cbiAgICAgICAgICAgIOagvOW8j+WMluaVsOaNrlxuICAgICAgICAgIDwvYnV0dG9uPiAqL31cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByZWZlcmVuY2VzU2VjdGlvbjtcbiIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIG1lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgUHJlZmVyZW5jZXNTZWN0aW9uIGZyb20gJy4uL2NvbXBvbmVudHMvUHJlZmVyZW5jZXNTZWN0aW9uJztcbmltcG9ydCBPbmx5IGZyb20gJy4uL2NvbXBvbmVudHMvY29tbW9uL09ubHlXaGVuJztcbmltcG9ydCAnLi4vbGVzcy9zZXR0aW5nLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtZW51U3ZnIGZyb20gJy4uL2ljb25zL21lbnUuc3ZnJztcblxuaW50ZXJmYWNlIFByb3BzIHt9XG5cbmNvbnN0IFNldHRpbmc6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIGdsb2JhbFN0YXRlOiB7aXNNb2JpbGVWaWV3fSxcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBtZW1vU2VydmljZS5mZXRjaEFsbE1lbW9zKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVTaG93U2lkZWJhckJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcodHJ1ZSk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicHJlZmVyZW5jZS13cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24taGVhZGVyLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICA8T25seSB3aGVuPXtpc01vYmlsZVZpZXd9PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJhY3Rpb24tYnRuXCIgb25DbGljaz17aGFuZGxlU2hvd1NpZGViYXJCdG5DbGlja30+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21lbnVTdmd9IGFsdD1cIm1lbnVcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9Pbmx5PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+6LSm5Y+35LiO6K6+572uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb25zLXdyYXBwZXJcIj5cbiAgICAgICAgPFByZWZlcmVuY2VzU2VjdGlvbiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTZXR0aW5nO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNZW1vcyBmcm9tICcuLi9wYWdlcy9NZW1vcyc7XG5pbXBvcnQgTWVtb1RyYXNoIGZyb20gJy4uL3BhZ2VzL01lbW9UcmFzaCc7XG5pbXBvcnQgU2V0dGluZyBmcm9tICcuLi9wYWdlcy9TZXR0aW5nJztcblxuY29uc3QgaG9tZVJvdXRlciA9IHtcbiAgJy9yZWN5Y2xlJzogPE1lbW9UcmFzaCAvPixcbiAgJy9zZXR0aW5nJzogPFNldHRpbmcgLz4sXG4gICcqJzogPE1lbW9zIC8+LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgaG9tZVJvdXRlcjtcbiIsIi8vIGltcG9ydCBhcHBSb3V0ZXIgZnJvbSBcIi4vYXBwUm91dGVyXCI7XG5pbXBvcnQgaG9tZVJvdXRlciBmcm9tICcuL2hvbWVSb3V0ZXInO1xuXG4vLyBqdXN0IGxpa2UgUmVhY3QtUm91dGVyXG5pbnRlcmZhY2UgUm91dGVyIHtcbiAgW2tleTogc3RyaW5nXTogSlNYLkVsZW1lbnQgfCBudWxsO1xuICAnKic6IEpTWC5FbGVtZW50IHwgbnVsbDtcbn1cblxuY29uc3Qgcm91dGVyU3dpdGNoID0gKHJvdXRlcjogUm91dGVyKSA9PiB7XG4gIHJldHVybiAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJvdXRlcikpIHtcbiAgICAgIGlmIChrZXkgPT09IHBhdGhuYW1lKSB7XG4gICAgICAgIHJldHVybiByb3V0ZXJba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlclsnKiddO1xuICB9O1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGFwcFJvdXRlclN3aXRjaCA9IHJvdXRlclN3aXRjaChhcHBSb3V0ZXIpO1xuZXhwb3J0IGNvbnN0IGhvbWVSb3V0ZXJTd2l0Y2ggPSByb3V0ZXJTd2l0Y2goaG9tZVJvdXRlcik7XG4iLCJpbXBvcnQge3Nob3dEaWFsb2d9IGZyb20gJy4vRGlhbG9nJztcbmltcG9ydCAnLi4vbGVzcy9hYm91dC1zaXRlLWRpYWxvZy5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xvc2UgZnJvbSAnLi4vaWNvbnMvY2xvc2Uuc3ZnJztcblxuaW50ZXJmYWNlIFByb3BzIGV4dGVuZHMgRGlhbG9nUHJvcHMge31cblxuY29uc3QgQWJvdXRTaXRlRGlhbG9nOiBSZWFjdC5GQzxQcm9wcz4gPSAoe2Rlc3Ryb3l9OiBQcm9wcykgPT4ge1xuICBjb25zdCBoYW5kbGVDbG9zZUJ0bkNsaWNrID0gKCkgPT4ge1xuICAgIGRlc3Ryb3koKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn6SgPC9zcGFuPkFib3V0IDxiPk9ic2lkaWFuLU1lbW9zPC9iPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGNsb3NlLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUNsb3NlQnRuQ2xpY2t9PlxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Nsb3NlfSAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkaWFsb2ctY29udGVudC1jb250YWluZXJcIj5cbiAgICAgICAgSGksIEkgYW0gUXVvcmFmaW5kKEJvbmluYWxsKSwgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgcHJvamVjdCwgcGxlYXNlIHN1cHBvcnQgbXkgd29yayBhbmQgZW50aHVzaWFzbSBieVxuICAgICAgICBidXlpbmcgbWUgYSBjb2ZmZWUgb24gPGEgaHJlZj1cImh0dHBzOi8vd3d3LmJ1eW1lYWNvZmZlZS5jb20vYm9uaW5hbGxcIj5odHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2JvbmluYWxsPC9hPlxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly93d3cuYnV5bWVhY29mZmVlLmNvbS9ib25pbmFsbFwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIHNyYz17YGh0dHBzOi8vaW1nLmJ1eW1lYWNvZmZlZS5jb20vYnV0dG9uLWFwaS8/dGV4dD1CdXkgbWUgYSBjb2ZmZWUmZW1vamk9JnNsdWc9Ym9uaW5hbGwmYnV0dG9uX2NvbG91cj02NDk1RUQmZm9udF9jb2xvdXI9ZmZmZmZmJmZvbnRfZmFtaWx5PUxhdG8mb3V0bGluZV9jb2xvdXI9MDAwMDAwJmNvZmZlZV9jb2xvdXI9RkZERDAwYH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2E+XG4gICAgICAgIDxiciAvPlxuICAgICAgICA8cD5cbiAgICAgICAgICDln7rkuo4gPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9qdXN0bWVtb3MvbWVtb3NcIj5tZW1vczwvYT4g5byA5rqQ6aG555uu5omA5p6E5bu655qE6aG555uu44CCIE5PVEU6IEJhc2VkIG9ueycgJ31cbiAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2p1c3RtZW1vcy9tZW1vc1wiPm1lbW9zPC9hPiBwcm9qZWN0IHRvIGJ1aWxkLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxiciAvPlxuICAgICAgICA8cD5cbiAgICAgICAgICDwn4+XIFRoaXMgcHJvamVjdCBpcyB3b3JraW5nIGluIHByb2dyZXNzLCA8YnIgLz4gYW5kIHZlcnkgcGxlYXN1cmUgdG8gd2VsY29tZSB5b3VyeycgJ31cbiAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL1F1b3JhZmluZC9vYnNpZGlhbi1tZW1vcy9pc3N1ZXNcIj5pc3N1ZXM8L2E+IGFuZHsnICd9XG4gICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9RdW9yYWZpbmQvb2JzaWRpYW4tbWVtb3MvcHVsbHNcIj5QdWxsIFJlcXVlc3Q8L2E+LlxuICAgICAgICA8L3A+XG4gICAgICAgIDxociAvPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPlxuICAgICAgICAgIExhc3QgdXBkYXRlZCBvbiA8c3BhbiBjbGFzc05hbWU9XCJwcmUtdGV4dFwiPjIwMjIvMDEvMDQgMjI6NTU6MTU8L3NwYW4+IPCfjolcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93QWJvdXRTaXRlRGlhbG9nKCk6IHZvaWQge1xuICBzaG93RGlhbG9nKFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2Fib3V0LXNpdGUtZGlhbG9nJyxcbiAgICB9LFxuICAgIEFib3V0U2l0ZURpYWxvZyxcbiAgKTtcbn1cbiIsImltcG9ydCB7dXNlRWZmZWN0LCB1c2VSZWZ9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtsb2NhdGlvblNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHNob3dBYm91dFNpdGVEaWFsb2cgZnJvbSAnLi9BYm91dFNpdGVEaWFsb2cnO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVudS1idG5zLXBvcHVwLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xyXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge1xyXG4gIHNob3duU3RhdHVzOiBib29sZWFuO1xyXG4gIHNldFNob3duU3RhdHVzOiAoc3RhdHVzOiBib29sZWFuKSA9PiB2b2lkO1xyXG59XHJcblxyXG5jb25zdCBNZW51QnRuc1BvcHVwOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHM6IFByb3BzKSA9PiB7XHJcbiAgY29uc3Qge3Nob3duU3RhdHVzLCBzZXRTaG93blN0YXR1c30gPSBwcm9wcztcclxuICBjb25zdCB7YXBwfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XHJcblxyXG4gIGNvbnN0IHBvcHVwRWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHNob3duU3RhdHVzKSB7XHJcbiAgICAgIGNvbnN0IGhhbmRsZUNsaWNrT3V0c2lkZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICghcG9wdXBFbFJlZi5jdXJyZW50Py5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcclxuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRTaG93blN0YXR1cyhmYWxzZSk7XHJcbiAgICAgIH07XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrT3V0c2lkZSwge1xyXG4gICAgICAgIGNhcHR1cmU6IHRydWUsXHJcbiAgICAgICAgb25jZTogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSwgW3Nob3duU3RhdHVzXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZU15QWNjb3VudEJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgYXBwLnNldHRpbmcub3BlbigpO1xyXG4gICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgYXBwLnNldHRpbmcub3BlblRhYkJ5SWQoJ29ic2lkaWFuLW1lbW9zJyk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTWVtb3NUcmFzaEJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgbG9jYXRpb25TZXJ2aWNlLnB1c2hIaXN0b3J5KCcvcmVjeWNsZScpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUFib3V0QnRuQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICBzaG93QWJvdXRTaXRlRGlhbG9nKCk7XHJcbiAgfTtcclxuXHJcbiAgLy8gY29uc3QgaGFuZGxlU2lnbk91dEJ0bkNsaWNrID0gYXN5bmMgKCkgPT4ge1xyXG4gIC8vICAgYXdhaXQgdXNlclNlcnZpY2UuZG9TaWduT3V0KCk7XHJcbiAgLy8gfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPXtgbWVudS1idG5zLXBvcHVwICR7c2hvd25TdGF0dXMgPyAnJyA6ICdoaWRkZW4nfWB9IHJlZj17cG9wdXBFbFJlZn0+XHJcbiAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGFjdGlvbi1idG5cIiBvbkNsaWNrPXtoYW5kbGVNeUFjY291bnRCdG5DbGlja30+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvblwiPvCfkaQ8L3NwYW4+IHt0KCdTZXR0aW5ncycpfVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gYWN0aW9uLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZU1lbW9zVHJhc2hCdG5DbGlja30+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvblwiPvCfl5HvuI88L3NwYW4+IHt0KCdSZWN5Y2xlIGJpbicpfVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gYWN0aW9uLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUFib3V0QnRuQ2xpY2t9PlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb25cIj7wn6SgPC9zcGFuPiB7dCgnQWJvdXQgTWUnKX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIHsvKiA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBhY3Rpb24tYnRuXCIgb25DbGljaz17aGFuZGxlU2lnbk91dEJ0bkNsaWNrfT5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uXCI+8J+Rizwvc3Bhbj4g6YCA5Ye6XHJcbiAgICAgIDwvYnV0dG9uPiAqL31cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNZW51QnRuc1BvcHVwO1xyXG4iLCJpbXBvcnQge0lNQUdFX1VSTF9SRUcsIE1BUktET1dOX1VSTF9SRUcsIE1BUktET1dOX1dFQl9VUkxfUkVHLCBXSUtJX0lNQUdFX1VSTF9SRUd9IGZyb20gJy4uL2hlbHBlcnMvY29uc3RzJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7Zm9ybWF0TWVtb0NvbnRlbnR9IGZyb20gJy4vTWVtbyc7XG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XG5pbXBvcnQgJy4uL2xlc3MvZGFpbHktbWVtby5sZXNzJztcbmltcG9ydCBSZWFjdCwge3VzZUNvbnRleHQsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtURmlsZSwgVmF1bHQsIEFwcH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG4vLyBpbXBvcnQgYXBwQ29udGV4dCBmcm9tIFwiLi4vc3RvcmVzL2FwcENvbnRleHRcIjtcbi8vIGltcG9ydCBhcHBTdG9yZSBmcm9tIFwiLi4vc3RvcmVzL2FwcFN0b3JlXCI7XG4vLyBpbXBvcnQgeyBkYWlseU5vdGVzU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlc1wiO1xuXG5pbnRlcmZhY2UgRGFpbHlNZW1vIGV4dGVuZHMgRm9ybWF0dGVkTWVtbyB7XG4gIHRpbWVTdHI6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgbWVtbzogTW9kZWwuTWVtbztcbn1cblxuaW50ZXJmYWNlIExpbmtNYXRjaCB7XG4gIGxpbmtUZXh0OiBzdHJpbmc7XG4gIGFsdFRleHQ6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGdldFBhdGhPZkltYWdlID0gKHZhdWx0OiBWYXVsdCwgaW1hZ2U6IFRGaWxlKSA9PiB7XG4gIHJldHVybiB2YXVsdC5nZXRSZXNvdXJjZVBhdGgoaW1hZ2UpO1xufTtcblxuY29uc3QgZGV0ZWN0V2lraUludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nLCBhcHA6IEFwcCk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gV0lLSV9JTUFHRV9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMV07XG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xuICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVjb2RlVVJJQ29tcG9uZW50KGludGVybmFsRmlsZU5hbWUpLCAnJyk7XG4gIGlmIChmaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgcGF0aDogJycsXG4gICAgICBmaWxlUGF0aDogJycsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZShhcHAudmF1bHQsIGZpbGUpO1xuICAgIGlmIChpbnRlcm5hbEFsdE5hbWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUucGF0aCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiAnJyxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGRldGVjdE1ESW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcsIGFwcDogQXBwKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XG4gIC8vIGNvbnN0IHsgbWV0YWRhdGFDYWNoZSx2YXVsdCB9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBNQVJLRE9XTl9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMl07XG4gIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICBwYXRoOiAnJyxcbiAgICAgIGZpbGVQYXRoOiAnJyxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKGFwcC52YXVsdCwgZmlsZSk7XG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6ICcnLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVQYXRoOiBmaWxlLnBhdGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgRGFpbHlNZW1vOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHM6IFByb3BzKSA9PiB7XG4gIC8vIGNvbnN0IHBsdWdpbiA9IE1lbW9zUGx1Z2luO1xuICBjb25zdCB7YXBwfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlO1xuICBjb25zdCB7bWVtbzogcHJvcHNNZW1vfSA9IHByb3BzO1xuICBjb25zdCBtZW1vOiBEYWlseU1lbW8gPSB7XG4gICAgLi4ucHJvcHNNZW1vLFxuICAgIGNyZWF0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHNNZW1vLmNyZWF0ZWRBdCksXG4gICAgdGltZVN0cjogdXRpbHMuZ2V0VGltZVN0cmluZyhwcm9wc01lbW8uY3JlYXRlZEF0KSxcbiAgfTtcbiAgbGV0IGV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XG4gIGxldCBpbnRlcm5hbEltYWdlVXJscyA9IFtdO1xuICBsZXQgYWxsTWFya2Rvd25MaW5rOiBzdHJpbmcgfCBhbnlbXSA9IFtdO1xuICBsZXQgYWxsSW50ZXJuYWxMaW5rID0gW10gYXMgYW55W107XG4gIGlmIChJTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xuICAgIGxldCBhbGxFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xuICAgIGxldCBhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcbiAgICBpZiAoTUFSS0RPV05fVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbE1hcmtkb3duTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1VSTF9SRUcpKTtcbiAgICB9XG4gICAgaWYgKFdJS0lfSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xuICAgIH1cbiAgICAvLyBjb25zdCBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcbiAgICBpZiAoTUFSS0RPV05fV0VCX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XG4gICAgICBhbGxFeHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1dFQl9VUkxfUkVHKSk7XG4gICAgfVxuICAgIGlmIChhbGxJbnRlcm5hbExpbmsubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEludGVybmFsTGluay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgb25lID0gYWxsSW50ZXJuYWxMaW5rW2ldO1xuICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdFdpa2lJbnRlcm5hbExpbmsob25lLCBhcHApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbE1hcmtkb3duTGluay5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsTWFya2Rvd25MaW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB0d28gPSBhbGxNYXJrZG93bkxpbmtbaV07XG4gICAgICAgIGlmICgvKC4qKWh0dHBbc10/KC4qKS8udGVzdCh0d28pKSB7XG4gICAgICAgICAgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzLnB1c2goTUFSS0RPV05fVVJMX1JFRy5leGVjKHR3byk/Lls1XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW50ZXJuYWxJbWFnZVVybHMucHVzaChkZXRlY3RNREludGVybmFsTGluayh0d28sIGFwcCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGV4dGVybmFsSW1hZ2VVcmxzID0gYWxsRXh0ZXJuYWxJbWFnZVVybHMuY29uY2F0KGFub3RoZXJFeHRlcm5hbEltYWdlVXJscyk7XG4gICAgLy8gZXh0ZXJuYWxJbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChJTUFHRV9VUkxfUkVHKSA/PyBbXSk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZGFpbHktbWVtby13cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpbWUtd3JhcHBlclwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPnttZW1vLnRpbWVTdHJ9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY29udGVudC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLWNvbnRlbnQtdGV4dFwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBmb3JtYXRNZW1vQ29udGVudChtZW1vLmNvbnRlbnQpfX0+PC9kaXY+XG4gICAgICAgIDxPbmx5IHdoZW49e2V4dGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAge2V4dGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgPGltZyBrZXk9e2lkeH0gc3JjPXtpbWdVcmx9IHJlZmVycmVyUG9saWN5PVwibm8tcmVmZXJyZXJcIiAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvT25seT5cbiAgICAgICAgPE9ubHkgd2hlbj17aW50ZXJuYWxJbWFnZVVybHMubGVuZ3RoID4gMH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZXMtY29udGFpbmVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxuICAgICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgPGltZyBrZXk9e2lkeH0gc3JjPXtpbWdVcmwucGF0aH0gYWx0PXtpbWdVcmwuYWx0VGV4dH0gcGF0aD17aW1nVXJsLmZpbGVQYXRofSAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvT25seT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRGFpbHlNZW1vO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtEQUlMWV9USU1FU1RBTVB9IGZyb20gJy4uLy4uL2hlbHBlcnMvY29uc3RzJztcbmltcG9ydCAnLi4vLi4vbGVzcy9jb21tb24vZGF0ZS1waWNrZXIubGVzcyc7XG5pbXBvcnQgYXJyb3dMZWZ0IGZyb20gJy4uLy4uL2ljb25zL2Fycm93LWxlZnQuc3ZnJztcbmltcG9ydCBhcnJvd1JpZ2h0IGZyb20gJy4uLy4uL2ljb25zL2Fycm93LXJpZ2h0LnN2Zyc7XG5pbXBvcnQge3R9IGZyb20gJy4uLy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xuXG5pbnRlcmZhY2UgRGF0ZVBpY2tlclByb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBkYXRlc3RhbXA6IERhdGVTdGFtcDtcbiAgaGFuZGxlRGF0ZVN0YW1wQ2hhbmdlOiAoZGF0YXN0YW1wOiBEYXRlU3RhbXApID0+IHZvaWQ7XG59XG5cbmNvbnN0IERhdGVQaWNrZXI6IFJlYWN0LkZDPERhdGVQaWNrZXJQcm9wcz4gPSAocHJvcHM6IERhdGVQaWNrZXJQcm9wcykgPT4ge1xuICBjb25zdCB7Y2xhc3NOYW1lLCBkYXRlc3RhbXAsIGhhbmRsZURhdGVTdGFtcENoYW5nZX0gPSBwcm9wcztcbiAgY29uc3QgW2N1cnJlbnREYXRlU3RhbXAsIHNldEN1cnJlbnREYXRlU3RhbXBdID0gdXNlU3RhdGU8RGF0ZVN0YW1wPihnZXRNb250aEZpcnN0RGF5RGF0ZVN0YW1wKGRhdGVzdGFtcCkpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0Q3VycmVudERhdGVTdGFtcChnZXRNb250aEZpcnN0RGF5RGF0ZVN0YW1wKGRhdGVzdGFtcCkpO1xuICB9LCBbZGF0ZXN0YW1wXSk7XG5cbiAgY29uc3QgZmlyc3REYXRlID0gbmV3IERhdGUoY3VycmVudERhdGVTdGFtcCk7XG4gIGNvbnN0IGZpcnN0RGF0ZURheSA9IGZpcnN0RGF0ZS5nZXREYXkoKSA9PT0gMCA/IDcgOiBmaXJzdERhdGUuZ2V0RGF5KCk7XG4gIGNvbnN0IGRheUxpc3QgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdERhdGVEYXk7IGkrKykge1xuICAgIGRheUxpc3QucHVzaCh7XG4gICAgICBkYXRlOiAwLFxuICAgICAgZGF0ZXN0YW1wOiBmaXJzdERhdGUuZ2V0VGltZSgpIC0gREFJTFlfVElNRVNUQU1QICogKDcgLSBpKSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBkYXlBbW91bnQgPSBnZXRNb250aERheUFtb3VudChjdXJyZW50RGF0ZVN0YW1wKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGF5QW1vdW50OyBpKyspIHtcbiAgICBkYXlMaXN0LnB1c2goe1xuICAgICAgZGF0ZTogaSxcbiAgICAgIGRhdGVzdGFtcDogZmlyc3REYXRlLmdldFRpbWUoKSArIERBSUxZX1RJTUVTVEFNUCAqIChpIC0gMSksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBoYW5kbGVEYXRlSXRlbUNsaWNrID0gKGRhdGVzdGFtcDogRGF0ZVN0YW1wKSA9PiB7XG4gICAgaGFuZGxlRGF0ZVN0YW1wQ2hhbmdlKGRhdGVzdGFtcCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlTW9udGhCdG5DbGljayA9IChpOiAtMSB8IDEpID0+IHtcbiAgICBjb25zdCB5ZWFyID0gZmlyc3REYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBmaXJzdERhdGUuZ2V0TW9udGgoKSArIDE7XG4gICAgbGV0IG5leHREYXRlU3RhbXAgPSAwO1xuICAgIGlmIChtb250aCA9PT0gMSAmJiBpID09PSAtMSkge1xuICAgICAgbmV4dERhdGVTdGFtcCA9IG5ldyBEYXRlKGAke3llYXIgLSAxfS8xMi8xYCkuZ2V0VGltZSgpO1xuICAgIH0gZWxzZSBpZiAobW9udGggPT09IDEyICYmIGkgPT09IDEpIHtcbiAgICAgIG5leHREYXRlU3RhbXAgPSBuZXcgRGF0ZShgJHt5ZWFyICsgMX0vMS8xYCkuZ2V0VGltZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0RGF0ZVN0YW1wID0gbmV3IERhdGUoYCR7eWVhcn0vJHttb250aCArIGl9LzFgKS5nZXRUaW1lKCk7XG4gICAgfVxuICAgIHNldEN1cnJlbnREYXRlU3RhbXAoZ2V0TW9udGhGaXJzdERheURhdGVTdGFtcChuZXh0RGF0ZVN0YW1wKSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YGRhdGUtcGlja2VyLXdyYXBwZXIgJHtjbGFzc05hbWV9YH0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhdGUtcGlja2VyLWhlYWRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4tdGV4dFwiIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNoYW5nZU1vbnRoQnRuQ2xpY2soLTEpfT5cbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXthcnJvd0xlZnR9IC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj5cbiAgICAgICAgICB7Zmlyc3REYXRlLmdldEZ1bGxZZWFyKCl9IHt0KCd5ZWFyJyl9IHt0KCdtb250aHNTaG9ydCcpW2ZpcnN0RGF0ZS5nZXRNb250aCgpXSA/PyBmaXJzdERhdGUuZ2V0TW9udGgoKSArIDF9IHt0KCdtb250aCcpID8/ICcnfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0bi10ZXh0XCIgb25DbGljaz17KCkgPT4gaGFuZGxlQ2hhbmdlTW9udGhCdG5DbGljaygxKX0+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17YXJyb3dSaWdodH0gLz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhdGUtcGlja2VyLWRheS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXRlLXBpY2tlci1kYXktaGVhZGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZGF5LWl0ZW1cIj57dCgnd2Vla0RheXNTaG9ydCcpWzBdfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJkYXktaXRlbVwiPnt0KCd3ZWVrRGF5c1Nob3J0JylbMV19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+e3QoJ3dlZWtEYXlzU2hvcnQnKVsyXX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZGF5LWl0ZW1cIj57dCgnd2Vla0RheXNTaG9ydCcpWzNdfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJkYXktaXRlbVwiPnt0KCd3ZWVrRGF5c1Nob3J0JylbNF19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+e3QoJ3dlZWtEYXlzU2hvcnQnKVs1XX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZGF5LWl0ZW1cIj57dCgnd2Vla0RheXNTaG9ydCcpWzZdfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAge2RheUxpc3QubWFwKChkKSA9PiB7XG4gICAgICAgICAgaWYgKGQuZGF0ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPHNwYW4ga2V5PXtkLmRhdGVzdGFtcH0gY2xhc3NOYW1lPVwiZGF5LWl0ZW0gbnVsbFwiPlxuICAgICAgICAgICAgICAgIHsnJ31cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBrZXk9e2QuZGF0ZXN0YW1wfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGRheS1pdGVtICR7ZC5kYXRlc3RhbXAgPT09IGRhdGVzdGFtcCA/ICdjdXJyZW50JyA6ICcnfWB9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGF0ZUl0ZW1DbGljayhkLmRhdGVzdGFtcCl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZC5kYXRlfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmZ1bmN0aW9uIGdldE1vbnRoRGF5QW1vdW50KGRhdGVzdGFtcDogRGF0ZVN0YW1wKTogbnVtYmVyIHtcbiAgY29uc3QgZGF0ZVRlbXAgPSBuZXcgRGF0ZShkYXRlc3RhbXApO1xuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKGAke2RhdGVUZW1wLmdldEZ1bGxZZWFyKCl9LyR7ZGF0ZVRlbXAuZ2V0TW9udGgoKSArIDF9LzFgKTtcbiAgY29uc3QgbmV4dE1vbnRoRGF0ZSA9XG4gICAgY3VycmVudERhdGUuZ2V0TW9udGgoKSA9PT0gMTFcbiAgICAgID8gbmV3IERhdGUoYCR7Y3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSArIDF9LzEvMWApXG4gICAgICA6IG5ldyBEYXRlKGAke2N1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCl9LyR7Y3VycmVudERhdGUuZ2V0TW9udGgoKSArIDJ9LzFgKTtcblxuICByZXR1cm4gKG5leHRNb250aERhdGUuZ2V0VGltZSgpIC0gY3VycmVudERhdGUuZ2V0VGltZSgpKSAvIERBSUxZX1RJTUVTVEFNUDtcbn1cblxuZnVuY3Rpb24gZ2V0TW9udGhGaXJzdERheURhdGVTdGFtcCh0aW1lc3RhbXA6IFRpbWVTdGFtcCk6IERhdGVTdGFtcCB7XG4gIGNvbnN0IGRhdGVUZW1wID0gbmV3IERhdGUodGltZXN0YW1wKTtcbiAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShgJHtkYXRlVGVtcC5nZXRGdWxsWWVhcigpfS8ke2RhdGVUZW1wLmdldE1vbnRoKCkgKyAxfS8xYCk7XG4gIHJldHVybiBjdXJyZW50RGF0ZS5nZXRUaW1lKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXI7XG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge21lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB0b0ltYWdlIGZyb20gJy4uL2xhYnMvaHRtbDJpbWFnZSc7XHJcbmltcG9ydCB1c2VUb2dnbGUgZnJvbSAnLi4vaG9va3MvdXNlVG9nZ2xlJztcclxuaW1wb3J0IHVzZUxvYWRpbmcgZnJvbSAnLi4vaG9va3MvdXNlTG9hZGluZyc7XHJcbmltcG9ydCB7REFJTFlfVElNRVNUQU1QfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0IHtzaG93RGlhbG9nfSBmcm9tICcuL0RpYWxvZyc7XHJcbmltcG9ydCBzaG93UHJldmlld0ltYWdlRGlhbG9nIGZyb20gJy4vUHJldmlld0ltYWdlRGlhbG9nJztcclxuaW1wb3J0IERhaWx5TWVtbyBmcm9tICcuL0RhaWx5TWVtbyc7XHJcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJy4vY29tbW9uL0RhdGVQaWNrZXInO1xyXG5pbXBvcnQgJy4uL2xlc3MvZGFpbHktbWVtby1kaWFyeS1kaWFsb2cubGVzcyc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBjbG9zZSBmcm9tICcuLi9pY29ucy9jbG9zZS5zdmcnO1xyXG5pbXBvcnQgYXJyb3dMZWZ0IGZyb20gJy4uL2ljb25zL2Fycm93LWxlZnQuc3ZnJztcclxuaW1wb3J0IGFycm93UmlnaHQgZnJvbSAnLi4vaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJztcclxuaW1wb3J0IHNoYXJlIGZyb20gJy4uL2ljb25zL3NoYXJlLnN2Zyc7XHJcbmltcG9ydCB7QXV0b1NhdmVXaGVuT25Nb2JpbGV9IGZyb20gJy4uL21lbW9zJztcclxuaW1wb3J0IHtQbGF0Zm9ybSwgVEZpbGUsIG1vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQge2dldEFsbERhaWx5Tm90ZXN9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xyXG5pbXBvcnQge3R9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIGV4dGVuZHMgRGlhbG9nUHJvcHMge1xyXG4gIGN1cnJlbnREYXRlU3RhbXA6IERhdGVTdGFtcDtcclxufVxyXG5cclxuY29uc3QgRGFpbHlNZW1vRGlhcnlEaWFsb2c6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcclxuICBjb25zdCBsb2FkaW5nU3RhdGUgPSB1c2VMb2FkaW5nKCk7XHJcbiAgY29uc3QgW21lbW9zLCBzZXRNZW1vc10gPSB1c2VTdGF0ZTxNb2RlbC5NZW1vW10+KFtdKTtcclxuICBjb25zdCBbY3VycmVudERhdGVTdGFtcCwgc2V0Q3VycmVudERhdGVTdGFtcF0gPSB1c2VTdGF0ZShcclxuICAgIHV0aWxzLmdldERhdGVTdGFtcEJ5RGF0ZSh1dGlscy5nZXREYXRlU3RyaW5nKHByb3BzLmN1cnJlbnREYXRlU3RhbXApKSxcclxuICApO1xyXG4gIGNvbnN0IFtzaG93RGF0ZVBpY2tlciwgdG9nZ2xlU2hvd0RhdGVQaWNrZXJdID0gdXNlVG9nZ2xlKGZhbHNlKTtcclxuICBjb25zdCBtZW1vc0VsUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcclxuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlU3RhbXApO1xyXG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBzZXREYWlseU1lbW9zID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBkYWlseU1lbW9zID0gbWVtb1NlcnZpY2VcclxuICAgICAgICAuZ2V0U3RhdGUoKVxyXG4gICAgICAgIC5tZW1vcy5maWx0ZXIoXHJcbiAgICAgICAgICAoYSkgPT5cclxuICAgICAgICAgICAgdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSA+PSBjdXJyZW50RGF0ZVN0YW1wICYmXHJcbiAgICAgICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCkgPCBjdXJyZW50RGF0ZVN0YW1wICsgREFJTFlfVElNRVNUQU1QLFxyXG4gICAgICAgIClcclxuICAgICAgICAuc29ydCgoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkpO1xyXG4gICAgICBzZXRNZW1vcyhkYWlseU1lbW9zKTtcclxuICAgICAgbG9hZGluZ1N0YXRlLnNldEZpbmlzaCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBzZXREYWlseU1lbW9zKCk7XHJcbiAgfSwgW2N1cnJlbnREYXRlU3RhbXBdKTtcclxuXHJcbiAgY29uc3QgY29udmVydEJhc2U2NFRvQmxvYiA9IChiYXNlNjQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICB2YXIgYnl0ZXMgPSB3aW5kb3cuYXRvYihiYXNlNjQpO1xyXG4gICAgdmFyIGFiID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVzLmxlbmd0aCk7XHJcbiAgICB2YXIgaWEgPSBuZXcgVWludDhBcnJheShhYik7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlhW2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbYWJdLCB7dHlwZTogdHlwZX0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVNoYXJlQnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XHJcbiAgICB0b2dnbGVTaG93RGF0ZVBpY2tlcihmYWxzZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghbWVtb3NFbFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0b0ltYWdlKG1lbW9zRWxSZWYuY3VycmVudCwge1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmZmZmYnLFxyXG4gICAgICAgIHBpeGVsUmF0aW86IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogMixcclxuICAgICAgfSlcclxuICAgICAgICAudGhlbigodXJsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoQXV0b1NhdmVXaGVuT25Nb2JpbGUgJiYgUGxhdGZvcm0uaXNNb2JpbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgbXlCYXNlNjQgPSB1cmwuc3BsaXQoJ2Jhc2U2NCwnKVsxXTtcclxuICAgICAgICAgICAgY29uc3QgYmxvYklucHV0ID0gY29udmVydEJhc2U2NFRvQmxvYihteUJhc2U2NCwgJ2ltYWdlL3BuZycpO1xyXG4gICAgICAgICAgICBibG9iSW5wdXQuYXJyYXlCdWZmZXIoKS50aGVuKGFzeW5jIChidWZmZXIpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgYUZpbGU7XHJcbiAgICAgICAgICAgICAgbGV0IG5ld0ZpbGU7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXh0ID0gJ3BuZyc7XHJcbiAgICAgICAgICAgICAgY29uc3QgZGFpbHlOb3RlcyA9IGdldEFsbERhaWx5Tm90ZXMoKTtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0cmluZyBpbiBkYWlseU5vdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGFpbHlOb3Rlc1tzdHJpbmddIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgYUZpbGUgPSBkYWlseU5vdGVzW3N0cmluZ107XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoYUZpbGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbmV3RmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZUJpbmFyeShcclxuICAgICAgICAgICAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB2YXVsdC5nZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMoXHJcbiAgICAgICAgICAgICAgICAgICAgYFBhc3RlZCBJbWFnZSAke21vbWVudCgpLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKX1gLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBhRmlsZSxcclxuICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgYnVmZmVyLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2hvd1ByZXZpZXdJbWFnZURpYWxvZyh1cmwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgIC8vIGRvIG50aFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgMCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlRGF0YVBpY2tlckNoYW5nZSA9IChkYXRlc3RhbXA6IERhdGVTdGFtcCk6IHZvaWQgPT4ge1xyXG4gICAgc2V0Q3VycmVudERhdGVTdGFtcChkYXRlc3RhbXApO1xyXG4gICAgdG9nZ2xlU2hvd0RhdGVQaWNrZXIoZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1oZWFkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoZWFkZXItd3JhcHBlclwiPlxyXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiPnt0KCdEYWlseSBNZW1vcycpfTwvcD5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnRucy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuLXRleHRcIiBvbkNsaWNrPXsoKSA9PiBzZXRDdXJyZW50RGF0ZVN0YW1wKGN1cnJlbnREYXRlU3RhbXAgLSBEQUlMWV9USU1FU1RBTVApfT5cclxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXthcnJvd0xlZnR9IC8+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuLXRleHRcIiBvbkNsaWNrPXsoKSA9PiBzZXRDdXJyZW50RGF0ZVN0YW1wKGN1cnJlbnREYXRlU3RhbXAgKyBEQUlMWV9USU1FU1RBTVApfT5cclxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXthcnJvd1JpZ2h0fSAvPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0bi10ZXh0IHNoYXJlLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNoYXJlQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e3NoYXJlfSAvPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0bi10ZXh0XCIgb25DbGljaz17KCkgPT4gcHJvcHMuZGVzdHJveSgpfT5cclxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtjbG9zZX0gLz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1jb250ZW50LWNvbnRhaW5lclwiIHJlZj17bWVtb3NFbFJlZn0+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXRlLWNhcmQtY29udGFpbmVyXCIgb25DbGljaz17KCkgPT4gdG9nZ2xlU2hvd0RhdGVQaWNrZXIoKX0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInllYXItdGV4dFwiPntjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpfTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXRlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vbnRoLXRleHRcIj57dCgnbW9udGhzJylbY3VycmVudERhdGUuZ2V0TW9udGgoKV19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGF0ZS10ZXh0XCI+e2N1cnJlbnREYXRlLmdldERhdGUoKX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXktdGV4dFwiPnt0KCd3ZWVrRGF5cycpW2N1cnJlbnREYXRlLmdldERheSgpXX08L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxEYXRlUGlja2VyXHJcbiAgICAgICAgICBjbGFzc05hbWU9e2BkYXRlLXBpY2tlciAke3Nob3dEYXRlUGlja2VyID8gJycgOiAnaGlkZGVuJ31gfVxyXG4gICAgICAgICAgZGF0ZXN0YW1wPXtjdXJyZW50RGF0ZVN0YW1wfVxyXG4gICAgICAgICAgaGFuZGxlRGF0ZVN0YW1wQ2hhbmdlPXtoYW5kbGVEYXRhUGlja2VyQ2hhbmdlfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAge2xvYWRpbmdTdGF0ZS5pc0xvYWRpbmcgPyAoXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGlwLXRleHRcIj57dCgnTG9hZGluZy4uLicpfTwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICkgOiBtZW1vcy5sZW5ndGggPT09IDAgPyAoXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGlwLXRleHRcIj57dCgnTm9vb29wIScpfTwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICkgOiAoXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhaWx5bWVtb3Mtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICB7bWVtb3MubWFwKChtZW1vKSA9PiAoXHJcbiAgICAgICAgICAgICAgPERhaWx5TWVtbyBrZXk9e2Ake21lbW8uaWR9LSR7bWVtby51cGRhdGVkQXR9YH0gbWVtbz17bWVtb30gLz5cclxuICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2coZGF0ZXN0YW1wOiBEYXRlU3RhbXAgPSBEYXRlLm5vdygpKTogdm9pZCB7XHJcbiAgc2hvd0RpYWxvZyhcclxuICAgIHtcclxuICAgICAgY2xhc3NOYW1lOiAnZGFpbHktbWVtby1kaWFyeS1kaWFsb2cnLFxyXG4gICAgfSxcclxuICAgIERhaWx5TWVtb0RpYXJ5RGlhbG9nLFxyXG4gICAge2N1cnJlbnREYXRlU3RhbXA6IGRhdGVzdGFtcH0sXHJcbiAgKTtcclxufVxyXG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0IE1lbnVCdG5zUG9wdXAgZnJvbSAnLi9NZW51QnRuc1BvcHVwJztcclxuaW1wb3J0IHNob3dEYWlseU1lbW9EaWFyeURpYWxvZyBmcm9tICcuL0RhaWx5TWVtb0RpYXJ5RGlhbG9nJztcclxuaW1wb3J0ICcuLi9sZXNzL3VzZXItYmFubmVyLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge1VzZXJOYW1lfSBmcm9tICcuLi9tZW1vcyc7XHJcbmltcG9ydCBtb3JlIGZyb20gJy4uL2ljb25zL21vcmUuc3ZnJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbmludGVyZmFjZSBQcm9wcyB7fVxyXG5cclxuY29uc3QgVXNlckJhbm5lcjogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIG1lbW9TdGF0ZToge21lbW9zLCB0YWdzfSxcclxuICAgIHVzZXJTdGF0ZToge3VzZXJ9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG4gIGNvbnN0IHVzZXJuYW1lID0gdXNlciA/IHVzZXIudXNlcm5hbWUgOiBVc2VyTmFtZTtcclxuICBsZXQgbWVtb3NMZW5ndGg7XHJcbiAgbGV0IGNyZWF0ZWREYXlzO1xyXG4gIGlmIChtZW1vcy5sZW5ndGgpIHtcclxuICAgIG1lbW9zTGVuZ3RoID0gbWVtb3MubGVuZ3RoIC0gMTtcclxuICAgIGNyZWF0ZWREYXlzID0gbWVtb3NcclxuICAgICAgPyBNYXRoLmNlaWwoKERhdGUubm93KCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUobWVtb3NbbWVtb3NMZW5ndGhdLmNyZWF0ZWRBdCkpIC8gMTAwMCAvIDM2MDAgLyAyNCkgKyAxXHJcbiAgICAgIDogMDtcclxuICB9XHJcbiAgLy8gY29uc3QgZmlyc3RNZW1vID0gbWVtb3NbXSBhcyBNb2RlbC5NZW1vO1xyXG5cclxuICBjb25zdCBbc2hvdWxkU2hvd1BvcHVwQnRucywgc2V0U2hvdWxkU2hvd1BvcHVwQnRuc10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVVzZXJuYW1lQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICBsb2NhdGlvblNlcnZpY2UucHVzaEhpc3RvcnkoJy8nKTtcclxuICAgIGxvY2F0aW9uU2VydmljZS5jbGVhclF1ZXJ5KCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVQb3B1cEJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgY29uc3Qgc2lkZWJhckVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lbW9zLXNpZGViYXItd3JhcHBlcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3QgcG9wdXBFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZW51LWJ0bnMtcG9wdXAnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIHBvcHVwRWwuc3R5bGUudG9wID0gNzAgLSBzaWRlYmFyRWwuc2Nyb2xsVG9wICsgJ3B4JztcclxuICAgIHNldFNob3VsZFNob3dQb3B1cEJ0bnModHJ1ZSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1iYW5uZXItY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcmluZm8taGVhZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInVzZXJuYW1lLXRleHRcIiBvbkNsaWNrPXtoYW5kbGVVc2VybmFtZUNsaWNrfT5cclxuICAgICAgICAgIHt1c2VybmFtZX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYWN0aW9uLWJ0biBtZW51LXBvcHVwLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZVBvcHVwQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgPGltZyBzcmM9e21vcmV9IGNsYXNzTmFtZT1cImljb24taW1nXCIgLz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPE1lbnVCdG5zUG9wdXAgc2hvd25TdGF0dXM9e3Nob3VsZFNob3dQb3B1cEJ0bnN9IHNldFNob3duU3RhdHVzPXtzZXRTaG91bGRTaG93UG9wdXBCdG5zfSAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdGF0dXMtdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInN0YXR1cy10ZXh0IG1lbW9zLXRleHRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFtb3VudC10ZXh0XCI+e21lbW9zLmxlbmd0aH08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0eXBlLXRleHRcIj5NRU1PPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3RhdHVzLXRleHQgdGFncy10ZXh0XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJhbW91bnQtdGV4dFwiPnt0YWdzLmxlbmd0aH08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0eXBlLXRleHRcIj57dCgnVEFHJyl9PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3RhdHVzLXRleHQgZHVyYXRpb24tdGV4dFwiIG9uQ2xpY2s9eygpID0+IHNob3dEYWlseU1lbW9EaWFyeURpYWxvZygpfT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFtb3VudC10ZXh0XCI+e2NyZWF0ZWREYXlzID8/IDB9PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidHlwZS10ZXh0XCI+e3QoJ0RBWScpfTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVXNlckJhbm5lcjtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHttZW1vLCB1c2VFZmZlY3QsIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdXNlVG9nZ2xlIGZyb20gJy4uLy4uL2hvb2tzL3VzZVRvZ2dsZSc7XHJcbmltcG9ydCAnLi4vLi4vbGVzcy9jb21tb24vc2VsZWN0b3IubGVzcyc7XHJcbi8vIGltcG9ydCBhcnJvd0xlZnQgZnJvbSAnLi4vLi4vaWNvbnMvYXJyb3ctbGVmdC5zdmcnO1xyXG5pbXBvcnQgYXJyb3dSaWdodCBmcm9tICcuLi8uLi9pY29ucy9hcnJvdy1yaWdodC5zdmcnO1xyXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgVFZPYmplY3Qge1xyXG4gIHRleHQ6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge1xyXG4gIGNsYXNzTmFtZT86IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIGRhdGFTb3VyY2U6IFRWT2JqZWN0W107XHJcbiAgaGFuZGxlVmFsdWVDaGFuZ2VkPzogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmNvbnN0IG51bGxJdGVtID0ge1xyXG4gIHRleHQ6IHQoJ1NFTEVDVCcpLFxyXG4gIHZhbHVlOiAnJyxcclxufTtcclxuXHJcbmNvbnN0IFNlbGVjdG9yOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHM6IFByb3BzKSA9PiB7XHJcbiAgY29uc3Qge2NsYXNzTmFtZSwgZGF0YVNvdXJjZSwgaGFuZGxlVmFsdWVDaGFuZ2VkLCB2YWx1ZX0gPSBwcm9wcztcclxuICBjb25zdCBbc2hvd1NlbGVjdG9yLCB0b2dnbGVTZWxlY3RvclN0YXR1c10gPSB1c2VUb2dnbGUoZmFsc2UpO1xyXG5cclxuICBjb25zdCBzZWxldG9yRWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG5cclxuICBsZXQgY3VycmVudEl0ZW0gPSBudWxsSXRlbTtcclxuICBmb3IgKGNvbnN0IGQgb2YgZGF0YVNvdXJjZSkge1xyXG4gICAgaWYgKGQudmFsdWUgPT09IHZhbHVlKSB7XHJcbiAgICAgIGN1cnJlbnRJdGVtID0gZDtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHNob3dTZWxlY3Rvcikge1xyXG4gICAgICBjb25zdCBoYW5kbGVDbGlja091dHNpZGUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICBpZiAoIXNlbGV0b3JFbFJlZi5jdXJyZW50Py5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcclxuICAgICAgICAgIHRvZ2dsZVNlbGVjdG9yU3RhdHVzKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrT3V0c2lkZSwge1xyXG4gICAgICAgIGNhcHR1cmU6IHRydWUsXHJcbiAgICAgICAgb25jZTogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSwgW3Nob3dTZWxlY3Rvcl0pO1xyXG5cclxuICBjb25zdCBoYW5kbGVJdGVtQ2xpY2sgPSAoaXRlbTogVFZPYmplY3QpID0+IHtcclxuICAgIGlmIChoYW5kbGVWYWx1ZUNoYW5nZWQpIHtcclxuICAgICAgaGFuZGxlVmFsdWVDaGFuZ2VkKGl0ZW0udmFsdWUpO1xyXG4gICAgfVxyXG4gICAgdG9nZ2xlU2VsZWN0b3JTdGF0dXMoZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUN1cnJlbnRWYWx1ZUNsaWNrID0gKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRvZ2dsZVNlbGVjdG9yU3RhdHVzKCk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPXtgc2VsZWN0b3Itd3JhcHBlciAke2NsYXNzTmFtZSA/PyAnJ31gfSByZWY9e3NlbGV0b3JFbFJlZn0+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgY3VycmVudC12YWx1ZS1jb250YWluZXIgJHtzaG93U2VsZWN0b3IgPyAnYWN0aXZlJyA6ICcnfWB9IG9uQ2xpY2s9e2hhbmRsZUN1cnJlbnRWYWx1ZUNsaWNrfT5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ2YWx1ZS10ZXh0XCI+e2N1cnJlbnRJdGVtLnRleHR9PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFycm93LXRleHRcIj5cclxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Fycm93UmlnaHR9IC8+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgaXRlbXMtd3JhcHBlciAke3Nob3dTZWxlY3RvciA/ICcnIDogJ2hpZGRlbid9YH0+XHJcbiAgICAgICAge2RhdGFTb3VyY2UubWFwKChkKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgaXRlbS1jb250YWluZXIgJHtkLnZhbHVlID09PSB2YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ31gfVxyXG4gICAgICAgICAgICAgIGtleT17ZC52YWx1ZX1cclxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVJdGVtQ2xpY2soZCk7XHJcbiAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAge2QudGV4dH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBtZW1vKFNlbGVjdG9yKTtcclxuIiwiaW1wb3J0IHttZW1vLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge21lbW9TZXJ2aWNlLCBxdWVyeVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHtjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnMsIGZpbHRlckNvbnN0cywgZ2V0RGVmYXVsdEZpbHRlciwgcmVsYXRpb25Db25zdHN9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcclxuaW1wb3J0IHVzZUxvYWRpbmcgZnJvbSAnLi4vaG9va3MvdXNlTG9hZGluZyc7XHJcbmltcG9ydCB7c2hvd0RpYWxvZ30gZnJvbSAnLi9EaWFsb2cnO1xyXG5pbXBvcnQgU2VsZWN0b3IgZnJvbSAnLi9jb21tb24vU2VsZWN0b3InO1xyXG5pbXBvcnQgJy4uL2xlc3MvY3JlYXRlLXF1ZXJ5LWRpYWxvZy5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtOb3RpY2V9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IGNsb3NlIGZyb20gJy4uL2ljb25zL2Nsb3NlLnN2Zyc7XHJcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIERpYWxvZ1Byb3BzIHtcclxuICBxdWVyeUlkPzogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBDcmVhdGVRdWVyeURpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHtkZXN0cm95LCBxdWVyeUlkfSA9IHByb3BzO1xyXG5cclxuICBjb25zdCBbdGl0bGUsIHNldFRpdGxlXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xyXG4gIGNvbnN0IFtmaWx0ZXJzLCBzZXRGaWx0ZXJzXSA9IHVzZVN0YXRlPEZpbHRlcltdPihbXSk7XHJcbiAgY29uc3QgcmVxdWVzdFN0YXRlID0gdXNlTG9hZGluZyhmYWxzZSk7XHJcblxyXG4gIGNvbnN0IHNob3duTWVtb0xlbmd0aCA9IG1lbW9TZXJ2aWNlLmdldFN0YXRlKCkubWVtb3MuZmlsdGVyKChtZW1vKSA9PiB7XHJcbiAgICByZXR1cm4gY2hlY2tTaG91bGRTaG93TWVtb1dpdGhGaWx0ZXJzKG1lbW8sIGZpbHRlcnMpO1xyXG4gIH0pLmxlbmd0aDtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHF1ZXJ5VGVtcCA9IHF1ZXJ5U2VydmljZS5nZXRRdWVyeUJ5SWQocXVlcnlJZCA/PyAnJyk7XHJcbiAgICBpZiAocXVlcnlUZW1wKSB7XHJcbiAgICAgIHNldFRpdGxlKHF1ZXJ5VGVtcC50aXRsZSk7XHJcbiAgICAgIGNvbnN0IHRlbXAgPSBKU09OLnBhcnNlKHF1ZXJ5VGVtcC5xdWVyeXN0cmluZyk7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRlbXApKSB7XHJcbiAgICAgICAgc2V0RmlsdGVycyh0ZW1wKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sIFtxdWVyeUlkXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVRpdGxlSW5wdXRDaGFuZ2UgPSAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcclxuICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZSBhcyBzdHJpbmc7XHJcbiAgICBzZXRUaXRsZSh0ZXh0KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVTYXZlQnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAoIXRpdGxlKSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoJ1RJVExFIENBTk5PVCBCRSBOVUxM77yBJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoZmlsdGVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgbmV3IE5vdGljZSgnRklMVEVSIENBTk5PVCBCRSBOVUxM77yBJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAocXVlcnlJZCkge1xyXG4gICAgICAgIGNvbnN0IGVkaXRlZFF1ZXJ5ID0gYXdhaXQgcXVlcnlTZXJ2aWNlLnVwZGF0ZVF1ZXJ5KHF1ZXJ5SWQsIHRpdGxlLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmVkaXRRdWVyeShlZGl0ZWRRdWVyeSk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmdldE15QWxsUXVlcmllcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gYXdhaXQgcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KHRpdGxlLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLnB1c2hRdWVyeShxdWVyeSk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmdldE15QWxsUXVlcmllcygpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgICBkZXN0cm95KCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQWRkRmlsdGVyQmVuQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICBpZiAoZmlsdGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGxhc3RGaWx0ZXIgPSBmaWx0ZXJzW2ZpbHRlcnMubGVuZ3RoIC0gMV07XHJcbiAgICAgIGlmIChsYXN0RmlsdGVyLnZhbHVlLnZhbHVlID09PSAnJykge1xyXG4gICAgICAgIG5ldyBOb3RpY2UoJ+WFiOWujOWWhOS4iuS4gOS4qui/h+a7pOWZqOWQpycpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldEZpbHRlcnMoWy4uLmZpbHRlcnMsIGdldERlZmF1bHRGaWx0ZXIoKV0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUZpbHRlckNoYW5nZSA9IHVzZUNhbGxiYWNrKChpbmRleDogbnVtYmVyLCBmaWx0ZXI6IEZpbHRlcikgPT4ge1xyXG4gICAgc2V0RmlsdGVycygoZmlsdGVycykgPT4ge1xyXG4gICAgICBjb25zdCB0ZW1wID0gWy4uLmZpbHRlcnNdO1xyXG4gICAgICB0ZW1wW2luZGV4XSA9IGZpbHRlcjtcclxuICAgICAgcmV0dXJuIHRlbXA7XHJcbiAgICB9KTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUZpbHRlclJlbW92ZSA9IHVzZUNhbGxiYWNrKChpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICBzZXRGaWx0ZXJzKChmaWx0ZXJzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRlbXAgPSBmaWx0ZXJzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xyXG4gICAgICByZXR1cm4gdGVtcDtcclxuICAgIH0pO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlhbG9nLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn5SWPC9zcGFuPlxyXG4gICAgICAgICAge3F1ZXJ5SWQgPyB0KCdFRElUIFFVRVJZJykgOiB0KCdDUkVBVEUgUVVFUlknKX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gY2xvc2UtYnRuXCIgb25DbGljaz17ZGVzdHJveX0+XHJcbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtjbG9zZX0gLz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlhbG9nLWNvbnRlbnQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWl0ZW0tY29udGFpbmVyIGlucHV0LWZvcm0tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPnt0KCdUSVRMRScpfTwvc3Bhbj5cclxuICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJ0aXRsZS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9e3RpdGxlfSBvbkNoYW5nZT17aGFuZGxlVGl0bGVJbnB1dENoYW5nZX0gLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0taXRlbS1jb250YWluZXIgZmlsdGVyLWZvcm0tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPnt0KCdGSUxURVInKX08L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpbHRlcnMtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICB7ZmlsdGVycy5tYXAoKGYsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIDxNZW1vRmlsdGVySW5wdXRlclxyXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxyXG4gICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlcj17Zn1cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlRmlsdGVyQ2hhbmdlPXtoYW5kbGVGaWx0ZXJDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgICAgIGhhbmRsZUZpbHRlclJlbW92ZT17aGFuZGxlRmlsdGVyUmVtb3ZlfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjcmVhdGUtZmlsdGVyLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUFkZEZpbHRlckJlbkNsaWNrfT5cclxuICAgICAgICAgICAgICB7dCgnQUREIEZJTFRFUiBURVJNUycpfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkaWFsb2ctZm9vdGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG5zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtgdGlwLXRleHQgJHtmaWx0ZXJzLmxlbmd0aCA9PT0gMCAmJiAnaGlkZGVuJ31gfT5cclxuICAgICAgICAgICAge3QoJ01BVENIJyl9IE1lbW8gPHN0cm9uZz57c2hvd25NZW1vTGVuZ3RofTwvc3Ryb25nPiB7dCgnVElNRVMnKX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtgYnRuIHNhdmUtYnRuICR7cmVxdWVzdFN0YXRlLmlzTG9hZGluZyA/ICdyZXF1ZXN0aW5nJyA6ICcnfWB9IG9uQ2xpY2s9e2hhbmRsZVNhdmVCdG5DbGlja30+XHJcbiAgICAgICAgICAgIFNBVkVcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5pbnRlcmZhY2UgTWVtb0ZpbHRlcklucHV0ZXJQcm9wcyB7XHJcbiAgaW5kZXg6IG51bWJlcjtcclxuICBmaWx0ZXI6IEZpbHRlcjtcclxuICBoYW5kbGVGaWx0ZXJDaGFuZ2U6IChpbmRleDogbnVtYmVyLCBmaWx0ZXI6IEZpbHRlcikgPT4gdm9pZDtcclxuICBoYW5kbGVGaWx0ZXJSZW1vdmU6IChpbmRleDogbnVtYmVyKSA9PiB2b2lkO1xyXG59XHJcblxyXG5jb25zdCBGaWx0ZXJJbnB1dGVyOiBSZWFjdC5GQzxNZW1vRmlsdGVySW5wdXRlclByb3BzPiA9IChwcm9wczogTWVtb0ZpbHRlcklucHV0ZXJQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHtpbmRleCwgZmlsdGVyLCBoYW5kbGVGaWx0ZXJDaGFuZ2UsIGhhbmRsZUZpbHRlclJlbW92ZX0gPSBwcm9wcztcclxuICBjb25zdCB7dHlwZX0gPSBmaWx0ZXI7XHJcbiAgY29uc3QgW2lucHV0RWxlbWVudHMsIHNldElucHV0RWxlbWVudHNdID0gdXNlU3RhdGU8SlNYLkVsZW1lbnQ+KDw+PC8+KTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGxldCBvcGVyYXRvckVsZW1lbnQgPSA8PjwvPjtcclxuICAgIGlmIChPYmplY3Qua2V5cyhmaWx0ZXJDb25zdHMpLmluY2x1ZGVzKHR5cGUpKSB7XHJcbiAgICAgIG9wZXJhdG9yRWxlbWVudCA9IChcclxuICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgIGNsYXNzTmFtZT1cIm9wZXJhdG9yLXNlbGVjdG9yXCJcclxuICAgICAgICAgIGRhdGFTb3VyY2U9e09iamVjdC52YWx1ZXMoZmlsdGVyQ29uc3RzW3R5cGUgYXMgRmlsdGVyVHlwZV0ub3BlcmF0b3JzKX1cclxuICAgICAgICAgIHZhbHVlPXtmaWx0ZXIudmFsdWUub3BlcmF0b3J9XHJcbiAgICAgICAgICBoYW5kbGVWYWx1ZUNoYW5nZWQ9e2hhbmRsZU9wZXJhdG9yQ2hhbmdlfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHZhbHVlRWxlbWVudCA9IDw+PC8+O1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ1RZUEUnOiB7XHJcbiAgICAgICAgdmFsdWVFbGVtZW50ID0gKFxyXG4gICAgICAgICAgPFNlbGVjdG9yXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInZhbHVlLXNlbGVjdG9yXCJcclxuICAgICAgICAgICAgZGF0YVNvdXJjZT17ZmlsdGVyQ29uc3RzWydUWVBFJ10udmFsdWVzfVxyXG4gICAgICAgICAgICB2YWx1ZT17ZmlsdGVyLnZhbHVlLnZhbHVlfVxyXG4gICAgICAgICAgICBoYW5kbGVWYWx1ZUNoYW5nZWQ9e2hhbmRsZVZhbHVlQ2hhbmdlfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ1RBRyc6IHtcclxuICAgICAgICB2YWx1ZUVsZW1lbnQgPSAoXHJcbiAgICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidmFsdWUtc2VsZWN0b3JcIlxyXG4gICAgICAgICAgICBkYXRhU291cmNlPXttZW1vU2VydmljZVxyXG4gICAgICAgICAgICAgIC5nZXRTdGF0ZSgpXHJcbiAgICAgICAgICAgICAgLnRhZ3Muc29ydCgpXHJcbiAgICAgICAgICAgICAgLm1hcCgodCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHt0ZXh0OiB0LCB2YWx1ZTogdH07XHJcbiAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgIHZhbHVlPXtmaWx0ZXIudmFsdWUudmFsdWV9XHJcbiAgICAgICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlZD17aGFuZGxlVmFsdWVDaGFuZ2V9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnVEVYVCc6IHtcclxuICAgICAgICB2YWx1ZUVsZW1lbnQgPSAoXHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ2YWx1ZS1pbnB1dGVyXCJcclxuICAgICAgICAgICAgdmFsdWU9e2ZpbHRlci52YWx1ZS52YWx1ZX1cclxuICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRJbnB1dEVsZW1lbnRzKFxyXG4gICAgICA8PlxyXG4gICAgICAgIHtvcGVyYXRvckVsZW1lbnR9XHJcbiAgICAgICAge3ZhbHVlRWxlbWVudH1cclxuICAgICAgPC8+LFxyXG4gICAgKTtcclxuICB9LCBbdHlwZSwgZmlsdGVyXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVJlbGF0aW9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXHJcbiAgICAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoWydBTkQnLCAnT1InXS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2UoaW5kZXgsIHtcclxuICAgICAgICAgIC4uLmZpbHRlcixcclxuICAgICAgICAgIHJlbGF0aW9uOiB2YWx1ZSBhcyBNZW1vRmlsdGVyUmFsYXRpb24sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBbZmlsdGVyXSxcclxuICApO1xyXG5cclxuICBjb25zdCBoYW5kbGVUeXBlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXHJcbiAgICAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoZmlsdGVyLnR5cGUgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgY29uc3Qgb3BzID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXJDb25zdHNbdmFsdWUgYXMgRmlsdGVyVHlwZV0ub3BlcmF0b3JzKTtcclxuICAgICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2UoaW5kZXgsIHtcclxuICAgICAgICAgIC4uLmZpbHRlcixcclxuICAgICAgICAgIHR5cGU6IHZhbHVlIGFzIEZpbHRlclR5cGUsXHJcbiAgICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgICBvcGVyYXRvcjogb3BzWzBdLnZhbHVlLFxyXG4gICAgICAgICAgICB2YWx1ZTogJycsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgW2ZpbHRlcl0sXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlT3BlcmF0b3JDaGFuZ2UgPSB1c2VDYWxsYmFjayhcclxuICAgICh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGhhbmRsZUZpbHRlckNoYW5nZShpbmRleCwge1xyXG4gICAgICAgIC4uLmZpbHRlcixcclxuICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgLi4uZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgICAgb3BlcmF0b3I6IHZhbHVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIFtmaWx0ZXJdLFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVZhbHVlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXHJcbiAgICAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2UoaW5kZXgsIHtcclxuICAgICAgICAuLi5maWx0ZXIsXHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIC4uLmZpbHRlci52YWx1ZSxcclxuICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIFtmaWx0ZXJdLFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVJlbW92ZUJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgaGFuZGxlRmlsdGVyUmVtb3ZlKGluZGV4KTtcclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLWZpbHRlci1pbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgIHtpbmRleCA+IDAgPyAoXHJcbiAgICAgICAgPFNlbGVjdG9yXHJcbiAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGlvbi1zZWxlY3RvclwiXHJcbiAgICAgICAgICBkYXRhU291cmNlPXtyZWxhdGlvbkNvbnN0c31cclxuICAgICAgICAgIHZhbHVlPXtmaWx0ZXIucmVsYXRpb259XHJcbiAgICAgICAgICBoYW5kbGVWYWx1ZUNoYW5nZWQ9e2hhbmRsZVJlbGF0aW9uQ2hhbmdlfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICkgOiBudWxsfVxyXG4gICAgICA8U2VsZWN0b3JcclxuICAgICAgICBjbGFzc05hbWU9XCJ0eXBlLXNlbGVjdG9yXCJcclxuICAgICAgICBkYXRhU291cmNlPXtPYmplY3QudmFsdWVzKGZpbHRlckNvbnN0cyl9XHJcbiAgICAgICAgdmFsdWU9e2ZpbHRlci50eXBlfVxyXG4gICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlZD17aGFuZGxlVHlwZUNoYW5nZX1cclxuICAgICAgLz5cclxuXHJcbiAgICAgIHtpbnB1dEVsZW1lbnRzfVxyXG4gICAgICA8aW1nIGNsYXNzTmFtZT1cInJlbW92ZS1idG5cIiBzcmM9e2Nsb3NlfSBvbkNsaWNrPXtoYW5kbGVSZW1vdmVCdG5DbGlja30gLz5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5jb25zdCBNZW1vRmlsdGVySW5wdXRlcjogUmVhY3QuRkM8TWVtb0ZpbHRlcklucHV0ZXJQcm9wcz4gPSBtZW1vKEZpbHRlcklucHV0ZXIpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hvd0NyZWF0ZVF1ZXJ5RGlhbG9nKHF1ZXJ5SWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICBzaG93RGlhbG9nKFxyXG4gICAge1xyXG4gICAgICBjbGFzc05hbWU6ICdjcmVhdGUtcXVlcnktZGlhbG9nJyxcclxuICAgIH0sXHJcbiAgICBDcmVhdGVRdWVyeURpYWxvZyxcclxuICAgIHtxdWVyeUlkfSxcclxuICApO1xyXG59XHJcbiIsImltcG9ydCB7dXNlQ29udGV4dCwgdXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcclxuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xyXG5pbXBvcnQgdXNlTG9hZGluZyBmcm9tICcuLi9ob29rcy91c2VMb2FkaW5nJztcclxuaW1wb3J0IE9ubHkgZnJvbSAnLi9jb21tb24vT25seVdoZW4nO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlLCBxdWVyeVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHNob3dDcmVhdGVRdWVyeURpYWxvZyBmcm9tICcuL0NyZWF0ZVF1ZXJ5RGlhbG9nJztcclxuaW1wb3J0ICcuLi9sZXNzL3F1ZXJ5LWxpc3QubGVzcyc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBtb3JlIGZyb20gJy4uL2ljb25zL21vcmUuc3ZnJztcclxuaW1wb3J0IG1vcmVXaGl0ZSBmcm9tICcuLi9pY29ucy9tb3JlLXdoaXRlLnN2Zyc7XHJcbmltcG9ydCB7Tm90aWNlfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbmludGVyZmFjZSBQcm9wcyB7fVxyXG5cclxuY29uc3QgUXVlcnlMaXN0OiBSZWFjdC5GQzxQcm9wcz4gPSAoKSA9PiB7XHJcbiAgY29uc3Qge1xyXG4gICAgcXVlcnlTdGF0ZToge3F1ZXJpZXN9LFxyXG4gICAgbG9jYXRpb25TdGF0ZToge1xyXG4gICAgICBxdWVyeToge2ZpbHRlcn0sXHJcbiAgICB9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG4gIGNvbnN0IGxvYWRpbmdTdGF0ZSA9IHVzZUxvYWRpbmcoKTtcclxuICBjb25zdCBzb3J0ZWRRdWVyaWVzID0gcXVlcmllc1xyXG4gICAgLnNvcnQoKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5jcmVhdGVkQXQpKVxyXG4gICAgLnNvcnQoKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLnBpbm5lZEF0ID8/IDApIC0gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEucGlubmVkQXQgPz8gMCkpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgcXVlcnlTZXJ2aWNlXHJcbiAgICAgIC5nZXRNeUFsbFF1ZXJpZXMoKVxyXG4gICAgICAuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgIC8vIGRvIG50aFxyXG4gICAgICB9KVxyXG4gICAgICAuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgbG9hZGluZ1N0YXRlLnNldEZpbmlzaCgpO1xyXG4gICAgICB9KTtcclxuICB9LCBbXSk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInF1ZXJpZXMtd3JhcHBlclwiPlxyXG4gICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj57dCgnUVVFUlknKX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17KCkgPT4gc2hvd0NyZWF0ZVF1ZXJ5RGlhbG9nKCl9PlxyXG4gICAgICAgICAgK1xyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9wPlxyXG4gICAgICA8T25seSB3aGVuPXtsb2FkaW5nU3RhdGUuaXNTdWNjZWVkICYmIHNvcnRlZFF1ZXJpZXMubGVuZ3RoID09PSAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNyZWF0ZS1xdWVyeS1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXsoKSA9PiBzaG93Q3JlYXRlUXVlcnlEaWFsb2coKX0+XHJcbiAgICAgICAgICAgIHt0KCdDUkVBVEUgRklMVEVSJyl9XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJxdWVyaWVzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIHtzb3J0ZWRRdWVyaWVzLm1hcCgocSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIDxRdWVyeUl0ZW1Db250YWluZXIga2V5PXtxLmlkfSBxdWVyeT17cX0gaXNBY3RpdmU9e3EuaWQgPT09IGZpbHRlcn0gLz47XHJcbiAgICAgICAgfSl9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufTtcclxuXHJcbmludGVyZmFjZSBRdWVyeUl0ZW1Db250YWluZXJQcm9wcyB7XHJcbiAgcXVlcnk6IE1vZGVsLlF1ZXJ5O1xyXG4gIGlzQWN0aXZlOiBib29sZWFuO1xyXG59XHJcblxyXG5jb25zdCBRdWVyeUl0ZW1Db250YWluZXI6IFJlYWN0LkZDPFF1ZXJ5SXRlbUNvbnRhaW5lclByb3BzPiA9IChwcm9wczogUXVlcnlJdGVtQ29udGFpbmVyUHJvcHMpID0+IHtcclxuICBjb25zdCB7cXVlcnksIGlzQWN0aXZlfSA9IHByb3BzO1xyXG4gIGNvbnN0IFtzaG93QWN0aW9uQnRucywgdG9nZ2xlU2hvd0FjdGlvbkJ0bnNdID0gdXNlVG9nZ2xlKGZhbHNlKTtcclxuICBjb25zdCBbc2hvd0NvbmZpcm1EZWxldGVCdG4sIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG5dID0gdXNlVG9nZ2xlKGZhbHNlKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlUXVlcnlDbGljayA9ICgpID0+IHtcclxuICAgIGlmIChpc0FjdGl2ZSkge1xyXG4gICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0TWVtb0ZpbHRlcignJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBpZiAoIVtcIi9cIiwgXCIvcmVjeWNsZVwiXS5pbmNsdWRlcyhsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5wYXRobmFtZSkpIHtcclxuICAgICAgLy8gICBsb2NhdGlvblNlcnZpY2Uuc2V0UGF0aG5hbWUoXCIvXCIpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRNZW1vRmlsdGVyKHF1ZXJ5LmlkKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVTaG93QWN0aW9uQnRuQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdG9nZ2xlU2hvd0FjdGlvbkJ0bnMoKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVBY3Rpb25CdG5Db250YWluZXJNb3VzZUxlYXZlID0gKCkgPT4ge1xyXG4gICAgdG9nZ2xlU2hvd0FjdGlvbkJ0bnMoZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZURlbGV0ZU1lbW9DbGljayA9IGFzeW5jIChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKHNob3dDb25maXJtRGVsZXRlQnRuKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgcXVlcnlTZXJ2aWNlLmRlbGV0ZVF1ZXJ5KHF1ZXJ5LmlkKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVFZGl0UXVlcnlCdG5DbGljayA9IChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBzaG93Q3JlYXRlUXVlcnlEaWFsb2cocXVlcnkuaWQpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVBpblF1ZXJ5QnRuQ2xpY2sgPSBhc3luYyAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVyeS5waW5uZWRBdCkge1xyXG4gICAgICAgIGF3YWl0IHF1ZXJ5U2VydmljZS51bnBpblF1ZXJ5KHF1ZXJ5LmlkKTtcclxuICAgICAgICBxdWVyeVNlcnZpY2UuZWRpdFF1ZXJ5KHtcclxuICAgICAgICAgIC4uLnF1ZXJ5LFxyXG4gICAgICAgICAgcGlubmVkQXQ6ICcnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHF1ZXJ5U2VydmljZS5waW5RdWVyeShxdWVyeS5pZCk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmVkaXRRdWVyeSh7XHJcbiAgICAgICAgICAuLi5xdWVyeSxcclxuICAgICAgICAgIHBpbm5lZEF0OiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhEYXRlLm5vdygpKSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gZG8gbnRoXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlRGVsZXRlQnRuTW91c2VMZWF2ZSA9ICgpID0+IHtcclxuICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YHF1ZXJ5LWl0ZW0tY29udGFpbmVyICR7aXNBY3RpdmUgPyAnYWN0aXZlJyA6ICcnfWB9IG9uQ2xpY2s9e2hhbmRsZVF1ZXJ5Q2xpY2t9PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicXVlcnktdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPiM8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJxdWVyeS10ZXh0XCI+e3F1ZXJ5LnRpdGxlfTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJhY3Rpb24tYnRuIHRvZ2dsZS1idG5cIiBvbkNsaWNrPXtoYW5kbGVTaG93QWN0aW9uQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtpc0FjdGl2ZSA/IG1vcmVXaGl0ZSA6IG1vcmV9IC8+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YGFjdGlvbi1idG5zLXdyYXBwZXIgJHtzaG93QWN0aW9uQnRucyA/ICcnIDogJ2hpZGRlbid9YH1cclxuICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXtoYW5kbGVBY3Rpb25CdG5Db250YWluZXJNb3VzZUxlYXZlfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhY3Rpb24tYnRucy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVQaW5RdWVyeUJ0bkNsaWNrfT5cclxuICAgICAgICAgICAgICAgIHtxdWVyeS5waW5uZWRBdCA/IHQoJ1VOUElOJykgOiB0KCdQSU4nKX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17aGFuZGxlRWRpdFF1ZXJ5QnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAge3QoJ0VESVQnKX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGJ0biBkZWxldGUtYnRuICR7c2hvd0NvbmZpcm1EZWxldGVCdG4gPyAnZmluYWwtY29uZmlybScgOiAnJ31gfVxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRGVsZXRlTWVtb0NsaWNrfVxyXG4gICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXtoYW5kbGVEZWxldGVCdG5Nb3VzZUxlYXZlfT5cclxuICAgICAgICAgICAgICAgIHtzaG93Q29uZmlybURlbGV0ZUJ0biA/IHQoJ0NPTkZJUk3vvIEnKSA6IHQoJ0RFTEVURScpfVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8Lz5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUXVlcnlMaXN0O1xyXG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xyXG5pbXBvcnQge2xvY2F0aW9uU2VydmljZSwgbWVtb1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xyXG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0ICcuLi9sZXNzL3RhZy1saXN0Lmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXJyb3dSaWdodCBmcm9tICcuLi9pY29ucy9hcnJvdy1yaWdodC5zdmcnO1xyXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgVGFnIHtcclxuICBrZXk6IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgc3ViVGFnczogVGFnW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBQcm9wcyB7fVxyXG5cclxuY29uc3QgVGFnTGlzdDogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIGxvY2F0aW9uU3RhdGU6IHtcclxuICAgICAgcXVlcnk6IHt0YWc6IHRhZ1F1ZXJ5fSxcclxuICAgIH0sXHJcbiAgICBtZW1vU3RhdGU6IHt0YWdzOiB0YWdzVGV4dCwgbWVtb3N9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG4gIGNvbnN0IFt0YWdzLCBzZXRUYWdzXSA9IHVzZVN0YXRlPFRhZ1tdPihbXSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBtZW1vU2VydmljZS51cGRhdGVUYWdzU3RhdGUoKTtcclxuICB9LCBbbWVtb3NdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSBBcnJheS5mcm9tKHRhZ3NUZXh0KS5zb3J0KCk7XHJcbiAgICBjb25zdCByb290OiBLVk9iamVjdDxhbnk+ID0ge1xyXG4gICAgICBzdWJUYWdzOiBbXSxcclxuICAgIH07XHJcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBzb3J0ZWRUYWdzKSB7XHJcbiAgICAgIGNvbnN0IHN1YnRhZ3MgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgbGV0IHRlbXBPYmogPSByb290O1xyXG4gICAgICBsZXQgdGFnVGV4dCA9ICcnO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YnRhZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBzdWJ0YWdzW2ldO1xyXG4gICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICB0YWdUZXh0ICs9IGtleTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGFnVGV4dCArPSAnLycgKyBrZXk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgb2JqID0gbnVsbDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRlbXBPYmouc3ViVGFncykge1xyXG4gICAgICAgICAgaWYgKHQudGV4dCA9PT0gdGFnVGV4dCkge1xyXG4gICAgICAgICAgICBvYmogPSB0O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICBvYmogPSB7XHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgdGV4dDogdGFnVGV4dCxcclxuICAgICAgICAgICAgc3ViVGFnczogW10sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGVtcE9iai5zdWJUYWdzLnB1c2gob2JqKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRlbXBPYmogPSBvYmo7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHNldFRhZ3Mocm9vdC5zdWJUYWdzIGFzIFRhZ1tdKTtcclxuICB9LCBbdGFnc1RleHRdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwidGFncy13cmFwcGVyXCI+XHJcbiAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj57dCgnRnJlcXVlbnRseSBVc2VkIFRhZ3MnKX08L3A+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGFncy1jb250YWluZXJcIj5cclxuICAgICAgICB7dGFncy5tYXAoKHQsIGlkeCkgPT4gKFxyXG4gICAgICAgICAgPFRhZ0l0ZW1Db250YWluZXIga2V5PXt0LnRleHQgKyAnLScgKyBpZHh9IHRhZz17dH0gdGFnUXVlcnk9e3RhZ1F1ZXJ5fSAvPlxyXG4gICAgICAgICkpfVxyXG4gICAgICAgIDxPbmx5IHdoZW49e3RhZ3MubGVuZ3RoIDwgNSAmJiBtZW1vU2VydmljZS5pbml0aWFsaXplZH0+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0YWctdGlwLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICBJbnB1dDxzcGFuIGNsYXNzTmFtZT1cImNvZGUtdGV4dFwiPiNUYWcgPC9zcGFuPnRvIGNyZWF0ZSB0YWcuLi5cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L09ubHk+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufTtcclxuXHJcbmludGVyZmFjZSBUYWdJdGVtQ29udGFpbmVyUHJvcHMge1xyXG4gIHRhZzogVGFnO1xyXG4gIHRhZ1F1ZXJ5OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IFRhZ0l0ZW1Db250YWluZXI6IFJlYWN0LkZDPFRhZ0l0ZW1Db250YWluZXJQcm9wcz4gPSAocHJvcHM6IFRhZ0l0ZW1Db250YWluZXJQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHt0YWcsIHRhZ1F1ZXJ5fSA9IHByb3BzO1xyXG4gIGNvbnN0IGlzQWN0aXZlID0gdGFnUXVlcnkgPT09IHRhZy50ZXh0O1xyXG4gIGNvbnN0IGhhc1N1YlRhZ3MgPSB0YWcuc3ViVGFncy5sZW5ndGggPiAwO1xyXG4gIGNvbnN0IFtzaG93U3ViVGFncywgdG9nZ2xlU3ViVGFnc10gPSB1c2VUb2dnbGUoZmFsc2UpO1xyXG5cclxuICBjb25zdCBoYW5kbGVUYWdDbGljayA9ICgpID0+IHtcclxuICAgIGlmIChpc0FjdGl2ZSkge1xyXG4gICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0VGFnUXVlcnkoJycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdXRpbHMuY29weVRleHRUb0NsaXBib2FyZChgIyR7dGFnLnRleHR9IGApO1xyXG4gICAgICBpZiAoIVsnLycsICcvcmVjeWNsZSddLmluY2x1ZGVzKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnBhdGhuYW1lKSkge1xyXG4gICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRQYXRobmFtZSgnLycpO1xyXG4gICAgICB9XHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRUYWdRdWVyeSh0YWcudGV4dCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlVG9nZ2xlQnRuQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdG9nZ2xlU3ViVGFncygpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YHRhZy1pdGVtLWNvbnRhaW5lciAke2lzQWN0aXZlID8gJ2FjdGl2ZScgOiAnJ31gfSBvbkNsaWNrPXtoYW5kbGVUYWdDbGlja30+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0YWctdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPiM8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0YWctdGV4dFwiPnt0YWcua2V5fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICB7aGFzU3ViVGFncyA/IChcclxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtgYWN0aW9uLWJ0biB0b2dnbGUtYnRuICR7c2hvd1N1YlRhZ3MgPyAnc2hvd24nIDogJyd9YH0gb25DbGljaz17aGFuZGxlVG9nZ2xlQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Fycm93UmlnaHR9IC8+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICkgOiBudWxsfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIHtoYXNTdWJUYWdzID8gKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgc3VidGFncy1jb250YWluZXIgJHtzaG93U3ViVGFncyA/ICcnIDogJ2hpZGRlbid9YH0+XHJcbiAgICAgICAgICB7dGFnLnN1YlRhZ3MubWFwKChzdCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgIDxUYWdJdGVtQ29udGFpbmVyIGtleT17c3QudGV4dCArICctJyArIGlkeH0gdGFnPXtzdH0gdGFnUXVlcnk9e3RhZ1F1ZXJ5fSAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICkgOiBudWxsfVxyXG4gICAgPC8+XHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRhZ0xpc3Q7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIHJlYWN0XzEgPSByZXF1aXJlKFwicmVhY3RcIik7XG52YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIChzZXRTdGF0ZUFjdGlvbikge1xuICAgIHJldHVybiB0eXBlb2Ygc2V0U3RhdGVBY3Rpb24gPT09IFwiZnVuY3Rpb25cIjtcbn07XG52YXIgdXNlU3RhdGVSZWYgPSBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgdmFyIF9hID0gcmVhY3RfMS51c2VTdGF0ZShpbml0aWFsU3RhdGUpLCBzdGF0ZSA9IF9hWzBdLCBzZXRTdGF0ZSA9IF9hWzFdO1xuICAgIHZhciByZWYgPSByZWFjdF8xLnVzZVJlZihzdGF0ZSk7XG4gICAgdmFyIGRpc3BhdGNoID0gcmVhY3RfMS51c2VDYWxsYmFjayhmdW5jdGlvbiAoc2V0U3RhdGVBY3Rpb24pIHtcbiAgICAgICAgcmVmLmN1cnJlbnQgPSBpc0Z1bmN0aW9uKHNldFN0YXRlQWN0aW9uKSA/IHNldFN0YXRlQWN0aW9uKHJlZi5jdXJyZW50KSA6IHNldFN0YXRlQWN0aW9uO1xuICAgICAgICBzZXRTdGF0ZShyZWYuY3VycmVudCk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiBbc3RhdGUsIGRpc3BhdGNoLCByZWZdO1xufTtcbm1vZHVsZS5leHBvcnRzID0gdXNlU3RhdGVSZWY7XG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdXNlU3RhdGUgZnJvbSAncmVhY3QtdXNlc3RhdGVyZWYnO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7ZGFpbHlOb3Rlc1NlcnZpY2UsIGdsb2JhbFN0YXRlU2VydmljZSwgbG9jYXRpb25TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7REFJTFlfVElNRVNUQU1QfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0ICcuLi9sZXNzL3VzYWdlLWhlYXQtbWFwLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge21vbWVudCwgUGxhdGZvcm19IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuaW1wb3J0IHtnZXREYWlseU5vdGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcblxyXG5jb25zdCB0YWJsZUNvbmZpZyA9IHtcclxuICB3aWR0aDogMTIsXHJcbiAgaGVpZ2h0OiA3LFxyXG59O1xyXG5cclxuY29uc3QgZ2V0SW5pdGlhbFVzYWdlU3RhdCA9ICh1c2VkRGF5c0Ftb3VudDogbnVtYmVyLCBiZWdpbkRheVRpbWVzdGFtcDogbnVtYmVyKTogRGFpbHlVc2FnZVN0YXRbXSA9PiB7XHJcbiAgY29uc3QgaW5pdGlhbFVzYWdlU3RhdDogRGFpbHlVc2FnZVN0YXRbXSA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IHVzZWREYXlzQW1vdW50OyBpKyspIHtcclxuICAgIGluaXRpYWxVc2FnZVN0YXQucHVzaCh7XHJcbiAgICAgIHRpbWVzdGFtcDogcGFyc2VJbnQobW9tZW50KGJlZ2luRGF5VGltZXN0YW1wKS5hZGQoaSwgJ2RheXMnKS5mb3JtYXQoJ3gnKSksXHJcbiAgICAgIGNvdW50OiAwLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiBpbml0aWFsVXNhZ2VTdGF0O1xyXG59O1xyXG5cclxuaW50ZXJmYWNlIERhaWx5VXNhZ2VTdGF0IHtcclxuICB0aW1lc3RhbXA6IG51bWJlcjtcclxuICBjb3VudDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyBpbnRlcmZhY2UgRnJvbVRvIHtcclxuLy8gICBiZWdpbjogc3RyaW5nO1xyXG4vLyB9XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge31cclxuXHJcbi8vIGxldCBGcm9tVG86IHN0cmluZyA9ICcnO1xyXG5cclxuY29uc3QgVXNhZ2VIZWF0TWFwOiBSZWFjdC5GQzxQcm9wcz4gPSAoKSA9PiB7XHJcbiAgLy8gY29uc3QgdG9kYXlUaW1lU3RhbXAgPSB1dGlscy5nZXREYXRlU3RhbXBCeURhdGUobW9tZW50KCkuc3RhcnRPZignZGF5JykuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJykpO1xyXG4gIGNvbnN0IHRvZGF5VGltZVN0YW1wID0gcGFyc2VJbnQobW9tZW50KCkuZW5kT2YoJ2RheScpLmZvcm1hdCgneCcpKTtcclxuICBjb25zdCB0b2RheURheSA9IG5ldyBEYXRlKHRvZGF5VGltZVN0YW1wKS5nZXREYXkoKSB8fCA3O1xyXG4gIGNvbnN0IG51bGxDZWxsID0gbmV3IEFycmF5KDcgLSB0b2RheURheSkuZmlsbCgwKTtcclxuICBjb25zdCB1c2VkRGF5c0Ftb3VudCA9ICh0YWJsZUNvbmZpZy53aWR0aCAtIDEpICogdGFibGVDb25maWcuaGVpZ2h0ICsgdG9kYXlEYXk7XHJcbiAgLy8gY29uc3QgYmVnaW5EYXlUaW1lc3RhbXAgPSB1dGlscy5nZXREYXRlU3RhbXBCeURhdGUodG9kYXlUaW1lU3RhbXAgLSB1c2VkRGF5c0Ftb3VudCAqIERBSUxZX1RJTUVTVEFNUCk7XHJcbiAgY29uc3QgYmVnaW5EYXlUaW1lc3RhbXAgPSBwYXJzZUludChtb21lbnQoKS5zdGFydE9mKCdkYXknKS5zdWJ0cmFjdCh1c2VkRGF5c0Ftb3VudCwgJ2RheXMnKS5mb3JtYXQoJ3gnKSk7XHJcbiAgY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KCkuc3RhcnRPZignZGF5Jykuc3VidHJhY3QodXNlZERheXNBbW91bnQsICdkYXlzJyk7XHJcblxyXG4gIGNvbnN0IHtcclxuICAgIG1lbW9TdGF0ZToge21lbW9zfSxcclxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcclxuICBjb25zdCBbYWxsU3RhdCwgc2V0QWxsU3RhdF0gPSB1c2VTdGF0ZTxEYWlseVVzYWdlU3RhdFtdPihnZXRJbml0aWFsVXNhZ2VTdGF0KHVzZWREYXlzQW1vdW50LCBiZWdpbkRheVRpbWVzdGFtcCkpO1xyXG4gIGNvbnN0IFtwb3B1cFN0YXQsIHNldFBvcHVwU3RhdF0gPSB1c2VTdGF0ZTxEYWlseVVzYWdlU3RhdCB8IG51bGw+KG51bGwpO1xyXG4gIGNvbnN0IFtjdXJyZW50U3RhdCwgc2V0Q3VycmVudFN0YXRdID0gdXNlU3RhdGU8RGFpbHlVc2FnZVN0YXQgfCBudWxsPihudWxsKTtcclxuICBjb25zdCBbZnJvbVRvLCBzZXRGcm9tVG8sIGZyb21Ub1JlZl0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgY29uc3QgY29udGFpbmVyRWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IHBvcHVwUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcclxuICAvLyBjb25zdCBuZXdGcm9tVG8gPSB7XHJcbiAgLy8gICBiZWdpbjogXCJmcm9tXCIsXHJcbiAgLy8gfSBhcyBGcm9tVG87XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBuZXdTdGF0OiBEYWlseVVzYWdlU3RhdFtdID0gZ2V0SW5pdGlhbFVzYWdlU3RhdCh1c2VkRGF5c0Ftb3VudCwgYmVnaW5EYXlUaW1lc3RhbXApO1xyXG4gICAgZm9yIChjb25zdCBtIG9mIG1lbW9zKSB7XHJcbiAgICAgIGNvbnN0IGNyZWF0aW9uRGF0ZSA9IG1vbWVudChtLmNyZWF0ZWRBdC5yZXBsYWNlQWxsKCcvJywgJy0nKSkuc3RhcnRPZignZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gY3JlYXRpb25EYXRlLmRpZmYoc3RhcnREYXRlLCAnZGF5cycpO1xyXG4gICAgICAvLyBjb25zdCBpbmRleCA9ICh1dGlscy5nZXREYXRlU3RhbXBCeURhdGUobS5jcmVhdGVkQXQpIC0gYmVnaW5EYXlUaW1lc3RhbXApIC8gKDEwMDAgKiAzNjAwICogMjQpIC0gMTtcclxuICAgICAgLy8gaWYoaW5kZXggIT0gbmV3U3RhdC5sZW5ndGgpIHsgfVxyXG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG5ld1N0YXQubGVuZ3RoKSB7XHJcbiAgICAgICAgbmV3U3RhdFtpbmRleF0uY291bnQgKz0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0QWxsU3RhdChbLi4ubmV3U3RhdF0pO1xyXG4gIH0sIFttZW1vc10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVVc2FnZVN0YXRJdGVtTW91c2VFbnRlciA9IHVzZUNhbGxiYWNrKChldmVudDogUmVhY3QuTW91c2VFdmVudCwgaXRlbTogRGFpbHlVc2FnZVN0YXQpID0+IHtcclxuICAgIHNldFBvcHVwU3RhdChpdGVtKTtcclxuICAgIGlmICghcG9wdXBSZWYuY3VycmVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qge2lzTW9iaWxlVmlld30gPSBnbG9iYWxTdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKTtcclxuICAgIGNvbnN0IHRhcmdldEVsID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3Qgc2lkZWJhckVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lbW9zLXNpZGViYXItd3JhcHBlcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgcG9wdXBSZWYuY3VycmVudC5zdHlsZS5sZWZ0ID0gdGFyZ2V0RWwub2Zmc2V0TGVmdCAtIChjb250YWluZXJFbFJlZi5jdXJyZW50Py5vZmZzZXRMZWZ0ID8/IDApICsgJ3B4JztcclxuICAgIGxldCB0b3BWYWx1ZSA9IHRhcmdldEVsLm9mZnNldFRvcDtcclxuICAgIGlmICghaXNNb2JpbGVWaWV3KSB7XHJcbiAgICAgIHRvcFZhbHVlIC09IHNpZGViYXJFbC5zY3JvbGxUb3A7XHJcbiAgICB9XHJcbiAgICBwb3B1cFJlZi5jdXJyZW50LnN0eWxlLnRvcCA9IHRvcFZhbHVlICsgJ3B4JztcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVVzYWdlU3RhdEl0ZW1Nb3VzZUxlYXZlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgc2V0UG9wdXBTdGF0KG51bGwpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlVXNhZ2VTdGF0SXRlbUNsaWNrID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50LCBpdGVtOiBEYWlseVVzYWdlU3RhdCkgPT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICBsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8uZnJvbSA9PT0gaXRlbS50aW1lc3RhbXAgJiZcclxuICAgICAgbW9tZW50KGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy5mcm9tKS5kaWZmKFxyXG4gICAgICAgIGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy50byxcclxuICAgICAgICAnZGF5JyxcclxuICAgICAgKSA9PSAwXHJcbiAgICApIHtcclxuICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldEZyb21BbmRUb1F1ZXJ5KDAsIDApO1xyXG4gICAgICBzZXRDdXJyZW50U3RhdChudWxsKTtcclxuICAgICAgc2V0RnJvbVRvKG51bGwpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20gIT09IGl0ZW0udGltZXN0YW1wICYmXHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy5mcm9tID4gMCAmJlxyXG4gICAgICBldmVudC5zaGlmdEtleVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHRpbWVTdGFtcERheXMgPSBtb21lbnQoaXRlbS50aW1lc3RhbXApXHJcbiAgICAgICAgLmVuZE9mKCdkYXknKVxyXG4gICAgICAgIC5kaWZmKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy50bywgJ2RheScpO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGltZVN0YW1wRGF5cyA+IDAgJiZcclxuICAgICAgICBtb21lbnQobG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20pLmRpZmYoXHJcbiAgICAgICAgICBsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8udG8sXHJcbiAgICAgICAgICAnZGF5JyxcclxuICAgICAgICApID09IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2V0RnJvbVRvKCdmcm9tJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgdGltZVN0YW1wRGF5cyA8IDAgJiZcclxuICAgICAgICBtb21lbnQobG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20pLmRpZmYoXHJcbiAgICAgICAgICBsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8udG8sXHJcbiAgICAgICAgICAnZGF5JyxcclxuICAgICAgICApID09IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2V0RnJvbVRvKCd0bycpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtb21lbnQobG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20pLmlzQmVmb3JlKGl0ZW0udGltZXN0YW1wKSkge1xyXG4gICAgICAgIGlmIChmcm9tVG9SZWYuY3VycmVudCA9PT0gJ3RvJykge1xyXG4gICAgICAgICAgaWYgKHRpbWVTdGFtcERheXMgPCAwKSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShpdGVtLnRpbWVzdGFtcCwgbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LnRvKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShcclxuICAgICAgICAgICAgICBwYXJzZUludChtb21lbnQobG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LnRvKS5zdGFydE9mKCdkYXknKS5mb3JtYXQoJ3gnKSksXHJcbiAgICAgICAgICAgICAgcGFyc2VJbnQobW9tZW50KGl0ZW0udGltZXN0YW1wKS5lbmRPZignZGF5JykuZm9ybWF0KCd4JykpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBzZXRGcm9tVG8oJ2Zyb20nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGZyb21Ub1JlZi5jdXJyZW50ID09PSAnZnJvbScpIHtcclxuICAgICAgICAgIGlmICh0aW1lU3RhbXBEYXlzIDwgMCkge1xyXG4gICAgICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0RnJvbUFuZFRvUXVlcnkoXHJcbiAgICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20sXHJcbiAgICAgICAgICAgICAgcGFyc2VJbnQobW9tZW50KGl0ZW0udGltZXN0YW1wKS5lbmRPZignZGF5JykuZm9ybWF0KCd4JykpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldEZyb21BbmRUb1F1ZXJ5KFxyXG4gICAgICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy5mcm9tLFxyXG4gICAgICAgICAgICAgIHBhcnNlSW50KG1vbWVudChpdGVtLnRpbWVzdGFtcCkuZW5kT2YoJ2RheScpLmZvcm1hdCgneCcpKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gY29uc3QgZGF5cyA9IG1vbWVudChsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8uZnJvbSkuZGlmZihsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8udG8sICdkYXknKTtcclxuICAgICAgICBpZiAoZnJvbVRvUmVmLmN1cnJlbnQgPT09ICd0bycpIHtcclxuICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShpdGVtLnRpbWVzdGFtcCwgbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LnRvKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGZyb21Ub1JlZi5jdXJyZW50ID09PSAnZnJvbScpIHtcclxuICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShcclxuICAgICAgICAgICAgaXRlbS50aW1lc3RhbXAsXHJcbiAgICAgICAgICAgIHBhcnNlSW50KG1vbWVudChsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8uZnJvbSkuZW5kT2YoJ2RheScpLmZvcm1hdCgneCcpKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBzZXRGcm9tVG8oJ3RvJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy5mcm9tID09PSAwICYmIGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShpdGVtLnRpbWVzdGFtcCwgcGFyc2VJbnQobW9tZW50KCkuZW5kT2YoJ2RheScpLmZvcm1hdCgneCcpKSk7XHJcbiAgICB9IGVsc2UgaWYgKGl0ZW0uY291bnQgPiAwICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpKSB7XHJcbiAgICAgIGNvbnN0IHthcHAsIGRhaWx5Tm90ZXN9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXREYWlseU5vdGUobW9tZW50KGl0ZW0udGltZXN0YW1wKSwgZGFpbHlOb3Rlcyk7XHJcbiAgICAgIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcclxuICAgICAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5zcGxpdEFjdGl2ZUxlYWYoKTtcclxuICAgICAgICBsZWFmLm9wZW5GaWxlKGZpbGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBsZWFmID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xyXG4gICAgICAgIGlmIChsZWFmID09PSBudWxsKSB7XHJcbiAgICAgICAgICBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZWFmLm9wZW5GaWxlKGZpbGUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGl0ZW0uY291bnQgPiAwICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleSkge1xyXG4gICAgICBpZiAoIVsnLycsICcvcmVjeWNsZSddLmluY2x1ZGVzKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnBhdGhuYW1lKSkge1xyXG4gICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRQYXRobmFtZSgnLycpO1xyXG4gICAgICB9XHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShcclxuICAgICAgICBpdGVtLnRpbWVzdGFtcCxcclxuICAgICAgICB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoXHJcbiAgICAgICAgICBtb21lbnQoaXRlbS50aW1lc3RhbXAgKyBEQUlMWV9USU1FU1RBTVApXHJcbiAgICAgICAgICAgIC5zdWJ0cmFjdCgxLCAnZGF5cycpXHJcbiAgICAgICAgICAgIC5lbmRPZignZGF5JylcclxuICAgICAgICAgICAgLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpLFxyXG4gICAgICAgICksXHJcbiAgICAgICk7XHJcbiAgICAgIHNldEN1cnJlbnRTdGF0KGl0ZW0pO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwidXNhZ2UtaGVhdC1tYXAtd3JhcHBlclwiIHJlZj17Y29udGFpbmVyRWxSZWZ9PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRheS10aXAtdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPnt0KCd3ZWVrRGF5c1Nob3J0JylbMF19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+e3QoJ3dlZWtEYXlzU2hvcnQnKVsyXX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGlwLXRleHRcIj48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGlwLXRleHRcIj57dCgnd2Vla0RheXNTaG9ydCcpWzRdfTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPnt0KCd3ZWVrRGF5c1Nob3J0JylbNl19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIHsvKiBwb3B1cCAqL31cclxuICAgICAgPGRpdiByZWY9e3BvcHVwUmVmfSBjbGFzc05hbWU9eyd1c2FnZS1kZXRhaWwtY29udGFpbmVyIHBvcC11cCAnICsgKHBvcHVwU3RhdCA/ICcnIDogJ2hpZGRlbicpfT5cclxuICAgICAgICB7cG9wdXBTdGF0Py5jb3VudH0gbWVtb3Mgb257JyAnfVxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRhdGUtdGV4dFwiPntuZXcgRGF0ZShwb3B1cFN0YXQ/LnRpbWVzdGFtcCBhcyBudW1iZXIpLnRvRGF0ZVN0cmluZygpfTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzYWdlLWhlYXQtbWFwXCI+XHJcbiAgICAgICAge2FsbFN0YXQubWFwKCh2LCBpKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb3VudCA9IHYuY291bnQ7XHJcbiAgICAgICAgICBjb25zdCBjb2xvckxldmVsID1cclxuICAgICAgICAgICAgY291bnQgPD0gMFxyXG4gICAgICAgICAgICAgID8gJydcclxuICAgICAgICAgICAgICA6IGNvdW50IDw9IDFcclxuICAgICAgICAgICAgICA/ICdzdGF0LWRheS1MMS1iZydcclxuICAgICAgICAgICAgICA6IGNvdW50IDw9IDJcclxuICAgICAgICAgICAgICA/ICdzdGF0LWRheS1MMi1iZydcclxuICAgICAgICAgICAgICA6IGNvdW50IDw9IDRcclxuICAgICAgICAgICAgICA/ICdzdGF0LWRheS1MMy1iZydcclxuICAgICAgICAgICAgICA6ICdzdGF0LWRheS1MNC1iZyc7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2BzdGF0LWNvbnRhaW5lciAke2NvbG9yTGV2ZWx9ICR7Y3VycmVudFN0YXQgPT09IHYgPyAnY3VycmVudCcgOiAnJ30gJHtcclxuICAgICAgICAgICAgICAgIHRvZGF5VGltZVN0YW1wID09PSB2LnRpbWVzdGFtcCA/ICd0b2RheScgOiAnJ1xyXG4gICAgICAgICAgICAgIH1gfVxyXG4gICAgICAgICAgICAgIGtleT17aX1cclxuICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eyhlKSA9PiBoYW5kbGVVc2FnZVN0YXRJdGVtTW91c2VFbnRlcihlLCB2KX1cclxuICAgICAgICAgICAgICBvbk1vdXNlTGVhdmU9e2hhbmRsZVVzYWdlU3RhdEl0ZW1Nb3VzZUxlYXZlfVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBoYW5kbGVVc2FnZVN0YXRJdGVtQ2xpY2soZSwgdil9XHJcbiAgICAgICAgICAgID48L3NwYW4+XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pfVxyXG4gICAgICAgIHtudWxsQ2VsbC5tYXAoKHYsIGkpID0+IChcclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXQtY29udGFpbmVyIG51bGxcIiBrZXk9e2l9Pjwvc3Bhbj5cclxuICAgICAgICApKX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVXNhZ2VIZWF0TWFwO1xyXG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQge1NIT1dfU0lERVJCQVJfTU9CSUxFX0NMQVNTTkFNRX0gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCBVc2VyQmFubmVyIGZyb20gJy4vVXNlckJhbm5lcic7XG5pbXBvcnQgUXVlcnlMaXN0IGZyb20gJy4vUXVlcnlMaXN0JztcbmltcG9ydCBUYWdMaXN0IGZyb20gJy4vVGFnTGlzdCc7XG5pbXBvcnQgVXNhZ2VIZWF0TWFwIGZyb20gJy4vVXNhZ2VIZWF0TWFwJztcbmltcG9ydCAnLi4vbGVzcy9zaWRlcmJhci5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmludGVyZmFjZSBQcm9wcyB7fVxuXG5jb25zdCBTaWRlYmFyOiBSZWFjdC5GQzxQcm9wcz4gPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBsb2NhdGlvblN0YXRlLFxuICAgIGdsb2JhbFN0YXRlOiB7aXNNb2JpbGVWaWV3LCBzaG93U2lkZXJiYXJJbk1vYmlsZVZpZXd9LFxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcbiAgY29uc3Qgd3JhcHBlckVsUmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PihudWxsKTtcblxuICBjb25zdCBoYW5kbGVDbGlja091dHNpZGVPZldyYXBwZXIgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBzaWRlcmJhclNob3duID0gZ2xvYmFsU3RhdGVTZXJ2aWNlLmdldFN0YXRlKCkuc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3O1xuXG4gICAgICBpZiAoIXNpZGVyYmFyU2hvd24pIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2xpY2tPdXRzaWRlT2ZXcmFwcGVyLCB7XG4gICAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF3cmFwcGVyRWxSZWYuY3VycmVudD8uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIGlmICh3cmFwcGVyRWxSZWYuY3VycmVudD8ucGFyZW50Tm9kZT8uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgICAgaWYgKHNpZGVyYmFyU2hvd24pIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0U2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3KGZhbHNlKTtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDbGlja091dHNpZGVPZldyYXBwZXIsIHtcbiAgICAgICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0U2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3KGZhbHNlKTtcbiAgfSwgW2xvY2F0aW9uU3RhdGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChTSE9XX1NJREVSQkFSX01PQklMRV9DTEFTU05BTUUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoU0hPV19TSURFUkJBUl9NT0JJTEVfQ0xBU1NOQU1FKTtcbiAgICB9XG4gIH0sIFtzaG93U2lkZXJiYXJJbk1vYmlsZVZpZXddKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc01vYmlsZVZpZXcgJiYgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3KSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDbGlja091dHNpZGVPZldyYXBwZXIsIHtcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW2lzTW9iaWxlVmlldywgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3XSk7XG5cbiAgcmV0dXJuIChcbiAgICA8YXNpZGUgY2xhc3NOYW1lPVwibWVtb3Mtc2lkZWJhci13cmFwcGVyXCIgcmVmPXt3cmFwcGVyRWxSZWZ9PlxuICAgICAgPFVzZXJCYW5uZXIgLz5cbiAgICAgIDxVc2FnZUhlYXRNYXAgLz5cbiAgICAgIDxRdWVyeUxpc3QgLz5cbiAgICAgIDxUYWdMaXN0IC8+XG4gICAgPC9hc2lkZT5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGViYXI7XG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3R9IGZyb20gJ3JlYWN0Jztcbi8vIGltcG9ydCB7IGxvY2F0aW9uU2VydmljZSwgdXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXNcIjtcbmltcG9ydCB7aG9tZVJvdXRlclN3aXRjaH0gZnJvbSAnLi4vcm91dGVycyc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQgU2lkZWJhciBmcm9tICcuLi9jb21wb25lbnRzL1NpZGViYXInO1xuaW1wb3J0IHVzZUxvYWRpbmcgZnJvbSAnLi4vaG9va3MvdXNlTG9hZGluZyc7XG5pbXBvcnQgJy4uL2xlc3MvaG9tZS5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIEhvbWUoKSB7XG4gIGNvbnN0IHtcbiAgICBsb2NhdGlvblN0YXRlOiB7cGF0aG5hbWV9LFxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcbiAgLy8gY29uc3QgeyBhcHAgfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG4gIGNvbnN0IGxvYWRpbmdTdGF0ZSA9IHVzZUxvYWRpbmcoKTtcbiAgLy8gY29uc3QgcmVmcmVzaCA9IHVzZVJlZnJlc2goKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIGNvbnN0IHsgdXNlciB9ID0gdXNlclNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICAvLyBpZiAoIXVzZXIpIHtcbiAgICAvLyAgIHVzZXJTZXJ2aWNlXG4gICAgLy8gICAgIC5kb1NpZ25JbigpXG4gICAgLy8gICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgLy8gICAgICAgLy8gZG8gbnRoXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAvLyAgICAgICAvLyBpZiAodXNlclNlcnZpY2UuZ2V0U3RhdGUoKS51c2VyKSB7XG4gICAgLy8gICAgICAgICBsb2FkaW5nU3RhdGUuc2V0RmluaXNoKCk7XG4gICAgLy8gICAgICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgICAgICAvLyAgIGxvY2F0aW9uU2VydmljZS5yZXBsYWNlSGlzdG9yeShcIi9zaWduaW5cIik7XG4gICAgLy8gICAgICAgLy8gfVxuICAgIC8vICAgICB9KTtcbiAgICAvLyB9IGVsc2Uge1xuICAgIGxvYWRpbmdTdGF0ZS5zZXRGaW5pc2goKTtcblxuICAgIC8vIH1cbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHsvKiB7bG9hZGluZ1N0YXRlLmlzTG9hZGluZyA/IG51bGwgOiAoICovfVxuICAgICAgPHNlY3Rpb24gaWQ9XCJwYWdlLXdyYXBwZXJcIj5cbiAgICAgICAgPFNpZGViYXIgLz5cbiAgICAgICAgPG1haW4gY2xhc3NOYW1lPVwiY29udGVudC13cmFwcGVyXCI+e2hvbWVSb3V0ZXJTd2l0Y2gocGF0aG5hbWUpfTwvbWFpbj5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICAgIHsvKiApfSAqL31cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgSG9tZTtcbiIsIigoKSA9PiB7XG4gIGlmICghU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsKSB7XG4gICAgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHN0cjogYW55LCBuZXdTdHI6IGFueSkge1xuICAgICAgLy8gSWYgYSByZWdleCBwYXR0ZXJuXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN0cikudG9Mb3dlckNhc2UoKSA9PT0gJ1tvYmplY3QgcmVnZXhwXScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShzdHIsIG5ld1N0cik7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgc3RyaW5nXG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlKG5ldyBSZWdFeHAoc3RyLCAnZycpLCBuZXdTdHIpO1xuICAgIH07XG4gIH1cbn0pKCk7XG5cbmV4cG9ydCBkZWZhdWx0IG51bGw7XG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEhvbWUgZnJvbSAnLi9wYWdlcy9Ib21lJztcbmltcG9ydCB7Z2xvYmFsU3RhdGVTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCAnLi9sZXNzL2FwcC5sZXNzJztcbmltcG9ydCBQcm92aWRlciBmcm9tICcuL2xhYnMvUHJvdmlkZXInO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0ICcuL2hlbHBlcnMvcG9seWZpbGwnO1xuaW1wb3J0ICcuL2xlc3MvZ2xvYmFsLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gU3RyaWN0QXBwKCkge1xuICByZXR1cm4gKFxuICAgIDxQcm92aWRlciBzdG9yZT17YXBwU3RvcmV9IGNvbnRleHQ9e2FwcENvbnRleHR9PlxuICAgICAgPEFwcCAvPlxuICAgIDwvUHJvdmlkZXI+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEFwcCgpIHtcbiAgY29uc3Qge1xuICAgIGxvY2F0aW9uU3RhdGU6IHtwYXRobmFtZX0sXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlV2luZG93UmVzaXplID0gKCkgPT4ge1xuICAgICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldElzTW9iaWxlVmlldyhkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDw9IDg3NSk7XG4gICAgfTtcblxuICAgIGhhbmRsZVdpbmRvd1Jlc2l6ZSgpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxIb21lIC8+XG4gICAgPC8+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0cmljdEFwcDtcbiIsImltcG9ydCB7V29ya3NwYWNlTGVhZiwgSXRlbVZpZXcsIEhvdmVyUG9wb3ZlciwgVEZpbGV9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHtNRU1PU19WSUVXX1RZUEV9IGZyb20gJy4vY29uc3RhbnRzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XHJcblxyXG5pbXBvcnQgQXBwIGZyb20gJy4vQXBwJztcclxuaW1wb3J0IHR5cGUgTWVtb3NQbHVnaW4gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7ZGFpbHlOb3Rlc1NlcnZpY2UsIG1lbW9TZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzJztcclxuaW1wb3J0IHtnZXREYXRlRnJvbUZpbGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVtb3MgZXh0ZW5kcyBJdGVtVmlldyB7XHJcbiAgcGx1Z2luOiBNZW1vc1BsdWdpbjtcclxuICBob3ZlclBvcG92ZXI6IEhvdmVyUG9wb3ZlciB8IG51bGw7XHJcbiAgcHJpdmF0ZSBtZW1vc0NvbXBvbmVudDogUmVhY3QuUmVhY3RFbGVtZW50O1xyXG5cclxuICBjb25zdHJ1Y3RvcihsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwbHVnaW46IE1lbW9zUGx1Z2luKSB7XHJcbiAgICBzdXBlcihsZWFmKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cclxuICAgIC8vIHRoaXMucGx1Z2luLnNldHRpbmdzID0gbnVsbDtcclxuICAgIC8vIFx0cGx1Z2luLnNldHRpbmdzLnN1YnNjcmliZSgodmFsOmFueSkgPT4ge1xyXG4gICAgLy8gXHR0aGlzLnBsdWdpbi5zZXR0aW5ncyA9IHZhbDtcclxuXHJcbiAgICAvLyBcdC8vIFJlZnJlc2ggdGhlIGNhbGVuZGFyIGlmIHNldHRpbmdzIGNoYW5nZVxyXG4gICAgLy8gXHRpZiAodGhpcy5tZW1vc0NvbXBvbmVudCkge1xyXG4gICAgLy8gXHRcdHVzZVJlZnJlc2goKTtcclxuICAgIC8vIFx0fVxyXG4gICAgLy8gXHR9KTtcclxuICB9XHJcblxyXG4gIGdldERpc3BsYXlUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAvLyBUT0RPOiBNYWtlIHRoaXMgaW50ZXJhY3RpdmU6IEVpdGhlciB0aGUgYWN0aXZlIHdvcmtzcGFjZSBvciB0aGUgbG9jYWwgZ3JhcGhcclxuICAgIHJldHVybiAnTWVtb3MnO1xyXG4gIH1cclxuXHJcbiAgZ2V0SWNvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICdNZW1vcyc7XHJcbiAgfVxyXG5cclxuICBnZXRWaWV3VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE1FTU9TX1ZJRVdfVFlQRTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25NZW1vc1NldHRpbmdzVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgbWVtb1NlcnZpY2UuY2xlYXJNZW1vcygpO1xyXG4gICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkZpbGVEZWxldGVkKGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoZ2V0RGF0ZUZyb21GaWxlKGZpbGUsICdkYXknKSkge1xyXG4gICAgICBhd2FpdCBkYWlseU5vdGVzU2VydmljZS5nZXRNeUFsbERhaWx5Tm90ZXMoKTtcclxuICAgICAgbWVtb1NlcnZpY2UuY2xlYXJNZW1vcygpO1xyXG4gICAgICBtZW1vU2VydmljZS5mZXRjaEFsbE1lbW9zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uRmlsZU1vZGlmaWVkKGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKGZpbGUsICdkYXknKTtcclxuXHJcbiAgICBpZiAoZGF0ZSAmJiB0aGlzLm1lbW9zQ29tcG9uZW50KSB7XHJcbiAgICAgIC8vIG1lbW9TZXJ2aWNlLmNsZWFyTWVtb3MoKTtcclxuICAgICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkZpbGVDcmVhdGVkKGZpbGU6IFRGaWxlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hcHAud29ya3NwYWNlLmxheW91dFJlYWR5ICYmIHRoaXMubWVtb3NDb21wb25lbnQpIHtcclxuICAgICAgaWYgKGdldERhdGVGcm9tRmlsZShmaWxlLCAnZGF5JykpIHtcclxuICAgICAgICBkYWlseU5vdGVzU2VydmljZS5nZXRNeUFsbERhaWx5Tm90ZXMoKTtcclxuICAgICAgICAvLyBtZW1vU2VydmljZS5jbGVhck1lbW9zKCk7XHJcbiAgICAgICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLm9uTWVtb3NTZXR0aW5nc1VwZGF0ZSA9IHRoaXMub25NZW1vc1NldHRpbmdzVXBkYXRlLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLm9uRmlsZUNyZWF0ZWQgPSB0aGlzLm9uRmlsZUNyZWF0ZWQuYmluZCh0aGlzKTtcclxuICAgIHRoaXMub25GaWxlRGVsZXRlZCA9IHRoaXMub25GaWxlRGVsZXRlZC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5vbkZpbGVNb2RpZmllZCA9IHRoaXMub25GaWxlTW9kaWZpZWQuYmluZCh0aGlzKTtcclxuXHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoXHJcbiAgICAgIHRoaXMucGx1Z2luLmFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lbW9zQ29tcG9uZW50KSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbGVhdmVzID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgICAgIGlmICghKGxlYXZlcy5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsZWFmID0gbGVhdmVzWzBdO1xyXG4gICAgICAgIC8vQHRzLWV4cGVjdC1lcnJvciwgcHJpdmF0ZSBtZXRob2RcclxuICAgICAgICBjb25zdCBzaWRlID0gbGVhZi5nZXRSb290KCkuc2lkZTtcclxuICAgICAgICBsZXQgc2lkZWJhcjogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHBhZ2U6IEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmIChsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLm1lbW9zLXNpZGViYXItd3JhcHBlcicpKSB7XHJcbiAgICAgICAgICBzaWRlYmFyID0gbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5tZW1vcy1zaWRlYmFyLXdyYXBwZXInKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2lkZWJhciA9IGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcubWVtb3Mtc2lkZWJhci13cmFwcGVyLWRpc3BsYXknKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY29udGVudC13cmFwcGVyJykpIHtcclxuICAgICAgICAgIHBhZ2UgPSBsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNvbnRlbnQtd3JhcHBlcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYWdlID0gbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50LXdyYXBwZXItcGFkZGluZy1maXgnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc3QgcGFnZSA9IGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY29udGVudC13cmFwcGVyJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKHNpZGUgIT09IHVuZGVmaW5lZCAmJiAoc2lkZSA9PT0gJ2xlZnQnIHx8IHNpZGUgPT09ICdyaWdodCcpKSB7XHJcbiAgICAgICAgICBpZiAoIXNpZGViYXI/LmNsYXNzTmFtZS5jb250YWlucygnbWVtb3Mtc2lkZWJhci13cmFwcGVyLWRpc3BsYXknKSAmJiBwYWdlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc2lkZWJhci5jbGFzc05hbWUgPSAnbWVtb3Mtc2lkZWJhci13cmFwcGVyLWRpc3BsYXknO1xyXG4gICAgICAgICAgICBwYWdlLmNsYXNzTmFtZSA9ICdjb250ZW50LXdyYXBwZXItcGFkZGluZy1maXgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc2lkZWJhcj8uY2xhc3NMaXN0LmNvbnRhaW5zKCdtZW1vcy1zaWRlYmFyLXdyYXBwZXItZGlzcGxheScpICYmIHBhZ2UgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzaWRlYmFyLmNsYXNzTmFtZSA9ICdtZW1vcy1zaWRlYmFyLXdyYXBwZXInO1xyXG4gICAgICAgICAgICBwYWdlLmNsYXNzTmFtZSA9ICdjb250ZW50LXdyYXBwZXInO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMucmVnaXN0ZXJFdmVudChcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgKDxhbnk+dGhpcy5hcHAud29ya3NwYWNlKS5vbignb2JzaWRpYW4tbWVtb3M6c2V0dGluZ3MtdXBkYXRlZCcsIHRoaXMub25NZW1vc1NldHRpbmdzVXBkYXRlKSxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdjcmVhdGUnLCB0aGlzLm9uRmlsZUNyZWF0ZWQpKTtcclxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5vbkZpbGVEZWxldGVkKSk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ21vZGlmeScsIHRoaXMub25GaWxlTW9kaWZpZWQpKTtcclxuXHJcbiAgICBkYWlseU5vdGVzU2VydmljZS5nZXRBcHAodGhpcy5hcHApO1xyXG4gICAgSW5zZXJ0QWZ0ZXIgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnNlcnRBZnRlcjtcclxuICAgIFVzZXJOYW1lID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlck5hbWU7XHJcbiAgICBQcm9jZXNzRW50cmllc0JlbG93ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuUHJvY2Vzc0VudHJpZXNCZWxvdztcclxuICAgIFNhdmVNZW1vQnV0dG9uTGFiZWwgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TYXZlTWVtb0J1dHRvbkxhYmVsO1xyXG4gICAgRGVmYXVsdFByZWZpeCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRQcmVmaXg7XHJcbiAgICBJbnNlcnREYXRlRm9ybWF0ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5zZXJ0RGF0ZUZvcm1hdDtcclxuICAgIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRFZGl0b3JMb2NhdGlvbjtcclxuICAgIFVzZUJ1dHRvblRvU2hvd0VkaXRvciA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZUJ1dHRvblRvU2hvd0VkaXRvcjtcclxuICAgIEZvY3VzT25FZGl0b3IgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Gb2N1c09uRWRpdG9yO1xyXG4gICAgT3BlbkRhaWx5TWVtb3NXaXRoTWVtb3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5PcGVuRGFpbHlNZW1vc1dpdGhNZW1vcztcclxuICAgIEhpZGVEb25lVGFza3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5IaWRlRG9uZVRhc2tzO1xyXG4gICAgU2hhcmVGb290ZXJTdGFydCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyU3RhcnQ7XHJcbiAgICBTaGFyZUZvb3RlckVuZCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyRW5kO1xyXG4gICAgT3Blbk1lbW9zQXV0b21hdGljYWxseSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLk9wZW5NZW1vc0F1dG9tYXRpY2FsbHk7XHJcbiAgICAvLyBFZGl0b3JNYXhIZWlnaHQgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5FZGl0b3JNYXhIZWlnaHQ7XHJcbiAgICBTaG93VGltZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dUaW1lO1xyXG4gICAgU2hvd0RhdGUgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaG93RGF0ZTtcclxuICAgIEFkZEJsYW5rTGluZVdoZW5EYXRlID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuQWRkQmxhbmtMaW5lV2hlbkRhdGU7XHJcbiAgICBBdXRvU2F2ZVdoZW5Pbk1vYmlsZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkF1dG9TYXZlV2hlbk9uTW9iaWxlO1xyXG4gICAgUXVlcnlGaWxlTmFtZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlF1ZXJ5RmlsZU5hbWU7XHJcbiAgICBEZWxldGVGaWxlTmFtZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkRlbGV0ZUZpbGVOYW1lO1xyXG4gICAgVXNlVmF1bHRUYWdzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlVmF1bHRUYWdzO1xyXG4gICAgRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2UgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5EZWZhdWx0RGFya0JhY2tncm91bmRJbWFnZTtcclxuICAgIERlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZTtcclxuICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5EZWZhdWx0TWVtb0NvbXBvc2l0aW9uO1xyXG4gICAgU2hvd1Rhc2tMYWJlbCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dUYXNrTGFiZWw7XHJcblxyXG4gICAgdGhpcy5tZW1vc0NvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXBwKTtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgUmVhY3RET00ucmVuZGVyKHRoaXMubWVtb3NDb21wb25lbnQsICh0aGlzIGFzIGFueSkuY29udGVudEVsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ2xvc2UoKSB7XHJcbiAgICAvLyBOb3RoaW5nIHRvIGNsZWFuIHVwLlxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGxldCBJbnNlcnRBZnRlcjogc3RyaW5nO1xyXG5leHBvcnQgbGV0IFVzZXJOYW1lOiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgUHJvY2Vzc0VudHJpZXNCZWxvdzogc3RyaW5nO1xyXG5leHBvcnQgbGV0IFNhdmVNZW1vQnV0dG9uTGFiZWw6IHN0cmluZztcclxuZXhwb3J0IGxldCBEZWZhdWx0UHJlZml4OiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgSW5zZXJ0RGF0ZUZvcm1hdDogc3RyaW5nO1xyXG5leHBvcnQgbGV0IERlZmF1bHRFZGl0b3JMb2NhdGlvbjogc3RyaW5nO1xyXG5leHBvcnQgbGV0IFVzZUJ1dHRvblRvU2hvd0VkaXRvcjogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBGb2N1c09uRWRpdG9yOiBib29sZWFuO1xyXG5leHBvcnQgbGV0IE9wZW5EYWlseU1lbW9zV2l0aE1lbW9zOiBib29sZWFuO1xyXG5leHBvcnQgbGV0IEhpZGVEb25lVGFza3M6IGJvb2xlYW47XHJcbmV4cG9ydCBsZXQgU2hhcmVGb290ZXJTdGFydDogc3RyaW5nO1xyXG5leHBvcnQgbGV0IFNoYXJlRm9vdGVyRW5kOiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgT3Blbk1lbW9zQXV0b21hdGljYWxseTogYm9vbGVhbjtcclxuLy8gZXhwb3J0IGxldCBFZGl0b3JNYXhIZWlnaHQ6IHN0cmluZztcclxuZXhwb3J0IGxldCBTaG93VGltZTogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBTaG93RGF0ZTogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBBZGRCbGFua0xpbmVXaGVuRGF0ZTogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBBdXRvU2F2ZVdoZW5Pbk1vYmlsZTogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBRdWVyeUZpbGVOYW1lOiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgRGVsZXRlRmlsZU5hbWU6IHN0cmluZztcclxuZXhwb3J0IGxldCBVc2VWYXVsdFRhZ3M6IGJvb2xlYW47XHJcbmV4cG9ydCBsZXQgRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2U6IHN0cmluZztcclxuZXhwb3J0IGxldCBEZWZhdWx0TGlnaHRCYWNrZ3JvdW5kSW1hZ2U6IHN0cmluZztcclxuZXhwb3J0IGxldCBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uOiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgU2hvd1Rhc2tMYWJlbDogc3RyaW5nO1xyXG4iLCJpbXBvcnQge2FkZEljb259IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmNvbnN0IGljb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gIE1lbW9zOiBgPHN2ZyB0PVwiMTY0MTM0ODUwNzMzOVwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiMjEyMFwiIHdpZHRoPVwiMTAwXCIgaGVpZ2h0PVwiMTAwXCI+PHBhdGggZD1cIk0xMjYuNjkyNjUzIDQ3OC4wOTk2MzlsLTkwLjc1NzI4MSAwYy0xOS4wMTk0MDggMC0zNC40MzczMzYgMTUuNDIzOTIzLTM0LjQzNzMzNiAzNC40MTczNTYgMCAxOC45OTI0MzQgMTUuNDE2OTI5IDM0LjQ3NzI5NyAzNC40MzczMzYgMzQuNDc3Mjk3bDkwLjc1NzI4MSAwYzE5LjAxMzQxNCAwIDM0LjQyMzM1LTE1LjQ4NDg2MyAzNC40MjMzNS0zNC40NzcyOTdDMTYxLjExNjAwMyA0OTMuNTIzNTYxIDE0NS43MDYwNjcgNDc4LjA5OTYzOSAxMjYuNjkyNjUzIDQ3OC4wOTk2Mzl6TTI0NC42NjIzMzMgMjQzLjUyNjk0M2MxMy43NDI1NjYtMTMuMTEwMTg0IDE0LjMxMDAxMS0zNC45NDg4MzYgMS4xODU4NDEtNDguNzA2Mzg4bC02Mi42NDQ3NjItNjUuNjY4ODA2Yy0xMy4xMjgxNjctMTMuNzYyNTQ3LTM0Ljk3NDgxMS0xNC4yMjkwOTEtNDguNzE3Mzc3LTEuMTE4OTA2cy0xNC4yNjEwNTkgMzQuOTExODcyLTEuMTMyODkzIDQ4LjY3NDQxOWw2Mi42NDQ3NjIgNjUuNjY4ODA2QzIwOS4xMjMwNzQgMjU2LjEzMjYyIDIzMC45MTk3NjcgMjU2LjYzNzEyNyAyNDQuNjYyMzMzIDI0My41MjY5NDN6TTU0My4wNjY2MzEgOTU3LjQyMjA4M2wtNjAuNjAzNzU3IDBjLTE4LjY1NDc2NCAwLTMzLjc5NDk2NCAxNS4xNDcxOTMtMzMuNzk0OTY0IDMzLjg2Mjg5OCAwIDE4LjY2MTc1NyAxNS4xNDAyIDMyLjcxNTAyIDMzLjc5NDk2NCAzMi43MTUwMmw2MC42MDM3NTcgMGMxOC42NTQ3NjQgMCAzMy43OTQ5NjQtMTQuMDUzMjYyIDMzLjc5NDk2NC0zMi43MTUwMkM1NzYuODYxNTk1IDk3Mi41NjgyNzcgNTYxLjcyMTM5NSA5NTcuNDIyMDgzIDU0My4wNjY2MzEgOTU3LjQyMjA4M3pNOTg4LjA3NjYxNyA0NzkuMDUwNzA5bC05MC43NTcyODEgMGMtMTkuMDE5NDA4IDAtMzQuNDM3MzM2IDE1LjQyMzkyMy0zNC40MzczMzYgMzQuNDE3MzU2czE1LjQxNjkyOSAzNC40NzcyOTcgMzQuNDM3MzM2IDM0LjQ3NzI5N2w5MC43NTcyODEgMGMxOS4wMTM0MTQgMCAzNC40MjMzNS0xNS40ODQ4NjMgMzQuNDIzMzUtMzQuNDc3Mjk3UzEwMDcuMDkwMDMgNDc5LjA1MDcwOSA5ODguMDc2NjE3IDQ3OS4wNTA3MDl6TTUxMi4yNjg3MzcgMTkyLjc2NTU2NGMtMTcyLjczNzE0MyAwLTMxMi43NTUyNyAxNTAuMDc5MjkyLTMxMi43NTUyNyAzMjIuNzQ2NTAzIDAgMTI1LjYzMDE5MiA3NC4wODA1ODMgMjMzLjk1NzI5OCAxODAuOTM2MTI4IDI4My43MDM2NjlsMCA4NC41MTgzOGMwIDE2Ljc2MjYxNCAxNS40MTA5MzUgMzEuMzU0MzUgMzQuNDIzMzUgMzEuMzU0MzUgMC41OTg0MTUgMCAxLjE5MzgzMy0wLjAxNDk4NSAxLjc4NTI1NS0wLjA0Mjk1OCAwLjYxODM5NSAwLjAyNjk3NCAxLjIzOTc4OCAwLjA0Mjk1OCAxLjg2NzE3NSAwLjA0Mjk1OGwxODcuNDc5NzMxIDBjNS45MDUyMjcgMCAxMS40NTU4MDItMS4yMjA4MDcgMTYuMjg4MDc4LTMuNDc3NjAxIDEyLjIzMTA0NC00LjY1NzQ0NyAyMC43OTU2NzEtMTUuMzgzOTYyIDIwLjc5NTY3MS0yNy44NzU3NWwwLTg0LjA1MjgzNWMxMDcuMzkxMDIxLTQ5LjUzNDU3OCAxODEuOTM1MTUxLTE1OC4xNDc0MDUgMTgxLjkzNTE1MS0yODQuMTY4MjE0QzgyNS4wMjQwMDcgMzQyLjg0Mzg1NyA2ODQuOTk3ODg4IDE5Mi43NjU1NjQgNTEyLjI2ODczNyAxOTIuNzY1NTY0ek01NzQuODYzNTQ4IDc0Mi43MTM5NjhsMCA4MC4xNzA2M2MwIDMuMTU5OTExLTAuMjIxNzgzIDUuOTc2MTU4LTAuNjQyMzcyIDguNDk2Njk0bDAgMTkuMDkyMzM2LTEyNC45MTA4OTUgMCAwLTE3LjcxNzY4Yy0wLjQyMzU4Ni0yLjg1NjIwOC0wLjY0MjM3Mi02LjEyMzAxNS0wLjY0MjM3Mi05Ljg3MDM1MWwwLTgwLjQ0MzM2M2MtOTkuMjA0MDI0LTI3Ljc1Mzg3LTE3MS45NzA4OTItMTE4LjgyMTg0Ny0xNzEuOTcwODkyLTIyNi45MzAxNjcgMC0xMzAuMDk0ODI3IDEwNS40Njg5LTI0NS41MDcwMDcgMjM1LjU3MTcxOS0yNDUuNTA3MDA3czIzNS41NjM3MjcgMTE1LjQxMjE4IDIzNS41NjM3MjcgMjQ1LjUwNzAwN0M3NDcuODMyNDY1IDYyMy45ODQwMzEgNjc0LjU3ODA3NCA3MTUuMjkzNzcyIDU3NC44NjM1NDggNzQyLjcxMzk2OHpNODk1LjQwNzIwNCAxMjkuMzI4NTc2Yy0xMy40Mjk4NzItMTMuNDI5ODcyLTM1LjIzMzU1OC0xMy40Mzk4NjItNDguNjc3NDE2IDAuMDA0OTk1bC02NC4xNzQyNjcgNjQuMTc1MjY2Yy0xMy40NDg4NTMgMTMuNDQ4ODUzLTEzLjQ0Mzg1OCAzNS4yNTc1MzQtMC4wMTM5ODYgNDguNjg3NDA2IDEzLjQyOTg3MiAxMy40Mjk4NzIgMzUuMjgxNTExIDEzLjQ3NzgyNSA0OC43MzAzNjQgMC4wMjg5NzJsNjQuMTc1MjY2LTY0LjE3NTI2NkM5MDguODg5MDI1IDE2NC42MDUwOTIgOTA4LjgzNzA3NiAxNDIuNzU4NDQ4IDg5NS40MDcyMDQgMTI5LjMyODU3NnpNNTExLjc5NjE5OSAxNTkuNjE3OTY3YzE4Ljk5MjQzNCAwIDM0LjQxNzM1Ni0xNS40MTA5MzUgMzQuNDE3MzU2LTM0LjQyMzM1bDAtOTAuNzU3MjgxYzAtMTkuMDE5NDA4LTE1LjQyMzkyMy0zNC40MzczMzYtMzQuNDE3MzU2LTM0LjQzNzMzNi0xOC45OTI0MzQgMC0zNC40NzcyOTcgMTUuNDE2OTI5LTM0LjQ3NzI5NyAzNC40MzczMzZsMCA5MC43NTcyODFDNDc3LjMxNzkwMyAxNDQuMjA4MDMxIDQ5Mi44MDI3NjYgMTU5LjYxNzk2NyA1MTEuNzk2MTk5IDE1OS42MTc5Njd6XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHAtaWQ9XCIyMTIxXCI+PC9wYXRoPjwvc3ZnPmAsXHJcbn07XHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZEljb25zKCkge1xyXG4gIE9iamVjdC5rZXlzKGljb25zKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgIGFkZEljb24oa2V5LCBpY29uc1trZXldKTtcclxuICB9KTtcclxufVxyXG4iLCJpbXBvcnQge0FwcCwgRHJvcGRvd25Db21wb25lbnQsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmd9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHR5cGUgTWVtb3NQbHVnaW4gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7Z2V0RGFpbHlOb3RlUGF0aH0gZnJvbSAnLi9vYkNvbXBvbmVudHMvb2JVcGRhdGVNZW1vJztcclxuaW1wb3J0IG1lbW9TZXJ2aWNlIGZyb20gJy4vc2VydmljZXMvbWVtb1NlcnZpY2UnO1xyXG5pbXBvcnQge3R9IGZyb20gJy4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9zU2V0dGluZ3Mge1xyXG4gIFN0YXJ0RGF0ZTogc3RyaW5nO1xyXG4gIEluc2VydEFmdGVyOiBzdHJpbmc7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxuICBQcm9jZXNzRW50cmllc0JlbG93OiBzdHJpbmc7XHJcbiAgTGFuZ3VhZ2U6IHN0cmluZztcclxuICBTYXZlTWVtb0J1dHRvbkxhYmVsOiBzdHJpbmc7XHJcbiAgU2hhcmVGb290ZXJTdGFydDogc3RyaW5nO1xyXG4gIFNoYXJlRm9vdGVyRW5kOiBzdHJpbmc7XHJcbiAgRGVmYXVsdFByZWZpeDogc3RyaW5nO1xyXG4gIEluc2VydERhdGVGb3JtYXQ6IHN0cmluZztcclxuICBEZWZhdWx0RWRpdG9yTG9jYXRpb246IHN0cmluZztcclxuICBVc2VCdXR0b25Ub1Nob3dFZGl0b3I6IGJvb2xlYW47XHJcbiAgRm9jdXNPbkVkaXRvcjogYm9vbGVhbjtcclxuICBPcGVuRGFpbHlNZW1vc1dpdGhNZW1vczogYm9vbGVhbjtcclxuICBIaWRlRG9uZVRhc2tzOiBib29sZWFuO1xyXG4gIE9wZW5NZW1vc0F1dG9tYXRpY2FsbHk6IGJvb2xlYW47XHJcbiAgLy8gRWRpdG9yTWF4SGVpZ2h0OiBzdHJpbmc7XHJcbiAgU2hvd1RpbWU6IGJvb2xlYW47XHJcbiAgU2hvd0RhdGU6IGJvb2xlYW47XHJcbiAgQWRkQmxhbmtMaW5lV2hlbkRhdGU6IGJvb2xlYW47XHJcbiAgQXV0b1NhdmVXaGVuT25Nb2JpbGU6IGJvb2xlYW47XHJcbiAgRGVsZXRlRmlsZU5hbWU6IHN0cmluZztcclxuICBRdWVyeUZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgVXNlVmF1bHRUYWdzOiBib29sZWFuO1xyXG4gIERlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZTogc3RyaW5nO1xyXG4gIERlZmF1bHREYXJrQmFja2dyb3VuZEltYWdlOiBzdHJpbmc7XHJcbiAgRGVmYXVsdE1lbW9Db21wb3NpdGlvbjogc3RyaW5nO1xyXG4gIFNob3dUYXNrTGFiZWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBNZW1vc1NldHRpbmdzID0ge1xyXG4gIFN0YXJ0RGF0ZTogJ1N1bmRheScsXHJcbiAgSW5zZXJ0QWZ0ZXI6ICcjIEpvdXJuYWwnLFxyXG4gIFVzZXJOYW1lOiAnTUVNTyDwn5iJJyxcclxuICBQcm9jZXNzRW50cmllc0JlbG93OiAnJyxcclxuICBMYW5ndWFnZTogJ2VuJyxcclxuICBTYXZlTWVtb0J1dHRvbkxhYmVsOiAnTk9URUlUJyxcclxuICBTaGFyZUZvb3RlclN0YXJ0OiAne01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5JyxcclxuICBTaGFyZUZvb3RlckVuZDogJ+Kcje+4jyBieSB7VXNlck5hbWV9JyxcclxuICBEZWZhdWx0UHJlZml4OiAnTGlzdCcsXHJcbiAgSW5zZXJ0RGF0ZUZvcm1hdDogJ1Rhc2tzJyxcclxuICBEZWZhdWx0RWRpdG9yTG9jYXRpb246ICdUb3AnLFxyXG4gIFVzZUJ1dHRvblRvU2hvd0VkaXRvcjogZmFsc2UsXHJcbiAgRm9jdXNPbkVkaXRvcjogdHJ1ZSxcclxuICBPcGVuRGFpbHlNZW1vc1dpdGhNZW1vczogdHJ1ZSxcclxuICBIaWRlRG9uZVRhc2tzOiBmYWxzZSxcclxuICBTaG93VGFza0xhYmVsOiBmYWxzZSxcclxuICBPcGVuTWVtb3NBdXRvbWF0aWNhbGx5OiBmYWxzZSxcclxuICAvLyBFZGl0b3JNYXhIZWlnaHQ6ICcyNTAnLFxyXG4gIFNob3dUaW1lOiB0cnVlLFxyXG4gIFNob3dEYXRlOiB0cnVlLFxyXG4gIEFkZEJsYW5rTGluZVdoZW5EYXRlOiBmYWxzZSxcclxuICBBdXRvU2F2ZVdoZW5Pbk1vYmlsZTogZmFsc2UsXHJcbiAgRGVsZXRlRmlsZU5hbWU6ICdkZWxldGUnLFxyXG4gIFF1ZXJ5RmlsZU5hbWU6ICdxdWVyeScsXHJcbiAgVXNlVmF1bHRUYWdzOiBmYWxzZSxcclxuICBEZWZhdWx0TGlnaHRCYWNrZ3JvdW5kSW1hZ2U6ICcnLFxyXG4gIERlZmF1bHREYXJrQmFja2dyb3VuZEltYWdlOiAnJyxcclxuICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uOiAne1RJTUV9IHtDT05URU5UfScsXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgTWVtb3NTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcbiAgcGx1Z2luOiBNZW1vc1BsdWdpbjtcclxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gIHByaXZhdGUgYXBwbHlEZWJvdW5jZVRpbWVyOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBNZW1vc1BsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBhcHBseVNldHRpbmdzVXBkYXRlKCkge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuYXBwbHlEZWJvdW5jZVRpbWVyKTtcclxuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucGx1Z2luO1xyXG4gICAgdGhpcy5hcHBseURlYm91bmNlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgICBtZW1vU2VydmljZS51cGRhdGVUYWdzU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNoYW5nZUZpbGVOYW1lKG9yaWdpbmFsRmlsZU5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XHJcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCArICcvJyArIG9yaWdpbmFsRmlsZU5hbWUgKyAnLm1kJztcclxuICAgIGNvbnN0IG5ld0ZpbGVQYXRoID0gZmlsZVBhdGggKyAnLycgKyBmaWxlTmFtZSArICcubWQnO1xyXG4gICAgY29uc3QgZ2V0RmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChhYnNvbHV0ZVBhdGgpO1xyXG4gICAgLy8gY29uc3QgZGVsZXRlRmlsZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUsIG5ld0ZpbGVQYXRoKTtcclxuICB9XHJcblxyXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgYXN5bmMgaGlkZSgpIHt9XHJcblxyXG4gIGFzeW5jIGRpc3BsYXkoKSB7XHJcbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5sb2FkU2V0dGluZ3MoKTtcclxuXHJcbiAgICBjb25zdCB7Y29udGFpbmVyRWx9ID0gdGhpcztcclxuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMScsIHt0ZXh0OiB0KCdCYXNpYyBPcHRpb25zJyl9KTtcclxuICAgIC8vIGNvbnRhaW5lckVsLmNyZWF0ZURpdihcIlwiLCAoZWwpID0+IHtcclxuICAgIC8vICAgZWwuaW5uZXJIVE1MID0gXCJCYXNpYyBPcHRpb25zXCI7XHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnVXNlciBuYW1lIGluIE1lbW9zJykpXHJcbiAgICAgIC5zZXREZXNjKHQoXCJTZXQgeW91ciB1c2VyIG5hbWUgaGVyZS4gJ01lbW9zIPCfmI8nIEJ5IGRlZmF1bHRcIikpXHJcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgIHRleHRcclxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLlVzZXJOYW1lKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZXJOYW1lKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VyTmFtZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdJbnNlcnQgYWZ0ZXIgaGVhZGluZycpKVxyXG4gICAgICAuc2V0RGVzYyhcclxuICAgICAgICB0KCdZb3Ugc2hvdWxkIHNldCB0aGUgc2FtZSBoZWFkaW5nIGJlbG93IGlmIHlvdSB3YW50IHRvIGluc2VydCBhbmQgcHJvY2VzcyBtZW1vcyBiZWxvdyB0aGUgc2FtZSBoZWFkaW5nLicpLFxyXG4gICAgICApXHJcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgIHRleHRcclxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLkluc2VydEFmdGVyKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkluc2VydEFmdGVyKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnNlcnRBZnRlciA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdQcm9jZXNzIE1lbW9zIGJlbG93JykpXHJcbiAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgIHQoXHJcbiAgICAgICAgICAnT25seSBlbnRyaWVzIGJlbG93IHRoaXMgc3RyaW5nL3NlY3Rpb24gaW4geW91ciBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgaXQgZG9lcyBub3QgZXhpc3Qgbm8gbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoYXQgZmlsZS4nLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuUHJvY2Vzc0VudHJpZXNCZWxvdylcclxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Qcm9jZXNzRW50cmllc0JlbG93KVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Qcm9jZXNzRW50cmllc0JlbG93ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ1NhdmUgTWVtbyBidXR0b24gbGFiZWwnKSlcclxuICAgICAgLnNldERlc2ModChcIlRoZSB0ZXh0IHNob3duIG9uIHRoZSBzYXZlIE1lbW8gYnV0dG9uIGluIHRoZSBVSS4gJ05PVEVJVCcgYnkgZGVmYXVsdC5cIikpXHJcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgIHRleHRcclxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLlNhdmVNZW1vQnV0dG9uTGFiZWwpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuU2F2ZU1lbW9CdXR0b25MYWJlbClcclxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuU2F2ZU1lbW9CdXR0b25MYWJlbCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MuIEZvY3VzIGJ5IGRlZmF1bHQuJykpXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRm9jdXNPbkVkaXRvcikub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Gb2N1c09uRWRpdG9yID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MnKSlcclxuICAgICAgLnNldERlc2ModCgnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MuIE9wZW4gYnkgZGVmYXVsdC4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5PcGVuRGFpbHlNZW1vc1dpdGhNZW1vcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5PcGVuRGFpbHlNZW1vc1dpdGhNZW1vcyA9IHZhbHVlO1xyXG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ09wZW4gTWVtb3Mgd2hlbiBvYnNpZGlhbiBvcGVucycpKVxyXG4gICAgICAuc2V0RGVzYyh0KCdXaGVuIGVuYWJsZSB0aGlzLCBNZW1vcyB3aWxsIG9wZW4gd2hlbiBPYnNpZGlhbiBvcGVucy4gRmFsc2UgYnkgZGVmYXVsdC4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5PcGVuTWVtb3NBdXRvbWF0aWNhbGx5KS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLk9wZW5NZW1vc0F1dG9tYXRpY2FsbHkgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdIaWRlIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0JykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ0hpZGUgYWxsIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0LiBTaG93IGRvbmUgdGFza3MgYnkgZGVmYXVsdC4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5IaWRlRG9uZVRhc2tzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkhpZGVEb25lVGFza3MgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdTaG93IFRhc2tzIExhYmVsJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1Nob3cgdGFza3MgbGFiZWwgbmVhciB0aGUgdGltZSB0ZXh0LiBGYWxzZSBieSBkZWZhdWx0JykpXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuU2hvd1Rhc2tMYWJlbCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaG93VGFza0xhYmVsID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnVXNlIFRhZ3MgSW4gVmF1bHQnKSlcclxuICAgICAgLnNldERlc2ModCgnVXNlIHRhZ3MgaW4gdmF1bHQgcmF0aGVyIHRoYW4gb25seSBpbiBNZW1vcy4gRmFsc2UgYnkgZGVmYXVsdC4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VWYXVsdFRhZ3MpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlVmF1bHRUYWdzID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMScsIHt0ZXh0OiB0KCdBZHZhbmNlZCBPcHRpb25zJyl9KTtcclxuXHJcbiAgICAvLyBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgIC8vICAgLnNldE5hbWUoJ1NldCBUaGUgTWF4LUhlaWdodCBmb3IgRWRpdG9yJylcclxuICAgIC8vICAgLnNldERlc2MoXCJTZXQgdGhlIG1heCBoZWlnaHQgZm9yIGVkaXRvciBpbiBNZW1vcy4gJzI1MCcgQnkgZGVmYXVsdFwiKVxyXG4gICAgLy8gICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgIC8vICAgICB0ZXh0XHJcbiAgICAvLyAgICAgICAuc2V0UGxhY2Vob2xkZXIoREVGQVVMVF9TRVRUSU5HUy5FZGl0b3JNYXhIZWlnaHQpXHJcbiAgICAvLyAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRWRpdG9yTWF4SGVpZ2h0KVxyXG4gICAgLy8gICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgLy8gICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5FZGl0b3JNYXhIZWlnaHQgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAvLyAgICAgICB9KSxcclxuICAgIC8vICAgKTtcclxuXHJcbiAgICBsZXQgZHJvcGRvd246IERyb3Bkb3duQ29tcG9uZW50O1xyXG5cclxuICAgIC8vIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgLy8gICAuc2V0TmFtZSh0KCdVSSBsYW5ndWFnZSBmb3IgZGF0ZScpKVxyXG4gICAgLy8gICAuc2V0RGVzYyh0KFwiVHJhbnNsYXRlcyB0aGUgZGF0ZSBVSSBsYW5ndWFnZS4gT25seSAnZW4nIGFuZCAnemgnIGFyZSBhdmFpbGFibGUuXCIpKVxyXG4gICAgLy8gICAuYWRkRHJvcGRvd24oYXN5bmMgKGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAvLyAgICAgZHJvcGRvd24gPSBkO1xyXG4gICAgLy8gICAgIGRyb3Bkb3duLmFkZE9wdGlvbignemgnLCAn5Lit5paHJyk7XHJcbiAgICAvLyAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdlbicsICdFbmdsaXNoJyk7XHJcbiAgICAvLyAgICAgZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuTGFuZ3VhZ2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgLy8gICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuTGFuZ3VhZ2UgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRGVmYXVsdCBwcmVmaXgnKSlcclxuICAgICAgLnNldERlc2ModChcIlNldCB0aGUgZGVmYXVsdCBwcmVmaXggd2hlbiBjcmVhdGUgbWVtbywgJ0xpc3QnIGJ5IGRlZmF1bHQuXCIpKVxyXG4gICAgICAuYWRkRHJvcGRvd24oYXN5bmMgKGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgICAgZHJvcGRvd24gPSBkO1xyXG4gICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbignTGlzdCcsIHQoJ0xpc3QnKSk7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdUYXNrJywgdCgnVGFzaycpKTtcclxuICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5EZWZhdWx0UHJlZml4KS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRQcmVmaXggPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRGVmYXVsdCBpbnNlcnQgZGF0ZSBmb3JtYXQnKSlcclxuICAgICAgLnNldERlc2ModChcIlNldCB0aGUgZGVmYXVsdCBkYXRlIGZvcm1hdCB3aGVuIGluc2VydCBkYXRlIGJ5IEAsICdUYXNrcycgYnkgZGVmYXVsdC5cIikpXHJcbiAgICAgIC5hZGREcm9wZG93bihhc3luYyAoZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgICBkcm9wZG93biA9IGQ7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdUYXNrcycsICdUYXNrcycpO1xyXG4gICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbignRGF0YXZpZXcnLCAnRGF0YXZpZXcnKTtcclxuICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnNlcnREYXRlRm9ybWF0KS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkluc2VydERhdGVGb3JtYXQgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnU2hvdyBUaW1lIFdoZW4gQ29weSBSZXN1bHRzJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1Nob3cgdGltZSB3aGVuIHlvdSBjb3B5IHJlc3VsdHMsIGxpa2UgMTI6MDAuIENvcHkgdGltZSBieSBkZWZhdWx0LicpKVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dUaW1lKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dUaW1lID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnU2hvdyBEYXRlIFdoZW4gQ29weSBSZXN1bHRzJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1Nob3cgZGF0ZSB3aGVuIHlvdSBjb3B5IHJlc3VsdHMsIGxpa2UgW1syMDIyLTAxLTAxXV0uIENvcHkgZGF0ZSBieSBkZWZhdWx0LicpKVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dEYXRlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dEYXRlID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnQWRkIEJsYW5rIExpbmUgQmV0d2VlbiBEaWZmZXJlbnQgRGF0ZScpKVxyXG4gICAgICAuc2V0RGVzYyh0KCdBZGQgYmxhbmsgbGluZSB3aGVuIGNvcHkgcmVzdWx0IHdpdGggZGF0ZS4gTm8gYmxhbmsgbGluZSBieSBkZWZhdWx0LicpKVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkFkZEJsYW5rTGluZVdoZW5EYXRlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkFkZEJsYW5rTGluZVdoZW5EYXRlID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRmlsZSBOYW1lIG9mIFJlY3ljbGUgQmluJykpXHJcbiAgICAgIC5zZXREZXNjKHQoXCJTZXQgdGhlIGZpbGVuYW1lIGZvciByZWN5Y2xlIGJpbi4gJ2RlbGV0ZScgQnkgZGVmYXVsdFwiKSlcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuRGVsZXRlRmlsZU5hbWUpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVsZXRlRmlsZU5hbWUpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlRmlsZU5hbWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVsZXRlRmlsZU5hbWUsIHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVsZXRlRmlsZU5hbWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRmlsZSBOYW1lIG9mIFF1ZXJ5IEZpbGUnKSlcclxuICAgICAgLnNldERlc2ModChcIlNldCB0aGUgZmlsZW5hbWUgZm9yIHF1ZXJ5IGZpbGUuICdxdWVyeScgQnkgZGVmYXVsdFwiKSlcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuUXVlcnlGaWxlTmFtZSlcclxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5RdWVyeUZpbGVOYW1lKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUZpbGVOYW1lKHRoaXMucGx1Z2luLnNldHRpbmdzLlF1ZXJ5RmlsZU5hbWUsIHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuUXVlcnlGaWxlTmFtZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gxJywge3RleHQ6IHQoJ01vYmlsZSBPcHRpb25zJyl9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRGVmYXVsdCBlZGl0b3IgcG9zaXRpb24gb24gbW9iaWxlJykpXHJcbiAgICAgIC5zZXREZXNjKHQoXCJTZXQgdGhlIGRlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIE1vYmlsZSwgJ1RvcCcgYnkgZGVmYXVsdC5cIikpXHJcbiAgICAgIC5hZGREcm9wZG93bihhc3luYyAoZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgICBkcm9wZG93biA9IGQ7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdUb3AnLCB0KCdUb3AnKSk7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdCb3R0b20nLCB0KCdCb3R0b20nKSk7XHJcbiAgICAgICAgZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVmYXVsdEVkaXRvckxvY2F0aW9uKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRFZGl0b3JMb2NhdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdVc2UgYnV0dG9uIHRvIHNob3cgZWRpdG9yIG9uIG1vYmlsZScpKVxyXG4gICAgICAuc2V0RGVzYyh0KCdTZXQgYSBmbG9hdCBidXR0b24gdG8gY2FsbCBlZGl0b3Igb24gbW9iaWxlLiBPbmx5IHdoZW4gZWRpdG9yIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSB3b3Jrcy4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VCdXR0b25Ub1Nob3dFZGl0b3IpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlQnV0dG9uVG9TaG93RWRpdG9yID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMScsIHt0ZXh0OiB0KCdTaGFyZSBPcHRpb25zJyl9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIFN0YXJ0JykpXHJcbiAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgIHQoXHJcbiAgICAgICAgICBcIlNldCBhbnl0aGluZyB5b3Ugd2FudCBoZXJlLCB1c2Uge01lbW9zTnVtfSB0byBkaXNwbGF5IE51bWJlciBvZiBtZW1vcywge1VzZWREYXl9IGZvciBkYXlzLiAne01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5cycgQnkgZGVmYXVsdFwiLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuU2hhcmVGb290ZXJTdGFydClcclxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaGFyZUZvb3RlclN0YXJ0KVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaGFyZUZvb3RlclN0YXJ0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBFbmQnKSlcclxuICAgICAgLnNldERlc2ModChcIlNldCBhbnl0aGluZyB5b3Ugd2FudCBoZXJlLCB1c2Uge1VzZXJOYW1lfSBhcyB5b3VyIHVzZXJuYW1lLiAn4pyN77iPIEJ5IHtVc2VyTmFtZX0nIEJ5IGRlZmF1bHRcIikpXHJcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgIHRleHRcclxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLlNoYXJlRm9vdGVyRW5kKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyRW5kKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaGFyZUZvb3RlckVuZCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdCYWNrZ3JvdW5kIEltYWdlIGluIExpZ2h0IFRoZW1lJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1NldCBiYWNrZ3JvdW5kIGltYWdlIGluIGxpZ2h0IHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInKSlcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuRGVmYXVsdExpZ2h0QmFja2dyb3VuZEltYWdlKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZSlcclxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVmYXVsdExpZ2h0QmFja2dyb3VuZEltYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ0JhY2tncm91bmQgSW1hZ2UgaW4gRGFyayBUaGVtZScpKVxyXG4gICAgICAuc2V0RGVzYyh0KCdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBkYXJrIHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInKSlcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2UpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2UpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHREYXJrQmFja2dyb3VuZEltYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ1NhdmUgU2hhcmVkIEltYWdlIFRvIEZvbGRlciBGb3IgTW9iaWxlJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1NhdmUgaW1hZ2UgdG8gZm9sZGVyIGZvciBtb2JpbGUuIEZhbHNlIGJ5IERlZmF1bHQnKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvU2F2ZVdoZW5Pbk1vYmlsZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvU2F2ZVdoZW5Pbk1vYmlsZSA9IHZhbHVlO1xyXG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbCgnaDEnLCB7dGV4dDogdCgnRXhwZXJpbWVudGFsIE9wdGlvbnMnKX0pO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdEZWZhdWx0IE1lbW8gQ29tcG9zaXRpb24nKSlcclxuICAgICAgLnNldERlc2MoXHJcbiAgICAgICAgdChcclxuICAgICAgICAgICdTZXQgZGVmYXVsdCBtZW1vIGNvbXBvc2l0aW9uLCB5b3Ugc2hvdWxkIHVzZSB7VElNRX0gYXMgXCJISDptbVwiIGFuZCB7Q09OVEVOVH0gYXMgY29udGVudC4gXCJ7VElNRX0ge0NPTlRFTlR9XCIgYnkgZGVmYXVsdCcsXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgICAgICB0ZXh0XHJcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoREVGQVVMVF9TRVRUSU5HUy5EZWZhdWx0TWVtb0NvbXBvc2l0aW9uKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRNZW1vQ29tcG9zaXRpb24pXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRNZW1vQ29tcG9zaXRpb24gPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMScsIHt0ZXh0OiB0KCdTYXkgVGhhbmsgWW91Jyl9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRG9uYXRlJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ0lmIHlvdSBsaWtlIHRoaXMgcGx1Z2luLCBjb25zaWRlciBkb25hdGluZyB0byBzdXBwb3J0IGNvbnRpbnVlZCBkZXZlbG9wbWVudDonKSlcclxuICAgICAgLy8gLnNldENsYXNzKFwiQVQtZXh0cmFcIilcclxuICAgICAgLmFkZEJ1dHRvbigoYnQpID0+IHtcclxuICAgICAgICBidC5idXR0b25FbC5vdXRlckhUTUwgPSBgPGEgaHJlZj1cImh0dHBzOi8vd3d3LmJ1eW1lYWNvZmZlZS5jb20vYm9uaW5hbGxcIj48aW1nIHNyYz1cImh0dHBzOi8vaW1nLmJ1eW1lYWNvZmZlZS5jb20vYnV0dG9uLWFwaS8/dGV4dD1CdXkgbWUgYSBjb2ZmZWUmZW1vamk9JnNsdWc9Ym9uaW5hbGwmYnV0dG9uX2NvbG91cj02NDk1RUQmZm9udF9jb2xvdXI9ZmZmZmZmJmZvbnRfZmFtaWx5PUludGVyJm91dGxpbmVfY29sb3VyPTAwMDAwMCZjb2ZmZWVfY29sb3VyPUZGREQwMFwiPjwvYT5gO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtQbHVnaW4sIE5vdGljZSwgRmlsZVZpZXcsIFBsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7TWVtb3MsIEZvY3VzT25FZGl0b3IsIE9wZW5EYWlseU1lbW9zV2l0aE1lbW9zfSBmcm9tICcuL21lbW9zJztcclxuaW1wb3J0IHtNRU1PU19WSUVXX1RZUEV9IGZyb20gJy4vY29uc3RhbnRzJztcclxuaW1wb3J0IGFkZEljb25zIGZyb20gJy4vb2JDb21wb25lbnRzL2N1c3RvbUljb25zJztcclxuaW1wb3J0ICcuL2hlbHBlcnMvcG9seWZpbGwnO1xyXG5pbXBvcnQgJy4vbGVzcy9nbG9iYWwubGVzcyc7XHJcbmltcG9ydCB7TWVtb3NTZXR0aW5nVGFiLCBERUZBVUxUX1NFVFRJTkdTLCBNZW1vc1NldHRpbmdzfSBmcm9tICcuL3NldHRpbmcnO1xyXG5pbXBvcnQge2FwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWR9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcbi8vIGltcG9ydCB7IGVkaXRvcklucHV0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9FZGl0b3IvRWRpdG9yXCI7XHJcbmltcG9ydCBzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2cgZnJvbSAnLi9jb21wb25lbnRzL0RhaWx5TWVtb0RpYXJ5RGlhbG9nJztcclxuaW1wb3J0IHt0fSBmcm9tICcuL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG4vLyBpbXBvcnQgeyBnbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlc1wiO1xyXG5cclxuLy8gZGVjbGFyZSBtb2R1bGUgXCJvYnNpZGlhblwiIHtcclxuLy8gICBpbnRlcmZhY2UgQXBwIHtcclxuLy8gICAgICAgaXNNb2JpbGU6IGJvb2xlYW47XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4vLyBjb25zdCBtb25rZXlQYXRjaENvbnNvbGUgPSAocGx1Z2luOiBQbHVnaW4pID0+IHtcclxuXHJcbi8vICAgaWYgKCFQbGF0Zm9ybS5pc01vYmlsZSkge1xyXG4vLyAgICAgICByZXR1cm47XHJcbi8vICAgfVxyXG5cclxuLy8gICBjb25zdCBsb2dGaWxlID0gYCR7cGx1Z2luLm1hbmlmZXN0LmRpcn0vbG9ncy50eHRgO1xyXG4vLyAgIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XHJcbi8vICAgY29uc3QgbG9nTWVzc2FnZXMgPSAocHJlZml4OiBzdHJpbmcpID0+ICguLi5tZXNzYWdlczogdW5rbm93bltdKSA9PiB7XHJcbi8vICAgICAgIGxvZ3MucHVzaChgXFxuWyR7cHJlZml4fV1gKTtcclxuLy8gICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XHJcbi8vICAgICAgICAgICBsb2dzLnB1c2goU3RyaW5nKG1lc3NhZ2UpKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICBwbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUobG9nRmlsZSwgbG9ncy5qb2luKFwiIFwiKSk7XHJcbi8vICAgfTtcclxuXHJcbi8vICAgY29uc29sZS5kZWJ1ZyA9IGxvZ01lc3NhZ2VzKFwiZGVidWdcIik7XHJcbi8vICAgY29uc29sZS5lcnJvciA9IGxvZ01lc3NhZ2VzKFwiZXJyb3JcIik7XHJcbi8vICAgY29uc29sZS5pbmZvID0gbG9nTWVzc2FnZXMoXCJpbmZvXCIpO1xyXG4vLyAgIGNvbnNvbGUubG9nID0gbG9nTWVzc2FnZXMoXCJsb2dcIik7XHJcbi8vICAgY29uc29sZS53YXJuID0gbG9nTWVzc2FnZXMoXCJ3YXJuXCIpO1xyXG4vLyB9O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVtb3NQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG4gIHB1YmxpYyBzZXR0aW5nczogTWVtb3NTZXR0aW5ncztcclxuICBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zb2xlLmxvZygnb2JzaWRpYW4tbWVtb3MgbG9hZGluZy4uLicpO1xyXG4gICAgLy8gdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgLy8gYXdhaXQgdGhpcy5pbml0TG9jYWxpemF0aW9uKCk7XHJcblxyXG4gICAgLy8gbW9ua2V5UGF0Y2hDb25zb2xlKHRoaXMpO1xyXG5cclxuICAgIHRoaXMucmVnaXN0ZXJWaWV3KE1FTU9TX1ZJRVdfVFlQRSwgKGxlYWYpID0+IG5ldyBNZW1vcyhsZWFmLCB0aGlzKSk7XHJcblxyXG4gICAgLy8gdGhpcy5yZWdpc3RlclZpZXcoXHJcbiAgICAvLyAgIE1FTU9TX1ZJRVdfVFlQRSxcclxuICAgIC8vICAgKGxlYWY6IFdvcmtzcGFjZUxlYWYpID0+ICh0aGlzLnZpZXcgPSBuZXcgTWVtb3MobGVhZiwgdGhpcy5hcHAucGx1Z2luKSlcclxuICAgIC8vICk7XHJcblxyXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBNZW1vc1NldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHJcbiAgICBhZGRJY29ucygpO1xyXG4gICAgdGhpcy5hZGRSaWJib25JY29uKCdNZW1vcycsIHQoJ3JpYmJvbkljb25UaXRsZScpLCAoKSA9PiB7XHJcbiAgICAgIG5ldyBOb3RpY2UoJ09wZW4gTWVtb3MgU3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICAgIHRoaXMub3Blbk1lbW9zKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZCgpKSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoJ0NoZWNrIGlmIHlvdSBvcGVuZWQgRGFpbHkgTm90ZXMgUGx1Z2luJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdvcGVuLW1lbW9zJyxcclxuICAgICAgbmFtZTogJ09wZW4gTWVtb3MnLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5vcGVuTWVtb3MoKSxcclxuICAgICAgaG90a2V5czogW10sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogJ2ZvY3VzLW9uLW1lbW9zLWVkaXRvcicsXHJcbiAgICAgIG5hbWU6ICdGb2N1cyBPbiBNZW1vcyBFZGl0b3InLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5mb2N1c09uRWRpdG9yKCksXHJcbiAgICAgIGhvdGtleXM6IFtdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdzaG93LWRhaWx5LW1lbW8nLFxyXG4gICAgICBuYW1lOiAnU2hvdyBEYWlseSBNZW1vJyxcclxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMub3BlbkRhaWx5TWVtbygpLFxyXG4gICAgICBob3RrZXlzOiBbXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiAnbm90ZS1pdCcsXHJcbiAgICAgIG5hbWU6ICdOb3RlIEl0JyxcclxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMubm90ZUl0KCksXHJcbiAgICAgIGhvdGtleXM6IFtdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdmb2N1cy1vbi1zZWFyY2gtYmFyJyxcclxuICAgICAgbmFtZTogJ1NlYXJjaCBJdCcsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLnNlYXJjaEl0KCksXHJcbiAgICAgIGhvdGtleXM6IFtdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdjaGFuZ2Utc3RhdHVzJyxcclxuICAgICAgbmFtZTogJ0NoYW5nZSBTdGF0dXMgQmV0d2VlbiBUYXNrIE9yIExpc3QnLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5jaGFuZ2VTdGF0dXMoKSxcclxuICAgICAgaG90a2V5czogW10sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSh0aGlzLm9uTGF5b3V0UmVhZHkuYmluZCh0aGlzKSk7XHJcbiAgICBjb25zb2xlLmxvZyh0KCd3ZWxjb21lJykpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcclxuICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG4gICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIG9udW5sb2FkKCkge1xyXG4gICAgdGhpcy5hcHAud29ya3NwYWNlLmRldGFjaExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgbmV3IE5vdGljZSgnQ2xvc2UgTWVtb3MgU3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbGVhdmVzID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLkZvY3VzT25FZGl0b3IpIHtcclxuICAgICAgICBjb25zdCBsZWFmID0gbGVhdmVzWzBdO1xyXG4gICAgICAgIGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLk9wZW5NZW1vc0F1dG9tYXRpY2FsbHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVuTWVtb3MoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9wZW5EYWlseU1lbW8oKSB7XHJcbiAgICBjb25zdCB3b3Jrc3BhY2VMZWF2ZXMgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XHJcbiAgICBpZiAoT3BlbkRhaWx5TWVtb3NXaXRoTWVtb3MgPT09IHRydWUpIHtcclxuICAgICAgaWYgKHdvcmtzcGFjZUxlYXZlcyAhPT0gdW5kZWZpbmVkICYmIHdvcmtzcGFjZUxlYXZlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLm9wZW5NZW1vcygpO1xyXG4gICAgICAgIHNob3dEYWlseU1lbW9EaWFyeURpYWxvZygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNob3dEYWlseU1lbW9EaWFyeURpYWxvZygpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9wZW5NZW1vcygpIHtcclxuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMuYXBwLndvcmtzcGFjZTtcclxuICAgIHdvcmtzcGFjZS5kZXRhY2hMZWF2ZXNPZlR5cGUoTUVNT1NfVklFV19UWVBFKTtcclxuICAgIGNvbnN0IGxlYWYgPSB3b3Jrc3BhY2UuZ2V0TGVhZihcclxuICAgICAgIVBsYXRmb3JtLmlzTW9iaWxlICYmIHdvcmtzcGFjZS5hY3RpdmVMZWFmICYmIHdvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXcgaW5zdGFuY2VvZiBGaWxlVmlldyxcclxuICAgICk7XHJcbiAgICBhd2FpdCBsZWFmLnNldFZpZXdTdGF0ZSh7dHlwZTogTUVNT1NfVklFV19UWVBFfSk7XHJcbiAgICB3b3Jrc3BhY2UucmV2ZWFsTGVhZihsZWFmKTtcclxuICAgIGlmIChGb2N1c09uRWRpdG9yKSB7XHJcbiAgICAgIGlmIChsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykuZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoSXQoKSB7XHJcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLmFwcC53b3Jrc3BhY2U7XHJcbiAgICBjb25zdCBsZWF2ZXMgPSB3b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XHJcbiAgICBpZiAobGVhdmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgbGVhZiA9IGxlYXZlc1swXTtcclxuICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhZik7XHJcbiAgICAgIChsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLnNlYXJjaC1iYXItaW5wdXRlciAudGV4dC1pbnB1dCcpIGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuTWVtb3MoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvY3VzT25FZGl0b3IoKSB7XHJcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLmFwcC53b3Jrc3BhY2U7XHJcbiAgICBjb25zdCBsZWF2ZXMgPSB3b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XHJcbiAgICBpZiAobGVhdmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgbGVhZiA9IGxlYXZlc1swXTtcclxuICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhZik7XHJcbiAgICAgIGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpLmZvY3VzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5NZW1vcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbm90ZUl0KCkge1xyXG4gICAgY29uc3Qgd29ya3NwYWNlID0gdGhpcy5hcHAud29ya3NwYWNlO1xyXG4gICAgY29uc3QgbGVhdmVzID0gd29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGxlYWYgPSBsZWF2ZXNbMF07XHJcbiAgICAgIHdvcmtzcGFjZS5zZXRBY3RpdmVMZWFmKGxlYWYpO1xyXG4gICAgICBsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLm1lbW8tZWRpdG9yIC5jb25maXJtLWJ0bicpLmNsaWNrKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5NZW1vcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlU3RhdHVzKCkge1xyXG4gICAgY29uc3Qgd29ya3NwYWNlID0gdGhpcy5hcHAud29ya3NwYWNlO1xyXG4gICAgY29uc3QgbGVhdmVzID0gd29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGxlYWYgPSBsZWF2ZXNbMF07XHJcbiAgICAgIHdvcmtzcGFjZS5zZXRBY3RpdmVMZWFmKGxlYWYpO1xyXG4gICAgICBsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmxpc3Qtb3ItdGFzaycpLmNsaWNrKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5NZW1vcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgaW5pdExvY2FsaXphdGlvbigpIHtcclxuICAvLyAgIGkxOG5leHQuaW5pdCh7XHJcbiAgLy8gICAgIHJlc291cmNlczoge1xyXG4gIC8vICAgICAgIGVuOiB7XHJcbiAgLy8gICAgICAgICB0cmFuc2xhdGlvbjogVFJBTlNMQVRJT05TX0VOLFxyXG4gIC8vICAgICAgIH0sXHJcbiAgLy8gICAgICAgemg6IHtcclxuICAvLyAgICAgICAgIHRyYW5zbGF0aW9uOiBUUkFOU0xBVElPTlNfWkgsXHJcbiAgLy8gICAgICAgfSxcclxuICAvLyAgICAgfSxcclxuICAvLyAgIH0pO1xyXG5cclxuICAvLyAgIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2UodGhpcy5zZXR0aW5ncy5MYW5ndWFnZSk7XHJcbiAgLy8gfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwibiIsInAiLCJxIiwiciIsInQiLCJCIiwiRCIsIkYiLCJFIiwiRyIsIkgiLCJJIiwiTSIsIk4iLCJPIiwieSIsIlIiLCJUIiwiUCIsIlMiLCJfcmVhY3RfMTdfMF8yX3JlYWN0TW9kdWxlIiwiX3NjaGVkdWxlcl8wXzIwXzJfc2NoZWR1bGVyTW9kdWxlIiwibSIsInJlcXVpcmUkJDEiLCJyZXF1aXJlJCQyIiwiamEiLCJkYSIsImRlIiwiaWQiLCJoaSIsIl9yZWFjdERvbV8xN18wXzJfcmVhY3REb21Nb2R1bGUiLCJkZWZhdWx0U3RhdGUiLCJtb21lbnQiLCJ1dGlscyIsIm1haW4iLCJEYWlseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIiwiZ2V0QWxsRGFpbHlOb3RlcyIsImdsb2JhbFN0b3JlLmRlZmF1bHRTdGF0ZSIsImxvY2F0aW9uU3RvcmUuZGVmYXVsdFN0YXRlIiwibWVtb1N0b3JlLmRlZmF1bHRTdGF0ZSIsInVzZXJTdG9yZS5kZWZhdWx0U3RhdGUiLCJxdWVyeVN0b3JlLmRlZmF1bHRTdGF0ZSIsImRhaWx5Tm90ZXNTdG9yZS5kZWZhdWx0U3RhdGUiLCJnbG9iYWxTdG9yZS5yZWR1Y2VyIiwibG9jYXRpb25TdG9yZS5yZWR1Y2VyIiwibWVtb1N0b3JlLnJlZHVjZXIiLCJ1c2VyU3RvcmUucmVkdWNlciIsInF1ZXJ5U3RvcmUucmVkdWNlciIsImRhaWx5Tm90ZXNTdG9yZS5yZWR1Y2VyIiwiY3JlYXRlQ29udGV4dCIsImdldERhaWx5Tm90ZSIsImdldEFsbExpbmVzRnJvbUZpbGUiLCJnZXREYWlseU5vdGVTZXR0aW5ncyIsIlRGaWxlIiwiZ2V0SURGcm9tTGluZSIsImdldFBpbm5lZERhdGVGcm9tTGluZSIsIm5vcm1hbGl6ZVBhdGgiLCJOb3RpY2UiLCJnZXREYXRlRnJvbUZpbGUiLCJjcmVhdGVEYWlseU5vdGUiLCJleHRyYWN0Q29udGVudGZyb21UZXh0IiwiYXBpIiwidXNlU3RhdGUiLCJ1c2VDYWxsYmFjayIsImpzeFJ1bnRpbWVNb2R1bGUiLCJqc3hSdW50aW1lLmpzeCIsImpzeFJ1bnRpbWUuanN4cyIsImpzeFJ1bnRpbWUuRnJhZ21lbnQiLCJPbmx5V2hlbiIsInByb3BzIiwiY2hpbGRyZW4iLCJ3aGVuIiwiT25seSIsImdsb2JhbCIsIl9kZWZpbmVQcm9wZXJ0eSIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3R5cGVvZiIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJfZ2V0UHJvdG90eXBlT2YiLCJfc2V0UHJvdG90eXBlT2YiLCJfY2xhc3NDYWxsQ2hlY2siLCJfaW5oZXJpdHMiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIl9jcmVhdGVDbGFzcyIsIlJlYWN0IiwiUmVhY3RET00iLCJDdXN0b21FdmVudCIsImxvY2FsZSIsIlRJdGVtIiwiZW50aXR5IiwibmFtZSIsImNoYXIiLCJmaWxlIiwiTG9hZGluZyIsImRhdGEiLCJhY3R1YWxUb2tlbiIsIkVkaXRvciIsImZvcndhcmRSZWYiLCJyZWYiLCJnbG9iYWxTdGF0ZSIsInVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlIiwidXNlQ29udGV4dCIsImFwcENvbnRleHQiLCJjbGFzc05hbWUiLCJpbml0aWFsQ29udGVudCIsInBsYWNlaG9sZGVyIiwic2hvd0NvbmZpcm1CdG4iLCJzaG93Q2FuY2VsQnRuIiwib25Db25maXJtQnRuQ2xpY2siLCJoYW5kbGVDb25maXJtQnRuQ2xpY2tDYWxsYmFjayIsIm9uQ2FuY2VsQnRuQ2xpY2siLCJoYW5kbGVDYW5jZWxCdG5DbGlja0NhbGxiYWNrIiwib25Db250ZW50Q2hhbmdlIiwiaGFuZGxlQ29udGVudENoYW5nZUNhbGxiYWNrIiwiZWRpdG9yUmVmIiwidXNlUmVmIiwidGlueVVuZG9SZWYiLCJyZWZyZXNoIiwidXNlUmVmcmVzaCIsImN1cnJlbnQiLCJ2YWx1ZSIsInRpbnlVbmRvQWN0aW9uc0NhY2hlIiwidGlueVVuZG9JbmRleENhY2hlIiwic3RvcmFnZSIsImdldCIsIlRpbnlVbmRvIiwiaW50ZXJ2YWwiLCJpbml0aWFsQWN0aW9ucyIsImluaXRpYWxJbmRleCIsInN1YnNjcmliZSIsImFjdGlvbnMiLCJpbmRleCIsInNldCIsImRlc3Ryb3kiLCJyZW1vdmUiLCJzdHlsZSIsImhlaWdodCIsInNjcm9sbEhlaWdodCIsImVsZW1lbnQiLCJmb2N1cyIsIkZvY3VzT25FZGl0b3IiLCJpbnNlcnRUZXh0IiwicmF3VGV4dCIsInByZXZWYWx1ZSIsInNsaWNlIiwic2VsZWN0aW9uU3RhcnQiLCJzZXRDb250ZW50IiwidGV4dCIsImdldENvbnRlbnQiLCJoYW5kbGVJbnNlcnRUcmlnZ2VyIiwiZXZlbnQiLCJmaWxlTWFuYWdlciIsImFwcFN0b3JlIiwiZ2V0U3RhdGUiLCJkYWlseU5vdGVzU3RhdGUiLCJhcHAiLCJjdXJyZW50VHJpZ2dlciIsInJlbW92ZUNoYXJOdW0iLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJiZWhpbmRDaGFyTnVtIiwiaSIsInRlc3QiLCJpdGVtIiwiZmlsZVBhdGgiLCJnZW5lcmF0ZU1hcmtkb3duTGluayIsInBhdGgiLCJjb250YWlucyIsImV4dGVuc2lvbiIsImhhbmRsZUVkaXRvcklucHV0IiwiaGFuZGxlRWRpdG9yS2V5RG93biIsInN0b3BQcm9wYWdhdGlvbiIsImNvZGUiLCJtZXRhS2V5IiwiY3RybEtleSIsImhhbmRsZUNvbW1vbkNvbmZpcm1CdG5DbGljayIsImdldEVkaXRvckNvbnRlbnRDYWNoZSIsInJlc2V0U3RhdGUiLCJoYW5kbGVDb21tb25DYW5jZWxCdG5DbGljayIsImVkaXRvckNvbnRlbnRDYWNoZSIsImdldEVkaXRvckNvbnRlbnQiLCJydGEiLCJ0ZXh0YXJlYSIsIm1pbkhlaWdodCIsIm1pbldpZHRoIiwibWF4SGVpZ2h0Iiwib3ZlcmZsb3dZIiwiZGF0YVByb3ZpZGVyIiwidG9rZW4iLCJ1c2VkVGFncyIsIm1hcCIsImNvbXBvbmVudCIsImFmdGVyV2hpdGVzcGFjZSIsIm91dHB1dCIsImdldFN1Z2dlc3Rpb25zIiwidG9vbHMiLCJTYXZlTWVtb0J1dHRvbkxhYmVsIiwidXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZUVmZmVjdCIsImZpbmRJbmRleCIsIk1JTExJU0VDT05EU19JTl9EQVkiLCJNSUxMSVNFQ09ORFNfSU5fV0VFSyIsImZvcm1hdERpc3RhbmNlIiwiZm9ybWF0TG9uZyIsImZvcm1hdFJlbGF0aXZlIiwibG9jYWxpemUiLCJtYXRjaCIsImZvcm1hdHRlcnMiLCJsaWdodEZvcm1hdHRlcnMiLCJkZWZhdWx0TG9jYWxlIiwibG9uZ0Zvcm1hdHRlcnMiLCJzZXREYXRlTW9udGgiLCJpc0ZvY3VzYWJsZSIsIlJlYWN0LnVzZUxheW91dEVmZmVjdCIsIlJlYWN0LnVzZUVmZmVjdCIsImVmZmVjdCIsImdldENvbXB1dGVkU3R5bGUiLCJtaW4iLCJtYXgiLCJtYXRoTWF4IiwibWF0aE1pbiIsImhhc2giLCJhbGxQbGFjZW1lbnRzIiwicGxhY2VtZW50cyIsInBvcHBlck9mZnNldHMiLCJjb21wdXRlU3R5bGVzIiwiYXBwbHlTdHlsZXMiLCJvZmZzZXQiLCJmbGlwIiwicHJldmVudE92ZXJmbG93IiwiYXJyb3ciLCJoaWRlIiwiUmVhY3QudXNlUmVmIiwiUmVhY3QudXNlU3RhdGUiLCJSZWFjdC51c2VNZW1vIiwiaXNFcXVhbCIsImNyZWF0ZVBvcHBlciIsImRlZmF1bHRDcmVhdGVQb3BwZXIiLCJSZWFjdFByb3BUeXBlc1NlY3JldCIsIl9wcm9wVHlwZXNfMTVfOF8xX3Byb3BUeXBlc01vZHVsZSIsImNyZWF0ZUZvY3VzVHJhcCIsIm9iaiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwidGFyZ2V0IiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5Iiwia2V5IiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwibyIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiRGVyaXZlZCIsImhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiU3VwZXIiLCJyZXN1bHQiLCJOZXdUYXJnZXQiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiYXJndW1lbnRzIiwiYXBwbHkiLCJzZWxmIiwiY2FsbCIsIlJlZmVyZW5jZUVycm9yIiwic2hhbSIsIlByb3h5IiwiQm9vbGVhbiIsInZhbHVlT2YiLCJlIiwiZ2V0UHJvdG90eXBlT2YiLCJyZXF1aXJlIiwiUHJvcFR5cGVzIiwiX3JlcXVpcmUiLCJGb2N1c1RyYXAiLCJfUmVhY3QkQ29tcG9uZW50IiwiX3N1cGVyIiwiX2NyZWF0ZVN1cGVyIiwiX3RoaXMiLCJ0YWlsb3JlZEZvY3VzVHJhcE9wdGlvbnMiLCJyZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSIsImZvY3VzVHJhcE9wdGlvbnMiLCJvcHRpb25OYW1lIiwiaGFzT3duUHJvcGVydHkiLCJvblBvc3REZWFjdGl2YXRlIiwiZm9jdXNUcmFwRWxlbWVudHMiLCJjb250YWluZXJFbGVtZW50cyIsInVwZGF0ZVByZXZpb3VzRWxlbWVudCIsImRvY3VtZW50Iiwib3B0aW9uVmFsdWUiLCJub2RlIiwiX3RoaXMkZ2V0RG9jdW1lbnQiLCJnZXREb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJFcnJvciIsImNvbmNhdCIsImdldE5vZGVGb3JPcHRpb24iLCJwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQiLCJjdXJyZW50RG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwiX3RoaXMyIiwiX3RoaXMkdGFpbG9yZWRGb2N1c1RyIiwiY2hlY2tDYW5SZXR1cm5Gb2N1cyIsIl90aGlzJHRhaWxvcmVkRm9jdXNUcjIiLCJwcmV2ZW50U2Nyb2xsIiwiZm9jdXNUcmFwIiwiZGVhY3RpdmF0ZSIsInJldHVybkZvY3VzIiwiZmluaXNoRGVhY3RpdmF0aW9uIiwicmV0dXJuRm9jdXNOb2RlIiwiZ2V0UmV0dXJuRm9jdXNOb2RlIiwiY2FuUmV0dXJuRm9jdXMiLCJ0aGVuIiwiZm9jdXNUcmFwRWxlbWVudERPTU5vZGVzIiwiZmluZERPTU5vZGUiLCJub2Rlc0V4aXN0Iiwic29tZSIsIl9jcmVhdGVGb2N1c1RyYXAiLCJhY3RpdmUiLCJhY3RpdmF0ZSIsInBhdXNlZCIsInBhdXNlIiwic2V0dXBGb2N1c1RyYXAiLCJwcmV2UHJvcHMiLCJ1cGRhdGVDb250YWluZXJFbGVtZW50cyIsImhhc0FjdGl2YXRlZCIsImhhc0RlYWN0aXZhdGVkIiwiaGFzUGF1c2VkIiwiaGFzVW5wYXVzZWQiLCJkZWFjdGl2YXRlVHJhcCIsInVucGF1c2UiLCJfdGhpczMiLCJjaGlsZCIsIkNoaWxkcmVuIiwib25seSIsInR5cGUiLCJGcmFnbWVudCIsImNvbXBvc2VkUmVmQ2FsbGJhY2siLCJjaGlsZFdpdGhSZWYiLCJjbG9uZUVsZW1lbnQiLCJDb21wb25lbnQiLCJFbGVtZW50VHlwZSIsIkVsZW1lbnQiLCJGdW5jdGlvbiIsInByb3BUeXBlcyIsImJvb2wiLCJzaGFwZSIsIm9iamVjdCIsIm9uQWN0aXZhdGUiLCJmdW5jIiwib25Qb3N0QWN0aXZhdGUiLCJjaGVja0NhbkZvY3VzVHJhcCIsIm9uRGVhY3RpdmF0ZSIsImluaXRpYWxGb2N1cyIsIm9uZU9mVHlwZSIsImluc3RhbmNlT2YiLCJzdHJpbmciLCJmYWxsYmFja0ZvY3VzIiwiZXNjYXBlRGVhY3RpdmF0ZXMiLCJjbGlja091dHNpZGVEZWFjdGl2YXRlcyIsInNldFJldHVybkZvY3VzIiwiYWxsb3dPdXRzaWRlQ2xpY2siLCJhcnJheU9mIiwiZGVmYXVsdFByb3BzIiwibW9kdWxlIiwiZ2V0Q3Vyc29yUG9zdGlvbiIsImlucHV0Iiwib2Zmc2V0TGVmdCIsImlucHV0WCIsIm9mZnNldFRvcCIsImlucHV0WSIsIm9mZnNldEhlaWdodCIsImlucHV0SCIsIm9mZnNldFdpZHRoIiwiaW5wdXRXIiwic2VsZWN0aW9uRW5kIiwic2VsZWN0aW9uUG9pbnQiLCJkaXYiLCJjcmVhdGVFbGVtZW50IiwiY29weVN0eWxlIiwid2luZG93Iiwic2V0UHJvcGVydHkiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicG9zaXRpb24iLCJ2aXNpYmlsaXR5Iiwid2hpdGVTcGFjZSIsInN3YXAiLCJpbnB1dFZhbHVlIiwidGFnTmFtZSIsInJlcGxhY2UiLCJ0ZXh0Q29udGVudCIsInN1YnN0cmluZyIsInNwYW4iLCJhcHBlbmRDaGlsZCIsImJvZHkiLCJzcGFuWCIsInNwYW5ZIiwic3BhbkgiLCJzcGFuVyIsInJlbW92ZUNoaWxkIiwieCIsImgiLCJ3IiwiaXNMaXN0IiwiaXNFZGl0b3IiLCJpc0VkaXRvckdvIiwicG9zaXRpb25YIiwiTWVtb0VkaXRvciIsImlzTGlzdFNob3duIiwidG9nZ2xlTGlzdCIsInVzZVRvZ2dsZSIsImlzRWRpdG9yU2hvd24iLCJ0b2dnbGVFZGl0b3IiLCJwcmV2R2xvYmFsU3RhdGVSZWYiLCJzZWxlY3RlZCIsInNldFNlbGVjdGVkIiwiaXNQb3BwZXJPcGVuIiwic2V0SXNQb3BwZXJPcGVuIiwiZGFpbHlOb3Rlc1NlcnZpY2UiLCJwb3BwZXJSZWYiLCJwb3BwZXJFbGVtZW50Iiwic2V0UG9wcGVyRWxlbWVudCIsInBvcHBlciIsIkRlZmF1bHRQcmVmaXgiLCJpc01vYmlsZSIsImlubmVyV2lkdGgiLCJVc2VCdXR0b25Ub1Nob3dFZGl0b3IiLCJEZWZhdWx0RWRpdG9yTG9jYXRpb24iLCJQbGF0Zm9ybSIsImxlYXZlcyIsIndvcmtzcGFjZSIsImdldExlYXZlc09mVHlwZSIsIk1FTU9TX1ZJRVdfVFlQRSIsIm1lbW9zSGVpZ2h0IiwibGVhZlZpZXciLCJsZWFmIiwidmlldyIsImNvbnRhaW5lckVsIiwiaW5uZXJIZWlnaHQiLCJkaXZUaGlzIiwibWVtb0VkaXRvckRpdiIsInNyYyIsInNob3dFZGl0b3JTdmciLCJidXR0b25Ub3AiLCJidXR0b25MZWZ0IiwidG9wIiwibGVmdCIsIm9uY2xpY2siLCJzY2FsZUVsZW1lbnRBbmkiLCJhbmltYXRlIiwidHJhbnNmb3JtIiwiZHVyYXRpb24iLCJpdGVyYXRpb25zIiwiSW5maW5pdHkiLCJyZXZlcnNlIiwicHJlcGVuZCIsIm1lbW9saXN0U2Nyb2xsIiwib25zY3JvbGwiLCJzY2FsZUVkaXRvckVsZW1lbnRBbmkiLCJvcGFjaXR5Iiwic2NhbGVPbmVFbGVtZW50QW5pIiwiY2FuY2VsIiwidXNlUG9wcGVyIiwicGxhY2VtZW50IiwibW9kaWZpZXJzIiwib3B0aW9ucyIsImFsbG93ZWRBdXRvUGxhY2VtZW50cyIsInJvb3RCb3VuZGFyeSIsInNlbGV0b3JQb3B1cFdpZHRoIiwiY2xvc2VQb3BwZXIiLCJtYXJrTWVtb0lkIiwiZWRpdG9yQ3VycmVudFZhbHVlIiwibWVtb0xpbmtUZXh0Iiwic2V0TWFya01lbW9JZCIsImVkaXRNZW1vSWQiLCJlZGl0TWVtbyIsIm1lbW9TZXJ2aWNlIiwiZ2V0TWVtb0J5SWQiLCJjb250ZW50IiwiaGFuZGxlUGFzdGVFdmVudCIsImNsaXBib2FyZERhdGEiLCJmaWxlcyIsInByZXZlbnREZWZhdWx0IiwidXJsIiwiaGFuZGxlVXBsb2FkRmlsZSIsImhhbmRsZURyb3BFdmVudCIsImRhdGFUcmFuc2ZlciIsImhhbmRsZUNsaWNrRXZlbnQiLCJoYW5kbGVLZXlEb3duRXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInN0YXJ0c1dpdGgiLCJpbWFnZSIsInJlc291cmNlU2VydmljZSIsInVwbG9hZCIsImVycm9yIiwiaGFuZGxlU2F2ZUJ0bkNsaWNrIiwiZ2xvYmFsU3RhdGVTZXJ2aWNlIiwicmVwbGFjZUFsbCIsInByZXZNZW1vIiwiZWRpdGVkTWVtbyIsInVwZGF0ZU1lbW8iLCJtZW1vVHlwZSIsInVwZGF0ZWRBdCIsImdldERhdGVUaW1lU3RyaW5nIiwiRGF0ZSIsIm5vdyIsInNldEVkaXRNZW1vSWQiLCJuZXdNZW1vIiwiY3JlYXRlTWVtbyIsInB1c2hNZW1vIiwiY2xlYXJRdWVyeSIsIm1lc3NhZ2UiLCJoYW5kbGVDYW5jZWxCdG5DbGljayIsImhhbmRsZUNvbnRlbnRDaGFuZ2UiLCJ0ZW1wRGl2IiwiaW5uZXJIVE1MIiwiaW5uZXJUZXh0IiwidHJpbSIsImN1cnJlbnRWYWx1ZSIsInByZXZTdHJpbmciLCJuZXh0U3RyaW5nIiwiZW5kc1dpdGgiLCJoYW5kbGVEYXRlSW5zZXJ0VHJpZ2dlciIsImRhdGUiLCJ0b2RheU1vbWVudCIsIkluc2VydERhdGVGb3JtYXQiLCJmb3JtYXQiLCJzZXRTZWxlY3Rpb25SYW5nZSIsImhhbmRsZUNoYW5nZVN0YXR1cyIsImhhbmRsZVNob3dFZGl0b3IiLCJmbGFnIiwiaGFuZGxlVGFnVGV4dEJ0bkNsaWNrIiwibmV4dFZhbHVlIiwiY3Vyc29ySW5kZXgiLCJ1cGRhdGVEYXRlU2VsZWN0b3JQb3B1cFBvc2l0aW9uIiwiZWRpdG9yV2lkdGgiLCJjbGllbnRXaWR0aCIsImhhbmRsZVVwbG9hZEZpbGVCdG5DbGljayIsImlucHV0RWwiLCJtdWx0aXBsZSIsImFjY2VwdCIsIm9uY2hhbmdlIiwiY2xpY2siLCJzaG93RWRpdFN0YXR1cyIsImVkaXRvckNvbmZpZyIsInVzZU1lbW8iLCJzaG93VG9vbHMiLCJ0YWciLCJpbWFnZVN2ZyIsImpvdXJuYWxTdmciLCJ0YXNrU3ZnIiwic3R5bGVzIiwiYXR0cmlidXRlcyIsIlNlYXJjaEJhciIsImxvY2F0aW9uU3RhdGUiLCJxdWVyeSIsImlzU2VhcmNoQmFyU2hvdyIsInRvZ2dsZVNlYXJjaGJhciIsImhhbmRsZU1lbW9UeXBlSXRlbUNsaWNrIiwicHJldlR5cGUiLCJsb2NhdGlvblNlcnZpY2UiLCJzZXRNZW1vVHlwZVF1ZXJ5IiwiaGFuZGxlVGV4dFF1ZXJ5SW5wdXQiLCJjdXJyZW50VGFyZ2V0Iiwic2V0VGV4dFF1ZXJ5IiwibW91c2VJbiIsIm1vdXNlT3V0Iiwic2VhcmNoIiwibWVtb1NwZWNpYWxUeXBlcyIsImlkeCIsInByZXZSZXF1ZXN0VGltZXN0YW1wIiwiTWVtb3NIZWFkZXIiLCJmaWx0ZXIiLCJpc01vYmlsZVZpZXciLCJxdWVyeVN0YXRlIiwicXVlcmllcyIsInRpdGxlVGV4dCIsInNldFRpdGxlVGV4dCIsInF1ZXJ5U2VydmljZSIsImdldFF1ZXJ5QnlJZCIsInRpdGxlIiwiaGFuZGxlTWVtb1RleHRDbGljayIsImZldGNoQWxsTWVtb3MiLCJjYXRjaCIsImhhbmRsZVNob3dTaWRlYmFyQnRuQ2xpY2siLCJzZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXciLCJtZW51U3ZnIiwiUHJvdmlkZXIiLCJzdG9yZSIsImNvbnRleHQiLCJDb250ZXh0IiwiYXBwU3RhdGUiLCJzZXRBcHBTdGF0ZSIsInVuc3Vic2NyaWJlIiwibnMiLCJCYXNlRGlhbG9nIiwiY2xpY2tTcGFjZURlc3Ryb3kiLCJoYW5kbGVTcGFjZUNsaWNrZWQiLCJoYW5kbGVFc2NDbGlja2VkIiwiY29uZmlnIiwiRGlhbG9nQ29tcG9uZW50IiwiYXBwZW5kIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJjbGFzc0xpc3QiLCJhZGQiLCJjYnMiLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwiQU5JTUFUSU9OX0RVUkFUSU9OIiwiZGlhbG9nUHJvcHMiLCJ1c2VBcHBDb250ZXh0IiwicmVuZGVyIiwiUHJldmlld0ltYWdlRGlhbG9nIiwiaW1nVXJsIiwiZmlsZXBhdGgiLCJpbWdSZWYiLCJpbWdXaWR0aCIsInNldEltZ1dpZHRoIiwidmF1bHQiLCJnZXRJbWFnZVNpemUiLCJ3aWR0aCIsImhhbmRsZUNsb3NlQnRuQ2xpY2siLCJoYW5kbGVEZWNyZWFzZUltYWdlU2l6ZSIsImhhbmRsZUluY3JlYXNlSW1hZ2VTaXplIiwiY29udmVydEJhc2U2NFRvQmxvYiIsImJhc2U2NCIsImJ5dGVzIiwiYXRvYiIsImFiIiwiQXJyYXlCdWZmZXIiLCJpYSIsIlVpbnQ4QXJyYXkiLCJjaGFyQ29kZUF0IiwiQmxvYiIsImNvcHlJbWFnZVRvQ2xpcGJvYXJkIiwibXlCYXNlNjQiLCJzcGxpdCIsImJsb2JJbnB1dCIsImNsaXBib2FyZEl0ZW1JbnB1dCIsIkNsaXBib2FyZEl0ZW0iLCJuYXZpZ2F0b3IiLCJ3cml0ZSIsImJ1ZmZlciIsImFkYXB0ZXIiLCJyZWFkQmluYXJ5IiwiYXJyIiwiYmxvYiIsImNsb3NlIiwiSW1hZ2UiLCJhbHQiLCJyZWZlcnJlclBvbGljeSIsImhhbmRsZUltYWdlQ2xpY2siLCJnZXRQYXRoT2ZJbWFnZSIsImdldFJlc291cmNlUGF0aCIsImRldGVjdFdpa2lJbnRlcm5hbExpbmsiLCJsaW5lVGV4dCIsIm1ldGFkYXRhQ2FjaGUiLCJpbnRlcm5hbEZpbGVOYW1lIiwiV0lLSV9JTUFHRV9VUkxfUkVHIiwiZXhlYyIsImludGVybmFsQWx0TmFtZSIsImdldEZpcnN0TGlua3BhdGhEZXN0IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwibGlua1RleHQiLCJhbHRUZXh0IiwiaW1hZ2VQYXRoIiwiZGV0ZWN0TURJbnRlcm5hbExpbmsiLCJNQVJLRE9XTl9VUkxfUkVHIiwiTWVtb0NhcmREaWFsb2ciLCJtZW1vIiwic2V0TWVtbyIsImNyZWF0ZWRBdFN0ciIsImNyZWF0ZWRBdCIsImxpbmtNZW1vcyIsInNldExpbmtNZW1vcyIsImxpbmtlZE1lbW9zIiwic2V0TGlua2VkTWVtb3MiLCJleHRlcm5hbEltYWdlVXJscyIsImludGVybmFsSW1hZ2VVcmxzIiwiYWxsTWFya2Rvd25MaW5rIiwiYWxsSW50ZXJuYWxMaW5rIiwiSU1BR0VfVVJMX1JFRyIsImFsbEV4dGVybmFsSW1hZ2VVcmxzIiwiYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzIiwiQXJyYXkiLCJmcm9tIiwiTUFSS0RPV05fV0VCX1VSTF9SRUciLCJvbmUiLCJwdXNoIiwidHdvIiwiZmV0Y2hMaW5rZWRNZW1vcyIsIm1hdGNoZWRBcnIiLCJtYXRjaEFsbCIsIk1FTU9fTElOS19SRUciLCJtYXRjaFJlcyIsIm1lbW9UZW1wIiwiZGF0ZVN0ciIsImdldERhdGVTdHJpbmciLCJnZXRMaW5rZWRNZW1vcyIsInNvcnQiLCJhIiwiYiIsImdldFRpbWVTdGFtcEJ5RGF0ZSIsImhhbmRsZU1lbW9Db250ZW50Q2xpY2siLCJ0YXJnZXRFbCIsIm5leHRNZW1vSWQiLCJkYXRhc2V0IiwibmV4dE1lbW8iLCJoYW5kbGVMaW5rZWRNZW1vQ2xpY2siLCJoYW5kbGVFZGl0TWVtb0J0bkNsaWNrIiwiZWRpdCIsIl9faHRtbCIsImZvcm1hdE1lbW9Db250ZW50IiwiXyIsImJvdHRvbSIsInpJbmRleCIsInJhd3RleHQiLCJwYXJzZUh0bWxUb1Jhd1RleHQiLCJTaGFyZU1lbW9JbWFnZURpYWxvZyIsInByb3BzTWVtbyIsIm1lbW9zIiwibWVtb1N0YXRlIiwibWVtb3NMZW5ndGgiLCJjcmVhdGVkRGF5cyIsIk1hdGgiLCJjZWlsIiwiZm9vdGVyRW5kIiwiU2hhcmVGb290ZXJFbmQiLCJVc2VyTmFtZSIsImZvb3RlclN0YXJ0IiwiU2hhcmVGb290ZXJTdGFydCIsInRvU3RyaW5nIiwic2hvcnRjdXRJbWdVcmwiLCJzZXRTaG9ydGN1dEltZ1VybCIsImltZ0Ftb3VudCIsInNldEltZ0Ftb3VudCIsIm1lbW9FbFJlZiIsInNoYXJlRGlhbG9nQmFja2dyb3VuZENvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwicGl4ZWxSYXRpbyIsImRldmljZVBpeGVsUmF0aW8iLCJjb252ZXJ0QmFja2dyb3VuZFRvQmFzZTY0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkZW5kIiwiYmFzZTY0VXJsIiwicmVhZEFzRGF0YVVSTCIsImNoYW5nZUJhY2tncm91bmRJbWFnZSIsImltYWdlVXJsIiwibGlnaHRCYWNrZ3JvdW5kSW1hZ2UiLCJlbmNvZGVVUkkiLCJsaWdodEJhY2tncm91bmQiLCJkYXJrQmFja2dyb3VuZEltYWdlIiwiZGFya0JhY2tncm91bmQiLCJleGlzdHMiLCJEZWZhdWx0TGlnaHRCYWNrZ3JvdW5kSW1hZ2UiLCJEZWZhdWx0RGFya0JhY2tncm91bmRJbWFnZSIsIm1lbW9TaGFyZURpdiIsImJhY2tncm91bmRJbWFnZSIsImhhbmRsZUNvcHl0b0NsaXBib2FyZEJ0bkNsaWNrIiwiZGl2cyIsImdldEF0dHJpYnV0ZSIsImFGaWxlIiwiQXV0b1NhdmVXaGVuT25Nb2JpbGUiLCJhcnJheUJ1ZmZlciIsImV4dCIsImRhaWx5Tm90ZXMiLCJjcmVhdGVCaW5hcnkiLCJnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMiLCJoYW5kbGVJbWFnZU9uTG9hZCIsImV2Iiwic2hhcmUiLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJNZW1vIiwic2hvd0NvbmZpcm1EZWxldGVCdG4iLCJ0b2dnbGVDb25maXJtRGVsZXRlQnRuIiwiaGFuZGxlU2hvd01lbW9TdG9yeURpYWxvZyIsImhhbmRsZU1hcmtNZW1vQ2xpY2siLCJlbGVtIiwiaGFuZGxlRWRpdE1lbW9DbGljayIsImhhbmRsZVNvdXJjZU1lbW9DbGljayIsImhhbmRsZURlbGV0ZU1lbW9DbGljayIsImhpZGVNZW1vQnlJZCIsImhhbmRsZU1vdXNlTGVhdmVNZW1vV3JhcHBlciIsImhhbmRsZUdlbk1lbW9JbWFnZUJ0bkNsaWNrIiwiaGFuZGxlTWVtb1R5cGVTaG93IiwiU2hvd1Rhc2tMYWJlbCIsInRhc2tCbGFuayIsInRhc2siLCJoYW5kbGVNZW1vS2V5RG93biIsImhhbmRsZU1lbW9Eb3VibGVDbGljayIsIm1lbW9JZCIsIm1vcmUiLCJtZW1vaWQiLCJlbmNvZGVIdG1sIiwicGFyc2VSYXdUZXh0VG9IdG1sIiwiam9pbiIsInNob3VsZFVzZU1hcmtkb3duUGFyc2VyIiwic2hvdWxkSGlkZUltYWdlVXJsIiwicGFyc2VNYXJrZWRUb0h0bWwiLCJUQUdfUkVHIiwiRklSU1RfVEFHX1JFRyIsIkxJTktfUkVHIiwiTURfTElOS19SRUciLCJ0ZW1wRGl2Q29udGFpbmVyIiwiYyIsImNvcHlTaG93bk1lbW9zIiwiTWVtb0xpc3QiLCJpc0ZldGNoaW5nIiwic2V0RmV0Y2hTdGF0dXMiLCJ3cmFwcGVyRWxlbWVudCIsInRhZ1F1ZXJ5IiwibWVtb0NvbnRlbnRUeXBlIiwidGV4dFF1ZXJ5IiwicXVlcnlJZCIsInF1ZXJ5RmlsdGVyIiwic2hvd01lbW9GaWx0ZXIiLCJ0byIsInNob3duTWVtb3MiLCJIaWRlRG9uZVRhc2tzIiwic2hvdWxkU2hvdyIsImZpbHRlcnMiLCJKU09OIiwicGFyc2UiLCJxdWVyeXN0cmluZyIsImlzQXJyYXkiLCJjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnMiLCJ0YWdzU2V0IiwiU2V0IiwiaXRlbXMiLCJ0ZW1wIiwiTk9QX0ZJUlNUX1RBR19SRUciLCJoYXMiLCJpbmNsdWRlcyIsImdldE15QWxsRGFpbHlOb3RlcyIsInNjcm9sbFRvIiwiaGFuZGxlTWVtb0xpc3RDbGljayIsImN1cnJUYWdRdWVyeSIsInNldFRhZ1F1ZXJ5Iiwic291cmNlUGF0aCIsIm9wZW5MaW5rVGV4dCIsIk1lbW9GaWx0ZXIiLCJzaG93RmlsdGVyIiwiaGFuZGxlQ29weUNsaWNrIiwibWVtb3NCeURhdGUiLCJnZXRNZW1vc0J5RGF0ZSIsInF1ZXJ5RGFpbHlNZW1vcyIsInRyYW5zZmVyTWVtb3NJbnRvVGV4dCIsImNvcHlUZXh0VG9DbGlwYm9hcmQiLCJzZXRNZW1vRmlsdGVyIiwiZ2V0VGV4dFdpdGhNZW1vVHlwZSIsInNldEZyb21BbmRUb1F1ZXJ5IiwiY29weSIsIkRlbGV0ZWRNZW1vIiwiaGFuZGxlRGVsZXRlZE1lbW9BY3Rpb24iLCJkZWxldGVkQXRTdHIiLCJkZWxldGVkQXQiLCJkZWxldGVNZW1vQnlJZCIsImhhbmRsZVJlc3RvcmVNZW1vQ2xpY2siLCJyZXN0b3JlTWVtb0J5SWQiLCJNZW1vVHJhc2giLCJsb2FkaW5nU3RhdGUiLCJ1c2VMb2FkaW5nIiwiZGVsZXRlZE1lbW9zIiwic2V0RGVsZXRlZE1lbW9zIiwiZmV0Y2hEZWxldGVkTWVtb3MiLCJmaW5hbGx5Iiwic2V0RmluaXNoIiwiaXNMb2FkaW5nIiwiUHJlZmVyZW5jZXNTZWN0aW9uIiwic2hvdWxkU3BsaXRNZW1vV29yZCIsImRlbW9NZW1vQ29udGVudCIsImhhbmRsZU9wZW5UaW55VW5kb0NoYW5nZWQiLCJzZXRBcHBTZXR0aW5nIiwiaGFuZGxlU3BsaXRXb3Jkc1ZhbHVlQ2hhbmdlZCIsImhhbmRsZUhpZGVJbWFnZVVybFZhbHVlQ2hhbmdlZCIsImhhbmRsZVVzZU1hcmtkb3duUGFyc2VyQ2hhbmdlZCIsImhhbmRsZUV4cG9ydEJ0bkNsaWNrIiwiZm9ybWF0ZWRNZW1vcyIsImpzb25TdHIiLCJzdHJpbmdpZnkiLCJzZXRBdHRyaWJ1dGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJkaXNwbGF5IiwiY2hlY2tib3hBY3RpdmUiLCJjaGVja2JveCIsIlNldHRpbmciLCJob21lUm91dGVyIiwiTWVtb3MiLCJBYm91dFNpdGVEaWFsb2ciLCJNZW51QnRuc1BvcHVwIiwic2hvd25TdGF0dXMiLCJzZXRTaG93blN0YXR1cyIsInBvcHVwRWxSZWYiLCJoYW5kbGVDbGlja091dHNpZGUiLCJjYXB0dXJlIiwib25jZSIsImhhbmRsZU15QWNjb3VudEJ0bkNsaWNrIiwic2V0dGluZyIsIm9wZW4iLCJvcGVuVGFiQnlJZCIsImhhbmRsZU1lbW9zVHJhc2hCdG5DbGljayIsInB1c2hIaXN0b3J5IiwiaGFuZGxlQWJvdXRCdG5DbGljayIsIkRhaWx5TWVtbyIsInRpbWVTdHIiLCJnZXRUaW1lU3RyaW5nIiwiRGF0ZVBpY2tlciIsImRhdGVzdGFtcCIsImhhbmRsZURhdGVTdGFtcENoYW5nZSIsImN1cnJlbnREYXRlU3RhbXAiLCJzZXRDdXJyZW50RGF0ZVN0YW1wIiwiZ2V0TW9udGhGaXJzdERheURhdGVTdGFtcCIsImZpcnN0RGF0ZSIsImZpcnN0RGF0ZURheSIsImdldERheSIsImRheUxpc3QiLCJnZXRUaW1lIiwiREFJTFlfVElNRVNUQU1QIiwiZGF5QW1vdW50IiwiZ2V0TW9udGhEYXlBbW91bnQiLCJoYW5kbGVEYXRlSXRlbUNsaWNrIiwiaGFuZGxlQ2hhbmdlTW9udGhCdG5DbGljayIsInllYXIiLCJnZXRGdWxsWWVhciIsIm1vbnRoIiwiZ2V0TW9udGgiLCJuZXh0RGF0ZVN0YW1wIiwiYXJyb3dMZWZ0IiwiYXJyb3dSaWdodCIsImQiLCJkYXRlVGVtcCIsImN1cnJlbnREYXRlIiwibmV4dE1vbnRoRGF0ZSIsInRpbWVzdGFtcCIsIkRhaWx5TWVtb0RpYXJ5RGlhbG9nIiwic2V0TWVtb3MiLCJnZXREYXRlU3RhbXBCeURhdGUiLCJzaG93RGF0ZVBpY2tlciIsInRvZ2dsZVNob3dEYXRlUGlja2VyIiwibWVtb3NFbFJlZiIsInNldERhaWx5TWVtb3MiLCJkYWlseU1lbW9zIiwiaGFuZGxlU2hhcmVCdG5DbGljayIsImhhbmRsZURhdGFQaWNrZXJDaGFuZ2UiLCJnZXREYXRlIiwiVXNlckJhbm5lciIsInRhZ3MiLCJ1c2VyU3RhdGUiLCJ1c2VyIiwidXNlcm5hbWUiLCJzaG91bGRTaG93UG9wdXBCdG5zIiwic2V0U2hvdWxkU2hvd1BvcHVwQnRucyIsImhhbmRsZVVzZXJuYW1lQ2xpY2siLCJoYW5kbGVQb3B1cEJ0bkNsaWNrIiwic2lkZWJhckVsIiwicG9wdXBFbCIsInNjcm9sbFRvcCIsInNob3dEYWlseU1lbW9EaWFyeURpYWxvZyIsIm51bGxJdGVtIiwiU2VsZWN0b3IiLCJkYXRhU291cmNlIiwiaGFuZGxlVmFsdWVDaGFuZ2VkIiwic2hvd1NlbGVjdG9yIiwidG9nZ2xlU2VsZWN0b3JTdGF0dXMiLCJzZWxldG9yRWxSZWYiLCJjdXJyZW50SXRlbSIsImhhbmRsZUl0ZW1DbGljayIsImhhbmRsZUN1cnJlbnRWYWx1ZUNsaWNrIiwiQ3JlYXRlUXVlcnlEaWFsb2ciLCJzZXRUaXRsZSIsInNldEZpbHRlcnMiLCJyZXF1ZXN0U3RhdGUiLCJzaG93bk1lbW9MZW5ndGgiLCJxdWVyeVRlbXAiLCJoYW5kbGVUaXRsZUlucHV0Q2hhbmdlIiwiZWRpdGVkUXVlcnkiLCJ1cGRhdGVRdWVyeSIsImVkaXRRdWVyeSIsImdldE15QWxsUXVlcmllcyIsImNyZWF0ZVF1ZXJ5IiwicHVzaFF1ZXJ5IiwiaGFuZGxlQWRkRmlsdGVyQmVuQ2xpY2siLCJsYXN0RmlsdGVyIiwiZ2V0RGVmYXVsdEZpbHRlciIsImhhbmRsZUZpbHRlckNoYW5nZSIsImhhbmRsZUZpbHRlclJlbW92ZSIsImYiLCJGaWx0ZXJJbnB1dGVyIiwiaW5wdXRFbGVtZW50cyIsInNldElucHV0RWxlbWVudHMiLCJvcGVyYXRvckVsZW1lbnQiLCJrZXlzIiwiZmlsdGVyQ29uc3RzIiwidmFsdWVzIiwib3BlcmF0b3JzIiwib3BlcmF0b3IiLCJoYW5kbGVPcGVyYXRvckNoYW5nZSIsInZhbHVlRWxlbWVudCIsImhhbmRsZVZhbHVlQ2hhbmdlIiwiaGFuZGxlUmVsYXRpb25DaGFuZ2UiLCJyZWxhdGlvbiIsImhhbmRsZVR5cGVDaGFuZ2UiLCJvcHMiLCJoYW5kbGVSZW1vdmVCdG5DbGljayIsInJlbGF0aW9uQ29uc3RzIiwiTWVtb0ZpbHRlcklucHV0ZXIiLCJRdWVyeUxpc3QiLCJzb3J0ZWRRdWVyaWVzIiwicGlubmVkQXQiLCJzaG93Q3JlYXRlUXVlcnlEaWFsb2ciLCJpc1N1Y2NlZWQiLCJRdWVyeUl0ZW1Db250YWluZXIiLCJpc0FjdGl2ZSIsInNob3dBY3Rpb25CdG5zIiwidG9nZ2xlU2hvd0FjdGlvbkJ0bnMiLCJoYW5kbGVRdWVyeUNsaWNrIiwiaGFuZGxlU2hvd0FjdGlvbkJ0bkNsaWNrIiwiaGFuZGxlQWN0aW9uQnRuQ29udGFpbmVyTW91c2VMZWF2ZSIsImRlbGV0ZVF1ZXJ5IiwiaGFuZGxlRWRpdFF1ZXJ5QnRuQ2xpY2siLCJoYW5kbGVQaW5RdWVyeUJ0bkNsaWNrIiwidW5waW5RdWVyeSIsInBpblF1ZXJ5IiwiaGFuZGxlRGVsZXRlQnRuTW91c2VMZWF2ZSIsIm1vcmVXaGl0ZSIsIlRhZ0xpc3QiLCJ0YWdzVGV4dCIsInNldFRhZ3MiLCJ1cGRhdGVUYWdzU3RhdGUiLCJzb3J0ZWRUYWdzIiwicm9vdCIsInN1YlRhZ3MiLCJzdWJ0YWdzIiwidGVtcE9iaiIsInRhZ1RleHQiLCJpbml0aWFsaXplZCIsIlRhZ0l0ZW1Db250YWluZXIiLCJoYXNTdWJUYWdzIiwic2hvd1N1YlRhZ3MiLCJ0b2dnbGVTdWJUYWdzIiwiaGFuZGxlVGFnQ2xpY2siLCJwYXRobmFtZSIsInNldFBhdGhuYW1lIiwiaGFuZGxlVG9nZ2xlQnRuQ2xpY2siLCJzdCIsInRhYmxlQ29uZmlnIiwiZ2V0SW5pdGlhbFVzYWdlU3RhdCIsInVzZWREYXlzQW1vdW50IiwiYmVnaW5EYXlUaW1lc3RhbXAiLCJpbml0aWFsVXNhZ2VTdGF0IiwicGFyc2VJbnQiLCJjb3VudCIsIlVzYWdlSGVhdE1hcCIsInRvZGF5VGltZVN0YW1wIiwiZW5kT2YiLCJ0b2RheURheSIsIm51bGxDZWxsIiwiZmlsbCIsInN0YXJ0T2YiLCJzdWJ0cmFjdCIsInN0YXJ0RGF0ZSIsImFsbFN0YXQiLCJzZXRBbGxTdGF0IiwicG9wdXBTdGF0Iiwic2V0UG9wdXBTdGF0IiwiY3VycmVudFN0YXQiLCJzZXRDdXJyZW50U3RhdCIsImZyb21UbyIsInNldEZyb21UbyIsImZyb21Ub1JlZiIsImNvbnRhaW5lckVsUmVmIiwicG9wdXBSZWYiLCJuZXdTdGF0IiwiY3JlYXRpb25EYXRlIiwiZGlmZiIsImhhbmRsZVVzYWdlU3RhdEl0ZW1Nb3VzZUVudGVyIiwidG9wVmFsdWUiLCJoYW5kbGVVc2FnZVN0YXRJdGVtTW91c2VMZWF2ZSIsImhhbmRsZVVzYWdlU3RhdEl0ZW1DbGljayIsInNoaWZ0S2V5IiwidGltZVN0YW1wRGF5cyIsImlzQmVmb3JlIiwic3BsaXRBY3RpdmVMZWFmIiwib3BlbkZpbGUiLCJhY3RpdmVMZWFmIiwiZ2V0TGVhZiIsInRvRGF0ZVN0cmluZyIsInYiLCJjb2xvckxldmVsIiwiU2lkZWJhciIsInNob3dTaWRlcmJhckluTW9iaWxlVmlldyIsIndyYXBwZXJFbFJlZiIsImhhbmRsZUNsaWNrT3V0c2lkZU9mV3JhcHBlciIsInNpZGVyYmFyU2hvd24iLCJwYXJlbnROb2RlIiwiU0hPV19TSURFUkJBUl9NT0JJTEVfQ0xBU1NOQU1FIiwiaG9tZVJvdXRlclN3aXRjaCIsImhhbmRsZVdpbmRvd1Jlc2l6ZSIsInNldElzTW9iaWxlVmlldyIsIkl0ZW1WaWV3IiwiQXBwIiwiUGx1Z2luU2V0dGluZ1RhYiIsIlBsdWdpbiIsImFwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWQiLCJGaWxlVmlldyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFBYSxrQkFBa0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1EvQixJQUFJLHdCQUF3QixPQUFPO0FBQ25DLElBQUksaUJBQWlCLE9BQU8sVUFBVTtBQUN0QyxJQUFJLG1CQUFtQixPQUFPLFVBQVU7QUFFeEMsa0JBQWtCLEtBQUs7QUFDdEIsTUFBSSxRQUFRLFFBQVEsUUFBUSxRQUFXO0FBQ3RDLFVBQU0sSUFBSSxVQUFVO0FBQUE7QUFHckIsU0FBTyxPQUFPO0FBQUE7QUFHZiwyQkFBMkI7QUFDMUIsTUFBSTtB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RyxXQUFFO0FBQUE7QUFBQTtBQUFJLGNBQVcsR0FBRSxHQUFFO0FBQUMsUUFBSSxJQUFFLEVBQUU7QUFBTyxNQUFFLEtBQUs7QUFBRztBQUFFLGlCQUFPO0FBQUMsWUFBSSxJQUFFLElBQUUsTUFBSSxHQUFFLElBQUUsRUFBRTtBQUFHLFlBQUcsQUFBUyxNQUFULFVBQVksSUFBRSxHQUFFLEdBQUU7QUFBRyxZQUFFLEtBQUcsR0FBRSxFQUFFLEtBQUcsR0FBRSxJQUFFO0FBQUE7QUFBTztBQUFBO0FBQUE7QUFBUyxjQUFXLEdBQUU7QUFBQyxRQUFFLEVBQUU7QUFBRyxXQUFPLEFBQVMsTUFBVCxTQUFXLE9BQUs7QUFBQTtBQUNoUCxjQUFXLEdBQUU7QUFBQyxRQUFJLElBQUUsRUFBRTtBQUFHLFFBQUcsQUFBUyxNQUFULFFBQVc7QUFBQyxVQUFJLElBQUUsRUFBRTtBQUFNLFVBQUcsTUFBSSxHQUFFO0FBQUMsVUFBRSxLQUFHO0FBQUU7QUFBRSxtQkFBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBRSxLQUFHO0FBQUMsZ0JBQUksS0FBRSxJQUFHLEtBQUUsS0FBRyxHQUFFLEtBQUUsRUFBRSxLQUFHLEtBQUUsS0FBRSxHQUFFLEtBQUUsRUFBRTtBQUFHLGdCQUFHLEFBQVMsT0FBVCxVQUFZLElBQUUsR0FBRSxJQUFFO0FBQUcsY0FBUyxPQUFULFVBQVksSUFBRSxHQUFFLElBQUUsTUFBSSxHQUFFLEtBQUcsSUFBRSxFQUFFLE1BQUcsR0FBRSxJQUFFLE1BQUksR0FBRSxLQUFHLElBQUUsRUFBRSxNQUFHLEdBQUUsSUFBRTtBQUFBLHFCQUFXLEFBQVMsT0FBVCxVQUFZLElBQUUsR0FBRSxJQUFFO0FBQUcsZ0JBQUUsS0FBRyxJQUFFLEVBQUUsTUFBRyxHQUFFLElBQUU7QUFBQTtBQUFPO0FBQUE7QUFBQTtBQUFTLGFBQU87QUFBQTtBQUFFLFdBQU87QUFBQTtBQUFLLGNBQVcsR0FBRSxHQUFFO0FBQUMsUUFBSSxJQUFFLEVBQUUsWUFBVSxFQUFFO0FBQVUsV0FBTyxBQUFJLE1BQUosSUFBTSxJ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
|