Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_00003e
T

7513 lines
997 KiB
Plaintext

var Js = Object.defineProperty;
var Qs = (e, t, s) => t in e ? Js(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
var Se = (e, t, s) => (Qs(e, typeof t != "symbol" ? t + "" : t, s), s);
import { defineComponent as D, resolveDynamicComponent as oe, computed as h, openBlock as a, createBlock as A, normalizeClass as x, normalizeStyle as ae, withCtx as E, createCommentVNode as I, renderSlot as H, createTextVNode as F, createElementBlock as f, createElementVNode as v, createVNode as z, Transition as Vt, unref as u, toDisplayString as P, toRefs as Be, Fragment as J, renderList as te, ref as j, onMounted as ce, onBeforeUnmount as ht, mergeProps as Te, watch as re, withDirectives as Q, isRef as vt, withModifiers as ge, vModelText as Ke, useSlots as bt, vModelDynamic as Ys, Teleport as zt, nextTick as en, mergeModels as Ce, useModel as ke, onUnmounted as tn, withMemo as sn, toHandlers as Ot, resolveDirective as Qe, vShow as gs, getCurrentInstance as nn, inject as ln, withKeys as Ue, defineAsyncComponent as on } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { CircleCheck as an, CircleX as rn, AlertCircle as un, Info as dn, X as ys, Minus as cn } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
import { CheckIcon as Et, CheckCircleIcon as fn, XMarkIcon as Ge, ExclamationCircleIcon as Rt, ChevronUpIcon as xs, ChevronDownIcon as ws, MagnifyingGlassIcon as ks } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_20_solid.js?v=e4f18c29";
import { wait as pn, isNullOrUndefined as mn, SourceApps as hn, getClientOperatingSystem as vn, OperatingSystem as Mt, md5 as bn } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import { buildManualPromise as Jp } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import { useField as De } from "/_nuxt/node_modules/.cache/vite/client/deps/vee-validate.js?v=e4f18c29";
import { nanoid as dt } from "/_nuxt/node_modules/.cache/vite/client/deps/nanoid.js?v=e4f18c29";
import { InformationCircleIcon as ft, ClipboardDocumentCheckIcon as gn, ClipboardDocumentIcon as yn, ChevronLeftIcon as xn, XMarkIcon as wn, ChevronDownIcon as kn, ArrowLongLeftIcon as Cn, ArrowLongRightIcon as $n, ExclamationTriangleIcon as In, ChevronRightIcon as Bn, ArrowUpRightIcon as Sn, CheckCircleIcon as Pn, XCircleIcon as Tn, ExclamationCircleIcon as On } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29";
import { directive as Ae } from "/_nuxt/node_modules/.cache/vite/client/deps/vue-tippy.js?v=e4f18c29";
import { useResizeObserver as Ft, useMutationObserver as Mn, useMounted as Dt, isClient as Ve, useElementBounding as _t, useIntersectionObserver as Cs, onClickOutside as jn, useClipboard as An, useMagicKeys as Ln, whenever as Vn, useElementSize as $s, useEventListener as Yt, computedAsync as zn, useFocus as En, useDropZone as Rn } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
import { Listbox as Fn, ListboxLabel as Dn, ListboxButton as _n, ListboxOptions as Hn, ListboxOption as Un, Switch as Wn, TransitionRoot as Is, Dialog as Nn, TransitionChild as es, DialogPanel as qn, Disclosure as Kn, DisclosureButton as Gn, DisclosurePanel as Xn, Menu as Zn, MenuButton as Jn, MenuItems as Qn, MenuItem as Yn, Combobox as el, ComboboxOptions as tl, ComboboxOption as sl } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/node_modules/@headlessui/vue/dist/headlessui.esm.js?v=e4f18c29";
import { XMarkIcon as nl, ChevronUpIcon as ll, Bars3Icon as ol, Squares2X2Icon as al, UserCircleIcon as rl } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_solid.js?v=e4f18c29";
import il from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/node_modules/v3-infinite-loading/lib/v3-infinite-loading.mjs?v=e4f18c29";
import { setInterval } from "/_nuxt/node_modules/nuxt/dist/app/compat/interval.js?v=e4f18c29";
import { ToastNotificationType } from "/_nuxt/utils/globals.ts";
var ul = typeof global == "object" && global && global.Object === Object && global;
const Bs = ul;
var dl = typeof self == "object" && self && self.Object === Object && self, cl = Bs || dl || Function("return this")();
const Ye = cl;
var fl = Ye.Symbol;
const Xe = fl;
var Ss = Object.prototype, pl = Ss.hasOwnProperty, ml = Ss.toString, lt = Xe ? Xe.toStringTag : void 0;
function hl(e) {
var t = pl.call(e, lt), s = e[lt];
try {
e[lt] = void 0;
var l = !0;
} catch {
}
var r = ml.call(e);
return l && (t ? e[lt] = s : delete e[lt]), r;
}
var vl = Object.prototype, bl = vl.toString;
function gl(e) {
return bl.call(e);
}
var yl = "[object Null]", xl = "[object Undefined]", ts = Xe ? Xe.toStringTag : void 0;
function _e(e) {
return e == null ? e === void 0 ? xl : yl : ts && ts in Object(e) ? hl(e) : gl(e);
}
function ye(e) {
return e != null && typeof e == "object";
}
var wl = "[object Symbol]";
function kl(e) {
return typeof e == "symbol" || ye(e) && _e(e) == wl;
}
function gt(e, t) {
for (var s = -1, l = e == null ? 0 : e.length, r = Array(l); ++s < l; )
r[s] = t(e[s], s, e);
return r;
}
var Cl = Array.isArray;
const se = Cl;
var $l = /\s/;
function Il(e) {
for (var t = e.length; t-- && $l.test(e.charAt(t)); )
;
return t;
}
var Bl = /^\s+/;
function Sl(e) {
return e && e.slice(0, Il(e) + 1).replace(Bl, "");
}
function Ze(e) {
var t = typeof e;
return e != null && (t == "object" || t == "function");
}
var ss = 0 / 0, Pl = /^[-+]0x[0-9a-f]+$/i, Tl = /^0b[01]+$/i, Ol = /^0o[0-7]+$/i, Ml = parseInt;
function qe(e) {
if (typeof e == "number")
return e;
if (kl(e))
return ss;
if (Ze(e)) {
var t = typeof e.valueOf == "function" ? e.valueOf() : e;
e = Ze(t) ? t + "" : t;
}
if (typeof e != "string")
return e === 0 ? e : +e;
e = Sl(e);
var s = Tl.test(e);
return s || Ol.test(e) ? Ml(e.slice(2), s ? 2 : 8) : Pl.test(e) ? ss : +e;
}
var ns = 1 / 0, jl = 17976931348623157e292;
function Al(e) {
if (!e)
return e === 0 ? e : 0;
if (e = qe(e), e === ns || e === -ns) {
var t = e < 0 ? -1 : 1;
return t * jl;
}
return e === e ? e : 0;
}
function Ll(e) {
var t = Al(e), s = t % 1;
return t === t ? s ? t - s : t : 0;
}
function Ps(e) {
return e;
}
var Vl = "[object AsyncFunction]", zl = "[object Function]", El = "[object GeneratorFunction]", Rl = "[object Proxy]";
function Ts(e) {
if (!Ze(e))
return !1;
var t = _e(e);
return t == zl || t == El || t == Vl || t == Rl;
}
var Fl = Ye["__core-js_shared__"];
const Bt = Fl;
var ls = function() {
var e = /[^.]+$/.exec(Bt && Bt.keys && Bt.keys.IE_PROTO || "");
return e ? "Symbol(src)_1." + e : "";
}();
function Dl(e) {
return !!ls && ls in e;
}
var _l = Function.prototype, Hl = _l.toString;
function Ul(e) {
if (e != null) {
try {
return Hl.call(e);
} catch {
}
try {
return e + "";
} catch {
}
}
return "";
}
var Wl = /[\\^$.*+?()[\]{}|]/g, Nl = /^\[object .+?Constructor\]$/, ql = Function.prototype, Kl = Object.prototype, Gl = ql.toString, Xl = Kl.hasOwnProperty, Zl = RegExp(
"^" + Gl.call(Xl).replace(Wl, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
);
function Jl(e) {
if (!Ze(e) || Dl(e))
return !1;
var t = Ts(e) ? Zl : Nl;
return t.test(Ul(e));
}
function Ql(e, t) {
return e == null ? void 0 : e[t];
}
function yt(e, t) {
var s = Ql(e, t);
return Jl(s) ? s : void 0;
}
function Yl(e, t, s) {
switch (s.length) {
case 0:
return e.call(t);
case 1:
return e.call(t, s[0]);
case 2:
return e.call(t, s[0], s[1]);
case 3:
return e.call(t, s[0], s[1], s[2]);
}
return e.apply(t, s);
}
function Ht() {
}
var eo = 800, to = 16, so = Date.now;
function no(e) {
var t = 0, s = 0;
return function() {
var l = so(), r = to - (l - s);
if (s = l, r > 0) {
if (++t >= eo)
return arguments[0];
} else
t = 0;
return e.apply(void 0, arguments);
};
}
function lo(e) {
return function() {
return e;
};
}
var oo = function() {
try {
var e = yt(Object, "defineProperty");
return e({}, "", {}), e;
} catch {
}
}();
const os = oo;
var ao = os ? function(e, t) {
return os(e, "toString", {
configurable: !0,
enumerable: !1,
value: lo(t),
writable: !0
});
} : Ps;
const ro = ao;
var io = no(ro);
const uo = io;
function co(e, t, s, l) {
for (var r = e.length, n = s + (l ? 1 : -1); l ? n-- : ++n < r; )
if (t(e[n], n, e))
return n;
return -1;
}
function fo(e) {
return e !== e;
}
function po(e, t, s) {
for (var l = s - 1, r = e.length; ++l < r; )
if (e[l] === t)
return l;
return -1;
}
function Os(e, t, s) {
return t === t ? po(e, t, s) : co(e, fo, s);
}
function Ut(e, t) {
var s = e == null ? 0 : e.length;
return !!s && Os(e, t, 0) > -1;
}
var mo = 9007199254740991, ho = /^(?:0|[1-9]\d*)$/;
function vo(e, t) {
var s = typeof e;
return t = t ?? mo, !!t && (s == "number" || s != "symbol" && ho.test(e)) && e > -1 && e % 1 == 0 && e < t;
}
function bo(e, t) {
return e === t || e !== e && t !== t;
}
var as = Math.max;
function go(e, t, s) {
return t = as(t === void 0 ? e.length - 1 : t, 0), function() {
for (var l = arguments, r = -1, n = as(l.length - t, 0), i = Array(n); ++r < n; )
i[r] = l[t + r];
r = -1;
for (var c = Array(t + 1); ++r < t; )
c[r] = l[r];
return c[t] = s(i), Yl(e, this, c);
};
}
function Ms(e, t) {
return uo(go(e, t, Ps), e + "");
}
var yo = 9007199254740991;
function js(e) {
return typeof e == "number" && e > -1 && e % 1 == 0 && e <= yo;
}
function Wt(e) {
return e != null && js(e.length) && !Ts(e);
}
var xo = Object.prototype;
function wo(e) {
var t = e && e.constructor, s = typeof t == "function" && t.prototype || xo;
return e === s;
}
function ko(e, t) {
for (var s = -1, l = Array(e); ++s < e; )
l[s] = t(s);
return l;
}
var Co = "[object Arguments]";
function rs(e) {
return ye(e) && _e(e) == Co;
}
var As = Object.prototype, $o = As.hasOwnProperty, Io = As.propertyIsEnumerable, Bo = rs(function() {
return arguments;
}()) ? rs : function(e) {
return ye(e) && $o.call(e, "callee") && !Io.call(e, "callee");
};
const Ls = Bo;
function So() {
return !1;
}
var Vs = typeof exports == "object" && exports && !exports.nodeType && exports, is = Vs && typeof module == "object" && module && !module.nodeType && module, Po = is && is.exports === Vs, us = Po ? Ye.Buffer : void 0, To = us ? us.isBuffer : void 0, Oo = To || So;
const Mo = Oo;
var jo = "[object Arguments]", Ao = "[object Array]", Lo = "[object Boolean]", Vo = "[object Date]", zo = "[object Error]", Eo = "[object Function]", Ro = "[object Map]", Fo = "[object Number]", Do = "[object Object]", _o = "[object RegExp]", Ho = "[object Set]", Uo = "[object String]", Wo = "[object WeakMap]", No = "[object ArrayBuffer]", qo = "[object DataView]", Ko = "[object Float32Array]", Go = "[object Float64Array]", Xo = "[object Int8Array]", Zo = "[object Int16Array]", Jo = "[object Int32Array]", Qo = "[object Uint8Array]", Yo = "[object Uint8ClampedArray]", ea = "[object Uint16Array]", ta = "[object Uint32Array]", ee = {};
ee[Ko] = ee[Go] = ee[Xo] = ee[Zo] = ee[Jo] = ee[Qo] = ee[Yo] = ee[ea] = ee[ta] = !0;
ee[jo] = ee[Ao] = ee[No] = ee[Lo] = ee[qo] = ee[Vo] = ee[zo] = ee[Eo] = ee[Ro] = ee[Fo] = ee[Do] = ee[_o] = ee[Ho] = ee[Uo] = ee[Wo] = !1;
function sa(e) {
return ye(e) && js(e.length) && !!ee[_e(e)];
}
function Nt(e) {
return function(t) {
return e(t);
};
}
var zs = typeof exports == "object" && exports && !exports.nodeType && exports, at = zs && typeof module == "object" && module && !module.nodeType && module, na = at && at.exports === zs, St = na && Bs.process, la = function() {
try {
var e = at && at.require && at.require("util").types;
return e || St && St.binding && St.binding("util");
} catch {
}
}();
const ds = la;
var cs = ds && ds.isTypedArray, oa = cs ? Nt(cs) : sa;
const aa = oa;
var ra = Object.prototype, ia = ra.hasOwnProperty;
function ua(e, t) {
var s = se(e), l = !s && Ls(e), r = !s && !l && Mo(e), n = !s && !l && !r && aa(e), i = s || l || r || n, c = i ? ko(e.length, String) : [], d = c.length;
for (var p in e)
(t || ia.call(e, p)) && !(i && // Safari 9 has enumerable `arguments.length` in strict mode.
(p == "length" || // Node.js 0.10 has enumerable non-index properties on buffers.
r && (p == "offset" || p == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays.
n && (p == "buffer" || p == "byteLength" || p == "byteOffset") || // Skip index properties.
vo(p, d))) && c.push(p);
return c;
}
function da(e, t) {
return function(s) {
return e(t(s));
};
}
var ca = da(Object.keys, Object);
const fa = ca;
var pa = Object.prototype, ma = pa.hasOwnProperty;
function ha(e) {
if (!wo(e))
return fa(e);
var t = [];
for (var s in Object(e))
ma.call(e, s) && s != "constructor" && t.push(s);
return t;
}
function va(e) {
return Wt(e) ? ua(e) : ha(e);
}
var ba = yt(Object, "create");
const it = ba;
function ga() {
this.__data__ = it ? it(null) : {}, this.size = 0;
}
function ya(e) {
var t = this.has(e) && delete this.__data__[e];
return this.size -= t ? 1 : 0, t;
}
var xa = "__lodash_hash_undefined__", wa = Object.prototype, ka = wa.hasOwnProperty;
function Ca(e) {
var t = this.__data__;
if (it) {
var s = t[e];
return s === xa ? void 0 : s;
}
return ka.call(t, e) ? t[e] : void 0;
}
var $a = Object.prototype, Ia = $a.hasOwnProperty;
function Ba(e) {
var t = this.__data__;
return it ? t[e] !== void 0 : Ia.call(t, e);
}
var Sa = "__lodash_hash_undefined__";
function Pa(e, t) {
var s = this.__data__;
return this.size += this.has(e) ? 0 : 1, s[e] = it && t === void 0 ? Sa : t, this;
}
function Fe(e) {
var t = -1, s = e == null ? 0 : e.length;
for (this.clear(); ++t < s; ) {
var l = e[t];
this.set(l[0], l[1]);
}
}
Fe.prototype.clear = ga;
Fe.prototype.delete = ya;
Fe.prototype.get = Ca;
Fe.prototype.has = Ba;
Fe.prototype.set = Pa;
function Ta() {
this.__data__ = [], this.size = 0;
}
function xt(e, t) {
for (var s = e.length; s--; )
if (bo(e[s][0], t))
return s;
return -1;
}
var Oa = Array.prototype, Ma = Oa.splice;
function ja(e) {
var t = this.__data__, s = xt(t, e);
if (s < 0)
return !1;
var l = t.length - 1;
return s == l ? t.pop() : Ma.call(t, s, 1), --this.size, !0;
}
function Aa(e) {
var t = this.__data__, s = xt(t, e);
return s < 0 ? void 0 : t[s][1];
}
function La(e) {
return xt(this.__data__, e) > -1;
}
function Va(e, t) {
var s = this.__data__, l = xt(s, e);
return l < 0 ? (++this.size, s.push([e, t])) : s[l][1] = t, this;
}
function et(e) {
var t = -1, s = e == null ? 0 : e.length;
for (this.clear(); ++t < s; ) {
var l = e[t];
this.set(l[0], l[1]);
}
}
et.prototype.clear = Ta;
et.prototype.delete = ja;
et.prototype.get = Aa;
et.prototype.has = La;
et.prototype.set = Va;
var za = yt(Ye, "Map");
const Ea = za;
function Ra() {
this.size = 0, this.__data__ = {
hash: new Fe(),
map: new (Ea || et)(),
string: new Fe()
};
}
function Fa(e) {
var t = typeof e;
return t == "string" || t == "number" || t == "symbol" || t == "boolean" ? e !== "__proto__" : e === null;
}
function wt(e, t) {
var s = e.__data__;
return Fa(t) ? s[typeof t == "string" ? "string" : "hash"] : s.map;
}
function Da(e) {
var t = wt(this, e).delete(e);
return this.size -= t ? 1 : 0, t;
}
function _a(e) {
return wt(this, e).get(e);
}
function Ha(e) {
return wt(this, e).has(e);
}
function Ua(e, t) {
var s = wt(this, e), l = s.size;
return s.set(e, t), this.size += s.size == l ? 0 : 1, this;
}
function tt(e) {
var t = -1, s = e == null ? 0 : e.length;
for (this.clear(); ++t < s; ) {
var l = e[t];
this.set(l[0], l[1]);
}
}
tt.prototype.clear = Ra;
tt.prototype.delete = Da;
tt.prototype.get = _a;
tt.prototype.has = Ha;
tt.prototype.set = Ua;
function Wa(e, t) {
for (var s = -1, l = t.length, r = e.length; ++s < l; )
e[r + s] = t[s];
return e;
}
var fs = Xe ? Xe.isConcatSpreadable : void 0;
function Na(e) {
return se(e) || Ls(e) || !!(fs && e && e[fs]);
}
function Es(e, t, s, l, r) {
var n = -1, i = e.length;
for (s || (s = Na), r || (r = []); ++n < i; ) {
var c = e[n];
t > 0 && s(c) ? t > 1 ? Es(c, t - 1, s, l, r) : Wa(r, c) : l || (r[r.length] = c);
}
return r;
}
function qa(e, t, s) {
return e === e && (s !== void 0 && (e = e <= s ? e : s), t !== void 0 && (e = e >= t ? e : t)), e;
}
function ps(e, t, s) {
return s === void 0 && (s = t, t = void 0), s !== void 0 && (s = qe(s), s = s === s ? s : 0), t !== void 0 && (t = qe(t), t = t === t ? t : 0), qa(qe(e), t, s);
}
var Ka = yt(Ye, "Set");
const Pt = Ka;
var Ga = "__lodash_hash_undefined__";
function Xa(e) {
return this.__data__.set(e, Ga), this;
}
function Za(e) {
return this.__data__.has(e);
}
function Je(e) {
var t = -1, s = e == null ? 0 : e.length;
for (this.__data__ = new tt(); ++t < s; )
this.add(e[t]);
}
Je.prototype.add = Je.prototype.push = Xa;
Je.prototype.has = Za;
function pt(e, t) {
return e.has(t);
}
function Rs(e) {
var t = -1, s = Array(e.size);
return e.forEach(function(l) {
s[++t] = l;
}), s;
}
var Ja = function() {
return Ye.Date.now();
};
const Tt = Ja;
var Qa = "Expected a function", Ya = Math.max, er = Math.min;
function st(e, t, s) {
var l, r, n, i, c, d, p = 0, m = !1, b = !1, o = !0;
if (typeof e != "function")
throw new TypeError(Qa);
t = qe(t) || 0, Ze(s) && (m = !!s.leading, b = "maxWait" in s, n = b ? Ya(qe(s.maxWait) || 0, t) : n, o = "trailing" in s ? !!s.trailing : o);
function g($) {
var k = l, M = r;
return l = r = void 0, p = $, i = e.apply(M, k), i;
}
function y($) {
return p = $, c = setTimeout(C, t), m ? g($) : i;
}
function S($) {
var k = $ - d, M = $ - p, B = t - k;
return b ? er(B, n - M) : B;
}
function w($) {
var k = $ - d, M = $ - p;
return d === void 0 || k >= t || k < 0 || b && M >= n;
}
function C() {
var $ = Tt();
if (w($))
return L($);
c = setTimeout(C, S($));
}
function L($) {
return c = void 0, o && l ? g($) : (l = r = void 0, i);
}
function N() {
c !== void 0 && clearTimeout(c), p = 0, l = d = r = c = void 0;
}
function Y() {
return c === void 0 ? i : L(Tt());
}
function R() {
var $ = Tt(), k = w($);
if (l = arguments, r = this, d = $, k) {
if (c === void 0)
return y(d);
if (b)
return clearTimeout(c), c = setTimeout(C, t), g(d);
}
return c === void 0 && (c = setTimeout(C, t)), i;
}
return R.cancel = N, R.flush = Y, R;
}
function jt(e) {
return ye(e) && Wt(e);
}
function qt(e, t, s) {
for (var l = -1, r = e == null ? 0 : e.length; ++l < r; )
if (s(t, e[l]))
return !0;
return !1;
}
var tr = 200;
function sr(e, t, s, l) {
var r = -1, n = Ut, i = !0, c = e.length, d = [], p = t.length;
if (!c)
return d;
s && (t = gt(t, Nt(s))), l ? (n = qt, i = !1) : t.length >= tr && (n = pt, i = !1, t = new Je(t));
e:
for (; ++r < c; ) {
var m = e[r], b = s == null ? m : s(m);
if (m = l || m !== 0 ? m : 0, i && b === b) {
for (var o = p; o--; )
if (t[o] === b)
continue e;
d.push(m);
} else
n(t, b, l) || d.push(m);
}
return d;
}
var nr = Ms(function(e, t) {
return jt(e) ? sr(e, Es(t, 1, jt, !0)) : [];
});
const lr = nr;
var or = "[object String]";
function Le(e) {
return typeof e == "string" || !se(e) && ye(e) && _e(e) == or;
}
function ar(e, t) {
return gt(t, function(s) {
return e[s];
});
}
function rr(e) {
return e == null ? [] : ar(e, va(e));
}
var ir = Math.max;
function ur(e, t, s, l) {
e = Wt(e) ? e : rr(e), s = s && !l ? Ll(s) : 0;
var r = e.length;
return s < 0 && (s = ir(r + s, 0)), Le(e) ? s <= r && e.indexOf(t, s) > -1 : !!r && Os(e, t, s) > -1;
}
var dr = Math.min;
function cr(e, t, s) {
for (var l = s ? qt : Ut, r = e[0].length, n = e.length, i = n, c = Array(n), d = 1 / 0, p = []; i--; ) {
var m = e[i];
i && t && (m = gt(m, Nt(t))), d = dr(m.length, d), c[i] = !s && (t || r >= 120 && m.length >= 120) ? new Je(i && m) : void 0;
}
m = e[0];
var b = -1, o = c[0];
e:
for (; ++b < r && p.length < d; ) {
var g = m[b], y = t ? t(g) : g;
if (g = s || g !== 0 ? g : 0, !(o ? pt(o, y) : l(p, y, s))) {
for (i = n; --i; ) {
var S = c[i];
if (!(S ? pt(S, y) : l(e[i], y, s)))
continue e;
}
o && o.push(y), p.push(g);
}
}
return p;
}
function fr(e) {
return jt(e) ? e : [];
}
var pr = Ms(function(e) {
var t = gt(e, fr);
return t.length && t[0] === e[0] ? cr(t) : [];
});
const mr = pr;
var hr = "[object Boolean]";
function vr(e) {
return e === !0 || e === !1 || ye(e) && _e(e) == hr;
}
var br = "[object Number]";
function gr(e) {
return typeof e == "number" || ye(e) && _e(e) == br;
}
function Pe(e) {
return e === void 0;
}
var yr = "Expected a function";
function mt(e, t, s) {
var l = !0, r = !0;
if (typeof e != "function")
throw new TypeError(yr);
return Ze(s) && (l = "leading" in s ? !!s.leading : l, r = "trailing" in s ? !!s.trailing : r), st(e, t, {
leading: l,
maxWait: t,
trailing: r
});
}
var xr = 1 / 0, wr = Pt && 1 / Rs(new Pt([, -0]))[1] == xr ? function(e) {
return new Pt(e);
} : Ht;
const kr = wr;
var Cr = 200;
function $r(e, t, s) {
var l = -1, r = Ut, n = e.length, i = !0, c = [], d = c;
if (s)
i = !1, r = qt;
else if (n >= Cr) {
var p = t ? null : kr(e);
if (p)
return Rs(p);
i = !1, r = pt, d = new Je();
} else
d = t ? [] : c;
e:
for (; ++l < n; ) {
var m = e[l], b = t ? t(m) : m;
if (m = s || m !== 0 ? m : 0, i && b === b) {
for (var o = d.length; o--; )
if (d[o] === b)
continue e;
t && d.push(b), c.push(m);
} else
r(d, b, s) || (d !== c && d.push(b), c.push(m));
}
return c;
}
function Ir(e) {
return e && e.length ? $r(e) : [];
}
const pe = /* @__PURE__ */ D({
__name: "Button",
props: {
to: {},
size: {},
fullWidth: { type: Boolean },
text: { type: Boolean },
link: { type: Boolean },
color: {},
rounded: { type: Boolean },
external: { type: Boolean },
disabled: { type: Boolean },
submit: { type: Boolean },
iconLeft: {},
iconRight: {},
hideText: { type: Boolean },
linkComponent: {},
loading: { type: Boolean }
},
emits: ["click"],
setup(e, { emit: t }) {
const s = t, l = e, r = oe("NuxtLink"), n = oe("RouterLink"), i = h(() => l.linkComponent ? l.linkComponent : l.external ? "a" : ye(r) ? r : ye(n) ? n : "a"), c = h(() => {
if (!l.to)
return l.submit ? "submit" : "button";
}), d = h(() => l.disabled || l.loading), p = h(
() => l.loading ? ct : l.iconLeft
), m = h(() => {
const C = [], L = {
subtle: [
"bg-transparent border-transparent text-foreground font-medium",
"hover:bg-primary-muted disabled:hover:bg-transparent focus-visible:border-foundation"
],
outline: [
"bg-foundation border-outline-2 text-foreground font-medium",
"hover:bg-primary-muted disabled:hover:bg-foundation focus-visible:border-foundation"
],
danger: [
"bg-danger border-danger-darker text-foundation font-medium",
"hover:bg-danger-darker disabled:hover:bg-danger focus-visible:border-foundation"
],
primary: [
"bg-primary border-outline-1 text-foreground-on-primary font-semibold",
"hover:bg-primary-focus disabled:hover:bg-primary focus-visible:border-foundation"
]
};
if (l.rounded && C.push("!rounded-full"), l.text || l.link)
switch (l.color) {
case "subtle":
C.push("text-foreground");
break;
case "outline":
C.push("text-foreground");
break;
case "danger":
C.push("text-danger");
break;
case "primary":
default:
C.push("text-primary");
break;
}
else
switch (l.color) {
case "subtle":
C.push(...L.subtle);
break;
case "outline":
C.push(...L.outline);
break;
case "danger":
C.push(...L.danger);
break;
case "primary":
default:
C.push(...L.primary);
break;
}
return C.join(" ");
}), b = h(() => {
switch (l.size) {
case "sm":
return "h-6 text-body-2xs";
case "lg":
return "h-10 text-body-sm";
default:
case "base":
return "h-8 text-body-xs";
}
}), o = h(() => {
if (l.text || l.link)
return "p-0";
const C = !!l.iconLeft, L = !!l.iconRight, N = l.hideText;
switch (l.size) {
case "sm":
return N ? "w-6" : C ? "py-1 pr-2 pl-1" : L ? "py-1 pl-2 pr-1" : "px-2 py-1";
case "lg":
return N ? "w-10" : C ? "py-2 pr-6 pl-4" : L ? "py-2 pl-6 pr-4" : "px-6 py-2";
case "base":
default:
return N ? "w-8" : C ? "py-0 pr-4 pl-2" : L ? "py-0 pl-4 pr-2" : "px-4 py-0";
}
}), g = h(() => {
const C = [
"inline-flex justify-center items-center",
"text-center select-none whitespace-nowrap",
"outline outline-2 outline-transparent",
"transition duration-200 ease-in-out focus-visible:outline-outline-4"
], L = [];
return !l.text && !l.link && L.push("rounded-md border"), l.fullWidth ? L.push("w-full") : l.hideText || L.push("max-w-max"), d.value && L.push("cursor-not-allowed opacity-60"), [...C, ...L].join(" ");
}), y = h(() => [
g.value,
b.value,
m.value,
o.value
].join(" ")), S = h(() => {
const C = ["shrink-0"];
switch (l.size) {
case "sm":
l.hideText ? C.push("h-4 w-4") : C.push("h-4 w-4 p-0.5");
break;
case "lg":
C.push("h-6 w-6 p-1");
break;
case "base":
default:
C.push("h-6 w-6 p-1");
break;
}
return C.join(" ");
}), w = (C) => {
if (d.value) {
C.preventDefault(), C.stopPropagation(), C.stopImmediatePropagation();
return;
}
s("click", C);
};
return (C, L) => (a(), A(oe(C.to ? i.value : "button"), {
href: C.to,
to: C.to,
type: c.value,
external: C.external,
class: x(y.value),
disabled: d.value,
role: "button",
style: ae(
C.color !== "subtle" && !C.text ? "box-shadow: -1px 1px 4px 0px #0000000a inset; box-shadow: 0px 2px 2px 0px #0000000d;" : ""
),
onClick: w
}, {
default: E(() => [
p.value ? (a(), A(oe(p.value), {
key: 0,
class: x(S.value)
}, null, 8, ["class"])) : I("", !0),
C.hideText ? I("", !0) : H(C.$slots, "default", { key: 1 }, () => [
L[0] || (L[0] = F("Button", -1))
]),
C.iconRight || !C.loading ? (a(), A(oe(C.iconRight), {
key: 2,
class: x(S.value)
}, null, 8, ["class"])) : I("", !0)
]),
_: 3
}, 8, ["href", "to", "type", "external", "class", "disabled", "style"]));
}
}), Br = /* @__PURE__ */ D({
__name: "Link",
props: {
to: {
type: String,
required: !1,
default: void 0
},
external: {
type: Boolean,
required: !1,
default: void 0
},
disabled: {
type: Boolean,
required: !1,
default: void 0
},
size: {
type: String,
default: "base"
},
foregroundLink: {
type: Boolean,
default: !1
},
/**
* Add icon to the left from the text
*/
iconLeft: {
type: [Object, Function],
default: null
},
/**
* Add icon to the right from the text
*/
iconRight: {
type: [Object, Function],
default: null
},
/**
* Hide default slot (when you want to show icons only)
*/
hideText: {
type: Boolean,
default: !1
},
underline: {
type: Boolean,
default: !1
}
},
emits: ["click"],
setup(e, { emit: t }) {
const s = t, l = e, r = (n) => {
if (l.disabled) {
n.preventDefault(), n.stopPropagation(), n.stopImmediatePropagation();
return;
}
s("click", n);
};
return (n, i) => (a(), A(pe, {
link: e.underline,
text: !e.underline,
to: e.to,
external: e.external,
disabled: e.disabled,
size: e.size,
"foreground-link": e.foregroundLink,
"icon-left": e.iconLeft,
"icon-right": e.iconRight,
"hide-text": e.hideText,
role: "link",
onClickCapture: r
}, {
default: E(() => [
H(n.$slots, "default", {}, () => [
i[0] || (i[0] = F("Link", -1))
])
]),
_: 3
}, 8, ["link", "text", "to", "external", "disabled", "size", "foreground-link", "icon-left", "icon-right", "hide-text"]));
}
});
var We = /* @__PURE__ */ ((e) => (e[e.Success = 0] = "Success", e[e.Warning = 1] = "Warning", e[e.Danger = 2] = "Danger", e[e.Info = 3] = "Info", e[e.Loading = 4] = "Loading", e))(We || {});
const Sr = {
"aria-live": "assertive",
class: "pointer-events-none fixed top-0 right-0 left-0 bottom-0 flex items-end px-4 py-6 mt-10 sm:items-start sm:p-6 z-[60]"
}, Pr = { class: "flex w-full flex-col items-center space-y-4 sm:items-end" }, Tr = {
key: 0,
class: "flex pointer-events-auto w-full max-w-[20rem] overflow-hidden rounded bg-foundation text-foreground shadow-lg border border-outline-2 p-2 pl-3"
}, Or = { class: "flex gap-2 items-center w-full" }, Mr = { class: "w-full min-w-[10rem]" }, jr = {
key: 0,
class: "text-foreground text-body-xs font-medium"
}, Ar = {
key: 1,
class: "text-foreground-2 text-body-2xs leading-snug"
}, Lr = { key: 2 }, lp = /* @__PURE__ */ D({
__name: "ToastRenderer",
props: {
notification: {}
},
emits: ["update:notification"],
setup(e, { emit: t }) {
const s = t, l = e, r = () => {
s("update:notification", null);
}, n = (i) => {
var c, d, p;
(p = (d = (c = l.notification) == null ? void 0 : c.cta) == null ? void 0 : d.onClick) == null || p.call(d, i), r();
};
return (i, c) => (a(), f("div", Sr, [
v("div", Pr, [
z(Vt, {
"enter-active-class": "transform ease-out duration-300 transition",
"enter-from-class": "translate-y-2 opacity-0 sm:translate-y-0 sm:translate-x-2",
"enter-to-class": "translate-y-0 opacity-100 sm:translate-x-0",
"leave-active-class": "transition ease-in duration-100",
"leave-from-class": "opacity-100",
"leave-to-class": "opacity-0"
}, {
default: E(() => [
i.notification ? (a(), f("div", Tr, [
v("div", Or, [
v("div", {
class: x(["shrink-0", {
"self-start mt-0.5": i.notification.description || i.notification.cta
}])
}, [
i.notification.type === u(We).Success ? (a(), A(u(an), {
key: 0,
class: "text-success h-4 w-4",
"aria-hidden": "true"
})) : i.notification.type === u(We).Danger ? (a(), A(u(rn), {
key: 1,
class: "text-danger h-4 w-4",
"aria-hidden": "true"
})) : i.notification.type === u(We).Warning ? (a(), A(u(un), {
key: 2,
class: "text-foreground-2 h-4 w-4",
"aria-hidden": "true"
})) : i.notification.type === u(We).Info ? (a(), A(u(dn), {
key: 3,
class: "text-foreground-2 h-4 w-4",
"aria-hidden": "true"
})) : i.notification.type === u(We).Loading ? (a(), A(u(ct), {
key: 4,
class: "h-4 w-4 opacity-80"
})) : I("", !0)
], 2),
v("div", Mr, [
i.notification.title ? (a(), f("p", jr, P(i.notification.title), 1)) : I("", !0),
i.notification.description ? (a(), f("p", Ar, P(i.notification.description), 1)) : I("", !0),
i.notification.cta ? (a(), f("div", Lr, [
z(Br, {
to: i.notification.cta.url,
size: "sm",
onClick: n
}, {
default: E(() => [
F(P(i.notification.cta.title), 1)
]),
_: 1
}, 8, ["to"])
])) : I("", !0)
]),
z(u(pe), {
"icon-left": u(ys),
color: "subtle",
size: "sm",
"hide-text": "",
class: x(["shrink-0 ml-auto", {
"self-start -mt-0.5 -mr-0.5": i.notification.description || i.notification.cta
}]),
onClick: r
}, {
default: E(() => [...c[0] || (c[0] = [
F(" Close ", -1)
])]),
_: 1
}, 8, ["icon-left", "class"])
])
])) : I("", !0)
]),
_: 1
})
])
]));
}
}), Vr = "Enter";
function Fs(e) {
return (t) => {
t.code === Vr && e(t);
};
}
const zr = { class: "whitespace-nowrap" }, nt = /* @__PURE__ */ D({
__name: "Badge",
props: {
size: { default: "base" },
color: { default: "primary" },
colorClasses: {},
dot: { type: Boolean },
dotIconColorClasses: {},
iconLeft: {},
rounded: { type: Boolean },
clickableIcon: { type: Boolean }
},
emits: ["click-icon"],
setup(e, { emit: t }) {
const s = t, l = e, r = h(() => l.colorClasses ? l.colorClasses : l.color === "secondary" ? "bg-highlight-3 text-foreground-2" : "bg-info-lighter text-primary-focus dark:text-foreground"), n = h(
() => l.dotIconColorClasses || "text-blue-400"
), i = h(() => {
const m = [
"inline-flex items-center select-none",
r.value,
l.size === "lg" ? "px-3 py-0.5 text-body-2xs" : "p-1 text-body-3xs text-body-3xs font-medium"
];
return l.rounded ? (m.push("rounded"), m.push(
l.size === "lg" ? "px-2 py-0.5 text-body-2xs" : "px-1.1 py-0.5 text-body-3xs font-medium"
)) : (m.push("rounded-full"), m.push(
l.size === "lg" ? "px-2.5 py-0.5 text-body-2xs" : "px-2.5 py-0.5 text-body-3xs font-medium"
)), m.join(" ");
}), c = h(() => {
const m = [
"mt-0.5 ml-0.5 inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full focus:outline-none"
];
return l.clickableIcon ? m.push("cursor-pointer") : m.push("cursor-default"), m.join(" ");
}), d = h(() => [
"-ml-0.5 mr-1.5 h-2 w-2",
n.value
].join(" ")), p = (m) => {
if (!l.clickableIcon) {
m.stopPropagation(), m.stopImmediatePropagation(), m.preventDefault();
return;
}
s("click-icon", m);
};
return (m, b) => (a(), f("span", {
class: x(i.value)
}, [
m.dot ? (a(), f("svg", {
key: 0,
class: x(d.value),
fill: "currentColor",
viewBox: "0 0 8 8"
}, [...b[1] || (b[1] = [
v("circle", {
cx: "4",
cy: "4",
r: "3"
}, null, -1)
])], 2)) : I("", !0),
v("span", zr, [
H(m.$slots, "default", {}, () => [
b[2] || (b[2] = F("Badge", -1))
])
]),
m.iconLeft ? (a(), f("button", {
key: 1,
class: x(c.value),
onClick: b[0] || (b[0] = (o) => p(o))
}, [
(a(), A(oe(m.iconLeft), {
class: x(["h-4 w-4", n.value])
}, null, 8, ["class"]))
], 2)) : I("", !0)
], 2));
}
});
let ms = [];
function Er(e) {
ms = ms ? e : e.slice();
}
var ot = /* @__PURE__ */ ((e) => (e[e.sm = 640] = "sm", e[e.md = 768] = "md", e[e.lg = 1024] = "lg", e[e.xl = 1280] = "xl", e[e["2xl"] = 1536] = "2xl", e))(ot || {});
function Ds(e) {
const {
props: {
modelValue: t,
steps: s,
orientation: l,
goVerticalBelow: r,
nonInteractive: n,
stepsPadding: i
},
emit: c
} = e, d = h(
() => (l == null ? void 0 : l.value) === "vertical" ? "vertical" : "horizontal"
), p = h({
get: () => ps((t == null ? void 0 : t.value) || 0, -1, s.value.length),
set: (w) => c("update:modelValue", ps(w, 0, s.value.length))
}), m = (w) => `${w + 1}`, b = (w) => w === p.value, o = (w) => w < p.value, g = (w, C) => {
var N;
if (n != null && n.value) {
C == null || C.preventDefault(), C == null || C.stopPropagation(), C == null || C.stopImmediatePropagation();
return;
}
p.value = w;
const L = s.value[p.value];
(N = L == null ? void 0 : L.onClick) == null || N.call(L);
}, y = h(() => {
const w = ["flex"];
let C, L;
return (i == null ? void 0 : i.value) === "xs" ? (C = "space-x-2", L = "space-y-1") : (i == null ? void 0 : i.value) === "sm" ? (C = "space-x-4", L = "space-y-1") : (C = "space-x-6", L = "space-y-4"), w.push("flex"), d.value === "vertical" || r != null && r.value ? (w.push(`flex-col ${L} justify-center`), (r == null ? void 0 : r.value) === ot.sm ? w.push(
`sm:flex-row sm:space-y-0 sm:justify-start sm:${C} sm:items-center`
) : (r == null ? void 0 : r.value) === ot.md ? w.push(
`md:flex-row md:space-y-0 md:justify-start md:${C} md:items-center`
) : (r == null ? void 0 : r.value) === ot.lg ? w.push(
`lg:flex-row lg:space-y-0 lg:justify-start lg:${C} lg:items-center`
) : (r == null ? void 0 : r.value) === ot.xl && w.push(
`xl:flex-row xl:space-y-0 xl:justify-start xl:${C} xl:items-center`
)) : w.push(`flex-row ${C} items-center`), w.join(" ");
}), S = h(() => {
const w = ["flex items-center"];
return n != null && n.value || w.push("cursor-pointer"), w.join(" ");
});
return {
value: p,
isCurrentStep: b,
isFinishedStep: o,
switchStep: g,
getStepDisplayValue: m,
listClasses: y,
linkClasses: S,
orientation: d
};
}
Er([
"sm:space-x-6",
"md:space-x-6",
"lg:space-x-6",
"xl:space-x-6",
"sm:space-x-2",
"md:space-x-2",
"lg:space-x-2",
"xl:space-x-2",
"sm:space-x-4",
"md:space-x-4",
"lg:space-x-4",
"xl:space-x-4"
]);
const Rr = ["aria-label"], Fr = ["href", "onClick"], Dr = { class: "flex space-x-2 items-center" }, _r = { class: "shrink-0 h-7 w-7 rounded-full border border-primary text-white bg-primary inline-flex items-center justify-center select-none" }, Hr = { class: "flex flex-col" }, Ur = { class: "text-body-xs font-medium text-primary" }, Wr = {
key: 0,
class: "text-body-2xs text-foreground-2"
}, Nr = ["href", "onClick"], qr = { class: "flex space-x-2 items-center" }, Kr = { class: "shrink-0 h-7 w-7 text-body-xs rounded-full border border-primary inline-flex items-center justify-center select-none text-primary" }, Gr = { class: "flex flex-col" }, Xr = { class: "text-body-xs font-medium text-primary" }, Zr = {
key: 0,
class: "text-body-2xs text-foreground-2"
}, Jr = ["href", "onClick"], Qr = { class: "flex space-x-2 items-center" }, Yr = { class: "shrink-0 h-7 w-7 rounded-full border border-foreground-3 inline-flex items-center justify-center select-none text-foreground-3" }, ei = { class: "flex flex-col" }, ti = { class: "text-body-xs font-medium text-foreground-2" }, si = {
key: 0,
class: "text-body-2xs text-foreground-2"
}, op = /* @__PURE__ */ D({
__name: "Number",
props: {
ariaLabel: {},
orientation: {},
steps: {},
modelValue: {},
goVerticalBelow: {},
nonInteractive: { type: Boolean },
stepsPadding: {}
},
emits: ["update:modelValue"],
setup(e, { emit: t }) {
const s = t, l = e, {
isCurrentStep: r,
isFinishedStep: n,
switchStep: i,
getStepDisplayValue: c,
listClasses: d,
linkClasses: p
} = Ds({
props: Be(l),
emit: s
});
return (m, b) => (a(), f("nav", {
class: "flex justify-center",
"aria-label": m.ariaLabel || "Progress steps"
}, [
v("ol", {
class: x(u(d))
}, [
(a(!0), f(J, null, te(m.steps, (o, g) => (a(), f("li", {
key: o.name
}, [
u(n)(g) ? (a(), f("a", {
key: 0,
href: o.href,
class: x(u(p)),
onClick: (y) => u(i)(g, y)
}, [
v("div", Dr, [
v("div", _r, [
z(u(Et), { class: "w-4 h-4" })
]),
v("div", Hr, [
v("div", Ur, P(o.name), 1),
o.description ? (a(), f("div", Wr, P(o.description), 1)) : I("", !0)
])
])
], 10, Fr)) : u(r)(g) ? (a(), f("a", {
key: 1,
href: o.href,
class: x(u(p)),
"aria-current": "step",
onClick: (y) => u(i)(g, y)
}, [
v("div", qr, [
v("div", Kr, P(u(c)(g)), 1),
v("div", Gr, [
v("div", Xr, P(o.name), 1),
o.description ? (a(), f("div", Zr, P(o.description), 1)) : I("", !0)
])
])
], 10, Nr)) : (a(), f("a", {
key: 2,
href: o.href,
class: x(u(p)),
onClick: (y) => u(i)(g, y)
}, [
v("div", Qr, [
v("div", Yr, P(u(c)(g)), 1),
v("div", ei, [
v("div", ti, P(o.name), 1),
o.description ? (a(), f("div", si, P(o.description), 1)) : I("", !0)
])
])
], 10, Jr))
]))), 128))
], 2)
], 8, Rr));
}
}), ni = ["aria-label"], li = ["href", "onClick"], oi = { class: "relative flex h-5 w-5 flex-shrink-0 items-center justify-center" }, ai = {
key: 0,
class: "h-3 w-3 rounded-full bg-foreground-2"
}, ri = ["href", "onClick"], ii = {
class: "relative flex h-5 w-5 flex-shrink-0 items-center justify-center",
"aria-hidden": "true"
}, ui = {
key: 0,
class: "h-3 w-3 rounded-full bg-foreground"
}, di = ["href", "onClick"], ci = {
class: "relative flex h-5 w-5 flex-shrink-0 items-center justify-center",
"aria-hidden": "true"
}, fi = {
key: 0,
class: "h-3 w-3 rounded-full bg-foreground-2"
}, pi = {
key: 1,
class: "h-4 w-4 rounded-full bg-foreground-disabled"
}, ap = /* @__PURE__ */ D({
__name: "Bullet",
props: {
ariaLabel: {},
basic: { type: Boolean },
orientation: {},
steps: {},
modelValue: {},
goVerticalBelow: {},
nonInteractive: { type: Boolean },
stepsPadding: {}
},
emits: ["update:modelValue"],
setup(e, { emit: t }) {
const s = t, l = e, { isCurrentStep: r, isFinishedStep: n, switchStep: i, listClasses: c, linkClasses: d } = Ds({
props: Be(l),
emit: s
}), p = h(() => {
const b = ["h6 font-medium leading-7"];
let o;
return l.stepsPadding === "xs" ? o = "ml-1" : l.stepsPadding === "sm" ? o = "ml-2" : o = "ml-3", b.push(o), l.basic && b.push("sr-only"), b.join(" ");
}), m = h(() => {
const b = [];
return l.basic && b.push("basic"), b.join(" ");
});
return (b, o) => (a(), f("nav", {
class: "flex justify-center",
"aria-label": b.ariaLabel || "Progress steps"
}, [
v("ol", {
class: x([u(c), m.value])
}, [
(a(!0), f(J, null, te(b.steps, (g, y) => (a(), f("li", {
key: g.name
}, [
u(n)(y) ? (a(), f("a", {
key: 0,
href: g.href,
class: x(u(d)),
onClick: (S) => u(i)(y, S)
}, [
v("span", oi, [
b.basic ? (a(), f("span", ai)) : (a(), A(u(fn), {
key: 1,
class: "h-full w-full text-primary",
"aria-hidden": "true"
}))
]),
v("span", {
class: x(["text-foreground", p.value])
}, P(g.name), 3)
], 10, li)) : u(r)(y) ? (a(), f("a", {
key: 1,
href: g.href,
class: x(u(d)),
"aria-current": "step",
onClick: (S) => u(i)(y, S)
}, [
v("span", ii, [
b.basic ? (a(), f("span", ui)) : (a(), f(J, { key: 1 }, [
o[0] || (o[0] = v("span", { class: "absolute h-4 w-4 rounded-full bg-outline-2" }, null, -1)),
o[1] || (o[1] = v("span", { class: "relative block h-2 w-2 rounded-full bg-primary-focus" }, null, -1))
], 64))
]),
v("span", {
class: x(["text-primary-focus", p.value])
}, P(g.name), 3)
], 10, ri)) : (a(), f("a", {
key: 2,
href: g.href,
class: x(u(d)),
onClick: (S) => u(i)(y, S)
}, [
v("div", ci, [
b.basic ? (a(), f("span", fi)) : (a(), f("div", pi))
]),
v("p", {
class: x(["text-foreground-disabled", p.value])
}, P(g.name), 3)
], 10, di))
]))), 128))
], 2)
], 8, ni));
}
}), me = (e, t) => {
const s = e.__vccOpts || e;
for (const [l, r] of t)
s[l] = r;
return s;
}, mi = {}, hi = {
xmlns: "http://www.w3.org/2000/svg",
class: "icon icon-tabler icon-tabler-pointer",
width: "44",
height: "44",
viewBox: "0 0 24 24",
"stroke-width": "1.5",
stroke: "currentColor",
fill: "rgba(255,255,255,0.8)",
"stroke-linecap": "round",
"stroke-linejoin": "round"
};
function vi(e, t) {
return a(), f("svg", hi, [...t[0] || (t[0] = [
v("path", {
stroke: "none",
d: "M0 0h24v24H0z",
fill: "none"
}, null, -1),
v("path", { d: "M7.904 17.563a1.2 1.2 0 0 0 2.228 .308l2.09 -3.093l4.907 4.907a1.067 1.067 0 0 0 1.509 0l1.047 -1.047a1.067 1.067 0 0 0 0 -1.509l-4.907 -4.907l3.113 -2.09a1.2 1.2 0 0 0 -.309 -2.228l-13.582 -3.904l3.904 13.563z" }, null, -1)
])]);
}
const bi = /* @__PURE__ */ me(mi, [["render", vi]]), gi = {}, yi = {
viewBox: "0 0 18 17",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
function xi(e, t) {
return a(), f("svg", yi, [...t[0] || (t[0] = [
v("path", {
d: "M9 1.25V3.5M14.834 3.666L13.243 5.257M17.25 9.5H15M4.757 13.743L3.167 15.333M3 9.5H0.75M4.757 5.257L3.167 3.667",
stroke: "currentColor",
"stroke-width": "1",
"stroke-linecap": "round",
"stroke-linejoin": "round"
}, null, -1)
])]);
}
const wi = /* @__PURE__ */ me(gi, [["render", xi]]), ki = { class: "relative aspect-square w-full h-full max-w-[250px] mx-auto mb-8 border-t border-r border-outline-3 select-none" }, Ci = { class: "w-full h-full overflow-hidden" }, rp = /* @__PURE__ */ D({
__name: "Instructional",
props: {
actions: Array,
initialPosition: {
type: Object
},
slotsConfig: Array
},
setup(e) {
const t = e, s = j(!0), l = j({ ...t.initialPosition }), r = j(!1), n = j(500), i = j(!0), c = j(t.slotsConfig || []);
async function d(b) {
await pn(b.duration);
}
function p(b) {
const o = c.value.find((g) => g.name === b.slot);
o && (o.visible = !o.visible);
}
function m(b) {
switch (b.type) {
case "animation":
l.value = { top: b.top, left: b.left }, n.value = b.duration;
break;
case "click":
r.value = !0, setTimeout(() => r.value = !1, 500);
break;
case "delay":
return d(b);
case "slot":
p(b);
break;
}
}
return ce(() => {
(async () => {
for (; s.value; ) {
await d({ type: "delay", duration: 800 }), i.value = !0;
for (const o of t.actions || [])
await m(o);
i.value = !1, l.value = { ...t.initialPosition }, await d({ type: "delay", duration: 200 });
}
})();
}), ht(() => {
s.value = !1;
}), (b, o) => (a(), f("div", ki, [
v("div", {
class: "absolute z-50 text-foreground dark:text-foundation",
style: ae({
transitionProperty: "all",
top: l.value.top + "%",
left: l.value.left + "%",
transitionDuration: n.value + "ms"
})
}, [
z(wi, {
class: x(["absolute -top-5 -left-4 h-12 w-12 -rotate-12 text-foreground", [{ hidden: !r.value }]])
}, null, 8, ["class"]),
z(bi, { class: "absolute top-0 left-0 right-0 bottom-0 h-11 w-11" })
], 4),
v("div", Ci, [
H(b.$slots, "background"),
(a(!0), f(J, null, te(c.value, (g) => (a(), f(J, {
key: g.name
}, [
g.visible ? H(b.$slots, g.name, { key: 0 }) : I("", !0)
], 64))), 128))
])
]));
}
}), $i = {}, Ii = {
width: "24",
height: "26",
viewBox: "0 0 24 26",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
function Bi(e, t) {
return a(), f("svg", Ii, [...t[0] || (t[0] = [
v("path", {
d: "M22.5 11.268C23.8333 12.0378 23.8333 13.9622 22.5 14.732L3.75 25.5574C2.41667 26.3272 0.750004 25.3649 0.750005 23.8253L0.750005 2.17468C0.750006 0.635079 2.41667 -0.327169 3.75001 0.442631L22.5 11.268Z",
fill: "currentColor"
}, null, -1)
])]);
}
const Si = /* @__PURE__ */ me($i, [["render", Bi]]), Pi = { class: "relative aspect-video w-full" }, Ti = ["title", "src"], Oi = { class: "absolute top-0 left-0 w-full h-full bg-foundation pointer-events-none" }, Mi = ["src", "alt"], ji = ["src", "alt"], Ai = { class: "relative z-10 bg-primary group-hover:bg-primary-focus h-28 w-28 rounded-full border-[4px] border-white flex items-center justify-center shadow-md" }, ip = /* @__PURE__ */ D({
__name: "VimeoEmbed",
props: {
vimeoId: {},
title: {},
autoplay: { type: Boolean },
muted: { type: Boolean },
controls: { type: Boolean },
darkPlaceholder: {},
lightPlaceholder: {},
placeholderAlt: {}
},
emits: ["onPlay"],
setup(e, { expose: t, emit: s }) {
const l = s, n = j(e.autoplay || !1), i = () => {
n.value = !0, l("onPlay");
};
return t({
play: i
}), (c, d) => (a(), f("div", Pi, [
v("iframe", {
title: c.title,
src: `https://player.vimeo.com/video/${c.vimeoId}?badge=0&autopause=0&player_id=0&app_id=58479&autoplay=${n.value ? "1" : "0"}&muted=${c.muted ? "1" : "0"}&controls=${c.controls ? "1" : "0"}`,
frameborder: "0",
allow: "autoplay; fullscreen; accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
allowfullscreen: "",
class: "w-full h-full"
}, null, 8, Ti),
!n.value && (c.darkPlaceholder || c.lightPlaceholder) ? (a(), f("button", {
key: 0,
class: "group absolute top-0 left-0 w-full h-full flex items-center justify-center",
onClick: i
}, [
v("div", Oi, [
c.darkPlaceholder ? (a(), f("img", {
key: 0,
src: c.darkPlaceholder,
class: "hidden dark:block w-full h-full object-cover",
alt: c.placeholderAlt || "Play video"
}, null, 8, Mi)) : I("", !0),
c.lightPlaceholder ? (a(), f("img", {
key: 1,
src: c.lightPlaceholder,
class: "dark:hidden w-full h-full object-cover",
alt: c.placeholderAlt || "Play video"
}, null, 8, ji)) : I("", !0)
]),
v("div", Ai, [
z(Si, { class: "h-10 w-10 ml-2 text-white" })
])
])) : I("", !0)
]));
}
}), Li = ["disabled"], up = /* @__PURE__ */ D({
__name: "CardButton",
props: {
disabled: { type: Boolean },
modelValue: { type: Boolean }
},
emits: ["update:modelValue", "click"],
setup(e, { emit: t }) {
const s = t, l = e, r = h(() => {
const i = [
"h-20 bg-foundation-2 inline-flex justify-center items-center outline-none",
"normal px-16 py-5 shadow rounded transition active:scale-95"
];
return l.disabled ? i.push("bg-foundation-disabled text-foreground-2 cursor-not-allowed") : (i.push(
l.modelValue ? "bg-primary-focus text-foreground-on-primary" : "bg-foundation text-foreground"
), i.push("ring-outline-2 hover:ring-4")), i.join(" ");
}), n = (i) => {
if (l.disabled) {
i.preventDefault(), i.stopPropagation(), i.stopImmediatePropagation();
return;
}
s("update:modelValue", !l.modelValue), s("click", i);
};
return (i, c) => (a(), f("button", {
class: x(r.value),
disabled: i.disabled,
onClick: n
}, [
H(i.$slots, "default", {}, () => [
c[0] || (c[0] = F("Text", -1))
])
], 10, Li));
}
}), Vi = { class: "relative flex h-full w-full" }, zi = ["id", "checked", "aria-describedby", "name", "disabled", "value"], Ei = {
key: 0,
class: "absolute w-full h-full top-0 left-0 flex items-center justify-center pointer-events-none"
}, Ri = ["for"], Fi = {
key: 0,
class: "text-danger ml-1"
}, Di = ["id"], _i = /* @__PURE__ */ D({
inheritAttrs: !1,
__name: "Checkbox",
props: {
/**
* Input name/id. In a checkbox group, all checkboxes must have the same name and different values.
*/
name: {
type: String,
required: !0
},
/**
* Whether the input is disabled
*/
disabled: {
type: Boolean,
default: !1
},
/**
* Set label text
*/
label: {
type: String,
default: void 0
},
/**
* Set label classes
*/
labelClasses: {
type: String,
default: void 0
},
/**
* Help text
*/
description: {
type: String,
default: void 0
},
/**
* Whether to inline the help description
*/
inlineDescription: {
type: Boolean,
default: !1
},
/**
* vee-validate validation rules
*/
rules: {
type: [String, Object, Function, Array],
default: void 0
},
/**
* vee-validate validation() on component mount
*/
validateOnMount: {
type: Boolean,
default: !1
},
/**
* Whether to show the red "required" asterisk
*/
showRequired: {
type: Boolean,
default: !1
},
/**
* Checkbox group's value
*/
modelValue: {
type: [String, Boolean],
default: void 0
},
/**
* Checkbox's own value. If it is checked, modelValue will include this value (amongst any other checked values from the same group).
* If not set will default to 'name' value.
*/
value: {
type: [String, Boolean],
default: !0
},
/**
* HTML ID to use, must be globally unique. If not specified, a random ID will be generated. One is necessary to properly associate the label and checkbox.
*/
id: {
type: String,
default: void 0
},
hideLabel: {
type: Boolean,
default: !1
},
labelPosition: {
type: String,
default: "top"
},
indeterminate: {
type: Boolean,
default: !1
}
},
emits: ["update:modelValue"],
setup(e) {
const t = e, s = (w) => `${w}-${dt()}`, l = h(() => t.value || t.name), {
checked: r,
errorMessage: n,
handleChange: i,
value: c
} = De(t.name, t.rules, {
validateOnMount: t.validateOnMount,
type: "checkbox",
checkedValue: l,
initialValue: t.modelValue || void 0
}), d = h(() => t.label || t.name), p = h(() => t.description || n.value), m = h(() => `${t.name}-description`), b = h(() => {
const w = ["text-body-2xs"];
return t.inlineDescription ? w.push("inline ml-2") : w.push("block"), n.value ? w.push("text-danger") : w.push("text-foreground-2"), w.join(" ");
}), o = j(s("checkbox")), g = h(() => t.id || o.value), y = h(() => {
const w = [
"h-3.5 w-3.5 rounded",
"border bg-foundation text-primary",
"hover:border-foreground-2 focus:ring-1 focus:ring-outline-4 focus:ring-offset-1",
"disabled:cursor-not-allowed disabled:opacity-60"
];
return n.value ? w.push("border-danger-lighter") : w.push("border-outline-5"), w.join(" ");
}), S = (w) => {
t.disabled || i(w);
};
return ce(() => {
const w = t.modelValue, C = c.value, L = Array.isArray(w) ? w.includes(t.value) : w === t.value, N = Array.isArray(C) ? C.includes(t.value) : C === t.value;
L !== N && i(w);
}), (w, C) => (a(), f("div", {
class: x(["relative flex items-center", [
e.labelPosition === "left" && "flex-row-reverse items-center",
e.labelPosition === "top" && "items-start",
e.labelPosition === "right" && "items-center"
]])
}, [
v("div", {
class: x(["flex items-center h-3.5 w-3.5", e.labelPosition === "left" ? "w-1/2 justify-end mr-2" : ""])
}, [
v("div", Vi, [
v("input", Te({
id: g.value,
checked: u(r),
"aria-describedby": m.value,
name: e.name,
disabled: e.disabled,
value: l.value,
type: "checkbox",
class: y.value
}, w.$attrs, { onChange: S }), null, 16, zi),
e.indeterminate ? (a(), f("div", Ei, [
z(u(cn), { class: "w-3 h-3 text-foreground" })
])) : I("", !0)
])
], 2),
v("div", {
class: x(["text-sm", e.labelPosition === "left" ? "w-1/2" : "ml-2"])
}, [
v("label", {
for: g.value,
class: x({ "sr-only": e.hideLabel })
}, [
v("span", {
class: x(["text-body-xs text-foreground font-medium", e.labelClasses])
}, P(d.value), 3),
e.showRequired ? (a(), f("span", Fi, "*")) : I("", !0),
p.value ? (a(), f("p", {
key: 1,
id: m.value,
class: x(b.value)
}, P(p.value), 11, Di)) : I("", !0)
], 10, Ri)
], 2)
], 2));
}
}), Hi = ["id", "checked", "aria-describedby", "name", "disabled", "value"], Ui = ["for"], Wi = { key: 0 }, Ni = { class: "flex flex-col" }, qi = ["id"], Ki = {
key: 1,
class: "text-danger ml-1"
}, Gi = ["id"], dp = /* @__PURE__ */ D({
inheritAttrs: !1,
__name: "Radio",
props: {
/**
* Input name/id. In a radio group, all radios must have the same name and different values.
*/
name: {
type: String,
required: !0
},
/**
* Whether the input is disabled
*/
disabled: {
type: Boolean,
default: !1
},
/**
* Set label text
*/
label: {
type: String,
default: void 0
},
/**
* Set label text classes
*/
labelClasses: {
type: String,
default: void 0
},
/**
* Help text
*/
description: {
type: String,
default: void 0
},
/**
* Whether to inline the help description
*/
inlineDescription: {
type: Boolean,
default: !1
},
/**
* Optional Icon
*/
icon: {
type: Object,
default: void 0
},
/**
* vee-validate validation rules
*/
rules: {
type: [String, Object, Function, Array],
default: void 0
},
/**
* vee-validate validation() on component mount
*/
validateOnMount: {
type: Boolean,
default: !1
},
/**
* Whether to show the red "required" asterisk
*/
showRequired: {
type: Boolean,
default: !1
},
/**
* Radio group's value
*/
modelValue: {
type: [String, Boolean],
default: void 0
},
/**
* Radio's own value. If it is checked, modelValue will include this value (amongst any other checked values from the same group).
* If not set will default to 'name' value.
*/
value: {
type: [String, Boolean],
default: !0
},
/**
* HTML ID to use, must be globally unique. If not specified, a random ID will be generated. One is necessary to properly associate the label and radio.
*/
id: {
type: String,
default: void 0
},
hideLabel: {
type: Boolean,
default: !1
},
size: {
type: String,
default: "base"
}
},
emits: ["update:modelValue"],
setup(e) {
const t = e, s = (w) => `${w}-${dt()}`, l = h(() => t.value || t.name), {
checked: r,
errorMessage: n,
handleChange: i,
value: c
} = De(t.name, t.rules, {
validateOnMount: t.validateOnMount,
type: "radio",
checkedValue: l,
initialValue: t.modelValue || void 0
}), d = h(() => t.label || t.name), p = h(() => n.value ? "border-danger-lighter" : "border-foreground-4 "), m = h(() => t.description || n.value), b = h(() => `${t.name}-description`), o = h(() => {
const w = ["text-body-3xs"];
return n.value ? w.push("text-danger") : w.push("text-foreground-2"), w.join(" ");
}), g = j(s("radio")), y = h(() => t.id || g.value), S = (w) => {
t.disabled || i(w);
};
return ce(() => {
const w = t.modelValue, C = c.value, L = Array.isArray(w) ? w.includes(t.value) : w === t.value, N = Array.isArray(C) ? C.includes(t.value) : C === t.value;
L !== N && i(w);
}), (w, C) => (a(), f("div", {
class: x(["relative flex space-x-2 mb-2 last:mb-0", e.description && e.inlineDescription ? "items-start" : "items-center"])
}, [
v("div", {
class: x(["flex items-center", e.size === "sm" ? "h-4" : "h-6"])
}, [
v("input", Te({
id: y.value,
checked: u(r),
"aria-describedby": b.value,
name: e.name,
disabled: e.disabled,
value: l.value,
type: "radio",
class: ["h-4 w-4 rounded-full text-primary focus:ring-primary bg-foundation disabled:cursor-not-allowed disabled:bg-disabled disabled:text-disabled-2", p.value]
}, w.$attrs, { onChange: S }), null, 16, Hi)
], 2),
v("div", {
class: x([
e.inlineDescription ? "flex space-x-2 items-center" : "",
e.size === "sm" ? "text-body-2xs" : "text-body-xs"
])
}, [
v("label", {
for: y.value,
class: x(["text-foreground flex space-x-2 items-center cursor-pointer", { "sr-only": e.hideLabel, "!cursor-not-allowed opacity-70": e.disabled }])
}, [
e.icon ? (a(), f("div", Wi, [
(a(), A(oe(e.icon), {
class: x([
e.size === "sm" ? "h-6 sm:h-8 w-6 sm:w-8" : "h-8 w-8 sm:h-10 sm:w-10"
])
}, null, 8, ["class"]))
])) : I("", !0),
v("div", Ni, [
v("span", {
class: x(e.labelClasses ? e.labelClasses : "")
}, P(d.value), 3),
m.value && !e.inlineDescription ? (a(), f("p", {
key: 0,
id: b.value,
class: x(o.value)
}, P(m.value), 11, qi)) : I("", !0)
]),
e.showRequired ? (a(), f("span", Ki, "*")) : I("", !0)
], 10, Ui),
m.value && e.inlineDescription ? (a(), f("p", {
key: 0,
id: b.value,
class: x(o.value)
}, P(m.value), 11, Gi)) : I("", !0)
], 2)
], 2));
}
}), Xi = { class: "w-full" }, Zi = ["disabled", "onClick"], Ji = { class: "flex flex-1 items-center text-left gap-x-2" }, Qi = { class: "flex flex-col" }, Yi = {
key: 0,
class: "text-foreground-3 text-body-xs"
}, eu = { class: "h-5 w-5 rounded-full flex items-center justify-center border-[1.5px] border-outline-5" }, tu = {
key: 0,
class: "h-2.5 w-2.5 rounded-full bg-primary flex"
}, su = {
key: 0,
class: "text-body-2xs text-foreground-2 select-none text-left pr-8"
}, nu = {
key: 0,
class: "sm:hidden text-xs flex space-x-0.5 mt-2 text-foreground"
}, lu = {
key: 0,
class: "hidden sm:flex space-x-3 w-full"
}, ou = {
key: 0,
class: "text-xs flex space-x-0.5 mt-2 text-foreground select-none"
}, au = {
key: 1,
class: "text-danger text-body-2xs mt-2"
}, cp = /* @__PURE__ */ D({
__name: "RadioGroup",
props: {
name: { default: "formRadioGroup" },
modelValue: {},
options: {},
disabled: { type: Boolean },
isStacked: { type: Boolean },
size: { default: "base" },
rules: {}
},
emits: ["update:modelValue"],
setup(e) {
const t = e, { value: s, errorMessage: l } = De(t.name, t.rules, {
initialValue: t.modelValue
}), r = h({
get: () => s.value,
set: (i) => s.value = i
}), n = (i) => {
r.value = i;
};
return (i, c) => (a(), f("div", Xi, [
v("div", {
class: x([
"flex items-stretch w-full",
i.isStacked ? "flex-col space-y-3 " : "flex-col sm:flex-row space-y-3 sm:space-y-0 sm:space-x-3"
])
}, [
(a(!0), f(J, null, te(i.options, (d) => (a(), f("div", {
key: d.value,
class: "w-full flex flex-col"
}, [
v("button", {
class: x(["bg-foundation relative w-full h-full select-none rounded-md border shadow", [
r.value === d.value ? "border-outline-4" : "border-outline-2",
i.disabled || d.disabled ? "opacity-60 cursor-not-allowed" : "hover:border-outline-1"
]]),
disabled: i.disabled || d.disabled,
type: "button",
onClick: (p) => n(d.value)
}, [
v("div", {
class: x(["flex flex-col space-y-2 h-full", t.size === "sm" ? "p-3" : "p-4 "])
}, [
v("div", {
class: x(["flex justify-between gap-x-3", d.icon ? "items-start" : "items-center"])
}, [
v("div", Ji, [
d.icon ? (a(), A(oe(d.icon), {
key: 0,
class: "text-foreground h-5 w-5"
})) : I("", !0),
v("div", Qi, [
v("h4", {
class: x(["text-foreground", t.size === "sm" ? "text-heading-sm" : "text-heading"])
}, P(d.title), 3),
d.subtitle ? (a(), f("h5", Yi, P(d.subtitle), 1)) : I("", !0)
])
]),
v("div", eu, [
r.value === d.value ? (a(), f("div", tu)) : I("", !0)
])
], 2),
d.introduction ? (a(), f("div", su, P(d.introduction), 1)) : I("", !0),
H(i.$slots, d.value)
], 2)
], 10, Zi),
d.help ? (a(), f("div", nu, [
z(u(ft), { class: "h-4 w-4" }),
F(" " + P(d.help), 1)
])) : I("", !0)
]))), 128))
], 2),
i.isStacked ? I("", !0) : (a(), f("div", lu, [
(a(!0), f(J, null, te(i.options, (d) => (a(), f("div", {
key: d.value,
class: "w-full"
}, [
d.help ? (a(), f("div", ou, [
z(u(ft), { class: "h-4 w-4" }),
F(" " + P(d.help), 1)
])) : I("", !0)
]))), 128))
])),
u(l) ? (a(), f("div", au, P(u(l)), 1)) : I("", !0)
]));
}
});
function Kt(e) {
const { props: t, inputEl: s, emit: l, options: r } = e, { value: n, errorMessage: i } = De(
t.name,
t.rules,
{
validateOnMount: u(t.validateOnMount),
validateOnValueUpdate: u(t.validateOnValueUpdate),
initialValue: u(t.modelValue) || void 0
}
), c = h(() => {
const k = [
"flex text-body-xs font-medium gap-1 items-center",
u(t.color) === "foundation" ? "text-foreground" : "text-foreground-2",
u(t.labelPosition) !== "left" ? "pb-1" : null
];
return u(t.showLabel) || k.push("sr-only"), k.join(" ");
}), d = h(() => [
"focus:outline-none disabled:cursor-not-allowed disabled:bg-foundation-disabled",
"disabled:text-disabled-muted placeholder:text-foreground-2",
"rounded-md"
].join(" ")), p = h(() => {
const k = u(t.color), M = ["block w-full text-foreground", d.value];
return k !== "fully-transparent" ? M.push("py-2 px-3") : M.push("p-0"), g.value ? M.push("!border-danger") : (M.push("border-0"), k !== "fully-transparent" ? M.push("transition-all focus:ring-2 focus:ring-outline-2") : M.push("focus:ring-0")), k === "foundation" ? M.push(
"bg-foundation !border border-outline-2 hover:border-outline-5 focus-visible:border-outline-4 !ring-0 focus-visible:!outline-0"
) : ur(["transparent", "fully-transparent"], k) ? M.push("bg-transparent") : M.push("bg-foundation-page"), M.join(" ");
}), m = j(dt()), b = h(() => u(t.label) || u(t.name)), o = h(() => {
if (u(t.customErrorMessage))
return u(t.customErrorMessage);
const k = i.value;
return !k || !u(t.useLabelInErrors) ? k : k.replace("Value", b.value);
}), g = h(() => !!o.value), y = h(
() => o.value && u(t.hideErrorMessage)
), S = h(() => o.value || u(t.help)), w = h(() => !!S.value), C = h(() => u(t.customHelpClass)), L = h(
() => w.value ? `${u(t.name)}-${m.value}` : void 0
), N = h(() => {
const k = ["text-body-2xs break-words"];
return k.push(g.value ? "text-danger" : "text-foreground-2"), C.value && k.push(C.value), k.join(" ");
}), Y = h(() => {
var k;
return u(t.showClear) ? (((k = n.value) == null ? void 0 : k.length) || 0) > 0 : !1;
}), R = () => {
var k;
(k = s.value) == null || k.focus();
}, $ = () => {
var k;
n.value = se(n.value) ? [] : "", (k = r == null ? void 0 : r.customClear) == null || k.call(r), l("change", { value: n.value }), l("clear");
};
return ce(() => {
u(t.autoFocus) && R();
}), {
coreInputClasses: d,
coreClasses: p,
title: b,
value: n,
helpTipId: L,
helpTipClasses: N,
helpTip: S,
hideHelpTip: y,
errorMessage: o,
clear: $,
focus: R,
labelClasses: c,
shouldShowClear: Y,
hasError: g
};
}
function ru(e) {
const {
debouncedBy: t = 1e3,
isBasicHtmlInput: s = !1,
submitOnEnter: l,
disableDebouncedInput: r,
onWrite: n
} = e || {}, i = e != null && e.debug ? vr(e.debug) ? console.debug : e.debug : Ht, c = (e == null ? void 0 : e.model) || j(""), d = j(c.value), p = (w) => {
if (Le(w))
return w;
if ("value" in w)
return w.value;
const C = w.target;
return (C == null ? void 0 : C.value) || "";
}, m = (w) => {
c.value = w, i("Value updated: " + w), n == null || n(w);
}, b = r ? void 0 : st((w) => {
m(w);
}, t), o = s ? "input" : "update:modelValue", g = {
[o]: (w) => {
const C = p(w);
d.value = C, b == null || b(C), i(`Input event [${o}] triggered: ${C}`);
},
clear: () => {
b == null || b.cancel(), d.value = "", m(""), i("Clear event");
},
change: (w) => {
const C = p(w);
b == null || b.cancel(), m(C), d.value = C, i("Change event: " + C);
},
keydown: (w) => {
if (!s || Pe(l) || !(w.key === "Enter"))
return;
w.target instanceof HTMLTextAreaElement ? l && (i("Triggering submit on enter"), w.preventDefault(), w.stopPropagation(), g.change(w)) : l || (i("Preventing submit on enter"), w.preventDefault(), w.stopPropagation());
}
}, y = h(() => ({
modelValue: d.value || ""
}));
return re(c, (w, C) => {
C === w && !C && !w || d.value !== c.value && (d.value = c.value);
}), {
on: g,
bind: y,
value: c,
/**
* Force sync internal state from the source of truth
*/
syncFromValue: () => {
b == null || b.cancel(), d.value = c.value;
}
};
}
const iu = ["for"], uu = {
key: 0,
class: "text-body-2xs font-normal"
}, du = ["id"], cu = ["id", "name", "placeholder", "disabled", "aria-invalid", "aria-describedby"], fu = ["id"], fp = /* @__PURE__ */ D({
__name: "TextArea",
props: {
name: {},
showLabel: { type: Boolean },
help: {},
placeholder: {},
label: {},
disabled: { type: Boolean },
rules: {},
validateOnMount: { type: Boolean },
validateOnValueUpdate: { type: Boolean },
useLabelInErrors: { type: Boolean, default: !0 },
autoFocus: { type: Boolean },
modelValue: { default: "" },
showClear: { type: Boolean },
fullWidth: { type: Boolean },
showRequired: { type: Boolean },
showOptional: { type: Boolean },
color: { default: "page" },
textareaClasses: {},
size: {},
labelPosition: { default: "top" },
wrapperClasses: { default: "" }
},
emits: ["update:modelValue", "change", "input", "clear"],
setup(e, { expose: t, emit: s }) {
const l = s, r = e, n = j(null), {
coreClasses: i,
title: c,
value: d,
helpTipClasses: p,
helpTip: m,
errorMessage: b,
labelClasses: o,
clear: g,
focus: y,
shouldShowClear: S
} = Kt({
props: Be(r),
emit: l,
inputEl: n
}), w = h(() => `${r.name}-help-top`), C = h(() => `${r.name}-help-left`), L = h(() => {
const R = ["pl-2"];
return S.value && b.value ? R.push("pr-12") : (S.value || b.value) && R.push("pr-8"), R.join(" ");
}), N = h(() => {
switch (r.size) {
case "sm":
return "text-body sm:text-body-2xs";
case "lg":
return "text-body sm:text-sm";
case "xl":
return "text-body sm:text-base";
case "base":
default:
return "text-body sm:text-body-xs";
}
}), Y = h(() => {
const R = ["flex", r.wrapperClasses];
return r.fullWidth && R.push("w-full"), r.labelPosition === "top" && R.push("flex-col"), r.labelPosition === "left" && R.push(
"w-full space-y-1 sm:space-y-0 sm:space-x-8 flex-col sm:flex-row items-start"
), R.join(" ");
});
return t({ focus: y }), (R, $) => (a(), f("div", {
class: x(Y.value)
}, [
v("div", {
class: x(
R.labelPosition === "left" ? "w-full md:w-6/12 flex flex-col justify-center" : "w-full"
)
}, [
v("label", {
for: R.name,
class: x(u(o))
}, [
v("span", null, P(u(c)), 1),
R.showRequired ? I("", !0) : (a(), f("div", uu, "(optional)"))
], 10, iu),
R.labelPosition === "left" && C.value ? (a(), f("span", {
key: 0,
id: C.value,
class: x(u(p))
}, P(u(m)), 11, du)) : I("", !0)
], 2),
v("div", {
class: x(["relative", R.labelPosition === "left" ? "w-full md:w-6/12" : "w-full"])
}, [
Q(v("textarea", Te({
id: R.name,
ref_key: "inputElement",
ref: n,
"onUpdate:modelValue": $[0] || ($[0] = (k) => vt(d) ? d.value = k : null),
name: R.name,
class: [
u(i),
L.value,
N.value,
R.textareaClasses || "",
"min-h-[6rem] sm:min-h-[3rem] simple-scrollbar"
],
placeholder: R.placeholder,
disabled: R.disabled,
"aria-invalid": u(b) ? "true" : "false",
"aria-describedby": R.labelPosition === "left" ? C.value : w.value
}, R.$attrs, {
onChange: $[1] || ($[1] = (k) => R.$emit("change", { event: k, value: u(d) })),
onInput: $[2] || ($[2] = (k) => R.$emit("input", { event: k, value: u(d) })),
onKeydown: $[3] || ($[3] = ge(() => {
}, ["stop"]))
}), null, 16, cu), [
[Ke, u(d)]
]),
u(S) ? (a(), f("a", {
key: 0,
title: "Clear input",
class: "absolute top-2 right-0 flex items-center pr-2 cursor-pointer",
onClick: $[4] || ($[4] = //@ts-ignore
(...k) => u(g) && u(g)(...k)),
onKeydown: $[5] || ($[5] = //@ts-ignore
(...k) => u(g) && u(g)(...k))
}, [
$[6] || ($[6] = v("span", { class: "text-xs sr-only" }, "Clear input", -1)),
z(u(Ge), {
class: "h-5 w-5 text-foreground",
"aria-hidden": "true"
})
], 32)) : I("", !0)
], 2),
R.labelPosition === "top" && w.value ? (a(), f("p", {
key: 0,
id: w.value,
class: x(["mt-1.5", u(p)])
}, P(u(m)), 11, fu)) : I("", !0)
], 2));
}
}), pu = ["for"], mu = {
key: 0,
class: "text-danger text-body-xs opacity-80"
}, hu = {
key: 1,
class: "text-body-2xs font-normal"
}, vu = ["id"], bu = {
key: 0,
class: "pointer-events-none absolute top-0 bottom-0 left-0 flex items-center pl-2"
}, gu = {
key: 1,
class: "absolute top-0 h-full right-0 flex items-center pr-2 text-foreground-3"
}, yu = ["id", "type", "name", "placeholder", "disabled", "aria-invalid", "aria-describedby", "readonly"], xu = ["title"], wu = { class: "text-body-xs sr-only" }, ku = ["id"], Gt = /* @__PURE__ */ D({
inheritAttrs: !1,
__name: "TextInput",
props: {
/**
* Input "type" value (changes behaviour & look)
*/
type: {
type: String,
default: "text"
},
/**
* Unique ID for the input (must be unique page-wide)
*/
name: {
type: String,
required: !0
},
/**
* Whether to show label (label will always be shown to screen readers)
*/
showLabel: {
type: Boolean,
required: !1
},
/**
* Optional help text
*/
help: {
type: String,
default: void 0
},
/**
* Placeholder text
*/
placeholder: {
type: String,
default: void 0
},
/**
* Set label text explicitly
*/
label: {
type: String,
default: void 0
},
/**
* Whether to show the red "required" asterisk
*/
showRequired: {
type: Boolean,
default: !1
},
/**
* Whether to show the "optional" text
*/
showOptional: {
type: Boolean,
default: !1
},
/**
* Whether to disable the component, blocking it from user input
*/
disabled: {
type: Boolean,
default: !1
},
/**
* Whether to disable editing the component, making it read only
*/
readOnly: {
type: Boolean,
default: !1
},
/**
* vee-validate validation rules
*/
rules: {
type: [String, Object, Function, Array],
default: void 0
},
/**
* vee-validate validation() on component mount
*/
validateOnMount: {
type: Boolean,
default: !1
},
/**
* Whether to trigger validation whenever the value changes
*/
validateOnValueUpdate: {
type: Boolean,
default: !1
},
/**
* Will replace the generic "Value" text with the name of the input in error messages
*/
useLabelInErrors: {
type: Boolean,
default: !0
},
/**
* Set a custom icon to use inside the input
*/
customIcon: {
type: [Object, Function],
default: void 0
},
iconClasses: {
type: String,
default: null
},
/**
* Whether to focus on the input when component is mounted
*/
autoFocus: {
type: Boolean,
default: !1
},
modelValue: {
type: String,
default: ""
},
size: {
type: String,
default: "base"
},
showClear: {
type: Boolean,
default: !1
},
inputClasses: {
type: String,
default: null
},
fullWidth: {
type: Boolean,
default: !1
},
loading: {
type: Boolean,
default: !1
},
hideErrorMessage: {
type: Boolean,
default: !1
},
customErrorMessage: {
type: String,
default: null
},
wrapperClasses: {
type: String,
default: () => ""
},
color: {
type: String,
default: "page"
},
labelPosition: {
type: String,
default: "top"
},
rightIcon: {
type: [Object, Function],
default: void 0
},
rightIconTitle: {
type: String,
default: void 0
},
tooltipText: {
type: String,
default: void 0
},
customHelpClass: {
type: String,
default: void 0
}
},
emits: ["update:modelValue", "change", "input", "clear", "focus", "blur", "rightIconClick"],
setup(e, { expose: t, emit: s }) {
const l = e, r = s, n = bt(), i = j(null), {
coreClasses: c,
title: d,
value: p,
helpTipId: m,
helpTipClasses: b,
helpTip: o,
hideHelpTip: g,
errorMessage: y,
clear: S,
focus: w,
labelClasses: C,
shouldShowClear: L
} = Kt({
props: Be(l),
emit: r,
inputEl: i
}), N = h(() => l.color !== "fully-transparent" ? {} : {
fontSize: "inherit"
}), Y = h(() => {
const B = ["h-4 w-4"];
return l.iconClasses && B.push(l.iconClasses), y.value ? B.push("text-danger") : B.push("text-foreground-2"), B.join(" ");
}), R = h(() => {
const B = [];
return l.customIcon && B.push("pl-8"), n["input-right"] || (l.rightIcon || y.value || L.value) && B.push("pr-8"), B.join(" ");
}), $ = h(() => {
const B = (V) => l.color === "fully-transparent" ? "" : V;
switch (l.size) {
case "sm":
return `h-6 ${B("text-body sm:text-body-sm")}`;
case "lg":
return `h-10 ${B("text-body sm:text-[13px]")}`;
case "xl":
return `h-14 ${B("text-body sm:text-sm")}`;
case "base":
default:
return `h-8 ${B("text-body sm:text-body-sm")}`;
}
}), k = h(() => {
const B = ["flex", l.wrapperClasses];
return l.fullWidth && B.push("w-full"), l.labelPosition === "top" && B.push("flex-col"), l.labelPosition === "left" && B.push("w-full space-y-1 sm:space-y-0 sm:space-x-8 flex-col sm:flex-row"), B.join(" ");
}), M = () => {
r("rightIconClick");
};
return t({ focus: w }), (B, V) => (a(), f("div", {
class: x(k.value)
}, [
v("div", {
class: x(
e.labelPosition === "left" ? "w-full md:w-6/12 flex flex-col justify-center" : "w-full"
)
}, [
v("label", {
for: e.name,
class: x(u(C))
}, [
v("span", null, P(u(d)), 1),
e.showRequired ? (a(), f("div", mu, "*")) : e.showOptional ? (a(), f("div", hu, "(optional)")) : I("", !0)
], 10, pu),
e.labelPosition === "left" && u(m) && !u(g) ? (a(), f("p", {
key: 0,
id: u(m),
class: x(u(b))
}, P(u(o)), 11, vu)) : I("", !0)
], 2),
v("div", {
class: x(["group relative", e.labelPosition === "left" ? "w-full md:w-6/12" : "w-full"])
}, [
e.customIcon ? (a(), f("div", bu, [
e.customIcon ? (a(), A(oe(e.customIcon), {
key: 0,
class: x(Y.value),
"aria-hidden": "true"
}, null, 8, ["class"])) : I("", !0)
])) : I("", !0),
e.loading ? (a(), f("div", gu, [
z(u(ct))
])) : I("", !0),
Q((a(), f("div", null, [
Q(v("input", Te({
id: e.name,
ref_key: "inputElement",
ref: i,
"onUpdate:modelValue": V[0] || (V[0] = (U) => vt(p) ? p.value = U : null),
type: e.type,
name: e.name,
class: [u(c), R.value, $.value, e.inputClasses || ""],
placeholder: e.placeholder,
disabled: e.disabled,
"aria-invalid": u(y) ? "true" : "false",
"aria-describedby": u(m),
readonly: e.readOnly,
role: "textbox"
}, B.$attrs, {
style: N.value,
onChange: V[1] || (V[1] = (U) => B.$emit("change", { event: U, value: u(p) })),
onInput: V[2] || (V[2] = (U) => B.$emit("input", { event: U, value: u(p) })),
onFocus: V[3] || (V[3] = (U) => B.$emit("focus")),
onBlur: V[4] || (V[4] = (U) => B.$emit("blur")),
onKeydown: V[5] || (V[5] = ge(() => {
}, ["stop"]))
}), null, 16, yu), [
[Ys, u(p)]
])
])), [
[u(Ae), e.tooltipText]
]),
H(B.$slots, "input-right", {}, () => [
e.rightIcon ? (a(), f("a", {
key: 0,
title: e.rightIconTitle,
class: x([[
$.value,
e.readOnly ? "w-full cursor-text border border-transparent group-hover:border-outline-5 rounded-md" : "cursor-pointer"
], "absolute top-0 right-0 hidden group-hover:flex items-center justify-end pr-1 text-foreground-2"]),
onClick: M,
onKeydown: M
}, [
v("span", wu, P(e.rightIconTitle), 1),
(a(), A(oe(e.rightIcon), {
class: "h-6 w-6 text-foreground",
"aria-hidden": "true"
}))
], 42, xu)) : u(L) ? (a(), f("a", {
key: 1,
title: "Clear input",
class: "absolute top-0 bottom-0 right-0 flex items-center pr-2 cursor-pointer",
onClick: V[6] || (V[6] = //@ts-ignore
(...U) => u(S) && u(S)(...U)),
onKeydown: V[7] || (V[7] = //@ts-ignore
(...U) => u(S) && u(S)(...U))
}, [
V[8] || (V[8] = v("span", { class: "text-body-xs sr-only" }, "Clear input", -1)),
z(u(Ge), {
class: "h-5 w-5 text-foreground",
"aria-hidden": "true"
})
], 32)) : !e.showLabel && e.showRequired && !u(y) ? (a(), f("div", {
key: 2,
class: x(["pointer-events-none absolute top-0 bottom-0 mt-2 text-body right-0 flex items-center text-danger pr-2.5", [u(L) ? "pr-8" : "pr-2"]])
}, " * ", 2)) : I("", !0)
])
], 2),
e.labelPosition === "top" && u(m) && !u(g) ? (a(), f("p", {
key: 0,
id: u(m),
class: x(["mt-1.5", u(b)])
}, P(u(o)), 11, ku)) : I("", !0)
], 2));
}
}), _s = /^https?:\/\//, kt = /^[^\s@]+@[^\s@]+\.[^\s@]+$/, Cu = (e) => (e || "").match(kt) ? !0 : "Value should be a valid e-mail address", $u = (e) => (e || "").match(kt) || !e ? !0 : "Value should be a valid e-mail address", Iu = (e) => (e || "").split(",").map((l) => l.trim()).every((l) => l.match(kt)) || "Value should be one or multiple comma-delimited e-mail addresses", Bu = (e) => (Le(e) && (e = e.trim()), e ? !0 : "Value is required"), Su = (e, t) => (s, l) => s === l.form[e] ? !0 : `Value must be the same as in field '${t || e}'`, Pu = (e) => (t) => {
const { minLength: s, maxLength: l } = e;
return t = mn(t) ? "" : t, Le(t) ? !Pe(s) && t.length < s ? `Value needs to be at least ${s} characters long` : !Pe(l) && t.length > l ? `Value can't be longer than ${l} characters` : !0 : "Value should be a text string";
}, Tu = (e) => (t) => {
const { match: s, message: l } = e;
return Le(t) ? s ? Le(s) ? t.includes(s) ? !0 : l : s.test(t) ? !0 : l : !0 : "Value should be a text string";
}, Ou = (e) => _s.test(e) ? !0 : "Value is not a valid URL", Mu = (e) => Array.isArray(e) && e.length > 0 ? !0 : "Value should have at least a single item selected", ju = (e) => Array.isArray(e) && e.length > 0 ? !0 : "Value should have at least a single item selected", pp = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
VALID_EMAIL: kt,
VALID_HTTP_URL: _s,
isEmail: Cu,
isEmailOrEmpty: $u,
isItemSelected: Mu,
isMultiItemSelected: ju,
isOneOrMultipleEmails: Iu,
isRequired: Bu,
isSameAs: Su,
isStringOfLength: Pu,
isUrl: Ou,
stringContains: Tu
}, Symbol.toStringTag, { value: "Module" }));
function Hs(e) {
const {
skipCalculation: t,
elementToWatchForChanges: s,
itemContainer: l,
trackResize: r = !1,
trackMutations: n = !0
} = e || {}, i = j(0), c = () => {
const d = l.value;
if (t != null && t.value || !d)
return;
const p = d.children;
let m = 0, b = 0, o;
for (const g of p) {
const y = g.offsetTop;
Pe(o) ? (o = y, m += 1) : y === o && (m += 1), b += 1;
}
i.value = b - m;
};
return r && Ft(s, c), n && Mn(s, c, {
childList: !0,
subtree: !0
}), {
hiddenItemCount: i
};
}
function Us(e) {
const { props: t, emit: s, dynamicVisibility: l } = e;
let r;
if (l) {
const { elementToWatchForChanges: p, itemContainer: m } = l;
r = Hs({
skipCalculation: h(() => {
var o;
return !((o = t.multiple) != null && o.value);
}),
elementToWatchForChanges: p,
itemContainer: m
}).hiddenItemCount;
} else
r = j(0);
const n = h({
get: () => {
var m, b;
const p = (m = t.modelValue) == null ? void 0 : m.value;
return (b = t.multiple) != null && b.value ? se(p) ? p : [] : se(p) ? void 0 : p;
},
set: (p) => {
var m, b, o;
if ((m = t.multiple) != null && m.value && !se(p)) {
console.warn("Attempting to set non-array value in selector w/ multiple=true");
return;
} else if (!((b = t.multiple) != null && b.value) && se(p)) {
console.warn("Attempting to set array value in selector w/ multiple=false");
return;
}
s("update:modelValue", (o = t.multiple) != null && o.value ? p || [] : p);
}
}), i = (p) => se(p);
return {
selectedValue: n,
hiddenSelectedItemCount: r,
isArrayValue: i,
isMultiItemArrayValue: (p) => se(p) && p.length > 1,
firstItem: (p) => i(p) ? p[0] : p
};
}
const Au = /* @__PURE__ */ D({
__name: "Bar",
props: {
loading: { type: Boolean },
clientOnly: { type: Boolean }
},
setup(e) {
const t = e, s = Dt(), l = h(() => (s.value || !t.clientOnly) && t.loading);
return (r, n) => (a(), f("div", {
class: x([
"relative w-full h-1 bg-blue-500/30 text-xs text-foreground-on-primary overflow-hidden rounded-xl",
l.value ? "opacity-100" : "opacity-0"
])
}, [...n[0] || (n[0] = [
v("div", { class: "swoosher relative top-0 bg-blue-500/50" }, null, -1)
])], 2));
}
});
const Ct = /* @__PURE__ */ me(Au, [["__scopeId", "data-v-bdcf2251"]]);
var Lu = /* @__PURE__ */ ((e) => (e[e.Throttle = 0] = "Throttle", e[e.Debounce = 1] = "Debounce", e))(Lu || {}), ut = /* @__PURE__ */ ((e) => (e[e.Left = 0] = "Left", e[e.Right = 1] = "Right", e))(ut || {});
function Vu(e, t) {
if (!Ve)
return;
const {
wait: s = 100,
throttleOrDebounce: l = 0
/* Throttle */
} = t || {}, r = s ? l === 0 ? mt(e, s) : st(e, s) : e;
ce(() => window.addEventListener("resize", r)), ht(() => window.removeEventListener("resize", r));
}
function mp(e) {
ce(() => {
window.addEventListener("beforeunload", e);
}), ht(() => {
window.removeEventListener("beforeunload", e);
});
}
function zu(e) {
const { el: t, defaultDirection: s } = e, l = j(
Pe(s) ? 1 : s
/* Right */
), r = h(() => {
const i = u(e.stopUpdatesBelowWidth);
if (!Pe(i))
return i;
const c = u(t);
return c != null && c.offsetWidth ? c.offsetWidth * 2 : void 0;
}), n = () => {
if (!Ve)
return;
const i = u(t);
if (!i)
return;
const c = i.getBoundingClientRect(), d = c.x + c.width > window.innerWidth, p = c.x < 0;
d && p || !Pe(r.value) && window.innerWidth < r.value || (d ? l.value = 0 : p && (l.value = 1));
};
return Vu(() => n()), re(
() => u(t),
(i) => {
i && n();
}
), {
direction: h(() => l.value),
recalculateDirection: n
};
}
const Ws = (e) => ({ menuStyle: h(() => {
const s = {};
if (!Ve)
return s;
const l = u(e.menuOpenDirection) === ut.Left, r = e.buttonBoundingBox.top.value, n = e.buttonBoundingBox.left.value, i = e.buttonBoundingBox.width.value, c = e.buttonBoundingBox.height.value, d = 4;
let p = i, m = n, b = r + c + d;
const o = u(e.menuWidth), g = u(e == null ? void 0 : e.menuHeight), y = window.innerWidth, S = window.innerHeight, w = y - d * 2, C = S - d * 2;
return Pe(o) || (o > w ? (p = w, m = d) : (p = o, l ? (m = n + i - o, m < d && (m = d)) : n + o > w && (m = Math.max(n + i - o, d)))), Pe(g) || (g > C ? b = d : r + c + g > C && (b = r - g - d)), s.left = `${m}px`, s.width = `${p}px`, s.top = `${b}px`, s;
}) }), Eu = {
key: 0,
class: "text-danger text-xs opacity-80"
}, Ru = {
key: 1,
class: "text-body-2xs font-normal"
}, Fu = ["id"], Du = { class: "pointer-events-none shrink-0 ml-1 flex items-center space-x-2" }, _u = {
key: 1,
class: "text-4xl text-danger opacity-50 h-4 w-4 leading-6"
}, Hu = ["disabled"], Uu = {
key: 0,
class: "flex flex-col mx-1 mb-1"
}, Wu = { class: "relative" }, Nu = { class: "pointer-events-none absolute top-0 bottom-0 left-0 flex items-center pl-2" }, qu = ["placeholder"], Ku = {
key: 0,
class: "px-1"
}, Gu = { key: 1 }, Xu = { class: "text-foreground-2 text-center" }, Zu = {
key: 0,
class: /* @__PURE__ */ x([
"absolute top-0 bottom-0 right-0 text-foreground flex items-center pr-4"
])
}, Ju = ["id"], Ns = /* @__PURE__ */ D({
__name: "Base",
props: {
size: {
type: String,
default: void 0
},
multiple: {
type: Boolean,
default: !1
},
items: {
type: Array,
default: () => []
},
modelValue: {
type: [Object, Array, String],
default: void 0
},
/**
* Whether to enable the search bar. You must also set one of the following:
* * filterPredicate - to allow filtering passed in `items` based on search bar
* * getSearchResults - to allow asynchronously loading items from server (props.items no longer required in this case,
* but can be used to prefill initial values)
*/
search: {
type: Boolean,
default: !1
},
/**
* If search=true and this is set, you can use this to filter passed in items based on whatever
* the user enters in the search bar
*/
filterPredicate: {
type: Function,
default: void 0
},
/**
* Set this to disable certain items in the list
*/
disabledItemPredicate: {
type: Function,
default: void 0
},
/**
* If search=true and this is set, you can use this to load data asynchronously depending
* on the search query
*/
getSearchResults: {
type: Function,
default: void 0
},
searchPlaceholder: {
type: String,
default: "Search"
},
/**
* Label is required at the very least for screen-readers
*/
label: {
type: String,
required: !0
},
/**
* Optional text that replaces the label as the placeholder when set.
*/
placeholder: {
type: String
},
/**
* Whether to show the label visually
*/
showLabel: {
type: Boolean,
default: !1
},
name: {
type: String,
required: !0
},
/**
* Objects will be compared by the values in the specified prop
*/
by: {
type: String,
required: !1
},
disabled: {
type: Boolean,
default: !1
},
buttonStyle: {
type: String,
default: "base"
},
hideCheckmarks: {
type: Boolean,
default: !1
},
allowUnset: {
type: Boolean,
default: !0
},
clearable: {
type: Boolean,
default: !1
},
/**
* Validation stuff
*/
rules: {
type: [String, Object, Function, Array],
default: void 0
},
/**
* vee-validate validation() on component mount
*/
validateOnMount: {
type: Boolean,
default: !1
},
/**
* Whether to trigger validation whenever the value changes
*/
validateOnValueUpdate: {
type: Boolean,
default: !1
},
/**
* Will replace the generic "Value" text with the name of the input in error messages
*/
useLabelInErrors: {
type: Boolean,
default: !0
},
/**
* Optional help text
*/
help: {
type: String,
default: void 0
},
/**
* @deprecated Use size attribute instead
*/
fixedHeight: {
type: Boolean,
default: !1
},
/**
* By default component holds its own internal value state so that even if you don't have it tied up to a real `modelValue` ref somewhere
* it knows its internal state and can report it on form submits.
*
* If you set this to true, its only going to rely on `modelValue` as its primary source of truth so that you can reject updates etc.
*/
fullyControlValue: {
type: Boolean,
default: !1
},
/**
* Whether to show the red "required" asterisk
*/
showRequired: {
type: Boolean,
default: !1
},
/**
* Whether to show the optional text
*/
showOptional: {
type: Boolean,
default: !1
},
/**
* Whether to mount the menu on the body instead of inside the component. Useful when select box is mounted within
* dialog windows and the menu causes unnecessary overflow.
*/
mountMenuOnBody: {
type: Boolean,
default: !1
},
labelId: {
type: String,
default: void 0
},
buttonId: {
type: String,
default: void 0
},
/**
* Tooltip shown on disabled items
*/
disabledItemTooltip: {
required: !1,
type: String
},
labelPosition: {
type: String,
default: "top"
},
tooltipText: {
type: String,
default: void 0
},
/**
* Optionally make the menu width wider/narrower than the button width by specifying the max width in pixels.
* Only supported when `mountMenuOnBody` is true.
*/
menuMaxWidth: {
type: Number,
default: void 0
},
/**
* If menuMaxWidth is set and menu is wider than the button, this will determine the direction of the menu opening.
* Default: 'left' (opens to the left of the button)
*/
menuOpenDirection: {
type: String,
default: "left"
},
/**
* Custom max height classes for the dropdown menu. If not provided, defaults to 'max-h-[50vh] xl:max-h-80'
*/
menuMaxHeightClasses: {
type: String,
default: void 0
}
},
emits: ["update:modelValue"],
setup(e, { expose: t, emit: s }) {
const l = (T) => ye(T), r = s, n = e, { value: i, errorMessage: c } = De(n.name, n.rules, {
validateOnMount: n.validateOnMount,
validateOnValueUpdate: n.validateOnValueUpdate,
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
initialValue: n.modelValue
}), d = Dt(), p = j(null), m = j(null), b = j(null), o = j(""), g = j([]), y = j(!1), S = j(1), w = j(dt()), C = j(!1), L = _t(
h(() => {
var T;
return (T = b.value) == null ? void 0 : T.el;
}),
{ windowResize: !0, windowScroll: !0, immediate: !0 }
);
Cs(
h(() => {
var T;
return (T = m.value) == null ? void 0 : T.el;
}),
([{ isIntersecting: T }]) => {
T && n.mountMenuOnBody && L.update();
}
);
const { menuStyle: N } = Ws({
menuOpenDirection: h(
() => n.menuOpenDirection === "left" ? ut.Left : ut.Right
),
menuWidth: h(() => n.menuMaxWidth),
buttonBoundingBox: L
}), Y = h(() => u(n.label) || u(n.name)), R = h(() => {
const T = c.value;
return !T || !u(n.useLabelInErrors) ? T : T.replace("Value", Y.value);
}), $ = h(() => R.value || u(n.help)), k = h(() => !!$.value), M = h(
() => k.value ? `${u(n.name)}-${w.value}` : void 0
), B = h(
() => c.value ? "text-danger" : "text-foreground-2"
), V = h(() => n.labelPosition === "left"), U = h(
() => n.buttonStyle !== "simple" && n.clearable && !n.disabled
), xe = h(() => {
if (!n.size)
return "";
switch (n.size) {
case "sm":
return "h-6 text-body-sm";
case "lg":
return "h-10 text-[13px]";
case "xl":
return "h-14 text-sm";
case "base":
default:
return "h-8 text-body-sm";
}
}), he = h(() => {
var X;
const T = ["relative flex group"];
return c.value ? (T.push("hover:shadow rounded-md"), T.push("text-danger-darker focus:border-danger"), n.buttonStyle !== "simple" && T.push("border border-danger")) : n.buttonStyle !== "simple" && (T.push("rounded-md border"), C.value ? T.push("border-outline-4") : T.push("border-outline-2 hover:border-outline-5 focus:outline-0")), n.fixedHeight ? T.push("h-8") : (X = xe.value) != null && X.length && T.push(xe.value), V.value && T.push("md:basis-1/2"), T.join(" ");
}), $e = h(() => {
const T = [];
return n.buttonStyle !== "simple" && T.push(
ne.value ? "bg-foundation-disabled text-foreground-disabled" : ""
), ne.value && T.push("cursor-not-allowed"), T.join(" ");
}), Oe = h(() => {
const T = [
"relative z-[1]",
"flex items-center justify-center text-center shrink-0",
"rounded-r-md overflow-hidden transition-all",
"text-foreground",
_.value ? `w-6 ${$e.value}` : "w-0"
];
return ne.value || (T.push(
"hover:bg-primary hover:text-foreground-on-primary dark:text-foreground-on-primary"
), n.buttonStyle === "tinted" ? T.push("bg-outline-3") : T.push("bg-primary-muted")), T.join(" ");
}), Ee = h(() => {
const T = [
"relative z-[2]",
"normal rounded-md cursor-pointer transition truncate flex-1",
"flex items-center focus:outline-outline-4 focus:outline-1",
$e.value
];
return n.buttonStyle !== "simple" && (T.push("p-2"), ne.value || (n.buttonStyle, T.push("bg-foundation text-foreground"))), U.value && _.value && T.push("rounded-r-none"), T.join(" ");
}), ie = h(
() => !!(n.search && (n.filterPredicate || n.getSearchResults))
), ue = h(() => ie.value && n.getSearchResults), ne = h(
() => n.disabled || !n.items.length && !ue.value
), le = h({
get: () => {
const T = i.value;
return n.multiple ? se(T) ? T : [] : se(T) ? void 0 : T;
},
set: (T) => {
if (n.multiple && !se(T)) {
console.warn("Attempting to set non-array value in selector w/ multiple=true");
return;
} else if (!n.multiple && se(T)) {
console.warn("Attempting to set array value in selector w/ multiple=false");
return;
}
let X;
if (n.multiple)
X = T || [];
else {
const Z = i.value;
X = n.allowUnset && Z && T && we(Z) === we(T) ? void 0 : T;
}
n.fullyControlValue ? r("update:modelValue", X) : i.value = X, S.value += 1;
}
}), _ = h(() => n.multiple && se(le.value) ? le.value.length !== 0 : !!le.value), W = () => {
n.multiple ? le.value = [] : le.value = void 0;
}, q = h(() => {
const T = o.value;
return !ie.value || !(T != null && T.length) ? g.value : n.filterPredicate ? g.value.filter(
(X) => {
var Z;
return ((Z = n.filterPredicate) == null ? void 0 : Z.call(n, X, T)) || !1;
}
) : g.value;
}), fe = h(() => {
const T = [
"rounded-md bg-foundation py-1 label label--light border border-outline-3 shadow-md"
];
return n.mountMenuOnBody ? T.push("fixed z-50") : T.push("absolute top-[100%] w-full z-40 mt-1"), T.join(" ");
}), ve = h(() => {
let T = {};
return !Ve || !n.mountMenuOnBody || (T = {
...T,
...N.value
}), T;
}), de = (T) => JSON.stringify(T), we = (T) => l(T) ? T[n.by || "id"] : T, Re = async () => {
if (!(!ue.value || !n.getSearchResults)) {
y.value = !0;
try {
g.value = await n.getSearchResults(o.value);
} finally {
y.value = !1;
}
}
}, $t = st(Re, 1e3), It = (T) => {
const { disabled: X } = T || {}, Z = ["relative transition select-none py-1 px-2"];
return X ? Z.push("opacity-50 cursor-not-allowed") : Z.push("text-foreground cursor-pointer"), Z.join(" ");
};
return re(
() => n.items,
(T) => {
g.value = T.slice();
},
{ immediate: !0 }
), re(o, () => {
ue.value && $t();
}), re(C, (T, X) => {
T && !X && L.update();
}), ce(() => {
ue.value && !n.items.length && Re();
}), t({ triggerSearch: Re }), (T, X) => (a(), f("div", null, [
(a(), A(u(Fn), {
key: S.value,
modelValue: le.value,
"onUpdate:modelValue": X[4] || (X[4] = (Z) => le.value = Z),
name: e.name,
multiple: e.multiple,
by: e.by,
disabled: ne.value,
as: "div",
class: x({
"md:flex md:items-center md:space-x-2 md:justify-between": V.value
})
}, {
default: E(() => [
v("div", {
class: x(["flex flex-col", { "pb-1": e.showLabel && !V.value }])
}, [
z(u(Dn), {
id: e.labelId,
class: x(["flex text-body-xs text-foreground font-medium", [{ "sr-only": !e.showLabel }, { "items-center gap-1": e.showOptional }]]),
for: e.buttonId
}, {
default: E(() => [
F(P(e.label) + " ", 1),
e.showRequired ? (a(), f("div", Eu, "*")) : e.showOptional ? (a(), f("div", Ru, " (optional) ")) : I("", !0)
]),
_: 1
}, 8, ["id", "class", "for"]),
M.value && V.value ? (a(), f("p", {
key: 0,
id: M.value,
class: x(["text-xs", B.value])
}, P($.value), 11, Fu)) : I("", !0)
], 2),
Q((a(), f("div", null, [
v("div", {
class: x(he.value)
}, [
z(u(_n), {
id: e.buttonId,
ref_key: "listboxButton",
ref: b,
class: x(Ee.value)
}, {
default: E(({ open: Z }) => [
v("div", {
class: x(["flex items-center w-full", e.buttonStyle === "simple" ? "justify-start" : "justify-between"])
}, [
v("div", {
class: x(["block truncate text-left text-xs sm:text-[13px]", [
_.value ? "text-foreground" : "text-foreground-2",
e.buttonStyle === "simple" ? "" : "grow"
]])
}, [
!le.value || u(se)(le.value) && !le.value.length ? H(T.$slots, "nothing-selected", { key: 0 }, () => [
F(P(e.placeholder ? e.placeholder : e.label), 1)
]) : H(T.$slots, "something-selected", {
key: 1,
value: le.value
}, () => [
F(P(de(le.value)), 1)
])
], 2),
v("div", Du, [
R.value ? (a(), A(u(Rt), {
key: 0,
class: "h-4 w-4 text-danger",
"aria-hidden": "true"
})) : !e.showLabel && e.showRequired ? (a(), f("div", _u, " * ")) : I("", !0),
Z ? (a(), A(u(xs), {
key: 2,
class: "h-4 w-4 text-foreground",
"aria-hidden": "true"
})) : (a(), A(u(ws), {
key: 3,
class: "h-4 w-4 text-foreground",
"aria-hidden": "true"
}))
])
], 2),
(C.value = Z) ? (a(), f(J, { key: 0 }, [], 64)) : I("", !0)
]),
_: 3
}, 8, ["id", "class"]),
U.value ? (a(), f("button", {
key: 0,
class: x(Oe.value),
disabled: e.disabled,
onClick: X[0] || (X[0] = (Z) => W())
}, [
z(u(Ge), { class: "w-3 h-3" })
], 10, Hu)) : I("", !0),
u(d) ? (a(), A(Vt, {
key: 1,
"leave-active-class": "transition ease-in duration-100",
"leave-from-class": "opacity-100",
"leave-to-class": "opacity-0"
}, {
default: E(() => [
(a(), A(zt, {
to: "body",
disabled: !e.mountMenuOnBody
}, [
z(u(Hn), {
ref_key: "menuEl",
ref: m,
class: x(fe.value),
style: ae(ve.value),
onFocus: X[3] || (X[3] = (Z) => {
var Me;
return (Me = p.value) == null ? void 0 : Me.focus();
})
}, {
default: E(() => [
ie.value ? (a(), f("label", Uu, [
X[5] || (X[5] = v("span", { class: "sr-only label text-foreground" }, "Search", -1)),
v("div", Wu, [
v("div", Nu, [
z(u(ks), { class: "h-4 w-4 text-foreground-2" })
]),
Q(v("input", {
ref_key: "searchInput",
ref: p,
"onUpdate:modelValue": X[1] || (X[1] = (Z) => o.value = Z),
type: "text",
class: "py-1 pl-7 w-full bg-foundation placeholder:font-normal normal placeholder:text-foreground-2 text-[13px] focus-visible:[box-shadow:none] rounded-md hover:border-outline-5 focus-visible:border-outline-4",
placeholder: e.searchPlaceholder,
onKeydown: X[2] || (X[2] = ge(() => {
}, ["stop"]))
}, null, 40, qu), [
[Ke, o.value]
])
])
])) : I("", !0),
v("div", {
class: x(["overflow-auto simple-scrollbar", n.menuMaxHeightClasses || "max-h-[50vh] xl:max-h-80"])
}, [
ue.value && y.value ? (a(), f("div", Ku, [
z(Ct, { loading: !0 })
])) : ue.value && !g.value.length ? (a(), f("div", Gu, [
v("div", Xu, [
H(T.$slots, "nothing-found", {}, () => [
X[6] || (X[6] = F("Nothing found", -1))
])
])
])) : I("", !0),
!ue.value || !y.value ? (a(!0), f(J, { key: 2 }, te(q.value, (Z) => {
var Me;
return a(), A(u(Un), {
key: we(Z),
value: Z,
disabled: ((Me = e.disabledItemPredicate) == null ? void 0 : Me.call(e, Z)) || !1
}, {
default: E(({
active: O,
selected: G
}) => {
var K, be, Ie, je;
return [
Q((a(), f("li", {
class: x(
It({
active: O,
disabled: ((K = e.disabledItemPredicate) == null ? void 0 : K.call(e, Z)) || !1
})
)
}, [
v("span", {
class: x(["block px-2 py-1.5 rounded-md", [
G ? "bg-highlight-3" : "",
e.hideCheckmarks ? "pr-2" : "pr-8",
!((be = e.disabledItemPredicate) != null && be.call(e, Z)) && !G ? "hover:bg-highlight-1" : ""
]])
}, [
H(T.$slots, "option", {
class: "truncate",
item: Z,
active: O,
selected: G,
disabled: ((Ie = e.disabledItemPredicate) == null ? void 0 : Ie.call(e, Z)) || !1
}, () => [
F(P(de(Z)), 1)
]),
!e.hideCheckmarks && G ? (a(), f("span", Zu, [
z(u(Et), {
class: "h-4 w-4",
"aria-hidden": "true"
})
])) : I("", !0)
], 2)
], 2)), [
[
u(Ae),
(je = e.disabledItemPredicate) != null && je.call(e, Z) ? e.disabledItemTooltip : void 0
]
])
];
}),
_: 2
}, 1032, ["value", "disabled"]);
}), 128)) : I("", !0)
], 2)
]),
_: 3
}, 8, ["class", "style"])
], 8, ["disabled"]))
]),
_: 3
})) : I("", !0)
], 2)
])), [
[u(Ae), e.tooltipText]
])
]),
_: 3
}, 8, ["modelValue", "name", "multiple", "by", "disabled", "class"])),
M.value && !V.value ? (a(), f("p", {
key: 0,
id: M.value,
class: x(["mt-2 text-xs", B.value])
}, P($.value), 11, Ju)) : I("", !0)
]));
}
}), Qu = /* @__PURE__ */ D({
__name: "SourceAppBadge",
props: {
sourceApp: {}
},
setup(e) {
return (t, s) => (a(), A(nt, {
"color-classes": "text-foreground-on-primary",
rounded: "",
style: ae({ backgroundColor: t.sourceApp.bgColor })
}, {
default: E(() => [
F(P(t.sourceApp.short), 1)
]),
_: 1
}, 8, ["style"]));
}
}), Yu = {
key: 0,
class: "text-foreground-2 normal"
}, ed = {
key: 1,
class: "flex items-center"
}, td = { class: "truncate" }, sd = { class: "flex items-center" }, nd = { class: "truncate" }, hp = /* @__PURE__ */ D({
__name: "SourceApps",
props: {
/**
* Whether to allow selecting multiple source apps
*/
multiple: {
type: Boolean,
default: !1
},
modelValue: {
type: [Object, Array],
default: void 0
},
/**
* Whether to allow filtering source apps through a search box
*/
search: {
type: Boolean,
default: !1
},
/**
* Search placeholder text
*/
searchPlaceholder: {
type: String,
default: "Search apps"
},
selectorPlaceholder: {
type: String,
default: void 0
},
/**
* Label is required at the very least for screen-readers
*/
label: {
type: String,
required: !0
},
/**
* Whether to show the label visually
*/
showLabel: {
type: Boolean,
default: !1
},
name: {
type: String,
default: void 0
},
/**
* Control source apps to show. If left undefined, will show all available options.
*/
items: {
type: Array,
default: void 0
},
clearable: {
type: Boolean
},
help: {
type: String
},
labelId: {
type: String
},
buttonId: {
type: String
}
},
emits: ["update:modelValue"],
setup(e, { emit: t }) {
const s = t, l = e, r = j(null), n = j(null), { selectedValue: i, hiddenSelectedItemCount: c, isMultiItemArrayValue: d, firstItem: p } = Us({
props: Be(l),
emit: s,
dynamicVisibility: { elementToWatchForChanges: r, itemContainer: n }
}), m = (b, o) => b.name.toLocaleLowerCase().includes(o.toLocaleLowerCase());
return (b, o) => (a(), A(Ns, {
modelValue: u(i),
"onUpdate:modelValue": o[0] || (o[0] = (g) => vt(i) ? i.value = g : null),
multiple: e.multiple,
items: e.items ?? u(hn),
search: e.search,
"search-placeholder": e.searchPlaceholder,
label: e.label,
"show-label": e.showLabel,
name: e.name || "sourceApps",
"filter-predicate": m,
clearable: e.clearable,
help: e.help,
"label-id": e.labelId,
"button-id": e.buttonId,
by: "name"
}, {
"nothing-selected": E(() => [
e.selectorPlaceholder ? (a(), f(J, { key: 0 }, [
F(P(e.selectorPlaceholder), 1)
], 64)) : (a(), f(J, { key: 1 }, [
F(P(e.multiple ? "Select apps" : "Select an app"), 1)
], 64))
]),
"something-selected": E(({ value: g }) => [
u(d)(g) ? (a(), f("div", {
key: 0,
ref_key: "elementToWatchForChanges",
ref: r,
class: "flex items-center space-x-0.5 h-5"
}, [
v("div", {
ref_key: "itemContainer",
ref: n,
class: "flex flex-wrap overflow-hidden space-x-0.5 h-5"
}, [
(a(!0), f(J, null, te(g, (y) => (a(), A(Qu, {
key: y.name,
"source-app": y
}, null, 8, ["source-app"]))), 128))
], 512),
u(c) > 0 ? (a(), f("div", Yu, " +" + P(u(c)), 1)) : I("", !0)
], 512)) : (a(), f("div", ed, [
v("div", {
class: "h-2 w-2 rounded-full mr-2",
style: ae({ backgroundColor: u(p)(g).bgColor })
}, null, 4),
v("span", td, P(u(p)(g).name), 1)
]))
]),
option: E(({ item: g }) => [
v("div", sd, [
v("div", {
class: "h-2 w-2 rounded-full mr-2",
style: ae({ backgroundColor: g.bgColor })
}, null, 4),
v("span", nd, P(g.name), 1)
])
]),
_: 1
}, 8, ["modelValue", "multiple", "items", "search", "search-placeholder", "label", "show-label", "name", "clearable", "help", "label-id", "button-id"]));
}
}), ld = { class: "flex flex-wrap gap-1.5" }, vp = /* @__PURE__ */ D({
__name: "Badges",
props: {
items: {},
label: {},
name: {},
help: {},
modelValue: {},
multiple: { type: Boolean },
rules: {},
by: {},
labelId: {},
buttonId: {}
},
emits: ["update:modelValue"],
setup(e, { emit: t }) {
const s = t, l = e, { selectedValue: r, isArrayValue: n } = Us({
props: Be(l),
emit: s
}), i = (c) => {
n(r.value) ? r.value = r.value.filter((d) => d.id !== c.id) : r.value = void 0;
};
return (c, d) => (a(), A(Ns, {
modelValue: u(r),
"onUpdate:modelValue": d[0] || (d[0] = (p) => vt(r) ? r.value = p : null),
multiple: c.multiple,
items: c.items,
label: c.label,
name: c.name,
help: c.help,
rules: c.rules,
by: c.by,
"label-id": c.labelId,
"button-id": c.buttonId
}, {
"something-selected": E(({ value: p }) => [
v("ul", ld, [
(a(!0), f(J, null, te(u(n)(p) ? p : [p], (m) => (a(), f("li", {
key: m[c.by]
}, [
z(nt, {
size: "lg",
"color-classes": "border border-outline-2 bg-foundation-page",
"dot-icon-color-classes": "text-foreground",
rounded: "",
"clickable-icon": !0,
"icon-left": u(nl),
onClickIcon: ge((b) => i(m), ["stop"])
}, {
default: E(() => [
F(P(m.text), 1)
]),
_: 2
}, 1032, ["icon-left", "onClickIcon"])
]))), 128))
])
]),
option: E(({ item: p }) => [
F(P(p.text), 1)
]),
_: 1
}, 8, ["modelValue", "multiple", "items", "label", "name", "help", "rules", "by", "label-id", "button-id"]));
}
}), od = ["id", "for"], ad = {
key: 0,
class: "text-danger text-xs opacity-80"
}, rd = {
key: 1,
class: "text-body-2xs font-normal"
}, id = ["id"], ud = ["id", "aria-expanded"], dd = { class: "flex items-center justify-between w-full" }, cd = { class: "pointer-events-none shrink-0 ml-1 flex items-center space-x-2" }, fd = {
key: 1,
class: "text-4xl text-danger opacity-50 h-4 w-4 leading-6"
}, pd = ["disabled"], md = ["aria-labelledby"], hd = {
key: 0,
class: "flex flex-col mx-1 mb-1"
}, vd = { class: "relative" }, bd = { class: "pointer-events-none absolute top-0 bottom-0 left-0 flex items-center pl-2" }, gd = ["placeholder"], yd = {
key: 0,
class: "px-1"
}, xd = { key: 1 }, wd = { class: "text-foreground-2 text-center" }, kd = ["aria-selected", "disabled", "onClick"], Cd = ["id"], bp = /* @__PURE__ */ D({
__name: "Multi",
props: {
size: {
type: String,
default: void 0
},
items: {
type: Array,
default: () => []
},
modelValue: {
type: [Array, Object, String, Number],
default: void 0
},
/**
* Whether to enable the search bar. You must also set one of the following:
* * filterPredicate - to allow filtering passed in `items` based on search bar
* * getSearchResults - to allow asynchronously loading items from server (props.items no longer required in this case,
* but can be used to prefill initial values)
*/
search: {
type: Boolean,
default: !1
},
/**
* If search=true and this is set, you can use this to filter passed in items based on whatever
* the user enters in the search bar
*/
filterPredicate: {
type: Function,
default: void 0
},
/**
* Set this to disable certain items in the list
*/
disabledItemPredicate: {
type: Function,
default: void 0
},
/**
* If search=true and this is set, you can use this to load data asynchronously depending
* on the search query
*/
getSearchResults: {
type: Function,
default: void 0
},
searchPlaceholder: {
type: String,
default: "Search"
},
/**
* Label is required at the very least for screen-readers
*/
label: {
type: String,
required: !0
},
/**
* Optional text that replaces the label as the placeholder when set.
*/
placeholder: {
type: String
},
/**
* Whether to show the label visually
*/
showLabel: {
type: Boolean,
default: !1
},
name: {
type: String,
required: !0
},
/**
* Objects will be compared by the values in the specified prop
*/
by: {
type: String,
required: !1
},
disabled: {
type: Boolean,
default: !1
},
buttonStyle: {
type: String,
default: "base"
},
hideCheckmarks: {
type: Boolean,
default: !1
},
allowUnset: {
type: Boolean,
default: !0
},
clearable: {
type: Boolean,
default: !1
},
/**
* Validation stuff
*/
rules: {
type: [String, Object, Function, Array],
default: void 0
},
/**
* vee-validate validation() on component mount
*/
validateOnMount: {
type: Boolean,
default: !1
},
/**
* Whether to trigger validation whenever the value changes
*/
validateOnValueUpdate: {
type: Boolean,
default: !1
},
/**
* Will replace the generic "Value" text with the name of the input in error messages
*/
useLabelInErrors: {
type: Boolean,
default: !0
},
/**
* Optional help text
*/
help: {
type: String,
default: void 0
},
/**
* @deprecated Use size attribute instead
*/
fixedHeight: {
type: Boolean,
default: !1
},
/**
* By default component holds its own internal value state so that even if you don't have it tied up to a real `modelValue` ref somewhere
* it knows its internal state and can report it on form submits.
*
* If you set this to true, its only going to rely on `modelValue` as its primary source of truth so that you can reject updates etc.
*/
fullyControlValue: {
type: Boolean,
default: !1
},
/**
* Whether to show the red "required" asterisk
*/
showRequired: {
type: Boolean,
default: !1
},
/**
* Whether to show the optional text
*/
showOptional: {
type: Boolean,
default: !1
},
/**
* Whether to mount the menu on the body instead of inside the component. Useful when select box is mounted within
* dialog windows and the menu causes unnecessary overflow.
*/
mountMenuOnBody: {
type: Boolean,
default: !1
},
labelId: {
type: String,
default: void 0
},
buttonId: {
type: String,
default: void 0
},
/**
* Tooltip shown on disabled items
*/
disabledItemTooltip: {
required: !1,
type: String
},
labelPosition: {
type: String,
default: "top"
},
tooltipText: {
type: String,
default: void 0
}
},
emits: ["update:modelValue"],
setup(e, { expose: t, emit: s }) {
const l = (O) => ye(O), r = s, n = e, { value: i, errorMessage: c } = De(n.name, n.rules, {
validateOnMount: n.validateOnMount,
validateOnValueUpdate: n.validateOnValueUpdate,
initialValue: se(n.modelValue) ? n.modelValue : []
}), d = Dt(), p = j(null), m = j(null), b = j(null), o = j(""), g = j([]), y = j(!1), S = j(1), w = j(dt()), C = j(!1), L = _t(b, {
windowResize: !0,
windowScroll: !0,
immediate: !0
});
Cs(
h(() => m.value),
([{ isIntersecting: O }]) => {
O && n.mountMenuOnBody && L.update();
}
);
const N = h(() => u(n.label) || u(n.name)), Y = h(() => {
const O = c.value;
return !O || !u(n.useLabelInErrors) ? O : O.replace("Value", N.value);
}), R = h(() => Y.value || u(n.help)), $ = h(() => !!R.value), k = h(
() => $.value ? `${u(n.name)}-${w.value}` : void 0
), M = h(
() => c.value ? "text-danger" : "text-foreground-2"
), B = h(() => n.labelPosition === "left"), V = h(
() => n.buttonStyle !== "simple" && n.clearable && !n.disabled
), U = h(() => {
if (!n.size)
return "";
switch (n.size) {
case "sm":
return "h-6 text-body-sm";
case "lg":
return "h-10 text-[13px]";
case "xl":
return "h-14 text-sm";
case "base":
default:
return "h-8 text-body-sm";
}
}), xe = h(() => {
var G;
const O = ["relative flex group"];
return c.value ? (O.push("hover:shadow rounded-md"), O.push("text-danger-darker focus:border-danger"), n.buttonStyle !== "simple" && O.push("border border-danger")) : n.buttonStyle !== "simple" && (O.push("rounded-md border"), C.value ? O.push("border-outline-4") : O.push("border-outline-2 hover:border-outline-5 focus:outline-0")), n.fixedHeight ? O.push("h-8") : (G = U.value) != null && G.length && O.push(U.value), B.value && O.push("md:basis-1/2"), O.join(" ");
}), he = h(() => {
const O = [];
return n.buttonStyle !== "simple" && O.push(
ue.value ? "bg-foundation-disabled text-foreground-disabled" : ""
), ue.value && O.push("cursor-not-allowed"), O.join(" ");
}), $e = h(() => {
const O = [
"relative z-[1]",
"flex items-center justify-center text-center shrink-0",
"rounded-r-md overflow-hidden transition-all",
"text-foreground",
le.value ? `w-6 ${he.value}` : "w-0"
];
return ue.value || (O.push(
"hover:bg-primary hover:text-foreground-on-primary dark:text-foreground-on-primary"
), n.buttonStyle === "tinted" ? O.push("bg-outline-3") : O.push("bg-primary-muted")), O.join(" ");
}), Oe = h(() => {
const O = [
"relative z-[2]",
"normal rounded-md cursor-pointer transition truncate flex-1",
"flex items-center focus:outline-outline-4 focus:outline-1",
he.value
];
return n.buttonStyle !== "simple" && (O.push("p-2"), ue.value || (n.buttonStyle, O.push("bg-foundation text-foreground"))), V.value && le.value && O.push("rounded-r-none"), O.join(" ");
}), Ee = h(
() => !!(n.search && (n.filterPredicate || n.getSearchResults))
), ie = h(() => Ee.value && n.getSearchResults), ue = h(
() => n.disabled || !n.items.length && !ie.value
), ne = h({
get: () => {
const O = i.value;
return se(O) ? O : [];
},
set: (O) => {
if (!se(O)) {
console.warn("Attempting to set non-array value in selector");
return;
}
n.fullyControlValue ? r("update:modelValue", O) : i.value = O, S.value += 1;
}
}), le = h(() => se(ne.value) ? ne.value.length !== 0 : !!ne.value), _ = () => {
ne.value = [];
}, W = h(() => {
const O = o.value;
return !Ee.value || !(O != null && O.length) ? g.value : n.filterPredicate ? g.value.filter(
(G) => {
var K;
return ((K = n.filterPredicate) == null ? void 0 : K.call(n, G, O)) || !1;
}
) : g.value;
}), q = h(() => {
const O = [
"rounded-md bg-foundation py-1 label label--light border border-outline-3 shadow-md mt-1 "
];
return n.mountMenuOnBody ? O.push("fixed z-50") : O.push("absolute top-[100%] w-full z-40"), O.join(" ");
}), fe = h(() => {
const O = {};
if (n.mountMenuOnBody) {
const G = L.top.value, K = L.left.value, be = L.width.value, Ie = L.height.value;
O.top = `${G + Ie}px`, O.left = `${K}px`, O.width = `${be}px`;
}
return O;
}), ve = (O) => JSON.stringify(O), de = (O) => l(O) ? O[n.by || "id"] : O, we = async () => {
if (!(!ie.value || !n.getSearchResults)) {
y.value = !0;
try {
g.value = await n.getSearchResults(o.value);
} finally {
y.value = !1;
}
}
}, Re = st(we, 1e3), $t = (O) => {
const { disabled: G } = O, K = ["relative transition select-none px-2"];
return G ? K.push("opacity-50 cursor-not-allowed") : K.push("text-foreground cursor-pointer"), K.join(" ");
};
re(
() => n.items,
(O) => {
g.value = O.slice();
},
{ immediate: !0 }
), re(o, () => {
ie.value && Re();
}), ce(() => {
ie.value && !n.items.length && we();
});
const It = () => {
ue.value || (C.value = !C.value);
}, T = (O) => ne.value.some((G) => de(G) === de(O)), X = j(null), Z = j(0), Me = (O, G) => {
var Ie, je;
if ((Ie = n.disabledItemPredicate) != null && Ie.call(n, O))
return;
G == null || G.stopPropagation(), Z.value = ((je = X.value) == null ? void 0 : je.scrollTop) || 0;
const K = ne.value, be = K.some((He) => de(He) === de(O));
ne.value = be ? K.filter((He) => de(He) !== de(O)) : [...K, O], en(() => {
X.value && (X.value.scrollTop = Z.value);
});
};
return jn(
m,
() => {
C.value && (C.value = !1);
},
{
ignore: [b]
}
), t({ triggerSearch: we }), (O, G) => (a(), f("div", null, [
(a(), f("div", {
key: S.value,
class: x({
"md:flex md:items-center md:space-x-2 md:justify-between": B.value
})
}, [
v("div", {
class: x(["flex flex-col", { "pb-1": e.showLabel && !B.value }])
}, [
v("label", {
id: e.labelId,
class: x(["flex text-body-xs text-foreground font-medium pointer-events-none", [{ "sr-only": !e.showLabel }, { "items-center gap-1": e.showOptional }]]),
for: e.buttonId
}, [
F(P(e.label) + " ", 1),
e.showRequired ? (a(), f("div", ad, "*")) : e.showOptional ? (a(), f("div", rd, " (optional) ")) : I("", !0)
], 10, od),
k.value && B.value ? (a(), f("p", {
key: 0,
id: k.value,
class: x(["text-xs", M.value])
}, P(R.value), 11, id)) : I("", !0)
], 2),
Q((a(), f("div", null, [
v("div", {
class: x(xe.value)
}, [
v("button", {
id: e.buttonId,
ref_key: "listboxButton",
ref: b,
type: "button",
class: x(Oe.value),
"aria-expanded": C.value,
"aria-haspopup": !0,
onClick: It
}, [
v("div", dd, [
v("div", {
class: x(["block truncate grow text-left text-xs sm:text-[13px]", [le.value ? "text-foreground" : "text-foreground-2"]])
}, [
!ne.value || u(se)(ne.value) && !ne.value.length ? H(O.$slots, "nothing-selected", { key: 0 }, () => [
F(P(e.placeholder ? e.placeholder : e.label), 1)
]) : H(O.$slots, "something-selected", {
key: 1,
value: ne.value
}, () => [
F(P(ve(ne.value)), 1)
])
], 2),
v("div", cd, [
Y.value ? (a(), A(u(Rt), {
key: 0,
class: "h-4 w-4 text-danger",
"aria-hidden": "true"
})) : !e.showLabel && e.showRequired ? (a(), f("div", fd, " * ")) : I("", !0),
C.value ? (a(), A(u(xs), {
key: 2,
class: "h-4 w-4 text-foreground",
"aria-hidden": "true"
})) : (a(), A(u(ws), {
key: 3,
class: "h-4 w-4 text-foreground",
"aria-hidden": "true"
}))
])
])
], 10, ud),
V.value ? (a(), f("button", {
key: 0,
class: x($e.value),
disabled: e.disabled,
onClick: G[0] || (G[0] = (K) => _())
}, [
z(u(Ge), { class: "w-3 h-3" })
], 10, pd)) : I("", !0),
u(d) ? (a(), A(Vt, {
key: 1,
"leave-active-class": "transition ease-in duration-100",
"leave-from-class": "opacity-100",
"leave-to-class": "opacity-0"
}, {
default: E(() => [
(a(), A(zt, {
to: "body",
disabled: !e.mountMenuOnBody
}, [
C.value ? (a(), f("div", {
key: 0,
ref_key: "menuEl",
ref: m,
class: x(q.value),
style: ae(fe.value),
role: "listbox",
"aria-labelledby": e.labelId,
onFocus: G[4] || (G[4] = (K) => {
var be;
return (be = p.value) == null ? void 0 : be.focus();
})
}, [
Ee.value ? (a(), f("label", hd, [
G[5] || (G[5] = v("span", { class: "sr-only label text-foreground" }, "Search", -1)),
v("div", vd, [
v("div", bd, [
z(u(ks), { class: "h-4 w-4 text-foreground-2" })
]),
Q(v("input", {
ref_key: "searchInput",
ref: p,
"onUpdate:modelValue": G[1] || (G[1] = (K) => o.value = K),
type: "text",
class: "py-1 pl-7 w-full bg-foundation placeholder:font-normal normal placeholder:text-foreground-2 text-[13px] focus-visible:[box-shadow:none] rounded-md hover:border-outline-5 focus-visible:border-outline-4",
placeholder: e.searchPlaceholder,
onKeydown: G[2] || (G[2] = ge(() => {
}, ["stop"]))
}, null, 40, gd), [
[Ke, o.value]
])
])
])) : I("", !0),
v("div", {
ref_key: "optionsContainer",
ref: X,
class: "overflow-auto simple-scrollbar max-h-60 xl:max-h-80 gap-1 flex flex-col"
}, [
ie.value && y.value ? (a(), f("div", yd, [
z(Ct, { loading: !0 })
])) : ie.value && !g.value.length ? (a(), f("div", xd, [
v("div", wd, [
H(O.$slots, "nothing-found", {}, () => [
G[6] || (G[6] = F("Nothing found", -1))
])
])
])) : I("", !0),
!ie.value || !y.value ? (a(!0), f(J, { key: 2 }, te(W.value, (K) => {
var be, Ie, je, He, Jt, Qt;
return Q((a(), f("button", {
key: de(K),
type: "button",
role: "option",
"aria-selected": T(K),
disabled: ((be = e.disabledItemPredicate) == null ? void 0 : be.call(e, K)) || !1,
class: x(
$t({
disabled: ((Ie = e.disabledItemPredicate) == null ? void 0 : Ie.call(e, K)) || !1
})
),
onClick: (Zs) => Me(K, Zs)
}, [
v("div", {
class: x(["block w-full px-2 py-1.5 rounded-md text-left flex items-center gap-1", [
e.hideCheckmarks ? "pr-2" : "pr-8",
!((je = e.disabledItemPredicate) != null && je.call(e, K)) && !T(K) ? "hover:bg-highlight-1" : ""
]])
}, [
z(_i, {
name: `select-${de(K)}`,
checked: T(K),
disabled: (He = e.disabledItemPredicate) == null ? void 0 : He.call(e, K),
"hide-label": !0,
onChange: G[3] || (G[3] = ge(() => {
}, ["stop"]))
}, null, 8, ["name", "checked", "disabled"]),
H(O.$slots, "option", {
class: "truncate",
item: K,
selected: T(K),
disabled: ((Jt = e.disabledItemPredicate) == null ? void 0 : Jt.call(e, K)) || !1
}, () => [
F(P(ve(K)), 1)
])
], 2)
], 10, kd)), [
[
u(Ae),
(Qt = e.disabledItemPredicate) != null && Qt.call(e, K) ? e.disabledItemTooltip : void 0
]
]);
}), 128)) : I("", !0)
], 512)
], 46, md)) : I("", !0)
], 8, ["disabled"]))
]),
_: 3
})) : I("", !0)
], 2)
])), [
[u(Ae), e.tooltipText]
])
], 2)),
k.value && !B.value ? (a(), f("p", {
key: 0,
id: k.value,
class: x(["mt-2 text-xs", M.value])
}, P(R.value), 11, Cd)) : I("", !0)
]));
}
}), $d = { class: "flex items-center space-x-2" }, Id = ["for"], gp = /* @__PURE__ */ D({
__name: "Switch",
props: /* @__PURE__ */ Ce({
showLabel: { type: Boolean, default: !0 },
name: {},
label: {},
disabled: { type: Boolean },
id: {}
}, {
modelValue: { type: Boolean },
modelModifiers: {}
}),
emits: ["update:modelValue"],
setup(e) {
const t = e, s = ke(e, "modelValue"), l = h(() => t.label || t.name), r = h(() => {
const c = ["block label-light"];
return t.showLabel || c.push("sr-only"), c.join(" ");
}), n = h(() => {
const c = [
"relative inline-flex flex-shrink-0 h-[18px] w-[30px] rounded-full",
"transition-colors ease-in-out duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-primary",
"cursor-pointer disabled:cursor-not-allowed disabled:opacity-40"
];
return s.value ? c.push("bg-primary") : c.push("bg-foreground-3"), c.join(" ");
}), i = h(() => {
const c = [
"pointer-events-none inline-block h-3 w-3 rounded-full mt-[3px] ml-[3px]",
"ring-0 transition ease-in-out duration-200 bg-foreground-on-primary"
];
return s.value ? c.push("translate-x-[12px]") : c.push("translate-x-0"), c.join(" ");
});
return (c, d) => (a(), f("div", $d, [
z(u(Wn), {
id: c.id || c.name,
modelValue: s.value,
"onUpdate:modelValue": d[0] || (d[0] = (p) => s.value = p),
class: x(n.value),
name: c.name,
disabled: c.disabled
}, {
default: E(() => [
v("span", {
class: x(i.value)
}, null, 2)
]),
_: 1
}, 8, ["id", "modelValue", "class", "name", "disabled"]),
v("label", {
for: c.id || c.name,
class: x(r.value)
}, [
v("span", null, P(l.value), 1)
], 10, Id)
]));
}
}), Bd = { class: "relative group bg-foundation border border-outline-2 p-2 rounded-lg pr-20" }, Sd = { class: "absolute top-3 right-2 flex justify-end items-center" }, yp = /* @__PURE__ */ D({
__name: "ClipboardInput",
props: {
value: {},
isMultiline: { type: Boolean, default: !1 },
isIconButton: { type: Boolean },
rows: {},
ctaColor: { default: "outline" },
ctaText: { default: "Copy" }
},
emits: ["copy"],
setup(e, { emit: t }) {
const s = e, l = t, { copy: r } = An({ legacy: !0 }), n = j(!1), i = async () => {
s.value && (await r(s.value), n.value = !0, l("copy", s.value), setTimeout(() => {
n.value = !1;
}, 2e3));
}, c = (d) => {
const p = d.target, m = window.getSelection();
if (m) {
const b = document.createRange();
b.selectNodeContents(p), m.removeAllRanges(), m.addRange(b);
}
};
return (d, p) => (a(), f("div", Bd, [
d.isMultiline ? (a(), f("div", {
key: 0,
class: "relative z-10 text-body-2xs select-all text-foreground font-mono break-all p-2 pl-3 max-h-[4.8rem] simple-scrollbar overflow-y-auto",
onKeypress: p[0] || (p[0] = (m) => u(Fs)(c))
}, P(d.value), 33)) : (a(), A(u(Gt), {
key: 1,
color: "transparent",
name: "contentInput",
readonly: "",
"model-value": d.value,
class: "relative z-10 !text-body-2xs sm:!text-body-xs text-foreground font-mono select-all truncate"
}, null, 8, ["model-value"])),
v("div", Sd, [
z(u(pe), {
color: d.ctaColor,
size: "sm",
"icon-left": d.isIconButton ? n.value ? u(gn) : u(yn) : void 0,
"hide-text": d.isIconButton,
onClick: i
}, {
default: E(() => [
F(P(n.value ? "Copied" : d.ctaText), 1)
]),
_: 1
}, 8, ["color", "icon-left", "hide-text"])
])
]));
}
}), Pd = { class: "flex flex-col items-center" }, Td = { class: "flex gap-2" }, xp = /* @__PURE__ */ D({
__name: "CodeInput",
props: {
modelValue: {},
digitCount: { default: 6 },
disabled: { type: Boolean },
error: { type: Boolean },
clearErrorOnEdit: { type: Boolean, default: !0 }
},
emits: ["update:modelValue", "complete"],
setup(e, { emit: t }) {
const s = e, l = t, r = j([]), n = j(new Array(s.digitCount).fill("")), i = j(s.error), c = (m) => {
var b;
s.clearErrorOnEdit && (i.value = !1), n.value[m] = n.value[m].replace(/[^0-9]/g, ""), n.value[m] && m < s.digitCount - 1 && ((b = r.value[m + 1]) == null || b.focus());
}, d = (m, b) => {
var o, g, y;
b.key === "Backspace" && !n.value[m] && m > 0 ? (s.clearErrorOnEdit && (i.value = !1), n.value[m - 1] = "", (o = r.value[m - 1]) == null || o.focus()) : b.key === "ArrowLeft" && m > 0 ? (g = r.value[m - 1]) == null || g.focus() : b.key === "ArrowRight" && m < s.digitCount - 1 && ((y = r.value[m + 1]) == null || y.focus());
}, p = (m) => {
var y, S, w;
s.clearErrorOnEdit && (i.value = !1), m.preventDefault();
const b = (y = m.clipboardData) == null ? void 0 : y.getData("text");
if (!b)
return;
const o = b.replace(/[^0-9]/g, "").split("");
n.value = [
...o.slice(0, s.digitCount),
...Array(Math.max(0, s.digitCount - o.length)).fill("")
];
const g = n.value.findIndex((C) => !C);
g !== -1 ? (S = r.value[g]) == null || S.focus() : (w = r.value[s.digitCount - 1]) == null || w.focus();
};
return ce(() => {
r.value[0] && r.value[0].focus();
}), re(
() => s.error,
(m) => {
i.value = m;
}
), re(
() => s.modelValue,
(m) => {
if (m) {
const b = m.split("");
n.value = [
...b,
...Array(s.digitCount - b.length).fill("")
];
} else
n.value = Array(s.digitCount).fill("");
},
{ immediate: !0 }
), re(
n,
(m) => {
const b = m.join("");
l("update:modelValue", b), b.length === s.digitCount && l("complete", b);
},
{ deep: !0 }
), (m, b) => (a(), f("div", Pd, [
v("div", Td, [
(a(!0), f(J, null, te(m.digitCount, (o, g) => (a(), f("div", {
key: g,
class: "w-10"
}, [
z(u(Gt), {
ref_for: !0,
ref_key: "inputRefs",
ref: r,
modelValue: n.value[g],
"onUpdate:modelValue": (y) => n.value[g] = y,
class: "text-center !text-[14px] py-6 !px-2 font-semibold",
color: "foundation",
name: `code-${g}`,
type: "text",
inputmode: "numeric",
disabled: m.disabled,
error: i.value,
"custom-error-message": i.value ? " " : void 0,
maxlength: "1",
size: "lg",
onInput: (y) => c(g),
onKeydown: (y) => d(g, y),
onPaste: p
}, null, 8, ["modelValue", "onUpdate:modelValue", "name", "disabled", "error", "custom-error-message", "onInput", "onKeydown"])
]))), 128))
])
]));
}
});
var rt = /* @__PURE__ */ ((e) => (e.CtrlOrCmd = "cmd-or-ctrl", e.AltOrOpt = "alt-or-opt", e.Shift = "shift", e))(rt || {});
const At = vn(), Od = {
"cmd-or-ctrl": At === Mt.Mac ? "⌘" : "⌃",
"alt-or-opt": At === Mt.Mac ? "⌥" : "Alt",
shift: "⇧"
};
function wp(e) {
const t = (s) => Object.values(rt).includes(s);
return e.map((s) => t(s) ? Od[s] : s).join("");
}
function kp(e, t, s) {
const l = Ln(), n = `${e.map((i) => {
switch (i) {
case rt.CtrlOrCmd:
return At === Mt.Mac ? "Meta" : "Control";
case rt.AltOrOpt:
return "Alt";
case rt.Shift:
return "Shift";
default:
return "";
}
}).join("+")}+${t}`;
Vn(l[n], s);
}
function Cp(e) {
const t = (e == null ? void 0 : e.model) || j(), s = h({
get: () => !!t.value,
set: (l) => t.value = l ? !0 : void 0
});
return { model: t, isChecked: s };
}
const Md = { class: "fixed top-0 left-0 z-10 h-screen !h-[100dvh] w-screen" }, jd = { class: "flex items-center justify-start rounded-t-lg shrink-0 min-h-[2rem] sm:min-h-[3rem] px-6 py-4 truncate text-heading-sm" }, Ad = { class: "flex items-center pr-12" }, Ld = { class: "w-full truncate" }, $p = /* @__PURE__ */ D({
__name: "Dialog",
props: {
open: { type: Boolean },
maxWidth: {},
fullscreen: { default: "mobile" },
hideCloser: { type: Boolean },
showBackButton: { type: Boolean },
preventCloseOnClickOutside: { type: Boolean },
title: {},
buttons: {},
buttonsWrapperClasses: {},
onSubmit: {},
isTransparent: { type: Boolean },
closerClasses: {},
hideTitle: { type: Boolean },
hideButtons: { type: Boolean }
},
emits: ["update:open", "fully-closed", "back"],
setup(e, { emit: t }) {
const s = t, l = e, r = bt(), n = j(!1), i = j(Math.random()), c = j(!1), d = j(!0), p = j(null);
Ft(
p,
mt(() => {
$({ target: p.value });
}, 60)
);
const m = h(() => !!l.onSubmit), b = h(
() => (l.buttons || r.buttons) && !l.hideButtons
), o = h(() => !l.hideTitle && (!!l.title || !!r.header)), g = h({
get: () => l.open,
set: (k) => s("update:open", k)
}), y = h(() => {
switch (l.maxWidth) {
case "xs":
return 0;
case "sm":
return 1;
case "md":
return 2;
case "lg":
return 3;
case "xl":
return 4;
default:
return 1e4;
}
}), S = h(() => {
const k = ["w-full", "sm:w-full"];
return w.value || (y.value === 0 && k.push("md:max-w-sm"), y.value >= 1 && k.push("md:max-w-lg"), y.value >= 2 && k.push("md:max-w-2xl"), y.value >= 3 && k.push("lg:max-w-3xl"), y.value >= 4 ? k.push("xl:max-w-6xl") : k.push("md:max-w-2xl")), k.join(" ");
}), w = h(
() => l.fullscreen === "desktop" || l.fullscreen === "all"
), C = h(() => {
const k = [
"transform md:rounded-xl text-foreground overflow-hidden transition-all text-left flex flex-col md:h-auto"
];
return l.isTransparent || k.push("bg-foundation-page shadow-xl border border-outline-2"), w.value ? k.push("md:h-full") : k.push("md:max-h-[90vh]"), (l.fullscreen === "mobile" || l.fullscreen === "all") && k.push("max-md:h-[98vh] max-md:!h-[98dvh]"), l.fullscreen === "none" || l.fullscreen === "desktop" ? k.push("rounded-lg max-h-[90vh]") : k.push("rounded-t-lg"), k.push(S.value), k.join(" ");
}), L = h(() => {
const k = ["flex-1 simple-scrollbar overflow-y-auto text-body-xs"];
return l.isTransparent || (o.value ? (k.push("px-6 py-4"), w.value && k.push("md:p-0")) : w.value || k.push("px-6 py-4")), k.join(" ");
}), N = () => {
l.preventCloseOnClickOutside || (g.value = !1);
}, Y = () => {
s("fully-closed"), n.value = !1;
}, R = (k) => {
var M;
(M = l.onSubmit) == null || M.call(l, k);
}, $ = mt((k) => {
if (!k.target)
return;
const M = k.target, { scrollTop: B, offsetHeight: V, scrollHeight: U } = M;
c.value = B > 0, d.value = B + V >= U;
}, 60);
return re(
g,
(k, M) => {
if (Ve) {
const B = document.documentElement;
k ? B.classList.add("dialog-open") : B.classList.remove("dialog-open");
}
!k && M && (n.value = !0);
},
{ flush: "sync" }
), tn(() => {
document.documentElement.classList.remove("dialog-open");
}), (k, M) => (a(), A(u(Is), {
as: "template",
show: g.value
}, {
default: E(() => [
z(u(Nn), {
as: "div",
class: "relative z-50",
open: "",
onClose: N
}, {
default: E(() => [
z(u(es), {
as: "template",
enter: "ease-out duration-300",
"enter-from": "opacity-0",
"enter-to": "opacity-100",
leave: "ease-in duration-400",
"leave-from": "opacity-100",
"leave-to": "opacity-0"
}, {
default: E(() => [...M[4] || (M[4] = [
v("div", { class: "fixed top-0 left-0 w-full h-full backdrop-blur-xs bg-black/60 dark:bg-neutral-900/60 transition-opacity" }, null, -1)
])]),
_: 1
}),
v("div", Md, [
v("div", {
class: x(["flex md:justify-center h-full w-full md:p-6", [
k.fullscreen === "none" || k.fullscreen === "desktop" ? "p-4 items-center" : "items-end md:items-center"
]])
}, [
z(u(es), {
as: "template",
enter: "ease-out duration-5000",
"enter-from": `md:opacity-0 ${k.fullscreen === "mobile" || k.fullscreen === "all" ? "translate-y-[100%]" : "translate-y-4"} md:translate-y-4`,
"enter-to": "md:opacity-100 translate-y-0",
leave: "ease-in duration-5000",
"leave-from": "md:opacity-100 translate-y-0",
"leave-to": `md:opacity-0 ${k.fullscreen === "mobile" || k.fullscreen === "all" ? "translate-y-[100%]" : "translate-y-4"} md:translate-y-4`,
onAfterLeave: Y
}, {
default: E(() => [
z(u(qn), {
class: x(C.value),
"dialog-panel-classes": "",
as: m.value ? "form" : "div",
onSubmit: ge(R, ["prevent"])
}, {
default: E(() => [
o.value ? (a(), f("div", {
key: 0,
class: x(["border-b border-outline-3", c.value && "relative z-20 shadow-lg"])
}, [
v("div", jd, [
v("div", Ad, [
k.showBackButton ? (a(), A(u(xn), {
key: 0,
class: "w-5 h-5 -ml-1 mr-3",
onClick: M[0] || (M[0] = (B) => k.$emit("back"))
})) : I("", !0),
v("div", Ld, [
F(P(k.title) + " ", 1),
H(k.$slots, "header")
])
])
])
], 2)) : I("", !0),
M[6] || (M[6] = v("button", {
class: "hidden",
type: "button"
}, null, -1)),
k.hideCloser ? I("", !0) : (a(), A(u(pe), {
key: 1,
color: "subtle",
size: "sm",
class: x(["absolute z-20 top-4 right-5 shrink-0 !w-6 !h-6 !p-0 text-foreground-2", k.closerClasses]),
onClick: M[1] || (M[1] = (B) => g.value = !1)
}, {
default: E(() => [
z(u(wn), { class: "h-6 w-6" })
]),
_: 1
}, 8, ["class"])),
sn(n.value ? [i.value] : [i.value = Math.random()], () => (a(), f("div", {
ref_key: "slotContainer",
ref: p,
class: x(L.value),
onScroll: M[2] || (M[2] = //@ts-ignore
(...B) => u($) && u($)(...B))
}, [
H(k.$slots, "default", {}, () => [
M[5] || (M[5] = F("Put your content here!", -1))
])
], 34)), M, 3),
b.value ? (a(), f("div", {
key: 2,
class: x(["relative z-50 flex justify-end px-6 pb-6 space-x-2 shrink-0 bg-foundation-page", {
"shadow-t pt-6": !d.value,
[k.buttonsWrapperClasses || ""]: !0
}])
}, [
k.buttons ? (a(!0), f(J, { key: 0 }, te(k.buttons, (B, V) => {
var U, xe, he;
return Q((a(), f("div", {
key: B.id || V
}, [
z(u(pe), Te({ ref_for: !0 }, B.props || {}, {
disabled: ((U = B.props) == null ? void 0 : U.disabled) || B.disabled,
submit: ((xe = B.props) == null ? void 0 : xe.submit) || B.submit,
onClick: ($e) => {
var Oe;
return (Oe = B.onClick) == null ? void 0 : Oe.call(B, $e);
}
}), {
default: E(() => [
F(P(B.text), 1)
]),
_: 2
}, 1040, ["disabled", "submit", "onClick"])
])), [
[
u(Ae),
(he = B.props) != null && he.disabled || B.disabled ? B.disabledMessage : void 0
]
]);
}), 128)) : H(k.$slots, "buttons", { key: 1 })
], 2)) : I("", !0)
]),
_: 3
}, 8, ["class", "as"])
]),
_: 3
}, 8, ["enter-from", "leave-to"])
], 2)
])
]),
_: 3
})
]),
_: 3
}, 8, ["show"]));
}
});
const Vd = {
key: 0,
class: "h-4 w-4 empty:h-0 empty:w-0"
}, Ip = /* @__PURE__ */ D({
__name: "DialogSection",
props: /* @__PURE__ */ Ce({
title: String,
borderT: Boolean,
borderB: Boolean,
allowOverflow: Boolean,
titleColor: {
type: String,
default: "default"
},
button: Object,
alwaysOpen: Boolean,
lazyLoad: {
type: Boolean,
default: !1
},
icon: {
type: [Function, Object],
default: void 0
}
}, {
open: { type: Boolean, required: !1 },
openModifiers: {}
}),
emits: ["update:open"],
setup(e) {
const t = e, s = j(null), { height: l } = $s(s), r = h(() => (l.value || 0) + 64), n = ke(e, "open"), i = h(() => {
const p = [];
return !t.button && !t.alwaysOpen && p.push("cursor-pointer", "hover:bg-foundation-page-2"), p;
}), c = h(() => {
switch (t.titleColor) {
case "danger":
return "text-danger";
case "warning":
return "text-warning";
case "success":
return "text-success";
case "secondary":
return "text-secondary";
case "info":
return "text-info";
default:
return "text-foreground";
}
}), d = () => {
n.value = !n.value;
};
return (p, m) => {
var b, o;
return a(), f("div", {
class: x(["flex flex-col border-primary-muted", {
"border-t": e.borderT,
"border-b": e.borderB,
"relative z-10": n.value
}])
}, [
v("div", Te({
class: ["flex justify-between items-center space-x-4 sm:space-x-8 py-2.5 px-2", i.value],
tabindex: "0"
}, Ot(
!e.button && !e.alwaysOpen ? {
click: d,
keypress: u(Fs)(d)
} : {},
!0
)), [
v("div", {
class: x(["text-heading-sm flex items-center space-x-1 sm:space-x-2 select-none", c.value])
}, [
p.$slots.icon || e.icon ? (a(), f("div", Vd, [
p.$slots.icon ? H(p.$slots, "icon", { key: 0 }) : I("", !0),
e.icon ? (a(), A(oe(e.icon), {
key: 1,
class: "w-full h-full"
})) : I("", !0)
])) : I("", !0),
v("span", null, P(e.title), 1)
], 2),
v("div", null, [
!e.button && !e.alwaysOpen ? (a(), A(u(kn), {
key: 0,
class: x(["w-4 h-4 transition-all duration-400", n.value && "rotate-180"])
}, null, 8, ["class"])) : I("", !0),
e.button ? (a(), A(u(pe), Te({
key: 1,
to: e.button.expandContent ? void 0 : e.button.to,
color: e.button.expandContent && n.value ? "outline" : e.button.color,
"icon-right": e.button.expandContent && n.value ? void 0 : e.button.iconRight,
size: "sm",
onClick: (b = e.button) == null ? void 0 : b.onClick
}, Ot((o = e.button) != null && o.expandContent ? { click: d } : {})), {
default: E(() => [
F(P(e.button.expandContent && n.value ? "Cancel" : e.button.text), 1)
]),
_: 1
}, 16, ["to", "color", "icon-right", "onClick"])) : I("", !0)
])
], 16),
v("div", {
class: x(["transition-all duration-300 overflow-hidden", [
e.allowOverflow && n.value ? "!overflow-visible" : "",
n.value ? "mb-2 mt-1" : "",
!e.button && !e.alwaysOpen ? "cursor-pointer hover:bg-foundation-page" : ""
]]),
style: ae(
e.alwaysOpen ? "max-height: none;" : `max-height: ${n.value ? r.value + "px" : "0px"}`
)
}, [
t.lazyLoad ? (a(), f(J, { key: 0 }, [
n.value || t.alwaysOpen ? (a(), f("div", {
key: 0,
ref_key: "content",
ref: s,
class: "rounded-md text-sm pb-3 px-2 mt-1"
}, [
H(p.$slots, "default", {}, () => [
m[0] || (m[0] = F("Panel contents", -1))
])
], 512)) : I("", !0)
], 64)) : (a(), f("div", {
key: 1,
ref_key: "content",
ref: s,
class: "rounded-md text-sm pb-3 px-2 mt-1"
}, [
H(p.$slots, "default", {}, () => [
m[1] || (m[1] = F("Panel contents", -1))
])
], 512))
], 6)
], 2);
};
}
}), zd = { class: "inline-flex items-center space-x-2 overflow-hidden pr-1 w-full" }, Ed = {
key: 1,
class: "text-left w-full truncate"
}, Rd = {
key: 0,
class: "label-light"
}, Bp = /* @__PURE__ */ D({
__name: "Disclosure",
props: /* @__PURE__ */ Ce({
icon: {},
color: { default: "default" },
lazyLoad: { type: Boolean },
exitEditModeOnBlur: { type: Boolean, default: !0 }
}, {
editTitle: { type: Boolean },
editTitleModifiers: {},
title: {},
titleModifiers: {},
open: { type: Boolean, default: !1 },
openModifiers: {}
}),
emits: ["update:editTitle", "update:title", "update:open"],
setup(e) {
const t = e, s = ke(e, "editTitle"), l = ke(e, "title"), r = ke(e, "open"), { on: n, bind: i, syncFromValue: c } = ru({
disableDebouncedInput: !0,
model: l
}), d = h(() => {
const y = ["font-medium"];
switch (t.color) {
case "warning":
y.push("text-warning");
break;
case "success":
y.push("text-success");
break;
case "danger":
y.push("text-danger");
break;
case "subtle":
y.push("text-foreground text-body-2xs");
break;
case "default":
default:
y.push("text-primary");
break;
}
return y.join(" ");
}), p = h(() => {
let y = [];
switch (y = [
"w-full",
"flex",
"items-center",
"transition",
"group/disclosure",
d.value
], t.color === "subtle" ? y.push(
"h-7",
"justify-normal",
"pl-1",
"pr-0.5",
"rounded-md",
"hover:bg-highlight-1",
"ring-none"
) : y.push(
"pr-3",
"h-10",
"justify-between",
"border-l-2",
"px-2",
"rounded",
"ring-1"
), t.color) {
case "warning":
y.push("border-warning ring-warning-lighter hover:ring-warning");
break;
case "success":
y.push("border-success ring-success-lighter hover:ring-success");
break;
case "danger":
y.push("border-danger ring-danger-lighter hover:ring-danger");
break;
case "subtle":
y.push("border-none ring-none flex-row-reverse gap-x-1 justify-end");
break;
case "default":
default:
y.push("border-primary ring-primary-muted hover:ring-primary");
break;
}
return y.join(" ");
}), m = h(() => {
const y = ["p-3 border-x border-b rounded-b-md"];
switch (t.color) {
case "warning":
y.push("border-warning-lighter");
break;
case "success":
y.push("border-success-lighter");
break;
case "danger":
y.push("border-danger-lighter");
break;
case "subtle":
y.push("border-none pl-0 pr-0 pb-0 pt-0 rounded-none");
break;
case "default":
default:
y.push("border-primary-muted");
break;
}
return y.join(" ");
}), b = h(() => {
const y = "h-4 w-4 transition-transform shrink-0 duration-200 ease-in-out";
return t.color === "subtle" ? r.value ? `${y} rotate-180 transform` : `${y} rotate-90 transform` : r.value ? y : `${y} rotate-180 transform`;
}), o = () => {
r.value = !r.value;
}, g = () => {
t.exitEditModeOnBlur && (s.value = !1);
};
return re(s, (y, S) => {
y && !S && c();
}), (y, S) => (a(), f("div", null, [
z(u(Kn), null, {
default: E(() => [
z(u(Gn), {
class: x(p.value),
onClick: o
}, {
default: E(() => [
v("div", zd, [
y.icon ? (a(), A(oe(y.icon), {
key: 0,
class: "h-5 w-5"
})) : I("", !0),
s.value ? (a(), A(u(Gt), Te({ key: 2 }, u(i), {
name: "disclosureTitle",
color: "fully-transparent",
"input-classes": d.value,
"auto-focus": !0,
"wrapper-classes": "flex-1"
}, Ot(u(n)), {
onClick: S[0] || (S[0] = ge(() => {
}, ["stop"])),
onBlur: g
}), null, 16, ["input-classes"])) : (a(), f("span", Ed, P(l.value), 1)),
H(y.$slots, "title-actions")
]),
z(u(ll), {
class: x(b.value)
}, null, 8, ["class"])
]),
_: 3
}, 8, ["class"]),
r.value ? (a(), A(u(Xn), {
key: 0,
class: x(m.value),
static: ""
}, {
default: E(() => [
!y.lazyLoad || r.value ? (a(), f("div", Rd, [
H(y.$slots, "default", {}, () => [
S[1] || (S[1] = F("Panel contents", -1))
])
])) : I("", !0)
]),
_: 3
}, 8, ["class"])) : I("", !0)
]),
_: 3
})
]));
}
});
var Ne = /* @__PURE__ */ ((e) => (e.Grid = "grid", e.List = "list", e))(Ne || {});
const Fd = { class: "relative flex bg-primary-muted rounded-md" }, Dd = { class: "relative z-10 flex space-x-1 items-center p-1 rounded-l" }, _d = { class: "relative z-10 flex space-x-1 items-center p-1 rounded-r" }, Sp = /* @__PURE__ */ D({
__name: "GridListToggle",
props: {
modelValue: {}
},
emits: ["click", "update:modelValue"],
setup(e, { emit: t }) {
const s = t, l = e, r = h({
get: () => l.modelValue || Ne.Grid,
set: (i) => s("update:modelValue", i)
}), n = (i) => {
s("click", i);
const c = r.value === Ne.Grid ? Ne.List : Ne.Grid;
r.value = c;
};
return (i, c) => {
const d = Qe("tippy");
return a(), f("button", {
class: "max-w-max transition flex justify-center items-center space-x-2 outline-none select-none h-8 text-foreground border-2 border-primary-muted dark:border-foundation bg-primary-muted rounded-md active:scale-[0.97] grow",
onClick: n
}, [
v("div", Fd, [
v("div", {
class: x(["absolute transition", {
"translate-x-7": r.value !== u(Ne).List
}])
}, [...c[0] || (c[0] = [
v("div", { class: "w-7 h-7 bg-foundation dark:bg-foundation-2 transition rounded shadow" }, null, -1)
])], 2),
Q((a(), f("div", Dd, [
z(u(ol), { class: "h-5 w-5" })
])), [
[d, "List View"]
]),
Q((a(), f("div", _d, [
z(u(al), { class: "h-5 w-5" })
])), [
[d, "Grid View"]
])
])
]);
};
}
}), Hd = {}, Ud = {
width: "16",
height: "16",
viewBox: "0 0 16 16",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
function Wd(e, t) {
return a(), f("svg", Ud, [...t[0] || (t[0] = [
v("path", {
"fill-rule": "evenodd",
"clip-rule": "evenodd",
d: "M12.8849 5.91851L7.25614 11.74L3.99951 8.48337L4.93388 7.549L7.24028 9.8554L11.9349 5L12.8849 5.91851Z",
fill: "currentColor"
}, null, -1)
])]);
}
const hs = /* @__PURE__ */ me(Hd, [["render", Wd]]), Nd = ["disabled", "onClick"], qd = {
key: 1,
class: "w-5 shrink-0"
}, Kd = {
key: 2,
class: "w-5 shrink-0"
}, Pp = /* @__PURE__ */ D({
__name: "Menu",
props: {
open: { type: Boolean },
items: {},
size: {},
menuId: {},
menuPosition: {},
mountMenuOnBody: { type: Boolean },
customMenuItemsClasses: {},
showTicks: { type: [Boolean, String] }
},
emits: ["update:open", "chosen"],
setup(e, { emit: t }) {
const s = t, l = e, r = j(null), n = j(null), i = j(null), c = j(!1), d = j(!1), p = h({
get: () => l.open || !1,
set: ($) => s("update:open", $)
}), m = _t(i, {
windowResize: !0,
windowScroll: !0,
immediate: !0
}), b = $s(h(() => {
var $;
return (($ = r.value) == null ? void 0 : $.el) || null;
})), { direction: o } = zu({
el: h(() => {
var $;
return (($ = r.value) == null ? void 0 : $.el) || null;
}),
defaultDirection: l.menuPosition,
stopUpdatesBelowWidth: 300
}), g = h(() => l.menuPosition || o.value), { menuStyle: y } = Ws({
menuOpenDirection: g,
buttonBoundingBox: m,
menuWidth: h(() => {
if (gr(l.size))
return l.size;
switch (l.size) {
case "lg":
return 208;
case "base":
default:
return 176;
}
}),
menuHeight: h(() => b.height.value)
}), S = h(() => l.mountMenuOnBody ? m.width.value ? {
position: "fixed",
zIndex: 50,
...y.value
} : {} : {}), w = h(() => {
const $ = [
"w-44 origin-top-right divide-y divide-outline-3 rounded-md bg-foundation shadow-lg border border-outline-2 z-50"
];
return l.customMenuItemsClasses && $.push(...l.customMenuItemsClasses), l.mountMenuOnBody ? $.push("fixed") : ($.push("absolute mt-1"), g.value === ut.Left && $.push("right-0")), l.size === "lg" ? $.push("w-52") : $.push("w-44"), $.join(" ");
}), C = ($) => {
const { active: k, disabled: M, color: B } = $, V = [
"group flex space-x-2 w-full items-center rounded-md px-2 py-1 text-body-xs text-left"
];
return k && !B ? V.push("bg-primary-muted text-foreground") : M ? V.push("opacity-40") : B === "danger" && k ? V.push("text-foreground-on-primary bg-danger") : B === "danger" && !k ? V.push("text-danger") : B === "info" && k ? V.push("text-foreground-on-primary bg-info") : B === "info" && !k ? V.push("text-info") : V.push("text-foreground"), V.join(" ");
}, L = ($, k) => {
s("chosen", { item: $, event: k }), Y(!1);
}, N = () => {
var $;
($ = n.value) == null || $.el.click(), l.mountMenuOnBody && m.update();
}, Y = ($) => {
c.value !== $ && N();
}, R = ($) => {
const k = !!$;
return c.value = k, k;
};
return re(c, ($, k) => {
$ !== k && (p.value = $);
}), re(p, ($) => {
($ && !c.value || !$ && c.value) && N();
}), ce(() => {
d.value = !0;
}), Yt(window, "resize", () => {
m.update();
}), Yt(window, "scroll", () => {
m.update();
}), ($, k) => (a(), A(u(Zn), {
as: "div",
class: "relative inline-block"
}, {
default: E(({ open: M }) => [
v("div", null, [
z(u(Jn), {
id: $.menuId,
ref_key: "menuButton",
ref: n,
class: "hidden",
onClick: k[0] || (k[0] = ge(() => {
}, ["stop", "prevent"]))
}, null, 8, ["id"]),
v("div", {
ref_key: "menuButtonWrapper",
ref: i,
class: x(M ? "pointer-events-none" : "")
}, [
H($.$slots, "default", {
toggle: N,
open: R(M)
})
], 2)
]),
(a(), A(zt, {
to: "body",
disabled: !$.mountMenuOnBody
}, [
M ? (a(), A(u(Qn), {
key: 0,
ref_key: "menuItems",
ref: r,
class: x(w.value),
style: ae(S.value)
}, {
default: E(() => [
(a(!0), f(J, null, te($.items, (B, V) => (a(), f("div", {
key: V,
class: "p-1"
}, [
(a(!0), f(J, null, te(B, (U) => (a(), A(u(Yn), {
key: U.id,
disabled: U.disabled || void 0,
color: U.color
}, {
default: E(({ active: xe, disabled: he }) => [
Q((a(), f("span", null, [
v("button", {
class: x(C({ active: xe, disabled: he, color: U.color })),
disabled: he,
onClick: ($e) => L(U, $e)
}, [
U.icon ? (a(), A(oe(U.icon), {
key: 0,
class: "h-4 w-4"
})) : I("", !0),
$.showTicks === !0 ? (a(), f("div", qd, [
U.active ? (a(), A(hs, {
key: 0,
class: "h-4 w-4 text-foreground-2"
})) : I("", !0)
])) : I("", !0),
H($.$slots, "item", { item: U }, () => [
v("div", {
class: x({ grow: !!$.showTicks })
}, P(U.title), 3)
]),
$.showTicks === "right" && U.active ? (a(), f("div", Kd, [
U.active ? (a(), A(hs, {
key: 0,
class: "h-4 w-4 text-foreground-2"
})) : I("", !0)
])) : I("", !0)
], 10, Nd)
])), [
[u(Ae), U.disabled && U.disabledTooltip]
])
]),
_: 2
}, 1032, ["disabled", "color"]))), 128))
]))), 128))
]),
_: 3
}, 8, ["class", "style"])) : I("", !0)
], 8, ["disabled"]))
]),
_: 3
}));
}
}), Gd = { class: "relative z-10 flex flex-col !mt-0" }, Xd = { class: "absolute left-[-2px] top-[-2px] z-20 pr-8 bg-gradient-to-r from-foundation-page to-transparent" }, Zd = ["data-tab-id", "disabled", "onClick"], Jd = { class: "flex space-x-2 items-center" }, Qd = { class: "min-w-6" }, Yd = { key: 0 }, ec = { key: 1 }, tc = { class: "absolute right-[-2px] top-[-2px] z-20 pl-8 bg-gradient-to-l from-foundation-page to-transparent" }, sc = { class: "pt-4" }, Tp = /* @__PURE__ */ D({
__name: "Horizontal",
props: /* @__PURE__ */ Ce({
items: {}
}, {
activeItem: { required: !0 },
activeItemModifiers: {}
}),
emits: ["update:activeItem"],
setup(e) {
const t = e, s = ke(e, "activeItem"), l = j(null), r = j(null), n = j(!1), i = j(!1), c = j(!0), d = j("0px"), p = j("0px"), m = h(() => ($) => {
var B;
const k = ((B = s.value) == null ? void 0 : B.id) === $.id, M = [
"relative",
"z-10",
"flex",
"items-center",
"disabled:opacity-60 disabled:hover:border-transparent disabled:cursor-not-allowed disabled:hover:bg-transparent",
"text-body-xs",
"hover:sm:border-outline-2",
"pb-2",
"border-b-[2px]",
"border-transparent",
"max-w-max",
"last:mr-6",
"whitespace-nowrap"
];
return k ? M.push("text-primary", "hover:text-primary") : M.push("text-foreground"), M;
}), b = h(() => {
var B;
const $ = (B = s.value) == null ? void 0 : B.id;
if (!$)
return null;
const k = l.value;
return k && [...k.getElementsByClassName("tab-button")].find((V) => V.dataset.tabId === $) || null;
}), o = h(() => ({
left: d.value,
width: p.value
})), g = () => {
const $ = b.value;
$ && (d.value = `${$.offsetLeft}px`, p.value = `${$.clientWidth}px`);
}, y = ($) => {
s.value = $, c.value = !1;
}, S = ($) => {
var k;
return ((k = s.value) == null ? void 0 : k.id) === $.id;
}, w = () => {
const $ = r.value;
if (!$)
return;
const k = $.scrollWidth, M = $.clientWidth, B = $.scrollLeft, V = 1;
n.value = B > V, i.value = B < k - M - V;
}, C = () => {
var $;
($ = r.value) == null || $.scrollBy({ left: -100, behavior: "smooth" }), w();
}, L = () => {
var $;
($ = r.value) == null || $.scrollBy({ left: 100, behavior: "smooth" }), w();
}, N = mt(() => {
w();
}, 250), Y = () => {
const $ = b.value;
$ && r.value && $.scrollIntoView({
behavior: "smooth",
block: "nearest",
inline: "center"
});
};
ce(() => {
Ve && (t.items.length && !s.value && y(t.items[0]), w(), Y());
}), re(
() => [t.items, s.value],
([$]) => {
Array.isArray($) && $.length && !s.value && y($[0]), w();
}
);
const { stop: R } = Ft(
b,
() => g()
);
return ht(() => {
N.cancel(), R();
}), ($, k) => {
const M = Qe("tippy");
return a(), f("div", Gd, [
v("div", Xd, [
n.value ? (a(), f("button", {
key: 0,
class: "bg-foundation p-1 rounded-full border border-outline-4 shadow",
onClick: C
}, [
z(u(Cn), { class: "h-4 w-4" })
])) : I("", !0)
]),
k[1] || (k[1] = v("div", { class: "absolute left-0 z-10 w-full h-[1px] mt-px bg-outline-3 top-7" }, null, -1)),
v("div", {
ref_key: "scrollContainer",
ref: r,
class: "relative overflow-x-auto hide-scrollbar w-full",
onScroll: k[0] || (k[0] = //@ts-ignore
(...B) => u(N) && u(N)(...B))
}, [
v("div", {
style: ae(o.value),
class: x(["h-[2px] absolute bottom-0 z-20 transition-[left,width] duration-300", c.value ? "bg-transparent" : "bg-primary"])
}, null, 6),
v("div", {
ref_key: "buttonContainer",
ref: l,
class: "flex w-full space-x-4"
}, [
(a(!0), f(J, null, te($.items, (B) => {
var V;
return a(), f("button", {
key: B.id,
"data-tab-id": B.id,
class: x([[
m.value(B),
{ "!border-primary": S(B) && c.value }
], "tab-button"]),
disabled: B.disabled,
onClick: (U) => y(B)
}, [
v("div", Jd, [
B.icon ? (a(), A(oe(B.icon), {
key: 0,
class: "shrink-0 h-4 w-4 stroke-[2px]"
})) : I("", !0),
v("div", Qd, [
B.disabled && B.disabledMessage ? Q((a(), f("span", Yd, [
F(P(B.title), 1)
])), [
[M, B.disabledMessage]
]) : (a(), f("span", ec, P(B.title), 1))
]),
B.count ? (a(), f("div", {
key: 1,
class: x([
"rounded-full px-2 text-body-3xs transition-all min-w-6",
((V = s.value) == null ? void 0 : V.id) === B.id ? "text-primary bg-info-lighter dark:text-foreground" : "text-foreground-2 bg-highlight-3"
])
}, [
v("span", null, P(B.count), 1)
], 2)) : I("", !0),
B.tag ? (a(), A(nt, { key: 2 }, {
default: E(() => [
F(P(B.tag), 1)
]),
_: 2
}, 1024)) : I("", !0)
])
], 10, Zd);
}), 128))
], 512)
], 544),
v("div", tc, [
i.value ? (a(), f("button", {
key: 0,
class: "bg-foundation p-1 rounded-full border border-outline-3 shadow",
onClick: L
}, [
z(u($n), { class: "h-4 w-4" })
])) : I("", !0)
]),
v("div", sc, [
H($.$slots, "default", { activeItem: s.value })
])
]);
};
}
});
const nc = { class: "flex space-y-8 lg:space-y-0 lg:space-x-8 flex-col lg:flex-row" }, lc = { class: "lg:w-2/12" }, oc = { class: "flex w-full flex-col space-y-1" }, ac = ["data-tab-id", "disabled", "onClick"], rc = { class: "absolute top-0 right-0 left-0 bottom-0" }, ic = { class: "flex space-x-2 items-center px-2" }, uc = { class: "min-w-6" }, dc = {
key: 2,
class: "text-body-3xs font-medium py-0.5 px-1.5 text-foreground-2 bg-foundation-2 uppercase text-outline-4 rounded"
}, cc = { class: "lg:w-10/12" }, Op = /* @__PURE__ */ D({
__name: "Vertical",
props: /* @__PURE__ */ Ce({
items: {}
}, {
activeItem: { required: !0 },
activeItemModifiers: {}
}),
emits: ["update:activeItem"],
setup(e) {
const t = e, s = ke(e, "activeItem"), l = h(() => (n) => {
var d;
const i = ((d = s.value) == null ? void 0 : d.id) === n.id, c = [
"relative",
"flex items-center space-x-1.5",
"hover:bg-highlight-2",
"disabled:opacity-60 disabled:hover:border-transparent disabled:cursor-not-allowed disabled:hover:bg-transparent rounded-md",
"text-body-xs font-medium",
"py-1"
];
return i ? c.push("bg-primary-muted") : c.push("border-transparent text-foreground"), c;
}), r = (n) => {
s.value = n;
};
return ce(() => {
Ve && t.items.length && !s.value && r(t.items[0]);
}), re(
() => [t.items, s.value],
([n]) => {
Array.isArray(n) && n.length && !s.value && r(n[0]);
}
), (n, i) => {
const c = Qe("tippy");
return a(), f("div", nc, [
v("div", lc, [
v("div", oc, [
(a(!0), f(J, null, te(n.items, (d) => {
var p;
return a(), f("button", {
key: d.id,
"data-tab-id": d.id,
class: x([l.value(d)]),
disabled: d.disabled,
onClick: (m) => r(d)
}, [
Q(v("div", rc, null, 512), [
[
c,
d.disabled && d.disabledMessage ? d.disabledMessage : void 0
]
]),
v("div", ic, [
d.icon ? (a(), A(oe(d.icon), {
key: 0,
class: "shrink-0 h-4 w-4 stroke-[2px]"
})) : I("", !0),
v("span", uc, P(d.title), 1),
d.count ? (a(), f("div", {
key: 1,
class: x([
"rounded-full px-2 text-body-3xs transition-all min-w-6",
((p = s.value) == null ? void 0 : p.id) === d.id ? "text-primary bg-info-lighter dark:text-foreground" : "text-foreground-2 bg-foundation-2"
])
}, [
v("span", null, P(d.count), 1)
], 2)) : I("", !0),
d.tag ? (a(), f("div", dc, P(d.tag), 1)) : I("", !0)
])
], 10, ac);
}), 128))
])
]),
v("div", cc, [
H(n.$slots, "default", { activeItem: s.value })
])
]);
};
}
}), fc = {
key: 0,
class: "flex items-center justify-center py-3",
tabindex: "0"
}, pc = ["onClick", "onKeypress"], mc = {
key: 0,
class: "absolute right-1.5 space-x-1 flex items-center p-0 h-full"
}, hc = { class: "w-full text-center label-light text-foreground-2 italic" }, Mp = /* @__PURE__ */ D({
__name: "Table",
props: {
items: {},
buttons: {},
columns: {},
overflowCells: { type: Boolean },
onRowClick: {},
rowItemsAlign: { default: "center" },
emptyMessage: { default: "No data found" },
loading: { type: Boolean }
},
setup(e) {
const t = e, s = h(() => [
"w-full text-foreground text-sm border border-outline-3 rounded-lg",
"overflow-x-auto simple-scrollbar",
"h-full flex flex-col"
].join(" ")), l = h(() => ["w-full min-w-[750px]"].join(" ")), r = h(() => {
const o = [
"divide-y divide-outline-3 overflow-y-auto overflow-x-hidden simple-scrollbar",
l.value
];
return t.overflowCells && o.push("pb-32"), o.join(" ");
}), n = h(() => (t.buttons || []).length), i = h(() => {
let o = 16;
return n.value > 0 && (o = 48 + (n.value - 1) * 42), `${o}px`;
}), c = h(() => {
var g;
const o = [
"relative grid grid-cols-12 items-center space-x-6 px-4 py-0.5 min-w-[750px] text-body-xs"
];
switch (t.onRowClick && ((g = t.items) != null && g.length) && o.push("cursor-pointer hover:bg-highlight-1"), t.rowItemsAlign) {
case "center":
o.push("items-center");
break;
case "stretch":
o.push("items-stretch");
break;
}
return o.join(" ");
}), d = (o, g, y) => {
var C;
const w = [(o ? (C = t.columns.find((L) => L.id === o)) == null ? void 0 : C.classes : "") || ""];
return y != null && y.noPadding || (g === 0 ? w.push("px-1") : w.push("lg:p-0 px-1")), w.join(" ");
}, p = (o, g, y) => {
const S = [d(o, g, y)];
return g === 0 ? S.push(`bg-transparent py-2 ${o ? "pr-5" : "col-span-full"}`) : S.push("my-2"), S.join(" ");
}, m = (o) => {
var g;
(g = t.onRowClick) == null || g.call(t, o);
}, b = h(() => [
"z-10 grid grid-cols-12 items-center",
"space-x-6",
"px-4 py-3",
"bg-foundation-2 rounded-t-lg",
"font-medium text-body-2xs text-foreground-2",
"border-b border-outline-3",
l.value
]);
return (o, g) => {
var y;
return a(), f("div", {
class: x(s.value)
}, [
v("div", {
class: x(b.value),
style: ae({ paddingRight: i.value })
}, [
(a(!0), f(J, null, te(o.columns, (S, w) => (a(), f("div", {
key: S.id,
class: x(d(S.id, w))
}, P(S.header), 3))), 128))
], 6),
v("div", {
class: x(r.value)
}, [
o.loading || !o.items ? (a(), f("div", fc, [
z(u(ct))
])) : (y = o.items) != null && y.length ? (a(!0), f(J, { key: 1 }, te(o.items, (S) => (a(), f("div", {
key: S.id,
style: ae({ paddingRight: i.value }),
class: x(c.value),
tabindex: "0",
onClick: (w) => m(S),
onKeypress: (w) => m(S)
}, [
(a(!0), f(J, null, te(o.columns, (w, C) => (a(), f("div", {
key: w.id,
class: x(p(w.id, C)),
tabindex: "0"
}, [
H(o.$slots, w.id, { item: S }, () => [
g[0] || (g[0] = v("div", { class: "text-foreground-2 font-medium order-1" }, "Placeholder", -1))
])
], 2))), 128)),
o.buttons ? (a(), f("div", mc, [
(a(!0), f(J, null, te(o.buttons, (w) => (a(), f("div", {
key: w.label
}, [
Q(z(u(pe), {
"icon-left": w.icon,
size: "sm",
color: "outline",
"hide-text": "",
disabled: w.disabled,
class: x(w.class),
to: u(Le)(w.action) ? w.action : void 0,
onClick: ge((C) => u(Le)(w.action) ? u(Ht) : w.action(S), ["stop"])
}, null, 8, ["icon-left", "disabled", "class", "to", "onClick"]), [
[u(Ae), w.tooltip]
])
]))), 128))
])) : I("", !0)
], 46, pc))), 128)) : (a(), f("div", {
key: 2,
tabindex: "0",
style: ae({ paddingRight: i.value }),
class: x(c.value)
}, [
v("div", {
class: x(p(void 0, 0)),
tabindex: "0"
}, [
H(o.$slots, "empty", {}, () => [
v("div", hc, P(o.emptyMessage), 1)
])
], 2)
], 6)),
H(o.$slots, "loader")
], 2)
], 2);
};
}
}), vc = { class: "w-full flex flex-col items-center my-2 space-y-2 mt-4" }, bc = { class: "inline-flex items-center space-x-1" }, jp = /* @__PURE__ */ D({
__name: "InfiniteLoading",
props: {
settings: {},
allowRetry: { type: Boolean },
hideWhenComplete: { type: Boolean }
},
emits: ["infinite"],
setup(e) {
const t = j(null), s = j(!1);
return Ve && ce(() => {
const l = setInterval(() => {
var r;
(r = t.value) != null && r.isConnected && (s.value = !0, clearInterval(l));
}, 200);
}), (l, r) => (a(), f("div", {
ref_key: "wrapper",
ref: t
}, [
s.value ? (a(), A(u(il), Te({ key: 0 }, l.$props.settings || {}, {
onInfinite: r[0] || (r[0] = (n) => l.$emit("infinite", n))
}), {
spinner: E(() => [
z(Ct, {
loading: !0,
class: "my-2"
})
]),
complete: E(() => [
v("div", {
class: x({ "h-8": !l.hideWhenComplete })
}, null, 2)
]),
error: E(({ retry: n }) => [
v("div", vc, [
v("div", bc, [
z(u(In), { class: "w-5 h-5 text-danger" }),
r[1] || (r[1] = v("span", { class: "text-foreground-2" }, "An error occurred while loading", -1))
]),
l.allowRetry ? (a(), A(pe, {
key: 0,
onClick: n
}, {
default: E(() => [...r[2] || (r[2] = [
F("Retry", -1)
])]),
_: 2
}, 1032, ["onClick"])) : I("", !0)
])
]),
_: 1
}, 16)) : I("", !0)
], 512));
}
}), gc = { class: "relative group" }, yc = {
key: 0,
class: "absolute -top-1 -left-1 -right-1 -bottom-1 bg-blue-300 dark:bg-blue-500 opacity-5 dark:opacity-0 rounded-md blur-sm group-hover:opacity-60 dark:group-hover:opacity-30 transition duration-500"
}, Ap = /* @__PURE__ */ D({
__name: "Panel",
props: {
/**
* Use a `<form/>` element as a wrapper that will emit 'submit' events out from the component when they occur
*/
form: {
type: Boolean,
default: !1
},
/**
* Add a ring outline on hover
*/
ring: {
type: Boolean,
default: !1
},
/**
* Add a primary-colored glow on hover
*/
fancyGlow: {
type: Boolean,
default: !1
},
customPadding: {
type: Boolean,
default: !1
},
noShadow: {
type: Boolean,
default: !1
},
panelClasses: {
type: String
}
},
emits: ["submit"],
setup(e, { emit: t }) {
const s = t, l = e, r = h(
() => l.customPadding ? "" : "px-4 py-4 sm:px-6"
), n = h(
() => l.customPadding ? "" : "px-4 py-4 sm:p-6"
), i = h(() => {
const c = ["rounded-lg"];
return l.noShadow || c.push("shadow"), l.ring && c.push("ring-outline-1 hover:ring-1"), l.panelClasses && c.push(l.panelClasses), c.join(" ");
});
return (c, d) => (a(), f("div", gc, [
e.fancyGlow ? (a(), f("div", yc)) : I("", !0),
(a(), A(oe(e.form ? "form" : "div"), {
class: x([
"relative divide-outline-3 bg-foundation text-foreground flex flex-col divide-y overflow-hidden",
i.value
]),
onSubmit: d[0] || (d[0] = (p) => s("submit", p))
}, {
default: E(() => [
c.$slots.header ? (a(), f("div", {
key: 0,
class: x(r.value)
}, [
H(c.$slots, "header")
], 2)) : I("", !0),
v("div", {
class: x(["grow", n.value])
}, [
H(c.$slots, "default")
], 2),
c.$slots.footer ? (a(), f("div", {
key: 1,
class: x(r.value)
}, [
H(c.$slots, "footer")
], 2)) : I("", !0)
]),
_: 3
}, 40, ["class"]))
]));
}
}), xc = {}, wc = {
key: 0,
class: "shrink-0 pt-2"
};
function kc(e, t) {
return a(), f("aside", {
class: x(["flex flex-col justify-between h-full w-full", e.$slots.promo ? "" : "overflow-y-auto overflow-x-hidden simple-scrollbar"])
}, [
v("div", {
class: x(["flex flex-col h-full w-full", e.$slots.promo ? "overflow-y-auto overflow-x-hidden simple-scrollbar" : ""])
}, [
H(e.$slots, "default")
], 2),
e.$slots.promo ? (a(), f("div", wc, [
H(e.$slots, "promo")
])) : I("", !0)
], 2);
}
const Lp = /* @__PURE__ */ me(xc, [["render", kc]]), Cc = { class: "flex flex-col gap-y-1 sm:gap-y-2 border border-outline-3 rounded-lg py-2 px-3 sm:p-4 select-none" }, $c = {
key: 0,
class: "text-body-xs sm:text-heading-sm font-medium text-foreground"
}, Ic = {
key: 1,
class: "text-body-2xs sm:text-body-xs text-foreground-2 !leading-5"
}, Vp = /* @__PURE__ */ D({
__name: "Promo",
props: {
title: {},
text: {},
to: {},
buttonText: {}
},
emits: ["onClick"],
setup(e) {
return (t, s) => (a(), f("div", Cc, [
t.title ? (a(), f("h6", $c, P(t.title), 1)) : I("", !0),
t.text ? (a(), f("p", Ic, P(t.text), 1)) : I("", !0),
t.buttonText ? (a(), A(pe, {
key: 2,
size: "sm",
class: "mt-1",
to: t.to,
target: t.to ? "_blank" : void 0,
onClick: s[0] || (s[0] = (l) => t.$emit("onClick"))
}, {
default: E(() => [
F(P(t.buttonText), 1)
]),
_: 1
}, 8, ["to", "target"])) : I("", !0)
]));
}
}), Bc = {}, Sc = { class: "flex flex-col" };
function Pc(e, t) {
return a(), f("nav", Sc, [
H(e.$slots, "default")
]);
}
const zp = /* @__PURE__ */ me(Bc, [["render", Pc]]), Tc = {}, Oc = {
width: "16",
height: "16",
viewBox: "0 0 16 16",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
function Mc(e, t) {
return a(), f("svg", Oc, [...t[0] || (t[0] = [
v("path", {
d: "M8 3V13M3 8H13",
stroke: "currentColor",
"stroke-width": "1.5"
}, null, -1)
])]);
}
const jc = /* @__PURE__ */ me(Tc, [["render", Mc]]), Ac = {}, Lc = {
width: "14",
height: "14",
viewBox: "0 0 14 14",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
function Vc(e, t) {
return a(), f("svg", Lc, [...t[0] || (t[0] = [
v("path", {
d: "M3.66748 3.66687H3.00081C2.64719 3.66687 2.30805 3.80735 2.058 4.05739C1.80796 4.30744 1.66748 4.64658 1.66748 5.0002V11.0002C1.66748 11.3538 1.80796 11.693 2.058 11.943C2.30805 12.1931 2.64719 12.3335 3.00081 12.3335H9.00081C9.35443 12.3335 9.69357 12.1931 9.94362 11.943C10.1937 11.693 10.3341 11.3538 10.3341 11.0002V10.3335",
stroke: "currentColor",
"stroke-width": "1.5",
"stroke-linecap": "round",
"stroke-linejoin": "round"
}, null, -1),
v("path", {
d: "M12.59 3.39007C12.8526 3.12751 13.0001 2.77139 13.0001 2.40007C13.0001 2.02875 12.8526 1.67264 12.59 1.41007C12.3274 1.14751 11.9713 1 11.6 1C11.2287 1 10.8726 1.14751 10.61 1.41007L5 7.00007V9.00007H7L12.59 3.39007Z",
stroke: "currentColor",
"stroke-width": "1.5",
"stroke-linecap": "round",
"stroke-linejoin": "round"
}, null, -1),
v("path", {
d: "M9.66748 2.33313L11.6675 4.33313",
stroke: "currentColor",
"stroke-width": "1.5",
"stroke-linecap": "round",
"stroke-linejoin": "round"
}, null, -1)
])]);
}
const zc = /* @__PURE__ */ me(Ac, [["render", Vc]]), Ec = {}, Rc = {
width: "16",
height: "32",
viewBox: "0 0 16 32",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
function Fc(e, t) {
return a(), f("svg", Rc, [...t[0] || (t[0] = [
v("path", {
d: "M7.64645 17.7498C7.84171 17.9451 8.15829 17.9451 8.35355 17.7498L11.1464 14.9569C11.4614 14.642 11.2383 14.1034 10.7929 14.1034H5.20711C4.76165 14.1034 4.53857 14.642 4.85355 14.9569L7.64645 17.7498Z",
fill: "currentColor"
}, null, -1)
])]);
}
const qs = /* @__PURE__ */ me(Ec, [["render", Fc]]), Dc = { class: "flex flex-col group" }, _c = { class: "flex flex-1 items-center truncate justify-between" }, Hc = ["disabled"], Uc = { class: "flex flex-col" }, Ep = /* @__PURE__ */ D({
__name: "Group",
props: /* @__PURE__ */ Ce({
tag: {},
title: {},
collapsible: { type: Boolean },
collapsed: { type: Boolean },
icon: {},
iconText: {},
iconClick: { type: Function },
iconDisabled: { type: Boolean },
noHover: { type: Boolean },
nested: { type: Boolean },
alwaysShowIcon: { type: Boolean }
}, {
collapsed: { type: Boolean },
collapsedModifiers: {}
}),
emits: ["update:collapsed"],
setup(e) {
const t = ke(e, "collapsed");
return (s, l) => {
const r = Qe("tippy");
return a(), f("div", Dc, [
s.title ? (a(), f("div", {
key: 0,
class: x(["h-8 flex items-center justify-between select-none rounded-md", [s.collapsible && !s.noHover && "hover:bg-highlight-1"]])
}, [
(a(), A(oe(s.collapsible ? "button" : "div"), {
class: x(["flex items-center w-full", [
s.collapsible ? "group rounded-md gap-x-1" : "space-x-1 p-1 text-foreground-2",
s.collapsible && !s.noHover ? "py-0.5 px-2" : "pl-2"
]]),
onClick: l[0] || (l[0] = (n) => s.collapsible ? t.value = !t.value : void 0)
}, {
default: E(() => [
s.collapsible ? (a(), A(qs, {
key: 0,
class: x([[t.value ? "-rotate-90" : "", s.noHover ? "-ml-1" : ""], "text-foreground-2 shrink-0"])
}, null, 8, ["class"])) : I("", !0),
s.$slots["title-icon"] ? (a(), f("div", {
key: 1,
class: x(["flex items-center justify-center", [s.collapsible ? "ml-1 mr-2" : ""]])
}, [
H(s.$slots, "title-icon")
], 2)) : I("", !0),
v("div", _c, [
v("h6", {
class: x(["truncate text-body-2xs pr-2", [s.nested ? "text-foreground" : "font-semibold text-foreground-2"]])
}, P(s.title), 3),
s.tag ? (a(), A(nt, {
key: 0,
rounded: ""
}, {
default: E(() => [
F(P(s.tag), 1)
]),
_: 1
})) : I("", !0)
])
]),
_: 3
}, 8, ["class"])),
s.iconClick ? Q((a(), f("button", {
key: 0,
disabled: s.iconDisabled,
class: x(["group-hover:flex p-1 shrink-0 hover:bg-primary-muted rounded text-foreground-2", [
s.noHover ? "" : "mr-2",
s.alwaysShowIcon ? "flex" : "hidden",
s.iconDisabled ? "opacity-50 cursor-not-allowed" : ""
]]),
onClick: l[1] || (l[1] = //@ts-ignore
(...n) => s.iconClick && s.iconClick(...n))
}, [
s.icon === "edit" ? (a(), A(zc, {
key: 0,
class: "h-4 w-4"
})) : s.icon === "view" ? (a(), A(u(Bn), {
key: 1,
class: "h-4 w-4"
})) : (a(), A(jc, {
key: 2,
class: "h-4 w-4"
}))
], 10, Hc)), [
[r, s.iconText ? s.iconText : void 0]
]) : I("", !0)
], 2)) : I("", !0),
Q(v("div", Uc, [
H(s.$slots, "default")
], 512), [
[gs, !t.value]
])
]);
};
}
}), Wc = ["to"], Nc = {
key: 0,
class: "h-6 w-6 flex items-center justify-center"
}, qc = { class: "truncate" }, Kc = {
key: 1,
class: "flex flex-col"
}, Gc = { class: "text-heading-sm flex items-center space-x-1.5" }, Xc = { class: "pl-4" }, Rp = /* @__PURE__ */ D({
__name: "Item",
props: {
label: {},
to: {},
tag: {},
external: { type: Boolean },
disabled: { type: Boolean },
active: { type: Boolean },
tooltipText: {},
extraPadding: { type: Boolean },
colorClasses: {}
},
setup(e) {
const t = e, s = j(!0), r = !!bt().default, n = () => {
t.disabled || (s.value = !s.value);
};
return (i, c) => {
const d = Qe("tippy");
return r ? (a(), f("div", Kc, [
Q((a(), f("button", {
class: x(["flex space-x-1.5 items-center w-full rounded-md p-0.5", [
!i.disabled && "cursor-pointer text-foreground-2 hover:text-foreground",
i.disabled && "opacity-60"
]]),
onClick: n
}, [
z(qs, {
class: x(["h-1 w-2 shrink-0", [s.value ? "" : "-rotate-90"]])
}, null, 8, ["class"]),
v("h6", Gc, P(i.label), 1)
], 2)), [
[d, i.tooltipText]
]),
Q(v("div", Xc, [
H(i.$slots, "default")
], 512), [
[gs, s.value]
])
])) : Q((a(), f("div", {
key: 0,
to: i.to,
class: x(["group/item flex items-center justify-between space-x-2 shrink-0 text-body-xs text-foreground select-none rounded-md w-full py-1", [
!i.disabled && "cursor-pointer hover:bg-highlight-1",
i.disabled && "cursor-not-allowed",
i.active && "bg-highlight-3 hover:!bg-highlight-3",
i.$slots.icon ? "pl-1 pr-2" : "pr-2 pl-7",
i.extraPadding && "!pl-14"
]])
}, [
v("div", {
class: x(["flex items-center space-x-2 truncate", [i.disabled && "opacity-60"]])
}, [
i.$slots.icon ? (a(), f("div", Nc, [
H(i.$slots, "icon")
])) : I("", !0),
v("span", qc, P(i.label), 1),
i.external ? (a(), A(u(Sn), {
key: 1,
class: "h-2.5 w-2.5 !stroke-[3px] -ml-1 -mt-1.5 opacity-0 group-hover/item:opacity-100 shrink-0"
})) : I("", !0)
], 2),
i.tag ? (a(), A(nt, {
key: 0,
rounded: "",
"color-classes": i.colorClasses ?? (i.disabled ? "text-foreground-2 bg-primary-muted" : void 0)
}, {
default: E(() => [
F(P(i.tag), 1)
]),
_: 1
}, 8, ["color-classes"])) : I("", !0)
], 10, Wc)), [
[d, i.tooltipText]
]);
};
}
}), Zc = { key: 0 }, Jc = { class: "flex-1" }, Qc = { class: "flex gap-x-2" }, Fp = /* @__PURE__ */ D({
__name: "Alert",
props: {
color: { default: "success" },
withDismiss: { type: Boolean },
actions: {},
customIcon: {},
hideIcon: { type: Boolean },
size: { default: "default" }
},
emits: ["dismiss"],
setup(e) {
const t = e, s = bt(), l = h(() => !!s.description), r = h(() => !!s.title), n = h(() => {
if (t.customIcon)
return t.customIcon;
switch (t.color) {
case "info":
return ft;
case "warning":
return On;
case "danger":
return Tn;
case "success":
return Pn;
default:
return ft;
}
}), i = h(() => {
const o = ["rounded-lg text-foreground border"];
switch (t.size) {
case "2xs":
case "xs":
o.push("p-2");
break;
case "default":
default:
o.push(l.value ? "p-3 sm:p-4" : "p-2");
break;
}
switch (t.color) {
case "success":
o.push("bg-success-lightest border-outline-2");
break;
case "info":
o.push("bg-foundation-2 border-outline-3");
break;
case "danger":
o.push("bg-danger-lightest border-outline-2");
break;
case "warning":
o.push("bg-warning-lightest border-outline-2");
break;
case "neutral":
o.push("bg-foundation border-outline-2");
break;
}
return o.join(" ");
}), c = h(() => {
const o = ["flex items-center w-full"];
switch (t.size) {
case "2xs":
case "xs":
o.push("gap-x-1.5");
break;
case "default":
default:
o.push("gap-x-3");
break;
}
return o.join(" ");
}), d = h(() => {
const o = [];
switch (t.size) {
case "2xs":
o.push("h-4 w-4");
break;
case "xs":
o.push("h-5 w-5");
break;
case "default":
default:
o.push("h-6 w-6");
break;
}
switch (t.color) {
case "success":
o.push("text-success-darker");
break;
case "info":
o.push("text-info-darker dark:text-primary");
break;
case "danger":
o.push("text-danger-darker");
break;
case "warning":
o.push("text-warning-darker");
break;
case "neutral":
o.push("text-foreground-2");
break;
}
return o.join(" ");
}), p = h(() => {
const o = ["font-medium"];
switch (t.size) {
case "2xs":
o.push("text-body-2xs");
break;
case "default":
default:
o.push("text-body-xs");
break;
}
return o.join(" ");
}), m = h(() => {
const o = ["whitespace-normal"];
switch (t.size) {
case "2xs":
o.push("text-body-2xs pt-0.5");
break;
case "default":
default:
o.push("text-body-xs");
break;
}
return o.join(" ");
});
function b(o) {
o.onClick && o.onClick();
}
return (o, g) => (a(), f("div", {
class: x(i.value)
}, [
v("div", {
class: x(c.value)
}, [
o.hideIcon ? I("", !0) : (a(), f("div", Zc, [
(a(), A(oe(n.value), {
class: x(d.value),
"aria-hidden": "true"
}, null, 8, ["class"]))
])),
v("div", Jc, [
r.value ? (a(), f("h3", {
key: 0,
class: x(p.value)
}, [
H(o.$slots, "title", {}, () => [
g[1] || (g[1] = F("Title", -1))
])
], 2)) : I("", !0),
l.value ? (a(), f("div", {
key: 1,
class: x(m.value)
}, [
H(o.$slots, "description", {}, () => [
g[2] || (g[2] = F(" Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid pariatur, ipsum similique veniam. ", -1))
])
], 2)) : I("", !0)
]),
v("div", Qc, [
(a(!0), f(J, null, te(o.actions || [], (y, S) => (a(), A(pe, {
key: S,
color: "outline",
size: "sm",
to: y.url,
external: y.externalUrl || !1,
disabled: y.disabled || !1,
onClick: (w) => b(y)
}, {
default: E(() => [
F(P(y.title), 1)
]),
_: 2
}, 1032, ["to", "external", "disabled", "onClick"]))), 128))
]),
o.withDismiss ? (a(), f("div", {
key: 1,
class: x(["flex", [l.value ? "items-start" : "items-center"]])
}, [
z(pe, {
type: "button",
color: "subtle",
size: "sm",
onClick: g[0] || (g[0] = (y) => o.$emit("dismiss"))
}, {
default: E(() => [...g[3] || (g[3] = [
F(" Dismiss ", -1)
])]),
_: 1
})
], 2)) : I("", !0)
], 2)
], 2));
}
});
function Dp(e) {
var y, S;
const { get: t, initialState: s, readOptions: l, set: r, asyncRead: n = !0, debugging: i } = e, c = i == null ? void 0 : i.log, d = () => (new Error("Trace:").stack || "").substring(7), p = ((S = (y = e.debugging) == null ? void 0 : y.log) == null ? void 0 : S.logger) || console.debug, m = c && !c.writesOnly ? () => {
const w = t();
return p(`debugging: '${c.name}' read`, w, d()), w;
} : t, b = c && !c.readsOnly ? (w) => (p(`debugging: '${c.name}' written to`, w, d()), r(w)) : r, o = n ? zn(m, s, l) : h(m), g = h(() => o.value);
return g.update = b, g;
}
const Yc = /* @__PURE__ */ D({
__name: "ContextManager",
setup(e, { expose: t }) {
const l = nn().provides, r = Object.getOwnPropertySymbols(l).find(
(o) => o.description === "ComboboxContext"
);
r || console.error("FormTagsContextManager ctx key not found!");
const n = ln(r || "__undefined");
return n || console.error("FormTagsContextManager ctx not found!"), t({ goUp: () => {
n == null || n.goToOption(1);
}, goDown: () => {
n == null || n.goToOption(2);
}, open: () => {
n && n.openCombobox();
}, close: () => {
n == null || n.closeCombobox();
}, selectActive: () => {
n == null || n.selectActiveOption();
}, isOpen: () => (n == null ? void 0 : n.comboboxState.value) === 0 }), (o, g) => H(o.$slots, "default");
}
}), ef = ["for"], tf = ["disabled", "placeholder"], sf = {
key: 3,
class: "text-body-2xs font-normal"
}, nf = { key: 1 }, lf = ["id"], _p = /* @__PURE__ */ D({
__name: "Tags",
props: {
name: {},
help: {},
label: {},
showLabel: { type: Boolean },
rules: {},
validateOnMount: { type: Boolean },
validateOnValueUpdate: { type: Boolean },
autoFocus: { type: Boolean },
showClear: { type: Boolean },
showRequired: { type: Boolean },
showOptional: { type: Boolean },
color: { default: "page" },
wrapperClasses: {},
size: { default: "base" },
placeholder: {},
disabled: { type: Boolean },
useLabelInErrors: { type: Boolean, default: !0 },
getAutocompleteItems: {},
modelValue: {}
},
emits: ["update:modelValue", "change", "clear"],
setup(e, { expose: t, emit: s }) {
const l = (_) => _.type === "input", r = s, n = e, i = j(null), { focused: c } = En(i), d = j(
null
), {
coreInputClasses: p,
coreClasses: m,
labelClasses: b,
title: o,
helpTip: g,
helpTipId: y,
hideHelpTip: S,
helpTipClasses: w,
errorMessage: C,
clear: L,
value: N
} = Kt({
props: Be(n),
emit: r,
inputEl: i
// options: {
// customClear: () => (selectedItems.value = [])
// }
}), Y = j([]), R = j(!1), $ = j(!1), k = j(""), M = h({
get: () => N.value || [],
set: (_) => {
N.value = Ir(_).filter((W) => !!W.length);
}
}), B = h(() => {
switch (n.size) {
case "sm":
return "h-6";
case "lg":
return "h-10";
case "xl":
return "h-14";
case "base":
default:
return "h-8";
}
}), V = h(() => n.showClear && !!M.value.length), U = h(() => {
const _ = [
m.value,
n.disabled ? "cursor-not-allowed !bg-foundation-disabled !text-disabled-muted" : ""
];
return V.value && (C.value || n.showRequired) ? _.push("pr-14") : (V.value || C.value || n.showRequired) && _.push("pr-8"), C.value ? (_.push("border-2 border-danger text-danger-darker"), c.value && _.push("ring-1 ring-danger")) : (_.push("border border-outline-3"), c.value && _.push("ring-1 ring-outline-3")), _.join(" ");
}), xe = (_) => {
if (n.disabled)
return;
const W = M.value.indexOf(_);
if (W !== -1) {
const q = M.value.slice();
q.splice(W, 1), M.value = q;
}
}, he = () => {
var _;
(_ = i.value) == null || _.blur(), $.value = !1;
}, $e = (_) => {
if (_.key !== "Backspace" || k.value.length)
return;
const W = M.value.slice();
W.pop(), M.value = W, $.value = !1;
}, Oe = () => {
var _, W, q;
(_ = d.value) != null && _.isOpen() ? (W = d.value) == null || W.goUp() : (q = d.value) == null || q.open();
}, Ee = () => {
var _, W, q;
(_ = d.value) != null && _.isOpen() ? (W = d.value) == null || W.goDown() : (q = d.value) == null || q.open();
}, ie = async () => {
n.getAutocompleteItems && (R.value = !0, Y.value = await Promise.resolve(
n.getAutocompleteItems(k.value)
), R.value = !1);
}, ue = st(ie, 1e3), ne = async () => {
R.value = !0, await ue();
}, le = (_, W) => {
var fe, ve;
if (l(_) ? _.data === " " || _.data === "," || _.data === ";" : !0) {
let de = !1;
if ((fe = d.value) != null && fe.isOpen() && Y.value.length && !W)
(ve = d.value) == null || ve.selectActive(), de = !0;
else {
const we = k.value.trim().substring(0, k.value.length - (l(_) ? 1 : 0)), Re = M.value.includes(we);
we.length > 0 && !Re && (M.value = [...M.value, we], de = !0);
}
de && (k.value = "", $.value = !1);
} else
$.value = !!k.value.length;
};
return re($, (_, W) => {
var q, fe;
_ && !W ? n.getAutocompleteItems && ((q = d.value) == null || q.open()) : !_ && W && ((fe = d.value) == null || fe.close());
}), re(k, () => {
ne();
}), ce(() => {
ie();
}), t({ resolveAutocompleteItems: ie }), (_, W) => (a(), A(u(el), {
modelValue: M.value,
"onUpdate:modelValue": W[5] || (W[5] = (q) => M.value = q),
as: "div",
multiple: "",
clearable: "",
class: x([_.wrapperClasses])
}, {
default: E(() => [
z(Yc, {
ref_key: "ctxManager",
ref: d
}, {
default: E(() => [
v("label", {
for: _.name,
class: x(u(b))
}, [
v("span", null, P(u(o)), 1)
], 10, ef),
v("div", {
class: x(["relative flex flex-wrap items-center space-x-1 px-2 py-1", U.value])
}, [
(a(!0), f(J, null, te(M.value, (q) => (a(), A(nt, {
key: q,
"icon-left": _.disabled ? void 0 : u(Ge),
"clickable-icon": "",
size: "lg",
onClickIcon: () => xe(q)
}, {
default: E(() => [
F(P(q), 1)
]),
_: 2
}, 1032, ["icon-left", "onClickIcon"]))), 128)),
Q(v("input", {
ref_key: "inputEl",
ref: i,
"onUpdate:modelValue": W[0] || (W[0] = (q) => k.value = q),
disabled: _.disabled,
class: x(["bg-transparent grow shrink border-0 focus:ring-0 p-0", [u(p), B.value]]),
style: { "flex-basis": "70px", "min-width": "70px" },
placeholder: M.value.length ? void 0 : _.placeholder,
onInput: le,
onKeydown: [
Ue(he, ["escape"]),
W[1] || (W[1] = Ue(ge((q) => le(q, !0), ["stop", "prevent"]), ["enter"])),
Ue(le, ["tab"]),
Ue($e, ["backspace"]),
Ue(Oe, ["arrow-up"]),
Ue(Ee, ["arrow-down"])
],
onBlur: W[2] || (W[2] = (q) => $.value = !1)
}, null, 42, tf), [
[Ke, k.value]
]),
V.value ? (a(), f("a", {
key: 0,
title: "Clear input",
class: "absolute top-2 right-0 flex items-center pr-2 cursor-pointer",
onClick: W[3] || (W[3] = //@ts-ignore
(...q) => u(L) && u(L)(...q)),
onKeydown: W[4] || (W[4] = //@ts-ignore
(...q) => u(L) && u(L)(...q))
}, [
W[6] || (W[6] = v("span", { class: "text-xs sr-only" }, "Clear input", -1)),
z(u(Ge), {
class: "h-5 w-5 text-foreground",
"aria-hidden": "true"
})
], 32)) : I("", !0),
u(C) ? (a(), f("div", {
key: 1,
class: x([
"pointer-events-none absolute top-[10px] right-0 flex items-center",
V.value ? "pr-8" : "pr-2"
])
}, [
z(u(Rt), {
class: "h-4 w-4 text-danger",
"aria-hidden": "true"
})
], 2)) : _.showRequired ? (a(), f("div", {
key: 2,
class: x(["pointer-events-none absolute top-[2px] text-4xl right-0 flex items-center text-danger opacity-50", V.value ? "pr-8" : "pr-2"])
}, " * ", 2)) : _.showOptional ? (a(), f("div", sf, "(optional)")) : I("", !0)
], 2),
z(u(Is), {
leave: "transition ease-in duration-100",
"leave-from": "opacity-100",
"leave-to": "opacity-0",
class: "relative px-0.5"
}, {
default: E(() => [
z(u(tl), { class: "absolute top-1 max-h-60 w-full overflow-auto simple-scrollbar rounded-md bg-foundation py-1 shadow label label--light outline outline-2 outline-primary-muted focus:outline-none" }, {
default: E(() => [
R.value ? (a(), f("div", {
key: 0,
class: x(["px-1", Y.value.length ? "mb-1" : ""])
}, [
z(Ct, { loading: !0 })
], 2)) : I("", !0),
!Y.value.length && !R.value ? (a(), f("div", nf, [...W[7] || (W[7] = [
v("div", { class: "text-foreground-2 text-center" }, [
F(" Press "),
v("strong", null, "Enter"),
F(" to create tag ⚡ ")
], -1)
])])) : I("", !0),
Y.value.length ? (a(!0), f(J, { key: 2 }, te(Y.value, (q) => (a(), A(u(sl), {
key: q,
as: "template",
value: q
}, {
default: E(({ selected: fe, active: ve }) => [
v("li", {
class: x(["relative cursor-pointer select-none py-1.5 pl-3", {
"text-primary": ve,
"text-foreground": !ve
}])
}, [
v("span", {
class: x(["block truncate", { "font-medium": fe, "font-normal": !fe }])
}, P(q), 3),
fe ? (a(), f("span", {
key: 0,
class: x(["absolute top-0 bottom-0 right-0 flex items-center pr-4", { "text-primary": ve, "text-foreground": !ve }])
}, [
z(u(Et), {
class: "h-5 w-5",
"aria-hidden": "true"
})
], 2)) : I("", !0)
], 2)
]),
_: 2
}, 1032, ["value"]))), 128)) : I("", !0)
]),
_: 1
})
]),
_: 1
}),
u(y) && !u(S) ? (a(), f("p", {
key: 0,
id: u(y),
class: x(["mt-2", u(w)])
}, P(u(g)), 11, lf)) : I("", !0)
]),
_: 1
}, 512)
]),
_: 1
}, 8, ["modelValue", "class"]));
}
});
function Xt(e) {
const { props: t } = e, s = h(() => {
var d;
switch ((d = t.size) == null ? void 0 : d.value) {
case "2xs":
return "h-4";
case "xs":
return "h-5";
case "sm":
return "h-6";
case "lg":
return "h-10";
case "xl":
return "h-14";
case "xxl":
return "h-24";
case "3xl":
return "h-32";
case "editable":
return "h-60";
case "base":
default:
return "h-8";
}
}), l = h(() => {
var d;
switch ((d = t.size) == null ? void 0 : d.value) {
case "2xs":
return "w-4";
case "xs":
return "w-5";
case "sm":
return "w-6";
case "lg":
return "w-10";
case "xl":
return "w-14";
case "xxl":
return "w-24";
case "3xl":
return "w-32";
case "editable":
return "w-60";
case "base":
default:
return "w-8";
}
}), r = h(() => {
var d;
switch ((d = t.size) == null ? void 0 : d.value) {
case "2xs":
case "xs":
return "text-tiny";
case "sm":
return "text-xs";
case "lg":
return "text-md";
case "xl":
return "text-2xl";
case "xxl":
return "text-2xl";
case "3xl":
return "text-3xl";
case "editable":
return "h1";
case "base":
default:
return "text-body-2xs";
}
}), n = h(() => {
var d;
switch ((d = t.size) == null ? void 0 : d.value) {
case "2xs":
case "xs":
return "w-3 h-3";
case "sm":
return "w-3 h-3";
case "lg":
return "w-5 h-5";
case "xl":
return "w-8 h-8";
case "xxl":
return "w-10 h-10";
case "editable":
return "w-20 h-20";
case "base":
default:
return "w-4 h-4";
}
}), i = h(
() => `${l.value} ${s.value} ${r.value}`
);
return { heightClasses: s, widthClasses: l, sizeClasses: i, iconClasses: n };
}
const of = { key: 2 }, Lt = /* @__PURE__ */ D({
__name: "Avatar",
props: {
user: { default: null },
size: { default: "base" },
hoverEffect: { type: Boolean, default: !1 },
active: { type: Boolean },
noBorder: { type: Boolean },
noBg: { type: Boolean },
hideTooltip: { type: Boolean },
rounded: { type: Boolean, default: !0 },
lightStyle: { type: Boolean, default: !1 }
},
setup(e) {
const t = e, { sizeClasses: s, iconClasses: l } = Xt({ props: Be(t) }), r = h(() => {
var g, y, S, w;
if (!((y = (g = t.user) == null ? void 0 : g.name) != null && y.length))
return;
const m = t.user.name.split(" "), b = ((S = m[0]) == null ? void 0 : S[0]) || "", o = ((w = m[1]) == null ? void 0 : w[0]) || "";
return t.size === "sm" || t.size === "xs" ? b : b + o;
}), n = h(() => t.noBorder ? "" : t.lightStyle ? "border border-outline-2" : "border border-foundation"), i = h(() => t.noBg ? "" : t.lightStyle ? "bg-foundation-2" : "bg-info-darker"), c = h(() => t.hoverEffect ? "hover:border-primary focus:border-primary active:scale-95" : ""), d = h(() => t.active ? "border-primary" : ""), p = h(() => t.lightStyle ? "text-foreground-3" : "");
return (m, b) => {
const o = Qe("tippy");
return a(), f("div", {
class: x([
"text-foreground-on-primary flex shrink-0 items-center justify-center overflow-hidden uppercase transition",
m.rounded ? "rounded-full" : "rounded-md",
u(s),
i.value,
n.value,
c.value,
d.value
])
}, [
H(m.$slots, "default", {}, () => {
var g, y, S;
return [
(g = m.user) != null && g.avatar ? Q((a(), f("div", {
key: 0,
class: "h-full w-full bg-cover bg-center bg-no-repeat",
style: ae({ backgroundImage: `url('${m.user.avatar}')` })
}, null, 4)), [
[o, m.hideTooltip || (y = t.user) == null ? void 0 : y.name]
]) : r.value ? Q((a(), f("div", {
key: 1,
class: x([p.value, "flex h-full w-full select-none items-center justify-center"])
}, [
F(P(r.value), 1)
], 2)), [
[o, m.hideTooltip || (S = t.user) == null ? void 0 : S.name]
]) : (a(), f("div", of, [
z(u(rl), {
class: x(u(l))
}, null, 8, ["class"])
]))
];
}),
H(m.$slots, "absolute-anchor")
], 2);
};
}
}), Hp = /* @__PURE__ */ D({
__name: "AvatarGroup",
props: {
users: { default: () => [] },
overlap: { type: Boolean, default: !0 },
size: { default: "base" },
maxCount: { default: void 0 },
hideTooltips: { type: Boolean, default: !1 },
maxAvatars: { default: void 0 },
onHiddenCountClick: { type: Function, default: void 0 }
},
setup(e) {
const t = e, s = j(null), l = j(null), { hiddenItemCount: r } = Hs({
elementToWatchForChanges: s,
itemContainer: l,
trackResize: !0,
trackMutations: !0
}), { heightClasses: n } = Xt({ props: Be(t) }), i = h(() => t.maxCount ? Math.max(t.users.length - t.maxCount, 0) : 0), c = h(() => {
const m = t.users, b = Math.min(t.maxCount ?? 1 / 0, t.maxAvatars ?? 1 / 0);
return m.slice(0, b);
}), d = h(() => t.maxAvatars ? Math.max(t.users.length - t.maxAvatars, 0) : 0), p = h(
() => r.value + i.value + d.value
);
return (m, b) => (a(), f("div", {
ref_key: "elementToWatchForChanges",
ref: s,
class: x(`flex ${m.overlap ? "-space-x-2" : ""}`)
}, [
v("div", {
ref_key: "itemContainer",
ref: l,
class: x(`flex flex-wrap overflow-hidden ${m.overlap ? "-space-x-2 " : ""} ${u(n)}`)
}, [
(a(!0), f(J, null, te(c.value, (o, g) => (a(), A(Lt, {
key: o.id || g,
user: o,
size: m.size,
"hide-tooltip": m.hideTooltips
}, null, 8, ["user", "size", "hide-tooltip"]))), 128))
], 2),
p.value ? (a(), A(Lt, {
key: 0,
size: m.size,
class: x(["select-none", { "cursor-pointer": !!m.onHiddenCountClick }]),
onClick: b[0] || (b[0] = (o) => m.onHiddenCountClick && m.onHiddenCountClick())
}, {
default: E(() => [
F(" +" + P(p.value), 1)
]),
_: 1
}, 8, ["size", "class"])) : I("", !0)
], 2));
}
}), af = /* @__PURE__ */ D({
__name: "Icon",
props: {
loading: { type: Boolean, default: !0 },
size: { default: "base" }
},
setup(e) {
const t = e, s = h(() => {
const l = [""];
switch (l.push(t.loading ? "opacity-100" : "opacity-0"), t.size) {
case "base":
l.push("h-5 w-5");
break;
case "sm":
l.push("h-4 w-4");
break;
case "lg":
l.push("h-8 w-8");
break;
}
return l.join(" ");
});
return (l, r) => (a(), f("svg", {
class: x(["spinner", s.value]),
width: "32px",
height: "40px",
viewBox: "0 0 66 66",
xmlns: "http://www.w3.org/2000/svg"
}, [...r[0] || (r[0] = [
v("circle", {
class: "path",
fill: "none",
stroke: "currentColor",
"stroke-width": "6",
"stroke-linecap": "round",
cx: "33",
cy: "33",
r: "30"
}, null, -1)
])], 2));
}
});
const ct = /* @__PURE__ */ me(af, [["__scopeId", "data-v-d0434356"]]), rf = { class: "flex flex-col items-center space-y-2" }, uf = {
key: 1,
class: "relative group"
}, df = ["src", "alt"], cf = { class: "opacity-0 transition-all absolute group-hover:opacity-100 top-0 right-0 left-0 bottom-0 flex items-end justify-center bottom-4" }, ff = {
key: 2,
class: "w-full text-center text-danger text-sm"
}, Up = /* @__PURE__ */ D({
__name: "AvatarEditable",
props: /* @__PURE__ */ Ce({
modelValue: {},
placeholder: {},
name: {},
rules: {},
validateOnMount: { type: Boolean },
validateOnValueUpdate: { type: Boolean },
disabled: { type: Boolean },
size: {},
defaultImg: {},
rounded: { type: Boolean, default: !0 },
lightStyle: { type: Boolean, default: !1 }
}, {
editMode: { type: Boolean },
editModeModifiers: {}
}),
emits: /* @__PURE__ */ Ce(["save", "update:modelValue"], ["update:editMode"]),
setup(e, { expose: t, emit: s }) {
const l = on({
loader: () => import("/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/AvatarEditor-b3722ced.js"),
loadingComponent: ct,
delay: 100
}), r = s, n = e, { value: i, errorMessage: c } = De(n.name, n.rules, {
validateOnMount: n.validateOnMount,
validateOnValueUpdate: n.validateOnValueUpdate,
initialValue: n.modelValue || void 0
}), { sizeClasses: d } = Xt({ props: Be(n) }), p = ke(e, "editMode"), m = h(
() => ({
avatar: i.value,
name: n.placeholder
})
), b = (y) => {
i.value = y, r("save", y);
};
return t({ open: () => p.value = !0, close: () => p.value = !1 }), (y, S) => (a(), f("div", rf, [
p.value ? (a(), A(u(l), {
key: 0,
user: m.value,
disabled: y.disabled,
size: y.size,
rounded: y.rounded,
onCancel: S[0] || (S[0] = (w) => p.value = !1),
onSave: b
}, null, 8, ["user", "disabled", "size", "rounded"])) : (a(), f("div", uf, [
!m.value.avatar && y.defaultImg ? (a(), f("img", {
key: 0,
src: y.defaultImg,
alt: m.value.name,
class: x(u(d))
}, null, 10, df)) : (a(), A(Lt, {
key: 1,
"hide-tooltip": "",
user: m.value,
size: y.size,
"light-style": y.lightStyle,
rounded: y.rounded
}, null, 8, ["user", "size", "light-style", "rounded"])),
v("div", cf, [
z(pe, {
size: "sm",
disabled: y.disabled,
color: "outline",
onClick: S[1] || (S[1] = (w) => p.value = !0)
}, {
default: E(() => [...S[2] || (S[2] = [
F(" Change ", -1)
])]),
_: 1
}, 8, ["disabled"])
])
])),
u(c) ? (a(), f("div", ff, P(u(c)), 1)) : I("", !0)
]));
}
});
class ze extends Error {
constructor(t, s) {
t || (t = new.target.defaultMessage), super(t, s);
}
}
/**
* Default message if none is passed
*/
Se(ze, "defaultMessage", "Unexpected error occurred");
class pf extends ze {
}
Se(pf, "defaultMessage", "An unexpected logic error occurred!");
class mf extends ze {
}
Se(mf, "defaultMessage", "Attempting to access an uninitialized resource");
class hf extends ze {
}
Se(hf, "defaultMessage", "getCurrentInstance() returned null. Method must be called at the top of a setup function");
class vf extends ze {
}
Se(vf, "defaultMessage", "Operation not supported in current (server or client) environment");
var Zt = /* @__PURE__ */ ((e) => (e.AnyAudio = "audio/*", e.AnyVideo = "video/*", e.AnyImage = "image/*", e))(Zt || {});
function bf(e, t) {
const s = mr(
Object.values(Zt),
t
);
for (const n of s)
switch (n) {
case "audio/*":
if (e.type.startsWith("audio"))
return !0;
break;
case "image/*":
if (e.type.startsWith("image"))
return !0;
break;
case "video/*":
if (e.type.startsWith("video"))
return !0;
break;
}
const l = lr(t, s), r = gf(e.name);
if (!r)
return new Ks();
for (const n of l)
if (n.toLowerCase() === r.toLowerCase())
return !0;
return new Gs();
}
function gf(e) {
const t = e.split(".");
if (t.length < 2)
return null;
const s = t.pop() || null;
return s ? `.${s}` : null;
}
function yf(e) {
return e.startsWith(".") || Object.values(Zt).includes(e);
}
function vs(e) {
const t = (n) => parseFloat(n.toFixed(2)).toString();
if (e < 1024)
return `${e}bytes`;
const s = e / 1024;
if (s < 1024)
return `${t(s)}KB`;
const l = s / 1024;
if (l < 1024)
return `${t(l)}MB`;
const r = l / 1024;
return `${t(r)}GB`;
}
function xf(e) {
const t = {
name: e.name,
lastModified: e.lastModified,
size: e.size,
type: e.type
};
return bn(JSON.stringify(t));
}
class Ks extends ze {
}
Se(Ks, "defaultMessage", "The selected file has a missing extension");
class Gs extends ze {
}
Se(Gs, "defaultMessage", "The selected file type is forbidden");
function wf(e) {
if (!e)
return;
const t = e.split(",").map((s) => yf(s) ? s : null).filter((s) => s !== null);
return t.length ? t : void 0;
}
function kf(e) {
const { disabled: t, accept: s, multiple: l, sizeLimit: r, countLimit: n } = e, i = h(() => wf(u(s))), c = (d) => {
const p = [], m = i.value;
for (const b of d) {
const o = xf(b), g = u(l) ? u(n) : 1;
if (!p.find((y) => y.id === o)) {
if (g && p.length >= g)
break;
if (m) {
const y = bf(b, m);
if (y instanceof Error) {
p.push({
file: b,
id: o,
error: y
});
continue;
}
}
if (b.size > u(r)) {
p.push({
file: b,
id: o,
error: new Xs(
`The selected file's size (${vs(
b.size
)}) is too big (over ${vs(u(r))})`
)
});
continue;
}
p.push({ file: b, id: o, error: null });
}
}
return p;
};
return {
/**
* Validate incoming files and build UploadableFileItem structs out of them
*/
buildUploadableFiles: (d) => {
if (!u(t || !1))
return c(d);
}
};
}
class Xs extends ze {
}
Se(Xs, "defaultMessage", "The selected file's size is too large");
const Cf = ["accept", "multiple"], Wp = /* @__PURE__ */ D({
__name: "Zone",
props: {
accept: {},
multiple: { type: Boolean },
sizeLimit: { default: 1024 * 1024 * 100 },
countLimit: {},
disabled: { type: Boolean }
},
emits: ["files-selected"],
setup(e, { expose: t, emit: s }) {
const l = s, r = e, n = j(null), i = j(null), { buildUploadableFiles: c } = kf({
sizeLimit: h(() => r.sizeLimit),
countLimit: h(() => r.countLimit),
accept: h(() => r.accept),
multiple: h(() => r.multiple),
disabled: h(() => r.disabled)
}), d = (o) => {
const g = c(o);
g != null && g.length && l("files-selected", { files: g });
}, { isOverDropZone: p } = Rn(n, (o) => {
o != null && o.length && d(o);
}), m = () => {
const o = i.value;
if (!o)
return;
const g = [...o.files || []];
o.value = "", g.length && d(g);
}, b = () => {
var o;
(o = i.value) == null || o.click();
};
return t({
triggerPicker: b
}), (o, g) => (a(), f("div", {
ref_key: "fileUploadZone",
ref: n,
class: "file-upload-zone"
}, [
H(o.$slots, "default", {
isDraggingFiles: u(p),
openFilePicker: b,
activatorOn: { click: b }
}),
v("input", {
ref_key: "fileInput",
ref: i,
type: "file",
class: "hidden",
accept: o.accept,
multiple: o.multiple,
onClick: g[0] || (g[0] = ge(() => {
}, ["stop"])),
onChange: m
}, null, 40, Cf)
], 512));
}
}), bs = (e) => {
var t;
e.code === "Enter" && ((t = e.target) == null || t.click());
}, $f = {
created(e) {
e.setAttribute("tabindex", "0"), e.addEventListener("keypress", bs);
},
unmounted(e) {
e.removeEventListener("keypress", bs);
}
}, If = { class: "relative w-full bg-outline-3 rounded h-1.5 overflow-hidden" }, Np = /* @__PURE__ */ D({
__name: "ProgressBar",
props: {
currentValue: {},
maxValue: {}
},
setup(e) {
const t = e, s = h(() => t.currentValue / t.maxValue * 100), l = h(() => s.value >= 100 ? "bg-danger" : s.value >= 80 ? "bg-warning" : "bg-success");
return (r, n) => (a(), f("div", If, [
v("div", {
class: x(["aboslute left-0 top-0 rounded h-1.5", l.value]),
style: ae({ width: `${s.value <= 100 ? s.value : 100}%` })
}, null, 6)
]));
}
}), Bf = { class: "bg-foundation-page shadow-sm flex flex-col gap-y-1 sm:gap-y-2 border border-outline-3 rounded-lg py-2 px-3 sm:p-4 select-none" }, Sf = { class: "flex justify-between items-center" }, Pf = {
key: 0,
class: "text-body-xs sm:text-heading-sm font-medium text-foreground"
}, Tf = {
key: 0,
class: "text-body-2xs sm:text-body-xs text-foreground-2 !leading-5"
}, Of = { class: "flex justify-end" }, qp = /* @__PURE__ */ D({
__name: "PromoAlert",
props: {
title: {},
text: {},
button: {},
showCloser: { type: Boolean }
},
emits: ["click", "close"],
setup(e) {
return (t, s) => (a(), f("div", Bf, [
v("div", Sf, [
t.title ? (a(), f("h6", Pf, P(t.title), 1)) : I("", !0),
t.showCloser ? Q((a(), A(u(ys), {
key: 1,
class: "h-4 w-4 cursor-pointer focus:outline-none",
onClick: s[0] || (s[0] = (l) => t.$emit("close", l))
}, null, 512)), [
[u($f)]
]) : I("", !0)
]),
t.text ? (a(), f("p", Tf, P(t.text), 1)) : I("", !0),
v("div", Of, [
t.button ? (a(), A(pe, {
key: 0,
size: "sm",
class: "mt-1",
to: t.button.to,
target: t.button.to ? "_blank" : void 0,
onClick: s[1] || (s[1] = (l) => t.$emit("click", l))
}, {
default: E(() => [
F(P(t.button.title), 1)
]),
_: 1
}, 8, ["to", "target"])) : I("", !0)
])
]));
}
}), Mf = {
key: 0,
class: "flex items-center justify-between"
}, jf = ["for"], Af = ["min", "max", "step", "value", "disabled", "aria-label"], Lf = ["id", "name", "min", "max", "step", "value", "disabled", "aria-label", "aria-valuemin", "aria-valuemax", "aria-valuenow"], Vf = ["min", "max", "step", "value", "disabled", "aria-label"], zf = /* @__PURE__ */ D({
__name: "Range",
props: /* @__PURE__ */ Ce({
min: {},
max: {},
step: {},
name: {},
label: {},
disabled: { type: Boolean },
hideHeader: { type: Boolean },
inputBelowSlider: { type: Boolean },
style: {}
}, {
modelValue: {
type: Number,
default: 0
},
modelModifiers: {}
}),
emits: /* @__PURE__ */ Ce(["update:modelValue"], ["update:modelValue"]),
setup(e, { emit: t }) {
const s = e, l = t, r = ke(e, "modelValue"), n = (p) => Math.max(s.min, Math.min(s.max, p)), i = (p) => {
const m = p.target, b = Number(m.value), o = n(b);
r.value = o, l("update:modelValue", o);
}, c = (p) => {
const m = p.target, b = Number(m.value);
r.value = b, l("update:modelValue", b);
}, d = (p) => {
const m = p.target, b = Number(m.value), o = n(b);
b !== o && (m.value = o.toString()), r.value = o, l("update:modelValue", o);
};
return (p, m) => (a(), f("div", {
class: "w-full flex flex-col gap-1.5",
style: ae(s.style)
}, [
p.hideHeader ? I("", !0) : (a(), f("div", Mf, [
v("label", {
for: p.name,
class: x(["block text-body-2xs", p.disabled ? "text-foreground-2" : "text-foreground"])
}, P(p.label || p.name), 11, jf),
v("input", {
type: "number",
min: p.min,
max: p.max,
step: p.step,
value: r.value,
disabled: p.disabled,
"aria-label": `${p.label} current value`,
class: "w-8 text-body-2xs text-foreground-2 bg-transparent border-0 focus:outline-none hover:ring-1 hover:ring-outline-2 focus:ring-1 focus:ring-outline-4 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:ring-0 rounded !p-0.5 text-right",
onInput: c,
onBlur: d
}, null, 40, Af)
])),
v("input", {
id: p.name,
name: p.name,
type: "range",
min: p.min,
max: p.max,
step: p.step,
value: r.value,
disabled: p.disabled,
class: x(["mt-1.5 w-full h-4 outline-none slider slider-gradient", {
"disabled:opacity-50 disabled:cursor-not-allowed": p.disabled,
"!mt-0": p.inputBelowSlider
}]),
"aria-label": p.label,
"aria-valuemin": p.min,
"aria-valuemax": p.max,
"aria-valuenow": r.value,
onInput: i
}, null, 42, Lf),
p.inputBelowSlider ? (a(), f("input", {
key: 1,
type: "number",
min: p.min,
max: p.max,
step: p.step,
value: r.value,
disabled: p.disabled,
"aria-label": `${p.label} current value`,
class: "w-16 text-body-2xs text-foreground-2 bg-transparent border-0 focus:outline-none hover:ring-1 hover:ring-outline-2 focus:ring-1 focus:ring-outline-4 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:ring-0 rounded !p-1",
onInput: c,
onBlur: d
}, null, 40, Vf)) : I("", !0)
], 4));
}
});
const Kp = /* @__PURE__ */ me(zf, [["__scopeId", "data-v-0d310a20"]]), Ef = { class: "relative" }, Rf = ["id", "name", "min", "max", "step", "value", "disabled", "aria-label", "aria-valuemin", "aria-valuemax", "aria-valuenow"], Ff = ["id", "name", "min", "max", "step", "value", "disabled", "aria-label", "aria-valuemin", "aria-valuemax", "aria-valuenow"], Df = {
class: "absolute top-0.5 h-3 w-full pointer-events-none z-0 overflow-hidden",
style: { background: "transparent" }
}, _f = {
key: 0,
class: "flex justify-between gap-2 mt-0.5"
}, Hf = ["min", "max", "step", "disabled", "aria-label"], Uf = ["min", "max", "step", "disabled", "aria-label"], Wf = /* @__PURE__ */ D({
__name: "DualRange",
props: /* @__PURE__ */ Ce({
min: {},
max: {},
step: {},
name: {},
disabled: { type: Boolean },
showFields: { type: Boolean },
style: {}
}, {
modelValue: {
default: () => ({ min: 0, max: 100 })
},
modelModifiers: {}
}),
emits: ["update:modelValue"],
setup(e) {
const t = e, s = ke(e, "modelValue"), l = (o) => Math.max(t.min, Math.min(t.max, o)), r = h({
get: () => s.value.min.toString(),
set: (o) => {
const g = Number(o);
if (!isNaN(g)) {
const y = l(g), S = Math.min(y, s.value.max);
s.value = { ...s.value, min: S };
}
}
}), n = h({
get: () => s.value.max.toString(),
set: (o) => {
const g = Number(o);
if (!isNaN(g)) {
const y = l(g), S = Math.max(y, s.value.min);
s.value = { ...s.value, max: S };
}
}
}), i = h(() => {
const o = (s.value.min - t.min) / (t.max - t.min) * 100;
return Math.max(0, o - 0.5);
}), c = h(() => {
const o = (s.value.max - t.min) / (t.max - t.min) * 100;
return Math.min(100, o + 0.5);
}), d = h(() => {
const o = i.value;
return o < 25 ? `${o + 2.5}%` : o > 75 ? `${o - 2.5}%` : `${o}%`;
}), p = h(() => {
const o = 100 - c.value;
return o < 25 ? `${o + 2.5}%` : o > 75 ? `${o - 2.5}%` : `${o}%`;
}), m = (o) => {
const g = o.target, y = l(Number(g.value));
s.value = {
...s.value,
min: Math.min(y, s.value.max)
};
}, b = (o) => {
const g = o.target, y = l(Number(g.value));
s.value = {
...s.value,
max: Math.max(y, s.value.min)
};
};
return (o, g) => (a(), f("div", null, [
v("div", {
class: "w-full h-5 max-w-96",
style: ae(t.style)
}, [
v("div", Ef, [
v("input", {
id: `${o.name}-min`,
name: `${o.name}-min`,
type: "range",
min: o.min,
max: o.max,
step: o.step,
value: s.value.min,
disabled: o.disabled,
class: x(["absolute w-full h-4 outline-none slider slider-min", { "disabled:opacity-50 disabled:cursor-not-allowed": o.disabled }]),
style: { "-webkit-appearance": "none", appearance: "none", "pointer-events": "none" },
"aria-label": `${o.name} minimum`,
"aria-valuemin": o.min,
"aria-valuemax": o.max,
"aria-valuenow": s.value.min,
onInput: m
}, null, 42, Rf),
v("input", {
id: `${o.name}-max`,
name: `${o.name}-max`,
type: "range",
min: o.min,
max: o.max,
step: o.step,
value: s.value.max,
disabled: o.disabled,
class: x(["absolute w-full h-4 outline-none slider slider-max px-0.5", { "disabled:opacity-50 disabled:cursor-not-allowed": o.disabled }]),
style: { "-webkit-appearance": "none", appearance: "none", "pointer-events": "none" },
"aria-label": `${o.name} maximum`,
"aria-valuemin": o.min,
"aria-valuemax": o.max,
"aria-valuenow": s.value.max,
onInput: b
}, null, 42, Ff),
v("div", Df, [
v("div", {
class: "absolute inset-0 bg-gray-300/60 dark:bg-gray-200/40",
style: ae({
left: d.value,
right: p.value
})
}, null, 4)
])
])
], 4),
o.showFields ? (a(), f("div", _f, [
Q(v("input", {
"onUpdate:modelValue": g[0] || (g[0] = (y) => r.value = y),
type: "number",
min: o.min,
max: o.max,
step: o.step,
disabled: o.disabled,
"aria-label": `${o.name}-min`,
placeholder: "Min",
class: "mt-0 w-16 text-body-2xs text-foreground-2 bg-transparent border-0 focus:outline-none hover:ring-1 hover:ring-outline-2 focus:ring-1 focus:ring-outline-4 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:ring-0 rounded !p-1"
}, null, 8, Hf), [
[Ke, r.value]
]),
Q(v("input", {
"onUpdate:modelValue": g[1] || (g[1] = (y) => n.value = y),
type: "number",
min: o.min,
max: o.max,
step: o.step,
disabled: o.disabled,
"aria-label": `${o.name}-max`,
placeholder: "Max",
class: "mt-0 w-16 text-body-2xs text-foreground-2 bg-transparent border-0 focus:outline-none hover:ring-1 hover:ring-outline-2 focus:ring-1 focus:ring-outline-4 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:ring-0 rounded !p-1 text-right"
}, null, 8, Uf), [
[Ke, n.value]
])
])) : I("", !0)
]));
}
});
const Gp = /* @__PURE__ */ me(Wf, [["__scopeId", "data-v-c6f0cbc2"]]);
export {
ze as BaseError,
Fp as CommonAlert,
rp as CommonAnimationInstructional,
nt as CommonBadge,
Ct as CommonLoadingBar,
ct as CommonLoadingIcon,
Np as CommonProgressBar,
qp as CommonPromoAlert,
ap as CommonStepsBullet,
op as CommonStepsNumber,
Br as CommonTextLink,
ip as CommonVimeoEmbed,
hf as ComposableInvokedOutOfScopeError,
Xs as FileTooLargeError,
Gs as ForbiddenFileTypeError,
pe as FormButton,
up as FormCardButton,
_i as FormCheckbox,
yp as FormClipboardInput,
xp as FormCodeInput,
Gp as FormDualRange,
Wp as FormFileUploadZone,
dp as FormRadio,
cp as FormRadioGroup,
Kp as FormRange,
vp as FormSelectBadges,
Ns as FormSelectBase,
bp as FormSelectMulti,
hp as FormSelectSourceApps,
gp as FormSwitch,
_p as FormTags,
fp as FormTextArea,
Gt as FormTextInput,
lp as GlobalToastRenderer,
Ne as GridListToggleValue,
ut as HorizontalDirection,
jp as InfiniteLoading,
$p as LayoutDialog,
Ip as LayoutDialogSection,
Bp as LayoutDisclosure,
Sp as LayoutGridListToggle,
Pp as LayoutMenu,
Ap as LayoutPanel,
Lp as LayoutSidebar,
zp as LayoutSidebarMenu,
Ep as LayoutSidebarMenuGroup,
Rp as LayoutSidebarMenuGroupItem,
Vp as LayoutSidebarPromo,
Mp as LayoutTable,
Tp as LayoutTabsHorizontal,
Op as LayoutTabsVertical,
pf as LogicError,
Ks as MissingFileExtensionError,
rt as ModifierKeys,
Qu as SourceAppBadge,
ot as TailwindBreakpoints,
Lu as ThrottleOrDebounce,
We as ToastNotificationType,
mf as UninitializedResourceAccessError,
Zt as UniqueFileTypeSpecifier,
vf as UnsupportedEnvironmentError,
Lt as UserAvatar,
Up as UserAvatarEditable,
Hp as UserAvatarGroup,
pp as ValidationHelpers,
Jp as buildManualPromise,
At as clientOs,
xf as generateFileId,
wp as getKeyboardShortcutTitle,
Fs as keyboardClick,
kp as onKeyboardShortcut,
vs as prettyFileSize,
gf as resolveFileExtension,
Xt as useAvatarSizeClasses,
ru as useDebouncedTextInput,
Cp as useFormCheckboxModel,
Us as useFormSelectChildInternals,
mp as useOnBeforeWindowUnload,
zu as useResponsiveHorizontalDirectionCalculation,
Vu as useWindowResizeHandler,
Hs as useWrappingContainerHiddenCount,
$f as vKeyboardClickable,
Dp as writableAsyncComputed
};
//# sourceMappingURL=data:application/json;base64,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QTFzQjtBQUFBLFVBQ3ZCLE1BQUs7QUFBQSxVQUNKLEtBQUtxc0IsRUFBRztBQUFBLFVBQ1IsS0FBS0MsRUFBRztBQUFBLFVBQ1IsTUFBTXRyQixFQUFJO0FBQUEsVUFDVixVQUFVZ0UsRUFBUTtBQUFBLFVBQ2xCLGlCQUFlc0UsRUFBSTtBQUFBLFVBQ3BCLGFBQVk7QUFBQSxVQUNaLE9BQU07QUFBQTtlQVJHb2pCLEVBQWM7QUFBQSIsIm5hbWVzIjpbImZyZWVHbG9iYWwiLCJmcmVlR2xvYmFsJDEiLCJmcmVlU2VsZiIsInJvb3QiLCJyb290JDEiLCJTeW1ib2wiLCJTeW1ib2wkMiIsIm9iamVjdFByb3RvIiwiaGFzT3duUHJvcGVydHkiLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsInN5bVRvU3RyaW5nVGFnIiwiZ2V0UmF3VGFnIiwidmFsdWUiLCJpc093biIsInRhZyIsInVubWFza2VkIiwicmVzdWx0Iiwib2JqZWN0VG9TdHJpbmciLCJudWxsVGFnIiwidW5kZWZpbmVkVGFnIiwiYmFzZUdldFRhZyIsImlzT2JqZWN0TGlrZSIsInN5bWJvbFRhZyIsImlzU3ltYm9sIiwiYXJyYXlNYXAiLCJhcnJheSIsIml0ZXJhdGVlIiwiaW5kZXgiLCJsZW5ndGgiLCJpc0FycmF5IiwiaXNBcnJheSQxIiwicmVXaGl0ZXNwYWNlIiwidHJpbW1lZEVuZEluZGV4Iiwic3RyaW5nIiwicmVUcmltU3RhcnQiLCJiYXNlVHJpbSIsImlzT2JqZWN0IiwidHlwZSIsIk5BTiIsInJlSXNCYWRIZXgiLCJyZUlzQmluYXJ5IiwicmVJc09jdGFsIiwiZnJlZVBhcnNlSW50IiwidG9OdW1iZXIiLCJvdGhlciIsImlzQmluYXJ5IiwiSU5GSU5JVFkiLCJNQVhfSU5URUdFUiIsInRvRmluaXRlIiwic2lnbiIsInRvSW50ZWdlciIsInJlbWFpbmRlciIsImlkZW50aXR5IiwiYXN5bmNUYWciLCJmdW5jVGFnIiwiZ2VuVGFnIiwicHJveHlUYWciLCJpc0Z1bmN0aW9uIiwiY29yZUpzRGF0YSIsImNvcmVKc0RhdGEkMSIsIm1hc2tTcmNLZXkiLCJ1aWQiLCJpc01hc2tlZCIsImZ1bmMiLCJmdW5jUHJvdG8iLCJmdW5jVG9TdHJpbmciLCJ0b1NvdXJjZSIsInJlUmVnRXhwQ2hhciIsInJlSXNIb3N0Q3RvciIsInJlSXNOYXRpdmUiLCJiYXNlSXNOYXRpdmUiLCJwYXR0ZXJuIiwiZ2V0VmFsdWUiLCJvYmplY3QiLCJrZXkiLCJnZXROYXRpdmUiLCJhcHBseSIsInRoaXNBcmciLCJhcmdzIiwibm9vcCIsIkhPVF9DT1VOVCIsIkhPVF9TUEFOIiwibmF0aXZlTm93Iiwic2hvcnRPdXQiLCJjb3VudCIsImxhc3RDYWxsZWQiLCJzdGFtcCIsInJlbWFpbmluZyIsImNvbnN0YW50IiwiZGVmaW5lUHJvcGVydHkiLCJkZWZpbmVQcm9wZXJ0eSQxIiwiYmFzZVNldFRvU3RyaW5nIiwiYmFzZVNldFRvU3RyaW5nJDEiLCJzZXRUb1N0cmluZyIsInNldFRvU3RyaW5nJDEiLCJiYXNlRmluZEluZGV4IiwicHJlZGljYXRlIiwiZnJvbUluZGV4IiwiZnJvbVJpZ2h0IiwiYmFzZUlzTmFOIiwic3RyaWN0SW5kZXhPZiIsImJhc2VJbmRleE9mIiwiYXJyYXlJbmNsdWRlcyIsIk1BWF9TQUZFX0lOVEVHRVIiLCJyZUlzVWludCIsImlzSW5kZXgiLCJlcSIsIm5hdGl2ZU1heCIsIm92ZXJSZXN0Iiwic3RhcnQiLCJ0cmFuc2Zvcm0iLCJvdGhlckFyZ3MiLCJiYXNlUmVzdCIsImlzTGVuZ3RoIiwiaXNBcnJheUxpa2UiLCJpc1Byb3RvdHlwZSIsIkN0b3IiLCJwcm90byIsImJhc2VUaW1lcyIsIm4iLCJhcmdzVGFnIiwiYmFzZUlzQXJndW1lbnRzIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJpc0FyZ3VtZW50cyIsImlzQXJndW1lbnRzJDEiLCJzdHViRmFsc2UiLCJmcmVlRXhwb3J0cyIsImZyZWVNb2R1bGUiLCJtb2R1bGVFeHBvcnRzIiwiQnVmZmVyIiwibmF0aXZlSXNCdWZmZXIiLCJpc0J1ZmZlciIsImlzQnVmZmVyJDEiLCJhcnJheVRhZyIsImJvb2xUYWciLCJkYXRlVGFnIiwiZXJyb3JUYWciLCJtYXBUYWciLCJudW1iZXJUYWciLCJvYmplY3RUYWciLCJyZWdleHBUYWciLCJzZXRUYWciLCJzdHJpbmdUYWciLCJ3ZWFrTWFwVGFnIiwiYXJyYXlCdWZmZXJUYWciLCJkYXRhVmlld1RhZyIsImZsb2F0MzJUYWciLCJmbG9hdDY0VGFnIiwiaW50OFRhZyIsImludDE2VGFnIiwiaW50MzJUYWciLCJ1aW50OFRhZyIsInVpbnQ4Q2xhbXBlZFRhZyIsInVpbnQxNlRhZyIsInVpbnQzMlRhZyIsInR5cGVkQXJyYXlUYWdzIiwiYmFzZUlzVHlwZWRBcnJheSIsImJhc2VVbmFyeSIsImZyZWVQcm9jZXNzIiwibm9kZVV0aWwiLCJ0eXBlcyIsIm5vZGVVdGlsJDEiLCJub2RlSXNUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5JDEiLCJhcnJheUxpa2VLZXlzIiwiaW5oZXJpdGVkIiwiaXNBcnIiLCJpc0FyZyIsImlzQnVmZiIsImlzVHlwZSIsInNraXBJbmRleGVzIiwib3ZlckFyZyIsImFyZyIsIm5hdGl2ZUtleXMiLCJuYXRpdmVLZXlzJDEiLCJiYXNlS2V5cyIsImtleXMiLCJuYXRpdmVDcmVhdGUiLCJuYXRpdmVDcmVhdGUkMSIsImhhc2hDbGVhciIsImhhc2hEZWxldGUiLCJIQVNIX1VOREVGSU5FRCIsImhhc2hHZXQiLCJkYXRhIiwiaGFzaEhhcyIsImhhc2hTZXQiLCJIYXNoIiwiZW50cmllcyIsImVudHJ5IiwibGlzdENhY2hlQ2xlYXIiLCJhc3NvY0luZGV4T2YiLCJhcnJheVByb3RvIiwic3BsaWNlIiwibGlzdENhY2hlRGVsZXRlIiwibGFzdEluZGV4IiwibGlzdENhY2hlR2V0IiwibGlzdENhY2hlSGFzIiwibGlzdENhY2hlU2V0IiwiTGlzdENhY2hlIiwiTWFwIiwiTWFwJDEiLCJtYXBDYWNoZUNsZWFyIiwiaXNLZXlhYmxlIiwiZ2V0TWFwRGF0YSIsIm1hcCIsIm1hcENhY2hlRGVsZXRlIiwibWFwQ2FjaGVHZXQiLCJtYXBDYWNoZUhhcyIsIm1hcENhY2hlU2V0Iiwic2l6ZSIsIk1hcENhY2hlIiwiYXJyYXlQdXNoIiwidmFsdWVzIiwib2Zmc2V0Iiwic3ByZWFkYWJsZVN5bWJvbCIsImlzRmxhdHRlbmFibGUiLCJiYXNlRmxhdHRlbiIsImRlcHRoIiwiaXNTdHJpY3QiLCJiYXNlQ2xhbXAiLCJudW1iZXIiLCJsb3dlciIsInVwcGVyIiwiY2xhbXAiLCJTZXQiLCJTZXQkMSIsInNldENhY2hlQWRkIiwic2V0Q2FjaGVIYXMiLCJTZXRDYWNoZSIsImNhY2hlSGFzIiwiY2FjaGUiLCJzZXRUb0FycmF5Iiwic2V0Iiwibm93Iiwibm93JDEiLCJGVU5DX0VSUk9SX1RFWFQiLCJuYXRpdmVNaW4iLCJkZWJvdW5jZSIsIndhaXQiLCJvcHRpb25zIiwibGFzdEFyZ3MiLCJsYXN0VGhpcyIsIm1heFdhaXQiLCJ0aW1lcklkIiwibGFzdENhbGxUaW1lIiwibGFzdEludm9rZVRpbWUiLCJsZWFkaW5nIiwibWF4aW5nIiwidHJhaWxpbmciLCJpbnZva2VGdW5jIiwidGltZSIsImxlYWRpbmdFZGdlIiwidGltZXJFeHBpcmVkIiwicmVtYWluaW5nV2FpdCIsInRpbWVTaW5jZUxhc3RDYWxsIiwidGltZVNpbmNlTGFzdEludm9rZSIsInRpbWVXYWl0aW5nIiwic2hvdWxkSW52b2tlIiwidHJhaWxpbmdFZGdlIiwiY2FuY2VsIiwiZmx1c2giLCJkZWJvdW5jZWQiLCJpc0ludm9raW5nIiwiaXNBcnJheUxpa2VPYmplY3QiLCJhcnJheUluY2x1ZGVzV2l0aCIsImNvbXBhcmF0b3IiLCJMQVJHRV9BUlJBWV9TSVpFIiwiYmFzZURpZmZlcmVuY2UiLCJpbmNsdWRlcyIsImlzQ29tbW9uIiwidmFsdWVzTGVuZ3RoIiwib3V0ZXIiLCJjb21wdXRlZCIsInZhbHVlc0luZGV4IiwiZGlmZmVyZW5jZSIsImRpZmZlcmVuY2UkMSIsImlzU3RyaW5nIiwiYmFzZVZhbHVlcyIsInByb3BzIiwiY29sbGVjdGlvbiIsImd1YXJkIiwiYmFzZUludGVyc2VjdGlvbiIsImFycmF5cyIsIm90aExlbmd0aCIsIm90aEluZGV4IiwiY2FjaGVzIiwibWF4TGVuZ3RoIiwic2VlbiIsImNhc3RBcnJheUxpa2VPYmplY3QiLCJpbnRlcnNlY3Rpb24iLCJtYXBwZWQiLCJpbnRlcnNlY3Rpb24kMSIsImlzQm9vbGVhbiIsImlzTnVtYmVyIiwiaXNVbmRlZmluZWQiLCJ0aHJvdHRsZSIsImNyZWF0ZVNldCIsImNyZWF0ZVNldCQxIiwiYmFzZVVuaXEiLCJzZWVuSW5kZXgiLCJ1bmlxIiwiZW1pdCIsIl9fZW1pdCIsIl9fcHJvcHMiLCJOdXh0TGluayIsInJlc29sdmVEeW5hbWljQ29tcG9uZW50IiwiUm91dGVyTGluayIsImxpbmtDb21wb25lbnQiLCJidXR0b25UeXBlIiwiaXNEaXNhYmxlZCIsImZpbmFsTGVmdEljb24iLCJDb21tb25Mb2FkaW5nSWNvbiIsImJnQW5kQm9yZGVyQ2xhc3NlcyIsImNsYXNzUGFydHMiLCJjb2xvcnNCZ0JvcmRlciIsInNpemVDbGFzc2VzIiwicGFkZGluZ0NsYXNzZXMiLCJoYXNJY29uTGVmdCIsImhhc0ljb25SaWdodCIsImhpZGVUZXh0IiwiZ2VuZXJhbENsYXNzZXMiLCJiYXNlQ2xhc3NlcyIsImFkZGl0aW9uYWxDbGFzc2VzIiwiYnV0dG9uQ2xhc3NlcyIsImljb25DbGFzc2VzIiwib25DbGljayIsImUiLCJfY3JlYXRlQmxvY2siLCJfcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQiLCJ0byIsImV4dGVybmFsIiwiX25vcm1hbGl6ZVN0eWxlIiwiY29sb3IiLCJ0ZXh0IiwiX29wZW5CbG9jayIsIl9yZW5kZXJTbG90IiwiX2N0eCIsImljb25SaWdodCIsImxvYWRpbmciLCJGb3JtQnV0dG9uIiwiVG9hc3ROb3RpZmljYXRpb25UeXBlIiwiVG9hc3ROb3RpZmljYXRpb25UeXBlMiIsImRpc21pc3MiLCJvbkN0YUNsaWNrIiwiX2MiLCJfYiIsIl9hIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9ob2lzdGVkXzEiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX2hvaXN0ZWRfMiIsIl9jcmVhdGVWTm9kZSIsIl9UcmFuc2l0aW9uIiwibm90aWZpY2F0aW9uIiwiX2hvaXN0ZWRfMyIsIl9ob2lzdGVkXzQiLCJfdW5yZWYiLCJDaXJjbGVDaGVjayIsIkNpcmNsZVgiLCJBbGVydENpcmNsZSIsIkluZm8iLCJfaG9pc3RlZF81IiwiX2hvaXN0ZWRfNiIsIl9ob2lzdGVkXzciLCJfaG9pc3RlZF84IiwiVGV4dExpbmsiLCJYIiwiX2NhY2hlIiwiS0VZQk9BUkRfQ0xJQ0tfQ0hBUiIsImtleWJvYXJkQ2xpY2siLCJjYiIsImJhZGdlQ29sb3JDbGFzc2VzIiwiYmFkZ2VEb3RJY29uQ29sb3JDbGFzc2VzIiwiYmFkZ2VDbGFzc2VzIiwiZG90Q2xhc3NlcyIsIm9uSWNvbkNsaWNrIiwiZG90IiwiaWNvbkxlZnQiLCIkZXZlbnQiLCJqdW5rVmFyaWFibGUiLCJtYXJrQ2xhc3Nlc1VzZWQiLCJjbGFzc2VzIiwiVGFpbHdpbmRCcmVha3BvaW50cyIsInVzZVN0ZXBzSW50ZXJuYWxzIiwicGFyYW1zIiwibW9kZWxWYWx1ZSIsInN0ZXBzIiwib3JpZW50YXRpb24iLCJnb1ZlcnRpY2FsQmVsb3ciLCJub25JbnRlcmFjdGl2ZSIsInN0ZXBzUGFkZGluZyIsImZpbmFsT3JpZW50YXRpb24iLCJuZXdWYWwiLCJnZXRTdGVwRGlzcGxheVZhbHVlIiwic3RlcCIsImlzQ3VycmVudFN0ZXAiLCJpc0ZpbmlzaGVkU3RlcCIsInN3aXRjaFN0ZXAiLCJuZXdTdGVwIiwic3RlcE9iaiIsImxpc3RDbGFzc2VzIiwicGFkZGluZ0hvcml6b250YWwiLCJwYWRkaW5nVmVydGljYWwiLCJsaW5rQ2xhc3NlcyIsInRvUmVmcyIsImFyaWFMYWJlbCIsIl9GcmFnbWVudCIsImkiLCJDaGVja0ljb24iLCJfdG9EaXNwbGF5U3RyaW5nIiwiX2hvaXN0ZWRfOSIsIl9ob2lzdGVkXzEwIiwiX2hvaXN0ZWRfMTEiLCJfaG9pc3RlZF8xMiIsIl9ob2lzdGVkXzEzIiwiX2hvaXN0ZWRfMTUiLCJfaG9pc3RlZF8xNiIsIl9ob2lzdGVkXzE3IiwiX2hvaXN0ZWRfMTgiLCJfaG9pc3RlZF8xOSIsImxhYmVsQ2xhc3NlcyIsImxlZnRNYXJnaW4iLCJleHRyYUxpc3RDbGFzc2VzIiwiX25vcm1hbGl6ZUNsYXNzIiwiYmFzaWMiLCJDaGVja0NpcmNsZUljb24iLCJfc2ZjX3JlbmRlciIsImlzQW5pbWF0aW5nIiwicmVmIiwibW91c2VQb3NpdGlvbiIsImlzQ2xpY2tlZCIsImFuaW1hdGlvbkR1cmF0aW9uIiwiaXNNb3VzZVZpc2libGUiLCJkeW5hbWljU2xvdHMiLCJkZWxheSIsImFjdGlvbiIsInRvZ2dsZVNsb3RWaXNpYmlsaXR5Iiwic2xvdFRvVG9nZ2xlIiwic2xvdCIsImhhbmRsZUFjdGlvbiIsIm9uTW91bnRlZCIsIm9uQmVmb3JlVW5tb3VudCIsIkNsaWNrSWNvbiIsIk1vdXNlSWNvbiIsIl9yZW5kZXJMaXN0Iiwic2xvdE9iamVjdCIsImlzUGxheWluZyIsInBsYXkiLCJfX2V4cG9zZSIsInRpdGxlIiwidmltZW9JZCIsIm11dGVkIiwiY29udHJvbHMiLCJkYXJrUGxhY2Vob2xkZXIiLCJsaWdodFBsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXJBbHQiLCJJY29uUGxheSIsImNvbXB1dGVkQ2xhc3NlcyIsImRpc2FibGVkIiwiZ2VuZXJhdGVSYW5kb21JZCIsInByZWZpeCIsIm5hbm9pZCIsImNoZWNrYm94VmFsdWUiLCJjb3JlQ2hlY2tlZCIsImVycm9yTWVzc2FnZSIsImhhbmRsZUNoYW5nZSIsImNvcmVWYWx1ZSIsInVzZUZpZWxkIiwiZGVzY3JpcHRpb25UZXh0IiwiZGVzY3JpcHRpb25JZCIsImRlc2NyaXB0aW9uQ2xhc3NlcyIsImltcGxpY2l0SWQiLCJmaW5hbElkIiwiY2hlY2tib3hDbGFzc2VzIiwib25DaGFuZ2UiLCJuZXdNb2RlbFZhbHVlIiwibmV3Q29yZVZhbHVlIiwic2hvdWxkQmVDaGVja2VkIiwiaXNDb3JlQ2hlY2tlZCIsIl9tZXJnZVByb3BzIiwiJGF0dHJzIiwiTWludXMiLCJyYWRpb1ZhbHVlIiwic2VsZWN0ZWQiLCJzZWxlY3RJdGVtIiwiaXNTdGFja2VkIiwib3B0aW9uIiwiSW5mb3JtYXRpb25DaXJjbGVJY29uIiwidXNlVGV4dElucHV0Q29yZSIsImlucHV0RWwiLCJ2ZWVFcnJvck1lc3NhZ2UiLCJ1bnJlZiIsImNvcmVJbnB1dENsYXNzZXMiLCJjb3JlQ2xhc3NlcyIsImhhc0Vycm9yIiwiaW50ZXJuYWxIZWxwVGlwSWQiLCJiYXNlIiwiaGlkZUhlbHBUaXAiLCJoZWxwVGlwIiwiaGFzSGVscFRpcCIsImN1c3RvbUhlbHBUaXBDbGFzcyIsImhlbHBUaXBJZCIsImhlbHBUaXBDbGFzc2VzIiwic2hvdWxkU2hvd0NsZWFyIiwiZm9jdXMiLCJjbGVhciIsInVzZURlYm91bmNlZFRleHRJbnB1dCIsImRlYm91bmNlZEJ5IiwiaXNCYXNpY0h0bWxJbnB1dCIsInN1Ym1pdE9uRW50ZXIiLCJkaXNhYmxlRGVib3VuY2VkSW5wdXQiLCJvbldyaXRlIiwibG9nIiwibW9kZWwiLCJ2YWwiLCJ0YXJnZXQiLCJwZXJzaXN0VmFsdWUiLCJkZWJvdW5jZWRWYWx1ZVVwZGF0ZSIsImlucHV0RXZlbnROYW1lIiwib24iLCJiaW5kIiwid2F0Y2giLCJvbGRWYWwiLCJpbnB1dEVsZW1lbnQiLCJoZWxwVGlwSWRUb3AiLCJoZWxwVGlwSWRMZWZ0IiwiY29tcHV0ZWRXcmFwcGVyQ2xhc3NlcyIsImxhYmVsUG9zaXRpb24iLCJuYW1lIiwic2hvd1JlcXVpcmVkIiwiX3dpdGhEaXJlY3RpdmVzIiwidGV4dGFyZWFDbGFzc2VzIiwicGxhY2Vob2xkZXIiLCIkZW1pdCIsIlhNYXJrSWNvbiIsInNsb3RzIiwidXNlU2xvdHMiLCJpbnB1dFN0eWxlIiwibGVhZGluZ0ljb25DbGFzc2VzIiwiaWZOb3RGdWxseVRyYW5zcGFyZW50Iiwib25SaWdodEljb25DbGljayIsIlZBTElEX0hUVFBfVVJMIiwiVkFMSURfRU1BSUwiLCJpc0VtYWlsIiwiaXNFbWFpbE9yRW1wdHkiLCJpc09uZU9yTXVsdGlwbGVFbWFpbHMiLCJpc1JlcXVpcmVkIiwiaXNTYW1lQXMiLCJvdGhlckZpZWxkTmFtZSIsIm90aGVyRmllbGREaXNwbGF5TmFtZSIsIm1ldGEiLCJpc1N0cmluZ09mTGVuZ3RoIiwibWluTGVuZ3RoIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJzdHJpbmdDb250YWlucyIsIm1hdGNoIiwibWVzc2FnZSIsImlzVXJsIiwiaXNJdGVtU2VsZWN0ZWQiLCJpc011bHRpSXRlbVNlbGVjdGVkIiwidXNlV3JhcHBpbmdDb250YWluZXJIaWRkZW5Db3VudCIsInNraXBDYWxjdWxhdGlvbiIsImVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlcyIsIml0ZW1Db250YWluZXIiLCJ0cmFja1Jlc2l6ZSIsInRyYWNrTXV0YXRpb25zIiwiaGlkZGVuSXRlbUNvdW50IiwicmVjYWxjdWxhdGUiLCJhdmF0YXJFbGVtZW50cyIsInZpc2libGVDb3VudCIsInRvdGFsQ291bnQiLCJmaXJzdEVsT2Zmc2V0VG9wIiwiYXZhdGFyRWwiLCJvZmZzZXRUb3AiLCJ1c2VSZXNpemVPYnNlcnZlciIsInVzZU11dGF0aW9uT2JzZXJ2ZXIiLCJ1c2VGb3JtU2VsZWN0Q2hpbGRJbnRlcm5hbHMiLCJkeW5hbWljVmlzaWJpbGl0eSIsInNlbGVjdGVkVmFsdWUiLCJjdXJyZW50VmFsdWUiLCJpc0FycmF5VmFsdWUiLCJ2IiwibW91bnRlZCIsInVzZU1vdW50ZWQiLCJzaG93QmFyIiwiVGhyb3R0bGVPckRlYm91bmNlIiwiVGhyb3R0bGVPckRlYm91bmNlMiIsIkhvcml6b250YWxEaXJlY3Rpb24iLCJIb3Jpem9udGFsRGlyZWN0aW9uMiIsInVzZVdpbmRvd1Jlc2l6ZUhhbmRsZXIiLCJoYW5kbGVyIiwiaXNDbGllbnQiLCJ0aHJvdHRsZU9yRGVib3VuY2UiLCJmaW5hbEhhbmRsZXIiLCJ1c2VPbkJlZm9yZVdpbmRvd1VubG9hZCIsInVzZVJlc3BvbnNpdmVIb3Jpem9udGFsRGlyZWN0aW9uQ2FsY3VsYXRpb24iLCJlbCIsImRlZmF1bHREaXJlY3Rpb24iLCJkaXJlY3Rpb24iLCJzdG9wVXBkYXRlc0JlbG93V2lkdGgiLCJlbGVtZW50IiwicmVjYWxjdWxhdGVEaXJlY3Rpb24iLCJyZWN0Iiwic2hvd09uTGVmdFNpZGUiLCJzaG93T25SaWdodFNpZGUiLCJ1c2VCb2R5TW91bnRlZE1lbnVQb3NpdGlvbmluZyIsInN0eWxlIiwib3BlblRvTGVmdCIsInRvcCIsImxlZnQiLCJ3aWR0aCIsImhlaWdodCIsIm1hcmdpbiIsImZpbmFsV2lkdGgiLCJmaW5hbExlZnQiLCJmaW5hbFRvcCIsIm1lbnVXaWR0aCIsIm1lbnVIZWlnaHQiLCJ2aWV3cG9ydFdpZHRoIiwidmlld3BvcnRIZWlnaHQiLCJ2aWV3cG9ydFdpZHRoV2l0aG91dE1hcmdpbnMiLCJ2aWV3cG9ydEhlaWdodFdpdGhvdXRNYXJnaW5zIiwiaXNPYmplY3RMaWtlVHlwZSIsImVycm9yIiwiaXNNb3VudGVkIiwic2VhcmNoSW5wdXQiLCJtZW51RWwiLCJsaXN0Ym94QnV0dG9uIiwic2VhcmNoVmFsdWUiLCJjdXJyZW50SXRlbXMiLCJpc0FzeW5jTG9hZGluZyIsImZvcmNlVXBkYXRlS2V5IiwiaXNPcGVuIiwibGlzdGJveEJ1dHRvbkJvdW5kaW5nIiwidXNlRWxlbWVudEJvdW5kaW5nIiwidXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJpc0ludGVyc2VjdGluZyIsIm1lbnVTdHlsZSIsImlzTGVmdExhYmVsUG9zaXRpb24iLCJyZW5kZXJDbGVhckJ1dHRvbiIsImJ1dHRvbnNXcmFwcGVyQ2xhc3NlcyIsImNvbW1vbkJ1dHRvbkNsYXNzZXMiLCJjbGVhckJ1dHRvbkNsYXNzZXMiLCJoYXNWYWx1ZVNlbGVjdGVkIiwiaGFzU2VhcmNoIiwiaXNBc3luY1NlYXJjaE1vZGUiLCJ3cmFwcGVkVmFsdWUiLCJmaW5hbFZhbHVlIiwiY3VycmVudFZhbCIsIml0ZW1LZXkiLCJjbGVhclZhbHVlIiwiZmluYWxJdGVtcyIsInNlYXJjaFZhbCIsImxpc3Rib3hPcHRpb25zQ2xhc3NlcyIsImxpc3Rib3hPcHRpb25zU3R5bGUiLCJzaW1wbGVEaXNwbGF5VGV4dCIsInRyaWdnZXJTZWFyY2giLCJkZWJvdW5jZWRTZWFyY2giLCJsaXN0Ym94T3B0aW9uQ2xhc3NlcyIsIm5ld0l0ZW1zIiwiTGlzdGJveCIsIkxpc3Rib3hMYWJlbCIsIl9jcmVhdGVUZXh0Vk5vZGUiLCJMaXN0Ym94QnV0dG9uIiwiX3dpdGhDdHgiLCJvcGVuIiwiRXhjbGFtYXRpb25DaXJjbGVJY29uIiwiQ2hldnJvblVwSWNvbiIsIkNoZXZyb25Eb3duSWNvbiIsIl9UZWxlcG9ydCIsIkxpc3Rib3hPcHRpb25zIiwiTWFnbmlmeWluZ0dsYXNzSWNvbiIsIkNvbW1vbkxvYWRpbmdCYXIiLCJpdGVtIiwiTGlzdGJveE9wdGlvbiIsImFjdGl2ZSIsIl9ob2lzdGVkXzE0IiwiX2QiLCJDb21tb25CYWRnZSIsInNvdXJjZUFwcCIsImhpZGRlblNlbGVjdGVkSXRlbUNvdW50IiwiaXNNdWx0aUl0ZW1BcnJheVZhbHVlIiwiZmlyc3RJdGVtIiwic2VhcmNoRmlsdGVyUHJlZGljYXRlIiwic2VhcmNoIiwiRm9ybVNlbGVjdEJhc2UiLCJTb3VyY2VBcHBzIiwiU291cmNlQXBwQmFkZ2UiLCJkZXNlbGVjdEl0ZW0iLCJtdWx0aXBsZSIsIml0ZW1zIiwibGFiZWwiLCJoZWxwIiwicnVsZXMiLCJieSIsImxhYmVsSWQiLCJidXR0b25JZCIsIl93aXRoTW9kaWZpZXJzIiwidG9nZ2xlRHJvcGRvd24iLCJpc1NlbGVjdGVkIiwib3B0aW9uc0NvbnRhaW5lciIsInNjcm9sbFBvc2l0aW9uIiwiZXZlbnQiLCJpdGVtRXhpc3RzIiwibmV4dFRpY2siLCJvbkNsaWNrT3V0c2lkZSIsIkZvcm1DaGVja2JveCIsIl9lIiwiX2YiLCJlbmFibGVkIiwiX3VzZU1vZGVsIiwic3dpdGNoQ2xhc3NlcyIsInNsaWRlckNsYXNzZXMiLCJIZWFkbGVzc1N3aXRjaCIsImlkIiwiY29weSIsInVzZUNsaXBib2FyZCIsImNvcGllZCIsImhhbmRsZUNvcHkiLCJzZWxlY3RBbGxUZXh0IiwidGV4dEVsZW1lbnQiLCJzZWxlY3Rpb24iLCJyYW5nZSIsImlzTXVsdGlsaW5lIiwiRm9ybVRleHRJbnB1dCIsImN0YUNvbG9yIiwiaXNJY29uQnV0dG9uIiwiQ2xpcGJvYXJkRG9jdW1lbnRDaGVja0ljb24iLCJDbGlwYm9hcmREb2N1bWVudEljb24iLCJjdGFUZXh0IiwiaW5wdXRSZWZzIiwiZGlnaXRzIiwiaW50ZXJuYWxFcnJvciIsIm9uSW5wdXQiLCJvbktleURvd24iLCJvblBhc3RlIiwicGFzdGVkRGF0YSIsIm51bWJlcnMiLCJuZXh0RW1wdHlJbmRleCIsImQiLCJuZXdWYWx1ZSIsIm5ld0RpZ2l0cyIsImRpZ2l0Q291bnQiLCJfIiwiTW9kaWZpZXJLZXlzIiwiY2xpZW50T3MiLCJnZXRDbGllbnRPcGVyYXRpbmdTeXN0ZW0iLCJNb2RpZmllcktleVRpdGxlcyIsIk9wZXJhdGluZ1N5c3RlbSIsImdldEtleWJvYXJkU2hvcnRjdXRUaXRsZSIsImlzTW9kaWZpZXJLZXkiLCJrIiwib25LZXlib2FyZFNob3J0Y3V0IiwibW9kaWZpZXJzIiwiY2FsbGJhY2siLCJ1c2VNYWdpY0tleXMiLCJrZXlDb21iaW5hdGlvbiIsIm1vZGlmaWVyIiwid2hlbmV2ZXIiLCJ1c2VGb3JtQ2hlY2tib3hNb2RlbCIsImlzQ2hlY2tlZCIsImlzQ2xvc2luZyIsIm1lbW9LZXkiLCJzY3JvbGxlZEZyb21Ub3AiLCJzY3JvbGxlZFRvQm90dG9tIiwic2xvdENvbnRhaW5lciIsIm9uU2Nyb2xsIiwiaXNGb3JtIiwiaGFzQnV0dG9ucyIsImhhc1RpdGxlIiwibWF4V2lkdGhXZWlnaHQiLCJ3aWR0aENsYXNzZXMiLCJpc0Z1bGxzY3JlZW5EZXNrdG9wIiwiZGlhbG9nUGFuZWxDbGFzc2VzIiwic2xvdENvbnRhaW5lckNsYXNzZXMiLCJvbkNsb3NlIiwib25GdWxseUNsb3NlZCIsIm9uRm9ybVN1Ym1pdCIsInNjcm9sbFRvcCIsIm9mZnNldEhlaWdodCIsInNjcm9sbEhlaWdodCIsIm9sZFZhbHVlIiwiaHRtbCIsIm9uVW5tb3VudGVkIiwiVHJhbnNpdGlvblJvb3QiLCJEaWFsb2ciLCJUcmFuc2l0aW9uQ2hpbGQiLCJmdWxsc2NyZWVuIiwiRGlhbG9nUGFuZWwiLCJzaG93QmFja0J1dHRvbiIsIkNoZXZyb25MZWZ0SWNvbiIsImhpZGVDbG9zZXIiLCJjbG9zZXJDbGFzc2VzIiwiYnV0dG9ucyIsImJ1dHRvbiIsImNvbnRlbnQiLCJ1c2VFbGVtZW50U2l6ZSIsImNvbnRlbnRIZWlnaHQiLCJpc0V4cGFuZGVkIiwiYmFja2dyb3VuZENsYXNzIiwidGl0bGVDbGFzc2VzIiwidG9nZ2xlRXhwYW5zaW9uIiwiX3RvSGFuZGxlcnMiLCIkc2xvdHMiLCJlZGl0VGl0bGUiLCJzeW5jRnJvbVZhbHVlIiwiYnV0dG9uVGV4dENsYXNzZXMiLCJwYW5lbENsYXNzZXMiLCJjaGV2cm9uQ2xhc3NlcyIsInRvZ2dsZSIsIm9uVGl0bGVJbnB1dEJsdXIiLCJIZWFkbGVzc0Rpc2Nsb3N1cmUiLCJEaXNjbG9zdXJlQnV0dG9uIiwiaWNvbiIsIkRpc2Nsb3N1cmVQYW5lbCIsImxhenlMb2FkIiwiR3JpZExpc3RUb2dnbGVWYWx1ZSIsIkJhcnMzSWNvbiIsIlNxdWFyZXMyWDJJY29uIiwibWVudUl0ZW1zIiwibWVudUJ1dHRvbiIsIm1lbnVCdXR0b25XcmFwcGVyIiwiaXNPcGVuSW50ZXJuYWxseSIsImZpbmFsT3BlbiIsIm1lbnVCdXR0b25Cb3VuZGluZyIsIm1lbnVJdGVtc1NpemUiLCJjYWxjdWxhdGVkRGlyZWN0aW9uIiwibWVudURpcmVjdGlvbiIsIm1lbnVJdGVtc1N0eWxlcyIsIm1lbnVJdGVtc0NsYXNzZXMiLCJidWlsZEJ1dHRvbkNsYXNzc2VzIiwiY2hvb3NlSXRlbSIsInNldE9wZW4iLCJwcm9jZXNzT3BlbiIsInNob3VsZEJlT3BlbiIsInVzZUV2ZW50TGlzdGVuZXIiLCJIZWFkbGVzc01lbnUiLCJpc01lbnVPcGVuIiwiTWVudUJ1dHRvbiIsIm1lbnVJZCIsIm1vdW50TWVudU9uQm9keSIsIk1lbnVJdGVtcyIsImdyb3VwIiwiTWVudUl0ZW0iLCJzaG93VGlja3MiLCJJY29uQ2hlY2siLCJ2VGlwcHkiLCJhY3RpdmVJdGVtIiwiYnV0dG9uQ29udGFpbmVyIiwic2Nyb2xsQ29udGFpbmVyIiwic2hvd0xlZnRBcnJvdyIsInNob3dSaWdodEFycm93IiwiaXNJbml0aWFsU2V0dXAiLCJ1bmRlcmxpbmVMZWZ0IiwidW5kZXJsaW5lV2lkdGgiLCJidXR0b25DbGFzcyIsImlzQWN0aXZlIiwiYWN0aXZlSXRlbVJlZiIsInBhcmVudCIsImIiLCJib3JkZXJTdHlsZSIsInVwZGF0ZVVuZGVybGluZSIsInNldEFjdGl2ZUl0ZW0iLCJpc0FjdGl2ZUl0ZW0iLCJjaGVja0Fycm93c1Zpc2liaWxpdHkiLCJjb250YWluZXIiLCJzY3JvbGxXaWR0aCIsImNsaWVudFdpZHRoIiwic2Nyb2xsTGVmdCIsImJ1ZmZlciIsInNjcm9sbFJpZ2h0IiwiaGFuZGxlU2Nyb2xsIiwiZW5zdXJlQWN0aXZlSXRlbVZpc2libGUiLCJhY3RpdmVCdXR0b24iLCJzdG9wUmVzaXplT2JzZXJ2ZXIiLCJBcnJvd0xvbmdMZWZ0SWNvbiIsIl9kaXJlY3RpdmVfdGlwcHkiLCJBcnJvd0xvbmdSaWdodEljb24iLCJ0YWJsZUNsYXNzZXMiLCJzaGFyZWRDb250YWluZXJDbGFzc2VzIiwicmVzdWx0Q29udGFpbmVyQ2xhc3NlcyIsImJ1dHRvbkNvdW50IiwicGFkZGluZ1JpZ2h0U3R5bGUiLCJwYWRkaW5nIiwicm93c1dyYXBwZXJDbGFzc2VzIiwiZ2V0SGVhZGVyQ2xhc3NlcyIsImNvbHVtbiIsImNvbEluZGV4IiwiYyIsImdldENsYXNzZXMiLCJoYW5kbGVSb3dDbGljayIsImhlYWRlclJvd0NsYXNzZXMiLCJjb2x1bW5zIiwiZW1wdHlNZXNzYWdlIiwid3JhcHBlciIsImluaXRpYWxpemVMb2FkZXIiLCJpbnQiLCJJbnRlcm5hbEluZmluaXRlTG9hZGluZyIsIiRwcm9wcyIsImhpZGVXaGVuQ29tcGxldGUiLCJyZXRyeSIsIkV4Y2xhbWF0aW9uVHJpYW5nbGVJY29uIiwiYWxsb3dSZXRyeSIsInNlY29uZGFyeVNsb3RQYWRkaW5nQ2xhc3NlcyIsImRlZmF1bHRTbG90UGFkZGluZ0NsYXNzZXMiLCJidXR0b25UZXh0IiwiaXNDb2xsYXBzZWQiLCJjb2xsYXBzaWJsZSIsIm5vSG92ZXIiLCJBcnJvd0ZpbGxlZCIsIm5lc3RlZCIsImljb25DbGljayIsImljb25EaXNhYmxlZCIsImFsd2F5c1Nob3dJY29uIiwiRWRpdCIsIkNoZXZyb25SaWdodEljb24iLCJQbHVzIiwiaWNvblRleHQiLCJoYXNDaGlsZHJlbiIsInRvZ2dsZU9wZW4iLCJ0b29sdGlwVGV4dCIsImV4dHJhUGFkZGluZyIsIkFycm93VXBSaWdodEljb24iLCJjb2xvckNsYXNzZXMiLCJoYXNEZXNjcmlwdGlvbiIsIlhDaXJjbGVJY29uIiwiY29udGFpbmVyQ2xhc3NlcyIsInN1YmNvbnRhaW5lckNsYXNzZXMiLCJoYW5kbGVBY3Rpb25DbGljayIsImhpZGVJY29uIiwiYWN0aW9ucyIsIndpdGhEaXNtaXNzIiwid3JpdGFibGVBc3luY0NvbXB1dGVkIiwiZ2V0IiwiaW5pdGlhbFN0YXRlIiwicmVhZE9wdGlvbnMiLCJhc3luY1JlYWQiLCJkZWJ1Z2dpbmciLCJsb2dTZXR0aW5ncyIsImdldFRyYWNlIiwibG9nZ2VyIiwiZmluYWxHZXQiLCJyZXMiLCJmaW5hbFNldCIsInJlYWRWYWx1ZSIsImNvbXB1dGVkQXN5bmMiLCJnZXR0ZXIiLCJwcm92aWRlcyIsImdldEN1cnJlbnRJbnN0YW5jZSIsImN0eEtleSIsInMiLCJzdGF0ZSIsImluamVjdCIsImlzSW5wdXRFdmVudCIsImlzSW5wdXRGb2N1c2VkIiwidXNlRm9jdXMiLCJjdHhNYW5hZ2VyIiwiYXV0b2NvbXBsZXRlSXRlbXMiLCJpc0F1dG9jb21wbGV0ZUxvYWRpbmciLCJpc0F1dG9jb21wbGV0ZU9wZW4iLCJxdWVyeSIsInNlbGVjdGVkSXRlbXMiLCJ0IiwiaW5wdXRXcmFwcGVyQ2xhc3NlcyIsInJlbW92ZVRhZyIsImlkeCIsIm5ld1NlbGVjdGVkIiwib25RdWVyeUVzY2FwZSIsIm9uUXVlcnlCYWNrc3BhY2UiLCJuZXdUYWdzIiwib25RdWVyeUFycm93VXAiLCJvblF1ZXJ5QXJyb3dEb3duIiwicmVzb2x2ZUF1dG9jb21wbGV0ZUl0ZW1zIiwiZGVib3VuY2VkUmVzb2x2ZSIsImRlYm91bmNlZFJlc29sdmVBbmRNYXJrTG9hZGluZyIsIm9uUXVlcnlJbnB1dCIsImZvcmNlQ3JlYXRlRnJvbUlucHV0IiwibmV3VGFnIiwidGFnRXhpc3RzIiwibmV3SXNPcGVuIiwib2xkSXNPcGVuIiwiQ29tYm9ib3giLCJ3cmFwcGVyQ2xhc3NlcyIsIkZvcm1UYWdzQ29udGV4dE1hbmFnZXIiLCJfd2l0aEtleXMiLCJzaG93T3B0aW9uYWwiLCJDb21ib2JveE9wdGlvbnMiLCJDb21ib2JveE9wdGlvbiIsInVzZUF2YXRhclNpemVDbGFzc2VzIiwiaGVpZ2h0Q2xhc3NlcyIsInRleHRDbGFzc2VzIiwiaW5pdGlhbHMiLCJwYXJ0cyIsImZpcnN0TGV0dGVyIiwic2Vjb25kTGV0dGVyIiwiYm9yZGVyQ2xhc3NlcyIsImJnQ2xhc3NlcyIsImhvdmVyQ2xhc3NlcyIsImFjdGl2ZUNsYXNzZXMiLCJyb3VuZGVkIiwidXNlciIsImhpZGVUb29sdGlwIiwiVXNlckNpcmNsZUljb24iLCJtYXhDb3VudEhpZGRlbkl0ZW1Db3VudCIsInZpc2libGVVc2VycyIsImxpbWl0IiwibWF4QXZhdGFyc0hpZGRlbkNvdW50IiwidG90YWxIaWRkZW5Db3VudCIsIm92ZXJsYXAiLCJVc2VyQXZhdGFyIiwiaGlkZVRvb2x0aXBzIiwib25IaWRkZW5Db3VudENsaWNrIiwiTGF6eVVzZXJBdmF0YXJFZGl0b3IiLCJkZWZpbmVBc3luY0NvbXBvbmVudCIsImVkaXRNb2RlIiwibW9kZWxBc1VzZXIiLCJvblNhdmUiLCJuZXdVcmwiLCJkZWZhdWx0SW1nIiwibGlnaHRTdHlsZSIsIkJhc2VFcnJvciIsIl9fcHVibGljRmllbGQiLCJMb2dpY0Vycm9yIiwiVW5pbml0aWFsaXplZFJlc291cmNlQWNjZXNzRXJyb3IiLCJDb21wb3NhYmxlSW52b2tlZE91dE9mU2NvcGVFcnJvciIsIlVuc3VwcG9ydGVkRW52aXJvbm1lbnRFcnJvciIsIlVuaXF1ZUZpbGVUeXBlU3BlY2lmaWVyIiwidmFsaWRhdGVGaWxlVHlwZSIsImZpbGUiLCJhbGxvd2VkVHlwZXMiLCJhbGxvd2VkVW5pcXVlVHlwZXMiLCJhbGxvd2VkVW5pcXVlVHlwZSIsImFsbG93ZWRFeHRlbnNpb25zIiwiZmlsZUV4dCIsInJlc29sdmVGaWxlRXh0ZW5zaW9uIiwiTWlzc2luZ0ZpbGVFeHRlbnNpb25FcnJvciIsImFsbG93ZWRFeHRlbnNpb24iLCJGb3JiaWRkZW5GaWxlVHlwZUVycm9yIiwiZmlsZU5hbWUiLCJmaWxlTmFtZVBhcnRzIiwiZXh0IiwiaXNGaWxlVHlwZVNwZWNpZmllciIsInByZXR0eUZpbGVTaXplIiwic2l6ZUluQnl0ZXMiLCJyZW1vdmVUcmFpbGluZ1plcm9lcyIsImZpbGVTaXplIiwia2JTaXplIiwibWJTaXplIiwiZ2JTaXplIiwiZ2VuZXJhdGVGaWxlSWQiLCJpbXBvcnRhbnREYXRhIiwibWQ1IiwiYnVpbGRGaWxlVHlwZVNwZWNpZmllcnMiLCJhY2NlcHQiLCJzcGVjaWZpZXJzIiwidXNlUHJlcGFyZVVwbG9hZGFibGVGaWxlcyIsInNpemVMaW1pdCIsImNvdW50TGltaXQiLCJmaWxlVHlwZVNwZWNpZmllcnMiLCJoYW5kbGVGaWxlcyIsImZpbGVzIiwicmVzdWx0cyIsImZpbmFsQ291bnRMaW1pdCIsInIiLCJ2YWxpZGF0aW9uUmVzdWx0IiwiRmlsZVRvb0xhcmdlRXJyb3IiLCJmaWxlVXBsb2FkWm9uZSIsImZpbGVJbnB1dCIsImJ1aWxkVXBsb2FkYWJsZUZpbGVzIiwiaGFuZGxlSW5jb21pbmdGaWxlcyIsImZpbGVJdGVtcyIsImlzT3ZlckRyb3Bab25lIiwidXNlRHJvcFpvbmUiLCJvbklucHV0Q2hhbmdlIiwiaW5wdXQiLCJ0cmlnZ2VyUGlja2VyIiwia2V5Ym9hcmRDbGlja2FibGVLZXlwcmVzc0hhbmRsZXIiLCJ2S2V5Ym9hcmRDbGlja2FibGUiLCJwZXJjZW50YWdlIiwiY29sb3JDbGFzcyIsInNob3dDbG9zZXIiLCJjbGFtcFZhbHVlIiwiaGFuZGxlSW5wdXQiLCJjbGFtcGVkVmFsdWUiLCJoYW5kbGVOdW1iZXJJbnB1dCIsInZhbGlkYXRlQW5kQ2xhbXAiLCJoaWRlSGVhZGVyIiwibWluIiwibWF4IiwiaW5wdXRCZWxvd1NsaWRlciIsIm1pblZhbHVlU3RyaW5nIiwibnVtVmFsdWUiLCJtYXhWYWx1ZVN0cmluZyIsIm1pblBlcmNlbnRhZ2UiLCJiYXNlUGVyY2VudGFnZSIsIm1heFBlcmNlbnRhZ2UiLCJ0cmFja0xlZnQiLCJ0cmFja1JpZ2h0IiwiaGFuZGxlTWluSW5wdXQiLCJoYW5kbGVNYXhJbnB1dCIsInNob3dGaWVsZHMiXSwiaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMF0sInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZnJlZUdsb2JhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3Jvb3QuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19TeW1ib2wuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRSYXdUYWcuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19vYmplY3RUb1N0cmluZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VHZXRUYWcuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzT2JqZWN0TGlrZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNTeW1ib2wuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheU1hcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3RyaW1tZWRFbmRJbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VUcmltLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc09iamVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdG9OdW1iZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RvRmluaXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b0ludGVnZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lkZW50aXR5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0Z1bmN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY29yZUpzRGF0YS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzTWFza2VkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fdG9Tb3VyY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNOYXRpdmUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRWYWx1ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldE5hdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FwcGx5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9ub29wLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc2hvcnRPdXQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2NvbnN0YW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZGVmaW5lUHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlU2V0VG9TdHJpbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRUb1N0cmluZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VGaW5kSW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNOYU4uanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpY3RJbmRleE9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUluZGV4T2YuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUluY2x1ZGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNJbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZXEuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19vdmVyUmVzdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VSZXN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0xlbmd0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcnJheUxpa2UuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc1Byb3RvdHlwZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VUaW1lcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc0FyZ3VtZW50cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcmd1bWVudHMuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N0dWJGYWxzZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNCdWZmZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNUeXBlZEFycmF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVVuYXJ5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbm9kZVV0aWwuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzVHlwZWRBcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5TGlrZUtleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19vdmVyQXJnLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbmF0aXZlS2V5cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VLZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9rZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbmF0aXZlQ3JlYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaENsZWFyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaERlbGV0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2hhc2hHZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNoSGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaFNldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0hhc2guanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19saXN0Q2FjaGVDbGVhci5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Fzc29jSW5kZXhPZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZURlbGV0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZUdldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZUhhcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZVNldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0xpc3RDYWNoZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX01hcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlQ2xlYXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc0tleWFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRNYXBEYXRhLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVEZWxldGUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tYXBDYWNoZUdldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlSGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVTZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19NYXBDYWNoZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5UHVzaC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzRmxhdHRlbmFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRmxhdHRlbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VDbGFtcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY2xhbXAuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19TZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRDYWNoZUFkZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldENhY2hlSGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fU2V0Q2FjaGUuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jYWNoZUhhcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldFRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL25vdy5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGVib3VuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJyYXlMaWtlT2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlJbmNsdWRlc1dpdGguanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRGlmZmVyZW5jZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGlmZmVyZW5jZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNTdHJpbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVmFsdWVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy92YWx1ZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2luY2x1ZGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUludGVyc2VjdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nhc3RBcnJheUxpa2VPYmplY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ludGVyc2VjdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNCb29sZWFuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc051bWJlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNVbmRlZmluZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3Rocm90dGxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlU2V0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVVuaXEuanMiLCIuLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuaXEuanMiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL0J1dHRvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vdGV4dC9MaW5rLnZ1ZSIsIi4uL3NyYy9oZWxwZXJzL2dsb2JhbC90b2FzdC50cyIsIi4uL3NyYy9jb21wb25lbnRzL2dsb2JhbC9Ub2FzdFJlbmRlcmVyLnZ1ZSIsIi4uL3NyYy9oZWxwZXJzL2dsb2JhbC9hY2Nlc3NpYmlsaXR5LnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvY29tbW9uL0JhZGdlLnZ1ZSIsIi4uL3NyYy9oZWxwZXJzL3RhaWx3aW5kLnRzIiwiLi4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi9zdGVwcy50cyIsIi4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9zdGVwcy9OdW1iZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29tbW9uL3N0ZXBzL0J1bGxldC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vYW5pbWF0aW9uL01vdXNlSWNvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vYW5pbWF0aW9uL0NsaWNrSWNvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vYW5pbWF0aW9uL0luc3RydWN0aW9uYWwudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZ2xvYmFsL2ljb24vUGxheS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vVmltZW9FbWJlZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL0NhcmRCdXR0b24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9DaGVja2JveC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL1JhZGlvLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vUmFkaW9Hcm91cC52dWUiLCIuLi9zcmMvY29tcG9zYWJsZXMvZm9ybS90ZXh0SW5wdXQudHMiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL1RleHRBcmVhLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vVGV4dElucHV0LnZ1ZSIsIi4uL3NyYy9oZWxwZXJzL2NvbW1vbi92YWxpZGF0aW9uLnRzIiwiLi4vc3JjL2NvbXBvc2FibGVzL2xheW91dC9yZXNpemUudHMiLCIuLi9zcmMvY29tcG9zYWJsZXMvZm9ybS9zZWxlY3QudHMiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9CYXIudnVlIiwiLi4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi93aW5kb3cudHMiLCIuLi9zcmMvY29tcG9zYWJsZXMvbGF5b3V0L21lbnUudHMiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL3NlbGVjdC9CYXNlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL1NvdXJjZUFwcEJhZGdlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vc2VsZWN0L1NvdXJjZUFwcHMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QvQmFkZ2VzLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vc2VsZWN0L011bHRpLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vU3dpdGNoLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vQ2xpcGJvYXJkSW5wdXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9Db2RlSW5wdXQudnVlIiwiLi4vc3JjL2hlbHBlcnMvZm9ybS9pbnB1dC50cyIsIi4uL3NyYy9jb21wb3NhYmxlcy9mb3JtL2lucHV0LnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvbGF5b3V0L0RpYWxvZy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvRGlhbG9nU2VjdGlvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvRGlzY2xvc3VyZS52dWUiLCIuLi9zcmMvaGVscGVycy9sYXlvdXQvY29tcG9uZW50cy50cyIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC9HcmlkTGlzdFRvZ2dsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9nbG9iYWwvaWNvbi9DaGVjay52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvTWVudS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvdGFicy9Ib3Jpem9udGFsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC90YWJzL1ZlcnRpY2FsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC9UYWJsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9JbmZpbml0ZUxvYWRpbmcudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvbGF5b3V0L1BhbmVsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC9zaWRlYmFyL1NpZGViYXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvbGF5b3V0L3NpZGViYXIvUHJvbW8udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvbGF5b3V0L3NpZGViYXIvbWVudS9NZW51LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2dsb2JhbC9pY29uL1BsdXMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZ2xvYmFsL2ljb24vRWRpdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9nbG9iYWwvaWNvbi9BcnJvd0ZpbGxlZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9sYXlvdXQvc2lkZWJhci9tZW51L2dyb3VwL0dyb3VwLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2xheW91dC9zaWRlYmFyL21lbnUvZ3JvdXAvSXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vQWxlcnQudnVlIiwiLi4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi9hc3luYy50cyIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vdGFncy9Db250ZXh0TWFuYWdlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mb3JtL1RhZ3MudnVlIiwiLi4vc3JjL2NvbXBvc2FibGVzL3VzZXIvYXZhdGFyLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvdXNlci9BdmF0YXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvdXNlci9BdmF0YXJHcm91cC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9JY29uLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3VzZXIvQXZhdGFyRWRpdGFibGUudnVlIiwiLi4vc3JjL2hlbHBlcnMvY29tbW9uL2Vycm9yLnRzIiwiLi4vc3JjL2hlbHBlcnMvZm9ybS9maWxlLnRzIiwiLi4vc3JjL2NvbXBvc2FibGVzL2Zvcm0vZmlsZVVwbG9hZC50cyIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmlsZS11cGxvYWQvWm9uZS52dWUiLCIuLi9zcmMvZGlyZWN0aXZlcy9hY2Nlc3NpYmlsaXR5LnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvY29tbW9uL1Byb2dyZXNzQmFyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9Qcm9tb0FsZXJ0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vUmFuZ2UudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9EdWFsUmFuZ2UudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbmV4cG9ydCBkZWZhdWx0IGZyZWVHbG9iYWw7XG4iLCJpbXBvcnQgZnJlZUdsb2JhbCBmcm9tICcuL19mcmVlR2xvYmFsLmpzJztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5leHBvcnQgZGVmYXVsdCByb290O1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5leHBvcnQgZGVmYXVsdCBTeW1ib2w7XG4iLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4vX1N5bWJvbC5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gIHRyeSB7XG4gICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0UmF3VGFnO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9iamVjdFRvU3RyaW5nO1xuIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuL19TeW1ib2wuanMnO1xuaW1wb3J0IGdldFJhd1RhZyBmcm9tICcuL19nZXRSYXdUYWcuanMnO1xuaW1wb3J0IG9iamVjdFRvU3RyaW5nIGZyb20gJy4vX29iamVjdFRvU3RyaW5nLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VHZXRUYWc7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNPYmplY3RMaWtlO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1N5bWJvbDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5TWFwO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJyYXk7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbnZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICovXG5mdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSB7XG4gIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1tZWRFbmRJbmRleDtcbiIsImltcG9ydCB0cmltbWVkRW5kSW5kZXggZnJvbSAnLi9fdHJpbW1lZEVuZEluZGV4LmpzJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmdcbiAgICA/IHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKVxuICAgIDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVHJpbTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc09iamVjdDtcbiIsImltcG9ydCBiYXNlVHJpbSBmcm9tICcuL19iYXNlVHJpbS5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5pbXBvcnQgaXNTeW1ib2wgZnJvbSAnLi9pc1N5bWJvbC5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b051bWJlcjtcbiIsImltcG9ydCB0b051bWJlciBmcm9tICcuL3RvTnVtYmVyLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvRmluaXRlO1xuIiwiaW1wb3J0IHRvRmluaXRlIGZyb20gJy4vdG9GaW5pdGUuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b0ludGVnZXI7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpZGVudGl0eTtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0Z1bmN0aW9uO1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbmV4cG9ydCBkZWZhdWx0IGNvcmVKc0RhdGE7XG4iLCJpbXBvcnQgY29yZUpzRGF0YSBmcm9tICcuL19jb3JlSnNEYXRhLmpzJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNNYXNrZWQ7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvU291cmNlO1xuIiwiaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJztcbmltcG9ydCBpc01hc2tlZCBmcm9tICcuL19pc01hc2tlZC5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5pbXBvcnQgdG9Tb3VyY2UgZnJvbSAnLi9fdG9Tb3VyY2UuanMnO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbik7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNOYXRpdmU7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0VmFsdWU7XG4iLCJpbXBvcnQgYmFzZUlzTmF0aXZlIGZyb20gJy4vX2Jhc2VJc05hdGl2ZS5qcyc7XG5pbXBvcnQgZ2V0VmFsdWUgZnJvbSAnLi9fZ2V0VmFsdWUuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXROYXRpdmU7XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFwcGx5O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4zLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxuZXhwb3J0IGRlZmF1bHQgbm9vcDtcbiIsIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2hvcnRPdXQ7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29uc3RhbnQ7XG4iLCJpbXBvcnQgZ2V0TmF0aXZlIGZyb20gJy4vX2dldE5hdGl2ZS5qcyc7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVQcm9wZXJ0eTtcbiIsImltcG9ydCBjb25zdGFudCBmcm9tICcuL2NvbnN0YW50LmpzJztcbmltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tICcuL19kZWZpbmVQcm9wZXJ0eS5qcyc7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBiYXNlU2V0VG9TdHJpbmc7XG4iLCJpbXBvcnQgYmFzZVNldFRvU3RyaW5nIGZyb20gJy4vX2Jhc2VTZXRUb1N0cmluZy5qcyc7XG5pbXBvcnQgc2hvcnRPdXQgZnJvbSAnLi9fc2hvcnRPdXQuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgc2V0VG9TdHJpbmcgPSBzaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO1xuXG5leHBvcnQgZGVmYXVsdCBzZXRUb1N0cmluZztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRmluZEluZGV4O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUlzTmFOO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpY3RJbmRleE9mO1xuIiwiaW1wb3J0IGJhc2VGaW5kSW5kZXggZnJvbSAnLi9fYmFzZUZpbmRJbmRleC5qcyc7XG5pbXBvcnQgYmFzZUlzTmFOIGZyb20gJy4vX2Jhc2VJc05hTi5qcyc7XG5pbXBvcnQgc3RyaWN0SW5kZXhPZiBmcm9tICcuL19zdHJpY3RJbmRleE9mLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUluZGV4T2Y7XG4iLCJpbXBvcnQgYmFzZUluZGV4T2YgZnJvbSAnLi9fYmFzZUluZGV4T2YuanMnO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBzcGVjaWZ5aW5nIGFuIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheUluY2x1ZGVzO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0luZGV4O1xuIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVxO1xuIiwiaW1wb3J0IGFwcGx5IGZyb20gJy4vX2FwcGx5LmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIGluZGV4ID0gLTE7XG4gICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgb3ZlclJlc3Q7XG4iLCJpbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgb3ZlclJlc3QgZnJvbSAnLi9fb3ZlclJlc3QuanMnO1xuaW1wb3J0IHNldFRvU3RyaW5nIGZyb20gJy4vX3NldFRvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VSZXN0O1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0xlbmd0aDtcbiIsImltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJy4vaXNGdW5jdGlvbi5qcyc7XG5pbXBvcnQgaXNMZW5ndGggZnJvbSAnLi9pc0xlbmd0aC5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0FycmF5TGlrZTtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNQcm90b3R5cGU7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVGltZXM7XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNBcmd1bWVudHM7XG4iLCJpbXBvcnQgYmFzZUlzQXJndW1lbnRzIGZyb20gJy4vX2Jhc2VJc0FyZ3VtZW50cy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJndW1lbnRzO1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHViRmFsc2U7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcbmltcG9ydCBzdHViRmFsc2UgZnJvbSAnLi9zdHViRmFsc2UuanMnO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IGlzQnVmZmVyO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNMZW5ndGggZnJvbSAnLi9pc0xlbmd0aC5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNUeXBlZEFycmF5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVW5hcnk7XG4iLCJpbXBvcnQgZnJlZUdsb2JhbCBmcm9tICcuL19mcmVlR2xvYmFsLmpzJztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxuZXhwb3J0IGRlZmF1bHQgbm9kZVV0aWw7XG4iLCJpbXBvcnQgYmFzZUlzVHlwZWRBcnJheSBmcm9tICcuL19iYXNlSXNUeXBlZEFycmF5LmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBub2RlVXRpbCBmcm9tICcuL19ub2RlVXRpbC5qcyc7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5leHBvcnQgZGVmYXVsdCBpc1R5cGVkQXJyYXk7XG4iLCJpbXBvcnQgYmFzZVRpbWVzIGZyb20gJy4vX2Jhc2VUaW1lcy5qcyc7XG5pbXBvcnQgaXNBcmd1bWVudHMgZnJvbSAnLi9pc0FyZ3VtZW50cy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzQnVmZmVyIGZyb20gJy4vaXNCdWZmZXIuanMnO1xuaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5pbXBvcnQgaXNUeXBlZEFycmF5IGZyb20gJy4vaXNUeXBlZEFycmF5LmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheUxpa2VLZXlzO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IG92ZXJBcmc7XG4iLCJpbXBvcnQgb3ZlckFyZyBmcm9tICcuL19vdmVyQXJnLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5leHBvcnQgZGVmYXVsdCBuYXRpdmVLZXlzO1xuIiwiaW1wb3J0IGlzUHJvdG90eXBlIGZyb20gJy4vX2lzUHJvdG90eXBlLmpzJztcbmltcG9ydCBuYXRpdmVLZXlzIGZyb20gJy4vX25hdGl2ZUtleXMuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VLZXlzO1xuIiwiaW1wb3J0IGFycmF5TGlrZUtleXMgZnJvbSAnLi9fYXJyYXlMaWtlS2V5cy5qcyc7XG5pbXBvcnQgYmFzZUtleXMgZnJvbSAnLi9fYmFzZUtleXMuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5cyhuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLmtleXMoJ2hpJyk7XG4gKiAvLyA9PiBbJzAnLCAnMSddXG4gKi9cbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQga2V5cztcbiIsImltcG9ydCBnZXROYXRpdmUgZnJvbSAnLi9fZ2V0TmF0aXZlLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuZXhwb3J0IGRlZmF1bHQgbmF0aXZlQ3JlYXRlO1xuIiwiaW1wb3J0IG5hdGl2ZUNyZWF0ZSBmcm9tICcuL19uYXRpdmVDcmVhdGUuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaENsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaERlbGV0ZTtcbiIsImltcG9ydCBuYXRpdmVDcmVhdGUgZnJvbSAnLi9fbmF0aXZlQ3JlYXRlLmpzJztcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoR2V0O1xuIiwiaW1wb3J0IG5hdGl2ZUNyZWF0ZSBmcm9tICcuL19uYXRpdmVDcmVhdGUuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhc2hIYXM7XG4iLCJpbXBvcnQgbmF0aXZlQ3JlYXRlIGZyb20gJy4vX25hdGl2ZUNyZWF0ZS5qcyc7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoU2V0O1xuIiwiaW1wb3J0IGhhc2hDbGVhciBmcm9tICcuL19oYXNoQ2xlYXIuanMnO1xuaW1wb3J0IGhhc2hEZWxldGUgZnJvbSAnLi9faGFzaERlbGV0ZS5qcyc7XG5pbXBvcnQgaGFzaEdldCBmcm9tICcuL19oYXNoR2V0LmpzJztcbmltcG9ydCBoYXNoSGFzIGZyb20gJy4vX2hhc2hIYXMuanMnO1xuaW1wb3J0IGhhc2hTZXQgZnJvbSAnLi9faGFzaFNldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5leHBvcnQgZGVmYXVsdCBIYXNoO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsaXN0Q2FjaGVDbGVhcjtcbiIsImltcG9ydCBlcSBmcm9tICcuL2VxLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXNzb2NJbmRleE9mO1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxpc3RDYWNoZURlbGV0ZTtcbiIsImltcG9ydCBhc3NvY0luZGV4T2YgZnJvbSAnLi9fYXNzb2NJbmRleE9mLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlR2V0O1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlSGFzO1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxpc3RDYWNoZVNldDtcbiIsImltcG9ydCBsaXN0Q2FjaGVDbGVhciBmcm9tICcuL19saXN0Q2FjaGVDbGVhci5qcyc7XG5pbXBvcnQgbGlzdENhY2hlRGVsZXRlIGZyb20gJy4vX2xpc3RDYWNoZURlbGV0ZS5qcyc7XG5pbXBvcnQgbGlzdENhY2hlR2V0IGZyb20gJy4vX2xpc3RDYWNoZUdldC5qcyc7XG5pbXBvcnQgbGlzdENhY2hlSGFzIGZyb20gJy4vX2xpc3RDYWNoZUhhcy5qcyc7XG5pbXBvcnQgbGlzdENhY2hlU2V0IGZyb20gJy4vX2xpc3RDYWNoZVNldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuZXhwb3J0IGRlZmF1bHQgTGlzdENhY2hlO1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5leHBvcnQgZGVmYXVsdCBNYXA7XG4iLCJpbXBvcnQgSGFzaCBmcm9tICcuL19IYXNoLmpzJztcbmltcG9ydCBMaXN0Q2FjaGUgZnJvbSAnLi9fTGlzdENhY2hlLmpzJztcbmltcG9ydCBNYXAgZnJvbSAnLi9fTWFwLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUNsZWFyO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0tleWFibGU7XG4iLCJpbXBvcnQgaXNLZXlhYmxlIGZyb20gJy4vX2lzS2V5YWJsZS5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0TWFwRGF0YTtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwQ2FjaGVEZWxldGU7XG4iLCJpbXBvcnQgZ2V0TWFwRGF0YSBmcm9tICcuL19nZXRNYXBEYXRhLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUdldDtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUhhcztcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcENhY2hlU2V0O1xuIiwiaW1wb3J0IG1hcENhY2hlQ2xlYXIgZnJvbSAnLi9fbWFwQ2FjaGVDbGVhci5qcyc7XG5pbXBvcnQgbWFwQ2FjaGVEZWxldGUgZnJvbSAnLi9fbWFwQ2FjaGVEZWxldGUuanMnO1xuaW1wb3J0IG1hcENhY2hlR2V0IGZyb20gJy4vX21hcENhY2hlR2V0LmpzJztcbmltcG9ydCBtYXBDYWNoZUhhcyBmcm9tICcuL19tYXBDYWNoZUhhcy5qcyc7XG5pbXBvcnQgbWFwQ2FjaGVTZXQgZnJvbSAnLi9fbWFwQ2FjaGVTZXQuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxuZXhwb3J0IGRlZmF1bHQgTWFwQ2FjaGU7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5UHVzaDtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBpc0FyZ3VtZW50cyBmcm9tICcuL2lzQXJndW1lbnRzLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0ZsYXR0ZW5hYmxlO1xuIiwiaW1wb3J0IGFycmF5UHVzaCBmcm9tICcuL19hcnJheVB1c2guanMnO1xuaW1wb3J0IGlzRmxhdHRlbmFibGUgZnJvbSAnLi9faXNGbGF0dGVuYWJsZS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRmxhdHRlbjtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xhbXBgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICovXG5mdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgaWYgKG51bWJlciA9PT0gbnVtYmVyKSB7XG4gICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgIH1cbiAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBudW1iZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VDbGFtcDtcbiIsImltcG9ydCBiYXNlQ2xhbXAgZnJvbSAnLi9fYmFzZUNsYW1wLmpzJztcbmltcG9ydCB0b051bWJlciBmcm9tICcuL3RvTnVtYmVyLmpzJztcblxuLyoqXG4gKiBDbGFtcHMgYG51bWJlcmAgd2l0aGluIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmNsYW1wKC0xMCwgLTUsIDUpO1xuICogLy8gPT4gLTVcbiAqXG4gKiBfLmNsYW1wKDEwLCAtNSwgNSk7XG4gKiAvLyA9PiA1XG4gKi9cbmZ1bmN0aW9uIGNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdXBwZXIgPSBsb3dlcjtcbiAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHVwcGVyID0gdG9OdW1iZXIodXBwZXIpO1xuICAgIHVwcGVyID0gdXBwZXIgPT09IHVwcGVyID8gdXBwZXIgOiAwO1xuICB9XG4gIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbG93ZXIgPSB0b051bWJlcihsb3dlcik7XG4gICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gIH1cbiAgcmV0dXJuIGJhc2VDbGFtcCh0b051bWJlcihudW1iZXIpLCBsb3dlciwgdXBwZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFtcDtcbiIsImltcG9ydCBnZXROYXRpdmUgZnJvbSAnLi9fZ2V0TmF0aXZlLmpzJztcbmltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxuZXhwb3J0IGRlZmF1bHQgU2V0O1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldENhY2hlQWRkO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzZXRDYWNoZUhhcztcbiIsImltcG9ydCBNYXBDYWNoZSBmcm9tICcuL19NYXBDYWNoZS5qcyc7XG5pbXBvcnQgc2V0Q2FjaGVBZGQgZnJvbSAnLi9fc2V0Q2FjaGVBZGQuanMnO1xuaW1wb3J0IHNldENhY2hlSGFzIGZyb20gJy4vX3NldENhY2hlSGFzLmpzJztcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5leHBvcnQgZGVmYXVsdCBTZXRDYWNoZTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjYWNoZUhhcztcbiIsIi8qKlxuICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldFRvQXJyYXk7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbm93O1xuIiwiaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuaW1wb3J0IG5vdyBmcm9tICcuL25vdy5qcyc7XG5pbXBvcnQgdG9OdW1iZXIgZnJvbSAnLi90b051bWJlci5qcyc7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmdcbiAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgIDogdGltZVdhaXRpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkZWJvdW5jZTtcbiIsImltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJyYXlMaWtlT2JqZWN0O1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlJbmNsdWRlc1dpdGg7XG4iLCJpbXBvcnQgU2V0Q2FjaGUgZnJvbSAnLi9fU2V0Q2FjaGUuanMnO1xuaW1wb3J0IGFycmF5SW5jbHVkZXMgZnJvbSAnLi9fYXJyYXlJbmNsdWRlcy5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlc1dpdGggZnJvbSAnLi9fYXJyYXlJbmNsdWRlc1dpdGguanMnO1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBjYWNoZUhhcyBmcm9tICcuL19jYWNoZUhhcy5qcyc7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGV4Y2x1ZGluZyBtdWx0aXBsZSBhcnJheXMgb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgdmFsdWVzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcblxuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgfVxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgfVxuICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgIGlmICh2YWx1ZXNbdmFsdWVzSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyh2YWx1ZXMsIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRGlmZmVyZW5jZTtcbiIsImltcG9ydCBiYXNlRGlmZmVyZW5jZSBmcm9tICcuL19iYXNlRGlmZmVyZW5jZS5qcyc7XG5pbXBvcnQgYmFzZUZsYXR0ZW4gZnJvbSAnLi9fYmFzZUZsYXR0ZW4uanMnO1xuaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCBpc0FycmF5TGlrZU9iamVjdCBmcm9tICcuL2lzQXJyYXlMaWtlT2JqZWN0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGBhcnJheWAgdmFsdWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3RoZXIgZ2l2ZW4gYXJyYXlzXG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICpcbiAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBzZWUgXy53aXRob3V0LCBfLnhvclxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pO1xuICogLy8gPT4gWzFdXG4gKi9cbnZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgOiBbXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1N0cmluZztcbiIsImltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVmFsdWVzO1xuIiwiaW1wb3J0IGJhc2VWYWx1ZXMgZnJvbSAnLi9fYmFzZVZhbHVlcy5qcyc7XG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8udmFsdWVzKG5ldyBGb28pO1xuICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy52YWx1ZXMoJ2hpJyk7XG4gKiAvLyA9PiBbJ2gnLCAnaSddXG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsdWVzO1xuIiwiaW1wb3J0IGJhc2VJbmRleE9mIGZyb20gJy4vX2Jhc2VJbmRleE9mLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL2lzU3RyaW5nLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IHZhbHVlcyBmcm9tICcuL3ZhbHVlcy5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5jbHVkZXM7XG4iLCJpbXBvcnQgU2V0Q2FjaGUgZnJvbSAnLi9fU2V0Q2FjaGUuanMnO1xuaW1wb3J0IGFycmF5SW5jbHVkZXMgZnJvbSAnLi9fYXJyYXlJbmNsdWRlcy5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlc1dpdGggZnJvbSAnLi9fYXJyYXlJbmNsdWRlc1dpdGguanMnO1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBjYWNoZUhhcyBmcm9tICcuL19jYWNoZUhhcy5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2Ygc2hhcmVkIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmNsdWRlcyA9IGNvbXBhcmF0b3IgPyBhcnJheUluY2x1ZGVzV2l0aCA6IGFycmF5SW5jbHVkZXMsXG4gICAgICBsZW5ndGggPSBhcnJheXNbMF0ubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoLFxuICAgICAgY2FjaGVzID0gQXJyYXkob3RoTGVuZ3RoKSxcbiAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKG90aEluZGV4LS0pIHtcbiAgICB2YXIgYXJyYXkgPSBhcnJheXNbb3RoSW5kZXhdO1xuICAgIGlmIChvdGhJbmRleCAmJiBpdGVyYXRlZSkge1xuICAgICAgYXJyYXkgPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgfVxuICAgIG1heExlbmd0aCA9IG5hdGl2ZU1pbihhcnJheS5sZW5ndGgsIG1heExlbmd0aCk7XG4gICAgY2FjaGVzW290aEluZGV4XSA9ICFjb21wYXJhdG9yICYmIChpdGVyYXRlZSB8fCAobGVuZ3RoID49IDEyMCAmJiBhcnJheS5sZW5ndGggPj0gMTIwKSlcbiAgICAgID8gbmV3IFNldENhY2hlKG90aEluZGV4ICYmIGFycmF5KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbiAgYXJyYXkgPSBhcnJheXNbMF07XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBzZWVuID0gY2FjaGVzWzBdO1xuXG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDwgbWF4TGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoIShzZWVuXG4gICAgICAgICAgPyBjYWNoZUhhcyhzZWVuLCBjb21wdXRlZClcbiAgICAgICAgICA6IGluY2x1ZGVzKHJlc3VsdCwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgICkpIHtcbiAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoO1xuICAgICAgd2hpbGUgKC0tb3RoSW5kZXgpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgaWYgKCEoY2FjaGVcbiAgICAgICAgICAgICAgPyBjYWNoZUhhcyhjYWNoZSwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJbnRlcnNlY3Rpb247XG4iLCJpbXBvcnQgaXNBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9pc0FycmF5TGlrZU9iamVjdC5qcyc7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhbiBlbXB0eSBhcnJheSBpZiBpdCdzIG5vdCBhbiBhcnJheSBsaWtlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgdGhlIGNhc3QgYXJyYXktbGlrZSBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDogW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhc3RBcnJheUxpa2VPYmplY3Q7XG4iLCJpbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGJhc2VJbnRlcnNlY3Rpb24gZnJvbSAnLi9fYmFzZUludGVyc2VjdGlvbi5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGNhc3RBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9fY2FzdEFycmF5TGlrZU9iamVjdC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGFsbCBnaXZlbiBhcnJheXNcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gKiAvLyA9PiBbMl1cbiAqL1xudmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgOiBbXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcnNlY3Rpb247XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGJvb2xUYWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0Jvb2xlYW47XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTnVtYmVyO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1VuZGVmaW5lZDtcbiIsImltcG9ydCBkZWJvdW5jZSBmcm9tICcuL2RlYm91bmNlLmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGhyb3R0bGU7XG4iLCJpbXBvcnQgU2V0IGZyb20gJy4vX1NldC5qcyc7XG5pbXBvcnQgbm9vcCBmcm9tICcuL25vb3AuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVNldDtcbiIsImltcG9ydCBTZXRDYWNoZSBmcm9tICcuL19TZXRDYWNoZS5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlcyBmcm9tICcuL19hcnJheUluY2x1ZGVzLmpzJztcbmltcG9ydCBhcnJheUluY2x1ZGVzV2l0aCBmcm9tICcuL19hcnJheUluY2x1ZGVzV2l0aC5qcyc7XG5pbXBvcnQgY2FjaGVIYXMgZnJvbSAnLi9fY2FjaGVIYXMuanMnO1xuaW1wb3J0IGNyZWF0ZVNldCBmcm9tICcuL19jcmVhdGVTZXQuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgfVxuICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgIGlmIChzZXQpIHtcbiAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgfVxuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICB9XG4gIGVsc2Uge1xuICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgIGlmIChzZWVuW3NlZW5JbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXMoc2VlbiwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VVbmlxO1xuIiwiaW1wb3J0IGJhc2VVbmlxIGZyb20gJy4vX2Jhc2VVbmlxLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGluIHdoaWNoIG9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBlbGVtZW50XG4gKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gKiBpbiB0aGUgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXEoWzIsIDEsIDJdKTtcbiAqIC8vID0+IFsyLCAxXVxuICovXG5mdW5jdGlvbiB1bmlxKGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1bmlxO1xuIiwiPHRlbXBsYXRlPlxyXG4gIDxDb21wb25lbnRcclxuICAgIDppcz1cInRvID8gbGlua0NvbXBvbmVudCA6ICdidXR0b24nXCJcclxuICAgIDpocmVmPVwidG9cIlxyXG4gICAgOnRvPVwidG9cIlxyXG4gICAgOnR5cGU9XCJidXR0b25UeXBlXCJcclxuICAgIDpleHRlcm5hbD1cImV4dGVybmFsXCJcclxuICAgIDpjbGFzcz1cImJ1dHRvbkNsYXNzZXNcIlxyXG4gICAgOmRpc2FibGVkPVwiaXNEaXNhYmxlZFwiXHJcbiAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgIDpzdHlsZT1cIlxyXG4gICAgICBjb2xvciAhPT0gJ3N1YnRsZScgJiYgIXRleHRcclxuICAgICAgICA/IGBib3gtc2hhZG93OiAtMXB4IDFweCA0cHggMHB4ICMwMDAwMDAwYSBpbnNldDsgYm94LXNoYWRvdzogMHB4IDJweCAycHggMHB4ICMwMDAwMDAwZDtgXHJcbiAgICAgICAgOiAnJ1xyXG4gICAgXCJcclxuICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxyXG4gID5cclxuICAgIDxDb21wb25lbnQgOmlzPVwiZmluYWxMZWZ0SWNvblwiIHYtaWY9XCJmaW5hbExlZnRJY29uXCIgOmNsYXNzPVwiaWNvbkNsYXNzZXNcIiAvPlxyXG4gICAgPHNsb3Qgdi1pZj1cIiFoaWRlVGV4dFwiPkJ1dHRvbjwvc2xvdD5cclxuICAgIDxDb21wb25lbnQgOmlzPVwiaWNvblJpZ2h0XCIgdi1pZj1cImljb25SaWdodCB8fCAhbG9hZGluZ1wiIDpjbGFzcz1cImljb25DbGFzc2VzXCIgLz5cclxuICA8L0NvbXBvbmVudD5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgaXNPYmplY3RMaWtlIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHR5cGUgeyBQcm9wQW55Q29tcG9uZW50IH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvY29tbW9uL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCByZXNvbHZlRHluYW1pY0NvbXBvbmVudCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHR5cGUgeyBGb3JtQnV0dG9uU3R5bGUsIEZvcm1CdXR0b25TaXplIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvZm9ybS9idXR0b24nXHJcbmltcG9ydCB7IENvbW1vbkxvYWRpbmdJY29uIH0gZnJvbSAnfn4vc3JjL2xpYidcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgLyoqXHJcbiAgICogRW1pdCBNb3VzZUV2ZW50IG9uIGNsaWNrXHJcbiAgICovXHJcbiAgKGU6ICdjbGljaycsIHZhbDogTW91c2VFdmVudCk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgLyoqXHJcbiAgICogVVJMIHRvIHdoaWNoIHRvIG5hdmlnYXRlIC0gY2FuIGJlIGEgcmVsYXRpdmUgKGFwcCkgcGF0aCBvciBhbiBhYnNvbHV0ZSBsaW5rIGZvciBhbiBleHRlcm5hbCBVUkxcclxuICAgKi9cclxuICB0bz86IHN0cmluZ1xyXG4gIC8qKlxyXG4gICAqIENob29zZSBmcm9tIG9uZSBvZiAzIGJ1dHRvbiBzaXplc1xyXG4gICAqL1xyXG4gIHNpemU/OiBGb3JtQnV0dG9uU2l6ZVxyXG4gIC8qKlxyXG4gICAqIElmIHNldCwgd2lsbCBtYWtlIHRoZSBidXR0b24gdGFrZSB1cCBhbGwgYXZhaWxhYmxlIHNwYWNlIGhvcml6b250YWxseVxyXG4gICAqL1xyXG4gIGZ1bGxXaWR0aD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBTaW1pbGFyIHRvIFwibGlua1wiLCBidXQgd2l0aG91dCBhbiB1bmRlcmxpbmUgYW5kIHBvc3NpYmx5IGluIGRpZmZlcmVudCBjb2xvcnNcclxuICAgKi9cclxuICB0ZXh0PzogYm9vbGVhblxyXG4gIC8qKlxyXG4gICAqIFdpbGwgcmVtb3ZlIHBhZGRpbmdzIGFuZCBiYWNrZ3JvdW5kLiBVc2UgZm9yIGxpbmtzLlxyXG4gICAqL1xyXG4gIGxpbms/OiBib29sZWFuXHJcbiAgLyoqXHJcbiAgICogY29sb3I6XHJcbiAgICogcHJpbWFyeTogdGhlIGRlZmF1bHQgcHJpbWFyeSBibHVlLlxyXG4gICAqIG91dGxpbmU6IGZvdW5kYXRpb24gYmFja2dyb3VuZCBhbmQgb3V0bGluZVxyXG4gICAqIHN1YnRsZTogbm8gc3R5bGluZ1xyXG4gICAqL1xyXG4gIGNvbG9yPzogRm9ybUJ1dHRvblN0eWxlXHJcbiAgLyoqXHJcbiAgICogU2hvdWxkIHJvdW5kZWQtZnVsbCBiZSBhZGRlZD86XHJcbiAgICovXHJcbiAgcm91bmRlZD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgbG9jYXRpb24gc2hvdWxkIGJlIGZvcmNlZnVsbHkgdHJlYXRlZCBhcyBhbiBleHRlcm5hbCBVUkxcclxuICAgKiAoZm9yIHJlbGF0aXZlIHBhdGhzIHRoaXMgd2lsbCBsaWtlbHkgY2F1c2UgYSByZWRpcmVjdClcclxuICAgKi9cclxuICBleHRlcm5hbD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgdGhlIGJ1dHRvbiBzbyB0aGF0IGl0IGNhbid0IGJlIHByZXNzZWRcclxuICAgKi9cclxuICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBJZiBzZXQsIHdpbGwgaGF2ZSB0eXBlIHNldCB0byBcInN1Ym1pdFwiIHRvIGVuYWJsZSBpdCB0byBzdWJtaXQgYW55IHBhcmVudCBmb3Jtc1xyXG4gICAqL1xyXG4gIHN1Ym1pdD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBBZGQgaWNvbiB0byB0aGUgbGVmdCBmcm9tIHRoZSB0ZXh0XHJcbiAgICovXHJcbiAgaWNvbkxlZnQ/OiBOdWxsYWJsZTxQcm9wQW55Q29tcG9uZW50PlxyXG4gIC8qKlxyXG4gICAqIEFkZCBpY29uIHRvIHRoZSByaWdodCBmcm9tIHRoZSB0ZXh0XHJcbiAgICovXHJcbiAgaWNvblJpZ2h0PzogTnVsbGFibGU8UHJvcEFueUNvbXBvbmVudD5cclxuICAvKipcclxuICAgKiBIaWRlIGRlZmF1bHQgc2xvdCAod2hlbiB5b3Ugd2FudCB0byBzaG93IGljb25zIG9ubHkpXHJcbiAgICovXHJcbiAgaGlkZVRleHQ/OiBib29sZWFuXHJcbiAgLyoqXHJcbiAgICogQ3VzdG9taXplIGNvbXBvbmVudCB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGxpbmtzLlxyXG4gICAqXHJcbiAgICogVGhlIGNvbXBvbmVudCB3aWxsIHRyeSB0byBkeW5hbWljYWxseSByZXNvbHZlIE51eHRMaW5rIGFuZCBSb3V0ZXJMaW5rIGFuZCB1c2UgdGhvc2UsIGlmIHRoaXMgaXMgc2V0IHRvIG51bGwuXHJcbiAgICovXHJcbiAgbGlua0NvbXBvbmVudD86IE51bGxhYmxlPFByb3BBbnlDb21wb25lbnQ+XHJcbiAgLyoqXHJcbiAgICogRGlzYWJsZXMgdGhlIGJ1dHRvbiBhbmQgc2hvd3MgYSBzcGlubmluZyBsb2FkZXJcclxuICAgKi9cclxuICBsb2FkaW5nPzogYm9vbGVhblxyXG59PigpXHJcblxyXG5jb25zdCBOdXh0TGluayA9IHJlc29sdmVEeW5hbWljQ29tcG9uZW50KCdOdXh0TGluaycpXHJcbmNvbnN0IFJvdXRlckxpbmsgPSByZXNvbHZlRHluYW1pY0NvbXBvbmVudCgnUm91dGVyTGluaycpXHJcblxyXG5jb25zdCBsaW5rQ29tcG9uZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5saW5rQ29tcG9uZW50KSByZXR1cm4gcHJvcHMubGlua0NvbXBvbmVudFxyXG4gIGlmIChwcm9wcy5leHRlcm5hbCkgcmV0dXJuICdhJ1xyXG4gIGlmIChpc09iamVjdExpa2UoTnV4dExpbmspKSByZXR1cm4gTnV4dExpbmtcclxuICBpZiAoaXNPYmplY3RMaWtlKFJvdXRlckxpbmspKSByZXR1cm4gUm91dGVyTGlua1xyXG4gIHJldHVybiAnYSdcclxufSlcclxuXHJcbmNvbnN0IGJ1dHRvblR5cGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLnRvKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgaWYgKHByb3BzLnN1Ym1pdCkgcmV0dXJuICdzdWJtaXQnXHJcbiAgcmV0dXJuICdidXR0b24nXHJcbn0pXHJcblxyXG5jb25zdCBpc0Rpc2FibGVkID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMubG9hZGluZylcclxuY29uc3QgZmluYWxMZWZ0SWNvbiA9IGNvbXB1dGVkKCgpID0+XHJcbiAgcHJvcHMubG9hZGluZyA/IENvbW1vbkxvYWRpbmdJY29uIDogcHJvcHMuaWNvbkxlZnRcclxuKVxyXG5cclxuY29uc3QgYmdBbmRCb3JkZXJDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gW11cclxuXHJcbiAgY29uc3QgY29sb3JzQmdCb3JkZXIgPSB7XHJcbiAgICBzdWJ0bGU6IFtcclxuICAgICAgJ2JnLXRyYW5zcGFyZW50IGJvcmRlci10cmFuc3BhcmVudCB0ZXh0LWZvcmVncm91bmQgZm9udC1tZWRpdW0nLFxyXG4gICAgICAnaG92ZXI6YmctcHJpbWFyeS1tdXRlZCBkaXNhYmxlZDpob3ZlcjpiZy10cmFuc3BhcmVudCBmb2N1cy12aXNpYmxlOmJvcmRlci1mb3VuZGF0aW9uJ1xyXG4gICAgXSxcclxuICAgIG91dGxpbmU6IFtcclxuICAgICAgJ2JnLWZvdW5kYXRpb24gYm9yZGVyLW91dGxpbmUtMiB0ZXh0LWZvcmVncm91bmQgZm9udC1tZWRpdW0nLFxyXG4gICAgICAnaG92ZXI6YmctcHJpbWFyeS1tdXRlZCBkaXNhYmxlZDpob3ZlcjpiZy1mb3VuZGF0aW9uIGZvY3VzLXZpc2libGU6Ym9yZGVyLWZvdW5kYXRpb24nXHJcbiAgICBdLFxyXG4gICAgZGFuZ2VyOiBbXHJcbiAgICAgICdiZy1kYW5nZXIgYm9yZGVyLWRhbmdlci1kYXJrZXIgdGV4dC1mb3VuZGF0aW9uIGZvbnQtbWVkaXVtJyxcclxuICAgICAgJ2hvdmVyOmJnLWRhbmdlci1kYXJrZXIgZGlzYWJsZWQ6aG92ZXI6YmctZGFuZ2VyIGZvY3VzLXZpc2libGU6Ym9yZGVyLWZvdW5kYXRpb24nXHJcbiAgICBdLFxyXG4gICAgcHJpbWFyeTogW1xyXG4gICAgICAnYmctcHJpbWFyeSBib3JkZXItb3V0bGluZS0xIHRleHQtZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGZvbnQtc2VtaWJvbGQnLFxyXG4gICAgICAnaG92ZXI6YmctcHJpbWFyeS1mb2N1cyBkaXNhYmxlZDpob3ZlcjpiZy1wcmltYXJ5IGZvY3VzLXZpc2libGU6Ym9yZGVyLWZvdW5kYXRpb24nXHJcbiAgICBdXHJcbiAgfVxyXG5cclxuICBpZiAocHJvcHMucm91bmRlZCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCchcm91bmRlZC1mdWxsJylcclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy50ZXh0IHx8IHByb3BzLmxpbmspIHtcclxuICAgIHN3aXRjaCAocHJvcHMuY29sb3IpIHtcclxuICAgICAgY2FzZSAnc3VidGxlJzpcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZm9yZWdyb3VuZCcpXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnb3V0bGluZSc6XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQnKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWRhbmdlcicpXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAncHJpbWFyeSc6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LXByaW1hcnknKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHN3aXRjaCAocHJvcHMuY29sb3IpIHtcclxuICAgICAgY2FzZSAnc3VidGxlJzpcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goLi4uY29sb3JzQmdCb3JkZXIuc3VidGxlKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJ291dGxpbmUnOlxyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaCguLi5jb2xvcnNCZ0JvcmRlci5vdXRsaW5lKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKC4uLmNvbG9yc0JnQm9yZGVyLmRhbmdlcilcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICdwcmltYXJ5JzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goLi4uY29sb3JzQmdCb3JkZXIucHJpbWFyeSlcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBzaXplQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ3NtJzpcclxuICAgICAgcmV0dXJuICdoLTYgdGV4dC1ib2R5LTJ4cydcclxuICAgIGNhc2UgJ2xnJzpcclxuICAgICAgcmV0dXJuICdoLTEwIHRleHQtYm9keS1zbSdcclxuICAgIGRlZmF1bHQ6XHJcbiAgICBjYXNlICdiYXNlJzpcclxuICAgICAgcmV0dXJuICdoLTggdGV4dC1ib2R5LXhzJ1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHBhZGRpbmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy50ZXh0IHx8IHByb3BzLmxpbmspIHtcclxuICAgIHJldHVybiAncC0wJ1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaGFzSWNvbkxlZnQgPSAhIXByb3BzLmljb25MZWZ0XHJcbiAgY29uc3QgaGFzSWNvblJpZ2h0ID0gISFwcm9wcy5pY29uUmlnaHRcclxuICBjb25zdCBoaWRlVGV4dCA9IHByb3BzLmhpZGVUZXh0XHJcblxyXG4gIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgY2FzZSAnc20nOlxyXG4gICAgICBpZiAoaGlkZVRleHQpIHJldHVybiAndy02J1xyXG4gICAgICBpZiAoaGFzSWNvbkxlZnQpIHJldHVybiAncHktMSBwci0yIHBsLTEnXHJcbiAgICAgIGlmIChoYXNJY29uUmlnaHQpIHJldHVybiAncHktMSBwbC0yIHByLTEnXHJcbiAgICAgIHJldHVybiAncHgtMiBweS0xJ1xyXG4gICAgY2FzZSAnbGcnOlxyXG4gICAgICBpZiAoaGlkZVRleHQpIHJldHVybiAndy0xMCdcclxuICAgICAgaWYgKGhhc0ljb25MZWZ0KSByZXR1cm4gJ3B5LTIgcHItNiBwbC00J1xyXG4gICAgICBpZiAoaGFzSWNvblJpZ2h0KSByZXR1cm4gJ3B5LTIgcGwtNiBwci00J1xyXG4gICAgICByZXR1cm4gJ3B4LTYgcHktMidcclxuICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgaWYgKGhpZGVUZXh0KSByZXR1cm4gJ3ctOCdcclxuICAgICAgaWYgKGhhc0ljb25MZWZ0KSByZXR1cm4gJ3B5LTAgcHItNCBwbC0yJ1xyXG4gICAgICBpZiAoaGFzSWNvblJpZ2h0KSByZXR1cm4gJ3B5LTAgcGwtNCBwci0yJ1xyXG4gICAgICByZXR1cm4gJ3B4LTQgcHktMCdcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBnZW5lcmFsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBiYXNlQ2xhc3NlcyA9IFtcclxuICAgICdpbmxpbmUtZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXInLFxyXG4gICAgJ3RleHQtY2VudGVyIHNlbGVjdC1ub25lIHdoaXRlc3BhY2Utbm93cmFwJyxcclxuICAgICdvdXRsaW5lIG91dGxpbmUtMiBvdXRsaW5lLXRyYW5zcGFyZW50JyxcclxuICAgICd0cmFuc2l0aW9uIGR1cmF0aW9uLTIwMCBlYXNlLWluLW91dCBmb2N1cy12aXNpYmxlOm91dGxpbmUtb3V0bGluZS00J1xyXG4gIF1cclxuXHJcbiAgY29uc3QgYWRkaXRpb25hbENsYXNzZXMgPSBbXVxyXG5cclxuICBpZiAoIXByb3BzLnRleHQgJiYgIXByb3BzLmxpbmspIHtcclxuICAgIGFkZGl0aW9uYWxDbGFzc2VzLnB1c2goJ3JvdW5kZWQtbWQgYm9yZGVyJylcclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5mdWxsV2lkdGgpIHtcclxuICAgIGFkZGl0aW9uYWxDbGFzc2VzLnB1c2goJ3ctZnVsbCcpXHJcbiAgfSBlbHNlIGlmICghcHJvcHMuaGlkZVRleHQpIHtcclxuICAgIGFkZGl0aW9uYWxDbGFzc2VzLnB1c2goJ21heC13LW1heCcpXHJcbiAgfVxyXG4gIGlmIChpc0Rpc2FibGVkLnZhbHVlKSB7XHJcbiAgICBhZGRpdGlvbmFsQ2xhc3Nlcy5wdXNoKCdjdXJzb3Itbm90LWFsbG93ZWQgb3BhY2l0eS02MCcpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gWy4uLmJhc2VDbGFzc2VzLCAuLi5hZGRpdGlvbmFsQ2xhc3Nlc10uam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBidXR0b25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBbXHJcbiAgICBnZW5lcmFsQ2xhc3Nlcy52YWx1ZSxcclxuICAgIHNpemVDbGFzc2VzLnZhbHVlLFxyXG4gICAgYmdBbmRCb3JkZXJDbGFzc2VzLnZhbHVlLFxyXG4gICAgcGFkZGluZ0NsYXNzZXMudmFsdWVcclxuICBdLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgaWNvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ3Nocmluay0wJ11cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICdzbSc6XHJcbiAgICAgIC8vIERvbnQgYWRkIHBhZGRpbmcgdG8gaWNvbiBpZiBoaWRlVGV4dCBpcyB0cnVlIG9uIHNtIHNpemVcclxuICAgICAgaWYgKHByb3BzLmhpZGVUZXh0KSB7XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTQgdy00JylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtNCB3LTQgcC0wLjUnKVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdsZyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnaC02IHctNiBwLTEnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnYmFzZSc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtNiB3LTYgcC0xJylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgb25DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgaWYgKGlzRGlzYWJsZWQudmFsdWUpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBlbWl0KCdjbGljaycsIGUpXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8Rm9ybUJ1dHRvblxyXG4gICAgOmxpbms9XCJ1bmRlcmxpbmVcIlxyXG4gICAgOnRleHQ9XCIhdW5kZXJsaW5lXCJcclxuICAgIDp0bz1cInRvXCJcclxuICAgIDpleHRlcm5hbD1cImV4dGVybmFsXCJcclxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgIDpzaXplPVwic2l6ZVwiXHJcbiAgICA6Zm9yZWdyb3VuZC1saW5rPVwiZm9yZWdyb3VuZExpbmtcIlxyXG4gICAgOmljb24tbGVmdD1cImljb25MZWZ0XCJcclxuICAgIDppY29uLXJpZ2h0PVwiaWNvblJpZ2h0XCJcclxuICAgIDpoaWRlLXRleHQ9XCJoaWRlVGV4dFwiXHJcbiAgICByb2xlPVwibGlua1wiXHJcbiAgICBAY2xpY2suY2FwdHVyZT1cIm9uQ2xpY2tcIlxyXG4gID5cclxuICAgIDxzbG90Pkxpbms8L3Nsb3Q+XHJcbiAgPC9Gb3JtQnV0dG9uPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgRm9ybUJ1dHRvbiBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9mb3JtL0J1dHRvbi52dWUnXHJcbmltcG9ydCB0eXBlIHsgUHJvcFR5cGUgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IFByb3BBbnlDb21wb25lbnQgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuXHJcbnR5cGUgTGlua1NpemUgPSAnc20nIHwgJ2Jhc2UnIHwgJ2xnJ1xyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8eyAoZTogJ2NsaWNrJywgdmFsOiBNb3VzZUV2ZW50KTogdm9pZCB9PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICB0bzoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBleHRlcm5hbDoge1xyXG4gICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxPcHRpb25hbDxib29sZWFuPj4sXHJcbiAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIGRpc2FibGVkOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuIGFzIFByb3BUeXBlPE9wdGlvbmFsPGJvb2xlYW4+PixcclxuICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgc2l6ZToge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPExpbmtTaXplPixcclxuICAgIGRlZmF1bHQ6ICdiYXNlJ1xyXG4gIH0sXHJcbiAgZm9yZWdyb3VuZExpbms6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQWRkIGljb24gdG8gdGhlIGxlZnQgZnJvbSB0aGUgdGV4dFxyXG4gICAqL1xyXG4gIGljb25MZWZ0OiB7XHJcbiAgICB0eXBlOiBbT2JqZWN0LCBGdW5jdGlvbl0gYXMgUHJvcFR5cGU8TnVsbGFibGU8UHJvcEFueUNvbXBvbmVudD4+LFxyXG4gICAgZGVmYXVsdDogbnVsbFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQWRkIGljb24gdG8gdGhlIHJpZ2h0IGZyb20gdGhlIHRleHRcclxuICAgKi9cclxuICBpY29uUmlnaHQ6IHtcclxuICAgIHR5cGU6IFtPYmplY3QsIEZ1bmN0aW9uXSBhcyBQcm9wVHlwZTxOdWxsYWJsZTxQcm9wQW55Q29tcG9uZW50Pj4sXHJcbiAgICBkZWZhdWx0OiBudWxsXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBIaWRlIGRlZmF1bHQgc2xvdCAod2hlbiB5b3Ugd2FudCB0byBzaG93IGljb25zIG9ubHkpXHJcbiAgICovXHJcbiAgaGlkZVRleHQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgdW5kZXJsaW5lOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBvbkNsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuICBpZiAocHJvcHMuZGlzYWJsZWQpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBlbWl0KCdjbGljaycsIGUpXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsImV4cG9ydCBlbnVtIFRvYXN0Tm90aWZpY2F0aW9uVHlwZSB7XHJcbiAgU3VjY2VzcyxcclxuICBXYXJuaW5nLFxyXG4gIERhbmdlcixcclxuICBJbmZvLFxyXG4gIExvYWRpbmdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVG9hc3ROb3RpZmljYXRpb24gPSB7XHJcbiAgdGl0bGU/OiBzdHJpbmdcclxuICAvKipcclxuICAgKiBPcHRpb25hbGx5IHByb3ZpZGUgZXh0cmEgdGV4dFxyXG4gICAqL1xyXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXHJcbiAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IGEgQ1RBIGxpbmsgb24gdGhlIHJpZ2h0XHJcbiAgICovXHJcbiAgY3RhPzoge1xyXG4gICAgdGl0bGU6IHN0cmluZ1xyXG4gICAgdXJsPzogc3RyaW5nXHJcbiAgICBvbkNsaWNrPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWRcclxuICB9XHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgdGhlIHRvYXN0IHNob3VsZCBkaXNhcHBlYXIgYXV0b21hdGljYWxseSBhZnRlciBhIHdoaWxlLlxyXG4gICAqIERlZmF1bHRzIHRvIHRydWVcclxuICAgKi9cclxuICBhdXRvQ2xvc2U/OiBib29sZWFuXHJcbiAgaWQ/OiBzdHJpbmdcclxufVxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdlxyXG4gICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJcclxuICAgIGNsYXNzPVwicG9pbnRlci1ldmVudHMtbm9uZSBmaXhlZCB0b3AtMCByaWdodC0wIGxlZnQtMCBib3R0b20tMCBmbGV4IGl0ZW1zLWVuZCBweC00IHB5LTYgbXQtMTAgc206aXRlbXMtc3RhcnQgc206cC02IHotWzYwXVwiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBzcGFjZS15LTQgc206aXRlbXMtZW5kXCI+XHJcbiAgICAgIDwhLS0gTm90aWZpY2F0aW9uIHBhbmVsLCBkeW5hbWljYWxseSBpbnNlcnQgdGhpcyBpbnRvIHRoZSBsaXZlIHJlZ2lvbiB3aGVuIGl0IG5lZWRzIHRvIGJlIGRpc3BsYXllZCAtLT5cclxuICAgICAgPFRyYW5zaXRpb25cclxuICAgICAgICBlbnRlci1hY3RpdmUtY2xhc3M9XCJ0cmFuc2Zvcm0gZWFzZS1vdXQgZHVyYXRpb24tMzAwIHRyYW5zaXRpb25cIlxyXG4gICAgICAgIGVudGVyLWZyb20tY2xhc3M9XCJ0cmFuc2xhdGUteS0yIG9wYWNpdHktMCBzbTp0cmFuc2xhdGUteS0wIHNtOnRyYW5zbGF0ZS14LTJcIlxyXG4gICAgICAgIGVudGVyLXRvLWNsYXNzPVwidHJhbnNsYXRlLXktMCBvcGFjaXR5LTEwMCBzbTp0cmFuc2xhdGUteC0wXCJcclxuICAgICAgICBsZWF2ZS1hY3RpdmUtY2xhc3M9XCJ0cmFuc2l0aW9uIGVhc2UtaW4gZHVyYXRpb24tMTAwXCJcclxuICAgICAgICBsZWF2ZS1mcm9tLWNsYXNzPVwib3BhY2l0eS0xMDBcIlxyXG4gICAgICAgIGxlYXZlLXRvLWNsYXNzPVwib3BhY2l0eS0wXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCJub3RpZmljYXRpb25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IHBvaW50ZXItZXZlbnRzLWF1dG8gdy1mdWxsIG1heC13LVsyMHJlbV0gb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQgYmctZm91bmRhdGlvbiB0ZXh0LWZvcmVncm91bmQgc2hhZG93LWxnIGJvcmRlciBib3JkZXItb3V0bGluZS0yIHAtMiBwbC0zXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInNocmluay0wXCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgICAgICAgICAnc2VsZi1zdGFydCBtdC0wLjUnOiBub3RpZmljYXRpb24uZGVzY3JpcHRpb24gfHwgbm90aWZpY2F0aW9uLmN0YVxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPENpcmNsZUNoZWNrXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwibm90aWZpY2F0aW9uLnR5cGUgPT09IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zdWNjZXNzIGgtNCB3LTRcIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxDaXJjbGVYXHJcbiAgICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJub3RpZmljYXRpb24udHlwZSA9PT0gVG9hc3ROb3RpZmljYXRpb25UeXBlLkRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyIGgtNCB3LTRcIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxBbGVydENpcmNsZVxyXG4gICAgICAgICAgICAgICAgdi1lbHNlLWlmPVwibm90aWZpY2F0aW9uLnR5cGUgPT09IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5XYXJuaW5nXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTIgaC00IHctNFwiXHJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPEluZm9cclxuICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cIm5vdGlmaWNhdGlvbi50eXBlID09PSBUb2FzdE5vdGlmaWNhdGlvblR5cGUuSW5mb1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yIGgtNCB3LTRcIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxDb21tb25Mb2FkaW5nSWNvblxyXG4gICAgICAgICAgICAgICAgdi1lbHNlLWlmPVwibm90aWZpY2F0aW9uLnR5cGUgPT09IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5Mb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCBvcGFjaXR5LTgwXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBtaW4tdy1bMTByZW1dXCI+XHJcbiAgICAgICAgICAgICAgPHBcclxuICAgICAgICAgICAgICAgIHYtaWY9XCJub3RpZmljYXRpb24udGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQgdGV4dC1ib2R5LXhzIGZvbnQtbWVkaXVtXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBub3RpZmljYXRpb24udGl0bGUgfX1cclxuICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPHBcclxuICAgICAgICAgICAgICAgIHYtaWY9XCJub3RpZmljYXRpb24uZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMiB0ZXh0LWJvZHktMnhzIGxlYWRpbmctc251Z1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sgbm90aWZpY2F0aW9uLmRlc2NyaXB0aW9uIH19XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDxkaXYgdi1pZj1cIm5vdGlmaWNhdGlvbi5jdGFcIj5cclxuICAgICAgICAgICAgICAgIDxUZXh0TGluayA6dG89XCJub3RpZmljYXRpb24uY3RhLnVybFwiIHNpemU9XCJzbVwiIEBjbGljaz1cIm9uQ3RhQ2xpY2tcIj5cclxuICAgICAgICAgICAgICAgICAge3sgbm90aWZpY2F0aW9uLmN0YS50aXRsZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9UZXh0TGluaz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgOmljb24tbGVmdD1cIlhcIlxyXG4gICAgICAgICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgIGhpZGUtdGV4dFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2hyaW5rLTAgbWwtYXV0b1wiXHJcbiAgICAgICAgICAgICAgOmNsYXNzPVwie1xyXG4gICAgICAgICAgICAgICAgJ3NlbGYtc3RhcnQgLW10LTAuNSAtbXItMC41JzpcclxuICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmRlc2NyaXB0aW9uIHx8IG5vdGlmaWNhdGlvbi5jdGFcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICBAY2xpY2s9XCJkaXNtaXNzXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIENsb3NlXHJcbiAgICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L1RyYW5zaXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IFRleHRMaW5rIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi90ZXh0L0xpbmsudnVlJ1xyXG5pbXBvcnQgdHlwZSB7IE1heWJlTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBUb2FzdE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICd+fi9zcmMvaGVscGVycy9nbG9iYWwvdG9hc3QnXHJcbmltcG9ydCB0eXBlIHsgVG9hc3ROb3RpZmljYXRpb24gfSBmcm9tICd+fi9zcmMvaGVscGVycy9nbG9iYWwvdG9hc3QnXHJcbmltcG9ydCB7IENvbW1vbkxvYWRpbmdJY29uLCBGb3JtQnV0dG9uIH0gZnJvbSAnfn4vc3JjL2xpYidcclxuaW1wb3J0IHsgWCwgQ2lyY2xlQ2hlY2ssIENpcmNsZVgsIEFsZXJ0Q2lyY2xlLCBJbmZvIH0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTpub3RpZmljYXRpb24nLCB2YWw6IE1heWJlTnVsbE9yVW5kZWZpbmVkPFRvYXN0Tm90aWZpY2F0aW9uPik6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgbm90aWZpY2F0aW9uOiBNYXliZU51bGxPclVuZGVmaW5lZDxUb2FzdE5vdGlmaWNhdGlvbj5cclxufT4oKVxyXG5cclxuY29uc3QgZGlzbWlzcyA9ICgpID0+IHtcclxuICBlbWl0KCd1cGRhdGU6bm90aWZpY2F0aW9uJywgbnVsbClcclxufVxyXG5cclxuY29uc3Qgb25DdGFDbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgcHJvcHMubm90aWZpY2F0aW9uPy5jdGE/Lm9uQ2xpY2s/LihlKVxyXG4gIGRpc21pc3MoKVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iLCJjb25zdCBLRVlCT0FSRF9DTElDS19DSEFSID0gJ0VudGVyJ1xyXG5cclxuLyoqXHJcbiAqIFZpc2libGUsIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cyB3aXRoIGNsaWNrIGhhbmRsZXJzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUga2V5Ym9hcmQgbGlzdGVuZXIgZm9yIGFjY2Vzc2liaWxpdHkuXHJcbiAqIFlvdSBjYW4gd3JhcCB5b3VyIGNsaWNrIGhhbmRsZXIgd2l0aCB0aGlzIGluIEBrZXlwcmVzcywgdG8gcnVuIGl0IHdoZW4gZW50ZXIgaXMgcHJlc3NlZCBvbiB0aGUgc2VsZWN0ZWQgY29tcG9uZW50XHJcbiAqIEBkZXByZWNhdGVkIFVzZSB2S2V5Ym9hcmRDbGlja2FibGUgZGlyZWN0aXZlIGluc3RlYWRcclxuICogU2VlIG1vcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWUtYTExeS9lc2xpbnQtcGx1Z2luLXZ1ZWpzLWFjY2Vzc2liaWxpdHkvYmxvYi9tYWluL2RvY3MvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cy5tZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGtleWJvYXJkQ2xpY2soY2I6IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkKSB7XHJcbiAgcmV0dXJuIChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZS5jb2RlICE9PSBLRVlCT0FSRF9DTElDS19DSEFSKSByZXR1cm5cclxuICAgIGNiKGUpXHJcbiAgfVxyXG59XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3BhbiA6Y2xhc3M9XCJiYWRnZUNsYXNzZXNcIj5cclxuICAgIDxzdmcgdi1pZj1cImRvdFwiIDpjbGFzcz1cImRvdENsYXNzZXNcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCA4IDhcIj5cclxuICAgICAgPGNpcmNsZSBjeD1cIjRcIiBjeT1cIjRcIiByPVwiM1wiIC8+XHJcbiAgICA8L3N2Zz5cclxuICAgIDxzcGFuIGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXBcIj5cclxuICAgICAgPHNsb3Q+QmFkZ2U8L3Nsb3Q+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8YnV0dG9uIHYtaWY9XCJpY29uTGVmdFwiIDpjbGFzcz1cImljb25DbGFzc2VzXCIgQGNsaWNrPVwib25JY29uQ2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICA8Q29tcG9uZW50IDppcz1cImljb25MZWZ0XCIgOmNsYXNzPVwiWydoLTQgdy00JywgYmFkZ2VEb3RJY29uQ29sb3JDbGFzc2VzXVwiIC8+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L3NwYW4+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IFByb3BBbnlDb21wb25lbnQgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuXHJcbnR5cGUgQmFkZ2VTaXplID0gJ2Jhc2UnIHwgJ2xnJ1xyXG50eXBlIEJhZGdlQ29sb3JzID0gJ3ByaW1hcnknIHwgJ3NlY29uZGFyeSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICdjbGljay1pY29uJywgdjogTW91c2VFdmVudCk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgc2l6ZT86IEJhZGdlU2l6ZVxyXG4gICAgY29sb3I/OiBCYWRnZUNvbG9yc1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGV4dCAmIGJnIGNvbG9yLiBEZWZhdWx0cyB0byBwcmltYXJ5IHZhcmlhdGlvbi5cclxuICAgICAqL1xyXG4gICAgY29sb3JDbGFzc2VzPzogc3RyaW5nXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IGRvdCB0byB0aGUgcmlnaHRcclxuICAgICAqL1xyXG4gICAgZG90PzogYm9vbGVhblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGRvdC9pY29uIGJnIGNvbG9yLiBEZWZhdWx0cyB0byBwcmltYXJ5IHZhcmlhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZG90SWNvbkNvbG9yQ2xhc3Nlcz86IHN0cmluZ1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3B0aW9uYWxseSBzaG93IGljb24gdG8gdGhlIGxlZnQgb2YgdGhlIHRleHRcclxuICAgICAqL1xyXG4gICAgaWNvbkxlZnQ/OiBQcm9wQW55Q29tcG9uZW50XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1vcmUgc3F1YXJlLCBidXQgc3RpbGwgcm91bmRlZCBsb29rXHJcbiAgICAgKi9cclxuICAgIHJvdW5kZWQ/OiBib29sZWFuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFjayBpY29uIGNsaWNrc1xyXG4gICAgICovXHJcbiAgICBjbGlja2FibGVJY29uPzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgc2l6ZTogJ2Jhc2UnLFxyXG4gICAgY29sb3I6ICdwcmltYXJ5J1xyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgYmFkZ2VDb2xvckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLmNvbG9yQ2xhc3Nlcykge1xyXG4gICAgcmV0dXJuIHByb3BzLmNvbG9yQ2xhc3Nlc1xyXG4gIH0gZWxzZSBpZiAocHJvcHMuY29sb3IgPT09ICdzZWNvbmRhcnknKSB7XHJcbiAgICByZXR1cm4gJ2JnLWhpZ2hsaWdodC0zIHRleHQtZm9yZWdyb3VuZC0yJ1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gJ2JnLWluZm8tbGlnaHRlciB0ZXh0LXByaW1hcnktZm9jdXMgZGFyazp0ZXh0LWZvcmVncm91bmQnXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgYmFkZ2VEb3RJY29uQ29sb3JDbGFzc2VzID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMuZG90SWNvbkNvbG9yQ2xhc3NlcyB8fCAndGV4dC1ibHVlLTQwMCdcclxuKVxyXG5cclxuY29uc3QgYmFkZ2VDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gW1xyXG4gICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzZWxlY3Qtbm9uZScsXHJcbiAgICBiYWRnZUNvbG9yQ2xhc3Nlcy52YWx1ZSxcclxuICAgIHByb3BzLnNpemUgPT09ICdsZydcclxuICAgICAgPyAncHgtMyBweS0wLjUgdGV4dC1ib2R5LTJ4cydcclxuICAgICAgOiAncC0xIHRleHQtYm9keS0zeHMgdGV4dC1ib2R5LTN4cyBmb250LW1lZGl1bSdcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5yb3VuZGVkKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3JvdW5kZWQnKVxyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKFxyXG4gICAgICBwcm9wcy5zaXplID09PSAnbGcnXHJcbiAgICAgICAgPyAncHgtMiBweS0wLjUgdGV4dC1ib2R5LTJ4cydcclxuICAgICAgICA6ICdweC0xLjEgcHktMC41IHRleHQtYm9keS0zeHMgZm9udC1tZWRpdW0nXHJcbiAgICApXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncm91bmRlZC1mdWxsJylcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgcHJvcHMuc2l6ZSA9PT0gJ2xnJ1xyXG4gICAgICAgID8gJ3B4LTIuNSBweS0wLjUgdGV4dC1ib2R5LTJ4cydcclxuICAgICAgICA6ICdweC0yLjUgcHktMC41IHRleHQtYm9keS0zeHMgZm9udC1tZWRpdW0nXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGljb25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gW1xyXG4gICAgJ210LTAuNSBtbC0wLjUgaW5saW5lLWZsZXggaC00IHctNCBmbGV4LXNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgZm9jdXM6b3V0bGluZS1ub25lJ1xyXG4gIF1cclxuXHJcbiAgaWYgKHByb3BzLmNsaWNrYWJsZUljb24pIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnY3Vyc29yLXBvaW50ZXInKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2N1cnNvci1kZWZhdWx0JylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgZG90Q2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtcclxuICAgICctbWwtMC41IG1yLTEuNSBoLTIgdy0yJyxcclxuICAgIGJhZGdlRG90SWNvbkNvbG9yQ2xhc3Nlcy52YWx1ZVxyXG4gIF1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBvbkljb25DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgaWYgKCFwcm9wcy5jbGlja2FibGVJY29uKSB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXHJcbiAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgZW1pdCgnY2xpY2staWNvbicsIGUpXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsImxldCBqdW5rVmFyaWFibGU6IHN0cmluZ1tdID0gW11cclxuXHJcbi8qKlxyXG4gKiBJZiB5b3UgdXNlIGNvbmNhdGVuYXRpb24gb3IgdmFyaWFibGVzIHRvIGJ1aWxkIHRhaWx3aW5kIGNsYXNzZXMsIFB1cmdlQ1NTIHdvbid0IHBpY2sgdXAgb24gdGhlbVxyXG4gKiBkdXJpbmcgYnVpbGQgYW5kIHdpbGwgbm90IGFkZCB0aGVtIHRvIHRoZSBidWlsZC4gU28geW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBqdXN0IGFkZCBzdHJpbmdcclxuICogbGl0ZXJhbHMgb2YgdGFpbHdpbmQgY2xhc3NlcyBzbyBQdXJnZUNTUyBwaWNrcyB1cCBvbiB0aGVtLlxyXG4gKlxyXG4gKiBXaGlsZSB5b3UgY291bGQganVzdCBkZWZpbmUgYW4gdW51c2VkIGFycmF5IG9mIHRoZXNlIGNsYXNzZXMsIGVzbGludC9UUyB3aWxsIGJvdGhlciB5b3UgYWJvdXQgdGhlIHVudXNlZFxyXG4gKiB2YXJpYWJsZSBzbyBpdCdzIGJldHRlciB0byB1c2UgdGhpcyBpbnN0ZWFkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtDbGFzc2VzVXNlZChjbGFzc2VzOiBzdHJpbmdbXSkge1xyXG4gIC8vIHRoaXMgZG9lc24ndCBkbyBhbnl0aGluZywgZXhjZXB0IHRyaWNrIHRoZSBjb21waWxlciBpbnRvIHRoaW5raW5nIHRoaXMgaXNuJ3QgYSBwdXJlXHJcbiAgLy8gZnVuY3Rpb24gc28gdGhhdCB0aGUgaW52b2NhdGlvbnMgYXJlbid0IHRyZWUtc2hha2VuIG91dFxyXG4gIGp1bmtWYXJpYWJsZSA9IGp1bmtWYXJpYWJsZSA/IGNsYXNzZXMgOiBjbGFzc2VzLnNsaWNlKClcclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgdGFpbHdpbmQgYnJlYWtwb2ludCBzZXQuIEVhY2ggdmFsdWUgaXMgdGhlIG1pbmltdW0gd2lkdGggKGluIHBpeGVscykgZXhwZWN0ZWQgZm9yIGVhY2ggYnJlYWtwb2ludC5cclxuICovXHJcbmV4cG9ydCBlbnVtIFRhaWx3aW5kQnJlYWtwb2ludHMge1xyXG4gIHNtID0gNjQwLFxyXG4gIG1kID0gNzY4LFxyXG4gIGxnID0gMTAyNCxcclxuICB4bCA9IDEyODAsXHJcbiAgJzJ4bCcgPSAxNTM2XHJcbn1cclxuIiwiaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgVG9SZWZzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgSG9yaXpvbnRhbE9yVmVydGljYWwsXHJcbiAgU3RlcENvcmVUeXBlXHJcbn0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvY29tbW9uL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IGNsYW1wIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgVGFpbHdpbmRCcmVha3BvaW50cywgbWFya0NsYXNzZXNVc2VkIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvdGFpbHdpbmQnXHJcblxyXG5leHBvcnQgdHlwZSBTdGVwc1BhZGRpbmcgPSAnYmFzZScgfCAneHMnIHwgJ3NtJ1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0ZXBzSW50ZXJuYWxzKHBhcmFtczoge1xyXG4gIHByb3BzOiBUb1JlZnM8e1xyXG4gICAgb3JpZW50YXRpb24/OiBIb3Jpem9udGFsT3JWZXJ0aWNhbFxyXG4gICAgc3RlcHM6IFN0ZXBDb3JlVHlwZVtdXHJcbiAgICBtb2RlbFZhbHVlPzogbnVtYmVyXHJcbiAgICBnb1ZlcnRpY2FsQmVsb3c/OiBUYWlsd2luZEJyZWFrcG9pbnRzXHJcbiAgICBub25JbnRlcmFjdGl2ZT86IGJvb2xlYW5cclxuICAgIHN0ZXBzUGFkZGluZz86IFN0ZXBzUGFkZGluZ1xyXG4gIH0+XHJcbiAgZW1pdDoge1xyXG4gICAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbDogbnVtYmVyKTogdm9pZFxyXG4gIH1cclxufSkge1xyXG4gIGNvbnN0IHtcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIG1vZGVsVmFsdWUsXHJcbiAgICAgIHN0ZXBzLFxyXG4gICAgICBvcmllbnRhdGlvbixcclxuICAgICAgZ29WZXJ0aWNhbEJlbG93LFxyXG4gICAgICBub25JbnRlcmFjdGl2ZSxcclxuICAgICAgc3RlcHNQYWRkaW5nXHJcbiAgICB9LFxyXG4gICAgZW1pdFxyXG4gIH0gPSBwYXJhbXNcclxuXHJcbiAgY29uc3QgZmluYWxPcmllbnRhdGlvbiA9IGNvbXB1dGVkKFxyXG4gICAgKCk6IEhvcml6b250YWxPclZlcnRpY2FsID0+XHJcbiAgICAgIG9yaWVudGF0aW9uPy52YWx1ZSA9PT0gJ3ZlcnRpY2FsJyA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCdcclxuICApXHJcblxyXG4gIGNvbnN0IHZhbHVlID0gY29tcHV0ZWQoe1xyXG4gICAgZ2V0OiAoKSA9PiBjbGFtcChtb2RlbFZhbHVlPy52YWx1ZSB8fCAwLCAtMSwgc3RlcHMudmFsdWUubGVuZ3RoKSxcclxuICAgIHNldDogKG5ld1ZhbCkgPT4gZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjbGFtcChuZXdWYWwsIDAsIHN0ZXBzLnZhbHVlLmxlbmd0aCkpXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgZ2V0U3RlcERpc3BsYXlWYWx1ZSA9IChzdGVwOiBudW1iZXIpID0+IGAke3N0ZXAgKyAxfWBcclxuICBjb25zdCBpc0N1cnJlbnRTdGVwID0gKHN0ZXA6IG51bWJlcikgPT4gc3RlcCA9PT0gdmFsdWUudmFsdWVcclxuICBjb25zdCBpc0ZpbmlzaGVkU3RlcCA9IChzdGVwOiBudW1iZXIpID0+IHN0ZXAgPCB2YWx1ZS52YWx1ZVxyXG5cclxuICBjb25zdCBzd2l0Y2hTdGVwID0gKG5ld1N0ZXA6IG51bWJlciwgZT86IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGlmIChub25JbnRlcmFjdGl2ZT8udmFsdWUpIHtcclxuICAgICAgZT8ucHJldmVudERlZmF1bHQoKVxyXG4gICAgICBlPy5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgICBlPy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICB2YWx1ZS52YWx1ZSA9IG5ld1N0ZXBcclxuXHJcbiAgICBjb25zdCBzdGVwT2JqID0gc3RlcHMudmFsdWVbdmFsdWUudmFsdWVdXHJcbiAgICBzdGVwT2JqPy5vbkNsaWNrPy4oKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbGlzdENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsnZmxleCddXHJcblxyXG4gICAgbGV0IHBhZGRpbmdIb3Jpem9udGFsOiBzdHJpbmdcclxuICAgIGxldCBwYWRkaW5nVmVydGljYWw6IHN0cmluZ1xyXG4gICAgaWYgKHN0ZXBzUGFkZGluZz8udmFsdWUgPT09ICd4cycpIHtcclxuICAgICAgcGFkZGluZ0hvcml6b250YWwgPSAnc3BhY2UteC0yJ1xyXG4gICAgICBwYWRkaW5nVmVydGljYWwgPSAnc3BhY2UteS0xJ1xyXG4gICAgfSBlbHNlIGlmIChzdGVwc1BhZGRpbmc/LnZhbHVlID09PSAnc20nKSB7XHJcbiAgICAgIHBhZGRpbmdIb3Jpem9udGFsID0gJ3NwYWNlLXgtNCdcclxuICAgICAgcGFkZGluZ1ZlcnRpY2FsID0gJ3NwYWNlLXktMSdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhZGRpbmdIb3Jpem9udGFsID0gJ3NwYWNlLXgtNidcclxuICAgICAgcGFkZGluZ1ZlcnRpY2FsID0gJ3NwYWNlLXktNCdcclxuICAgIH1cclxuXHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2ZsZXgnKVxyXG4gICAgaWYgKGZpbmFsT3JpZW50YXRpb24udmFsdWUgPT09ICd2ZXJ0aWNhbCcgfHwgZ29WZXJ0aWNhbEJlbG93Py52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goYGZsZXgtY29sICR7cGFkZGluZ1ZlcnRpY2FsfSBqdXN0aWZ5LWNlbnRlcmApXHJcblxyXG4gICAgICBpZiAoZ29WZXJ0aWNhbEJlbG93Py52YWx1ZSA9PT0gVGFpbHdpbmRCcmVha3BvaW50cy5zbSkge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgICAgIGBzbTpmbGV4LXJvdyBzbTpzcGFjZS15LTAgc206anVzdGlmeS1zdGFydCBzbToke3BhZGRpbmdIb3Jpem9udGFsfSBzbTppdGVtcy1jZW50ZXJgXHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2UgaWYgKGdvVmVydGljYWxCZWxvdz8udmFsdWUgPT09IFRhaWx3aW5kQnJlYWtwb2ludHMubWQpIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goXHJcbiAgICAgICAgICBgbWQ6ZmxleC1yb3cgbWQ6c3BhY2UteS0wIG1kOmp1c3RpZnktc3RhcnQgbWQ6JHtwYWRkaW5nSG9yaXpvbnRhbH0gbWQ6aXRlbXMtY2VudGVyYFxyXG4gICAgICAgIClcclxuICAgICAgfSBlbHNlIGlmIChnb1ZlcnRpY2FsQmVsb3c/LnZhbHVlID09PSBUYWlsd2luZEJyZWFrcG9pbnRzLmxnKSB7XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKFxyXG4gICAgICAgICAgYGxnOmZsZXgtcm93IGxnOnNwYWNlLXktMCBsZzpqdXN0aWZ5LXN0YXJ0IGxnOiR7cGFkZGluZ0hvcml6b250YWx9IGxnOml0ZW1zLWNlbnRlcmBcclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSBpZiAoZ29WZXJ0aWNhbEJlbG93Py52YWx1ZSA9PT0gVGFpbHdpbmRCcmVha3BvaW50cy54bCkge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgICAgIGB4bDpmbGV4LXJvdyB4bDpzcGFjZS15LTAgeGw6anVzdGlmeS1zdGFydCB4bDoke3BhZGRpbmdIb3Jpem9udGFsfSB4bDppdGVtcy1jZW50ZXJgXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goYGZsZXgtcm93ICR7cGFkZGluZ0hvcml6b250YWx9IGl0ZW1zLWNlbnRlcmApXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgbGlua0NsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsnZmxleCBpdGVtcy1jZW50ZXInXVxyXG5cclxuICAgIGlmICghbm9uSW50ZXJhY3RpdmU/LnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnY3Vyc29yLXBvaW50ZXInKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB2YWx1ZSxcclxuICAgIGlzQ3VycmVudFN0ZXAsXHJcbiAgICBpc0ZpbmlzaGVkU3RlcCxcclxuICAgIHN3aXRjaFN0ZXAsXHJcbiAgICBnZXRTdGVwRGlzcGxheVZhbHVlLFxyXG4gICAgbGlzdENsYXNzZXMsXHJcbiAgICBsaW5rQ2xhc3NlcyxcclxuICAgIG9yaWVudGF0aW9uOiBmaW5hbE9yaWVudGF0aW9uXHJcbiAgfVxyXG59XHJcblxyXG4vLyB0byBhbGxvdyBmb3IgZHluYW1pYyBjbGFzcyBidWlsZGluZyBhYm92ZTpcclxubWFya0NsYXNzZXNVc2VkKFtcclxuICAnc206c3BhY2UteC02JyxcclxuICAnbWQ6c3BhY2UteC02JyxcclxuICAnbGc6c3BhY2UteC02JyxcclxuICAneGw6c3BhY2UteC02JyxcclxuICAnc206c3BhY2UteC0yJyxcclxuICAnbWQ6c3BhY2UteC0yJyxcclxuICAnbGc6c3BhY2UteC0yJyxcclxuICAneGw6c3BhY2UteC0yJyxcclxuICAnc206c3BhY2UteC00JyxcclxuICAnbWQ6c3BhY2UteC00JyxcclxuICAnbGc6c3BhY2UteC00JyxcclxuICAneGw6c3BhY2UteC00J1xyXG5dKVxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPG5hdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXJcIiA6YXJpYS1sYWJlbD1cImFyaWFMYWJlbCB8fCAnUHJvZ3Jlc3Mgc3RlcHMnXCI+XHJcbiAgICA8b2wgOmNsYXNzPVwibGlzdENsYXNzZXNcIj5cclxuICAgICAgPGxpIHYtZm9yPVwiKHN0ZXAsIGkpIGluIHN0ZXBzXCIgOmtleT1cInN0ZXAubmFtZVwiPlxyXG4gICAgICAgIDxhXHJcbiAgICAgICAgICB2LWlmPVwiaXNGaW5pc2hlZFN0ZXAoaSlcIlxyXG4gICAgICAgICAgOmhyZWY9XCJzdGVwLmhyZWZcIlxyXG4gICAgICAgICAgOmNsYXNzPVwibGlua0NsYXNzZXNcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiKGUpID0+IHN3aXRjaFN0ZXAoaSwgZSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2hyaW5rLTAgaC03IHctNyByb3VuZGVkLWZ1bGwgYm9yZGVyIGJvcmRlci1wcmltYXJ5IHRleHQtd2hpdGUgYmctcHJpbWFyeSBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgc2VsZWN0LW5vbmVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPENoZWNrSWNvbiBjbGFzcz1cInctNCBoLTRcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LXhzIGZvbnQtbWVkaXVtIHRleHQtcHJpbWFyeVwiPnt7IHN0ZXAubmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgdi1pZj1cInN0ZXAuZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTJcIj5cclxuICAgICAgICAgICAgICAgIHt7IHN0ZXAuZGVzY3JpcHRpb24gfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPGFcclxuICAgICAgICAgIHYtZWxzZS1pZj1cImlzQ3VycmVudFN0ZXAoaSlcIlxyXG4gICAgICAgICAgOmhyZWY9XCJzdGVwLmhyZWZcIlxyXG4gICAgICAgICAgOmNsYXNzPVwibGlua0NsYXNzZXNcIlxyXG4gICAgICAgICAgYXJpYS1jdXJyZW50PVwic3RlcFwiXHJcbiAgICAgICAgICBAY2xpY2s9XCIoZSkgPT4gc3dpdGNoU3RlcChpLCBlKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteC0yIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaHJpbmstMCBoLTcgdy03IHRleHQtYm9keS14cyByb3VuZGVkLWZ1bGwgYm9yZGVyIGJvcmRlci1wcmltYXJ5IGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzZWxlY3Qtbm9uZSB0ZXh0LXByaW1hcnlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0U3RlcERpc3BsYXlWYWx1ZShpKSB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LXhzIGZvbnQtbWVkaXVtIHRleHQtcHJpbWFyeVwiPnt7IHN0ZXAubmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgdi1pZj1cInN0ZXAuZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTJcIj5cclxuICAgICAgICAgICAgICAgIHt7IHN0ZXAuZGVzY3JpcHRpb24gfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPGFcclxuICAgICAgICAgIHYtZWxzZVxyXG4gICAgICAgICAgOmhyZWY9XCJzdGVwLmhyZWZcIlxyXG4gICAgICAgICAgOmNsYXNzPVwibGlua0NsYXNzZXNcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiKGUpID0+IHN3aXRjaFN0ZXAoaSwgZSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2hyaW5rLTAgaC03IHctNyByb3VuZGVkLWZ1bGwgYm9yZGVyIGJvcmRlci1mb3JlZ3JvdW5kLTMgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHNlbGVjdC1ub25lIHRleHQtZm9yZWdyb3VuZC0zXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldFN0ZXBEaXNwbGF5VmFsdWUoaSkgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYm9keS14cyBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQtMlwiPlxyXG4gICAgICAgICAgICAgICAge3sgc3RlcC5uYW1lIH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic3RlcC5kZXNjcmlwdGlvblwiIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmQtMlwiPlxyXG4gICAgICAgICAgICAgICAge3sgc3RlcC5kZXNjcmlwdGlvbiB9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9saT5cclxuICAgIDwvb2w+XHJcbiAgPC9uYXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IENoZWNrSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzIwL3NvbGlkJ1xyXG5pbXBvcnQgeyB0b1JlZnMgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB7IHVzZVN0ZXBzSW50ZXJuYWxzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi9zdGVwcydcclxuaW1wb3J0IHR5cGUgeyBTdGVwc1BhZGRpbmcgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvY29tbW9uL3N0ZXBzJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgSG9yaXpvbnRhbE9yVmVydGljYWwsXHJcbiAgTnVtYmVyU3RlcFR5cGVcclxufSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuaW1wb3J0IHsgVGFpbHdpbmRCcmVha3BvaW50cyB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL3RhaWx3aW5kJ1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsOiBudW1iZXIpOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIGFyaWFMYWJlbD86IHN0cmluZ1xyXG4gIG9yaWVudGF0aW9uPzogSG9yaXpvbnRhbE9yVmVydGljYWxcclxuICBzdGVwczogTnVtYmVyU3RlcFR5cGVbXVxyXG4gIG1vZGVsVmFsdWU/OiBudW1iZXJcclxuICBnb1ZlcnRpY2FsQmVsb3c/OiBUYWlsd2luZEJyZWFrcG9pbnRzXHJcbiAgbm9uSW50ZXJhY3RpdmU/OiBib29sZWFuXHJcbiAgc3RlcHNQYWRkaW5nPzogU3RlcHNQYWRkaW5nXHJcbn0+KClcclxuXHJcbmNvbnN0IHtcclxuICBpc0N1cnJlbnRTdGVwLFxyXG4gIGlzRmluaXNoZWRTdGVwLFxyXG4gIHN3aXRjaFN0ZXAsXHJcbiAgZ2V0U3RlcERpc3BsYXlWYWx1ZSxcclxuICBsaXN0Q2xhc3NlcyxcclxuICBsaW5rQ2xhc3Nlc1xyXG59ID0gdXNlU3RlcHNJbnRlcm5hbHMoe1xyXG4gIHByb3BzOiB0b1JlZnMocHJvcHMpLFxyXG4gIGVtaXRcclxufSlcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8bmF2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiIDphcmlhLWxhYmVsPVwiYXJpYUxhYmVsIHx8ICdQcm9ncmVzcyBzdGVwcydcIj5cclxuICAgIDxvbCA6Y2xhc3M9XCJbbGlzdENsYXNzZXMsIGV4dHJhTGlzdENsYXNzZXNdXCI+XHJcbiAgICAgIDxsaSB2LWZvcj1cIihzdGVwLCBpKSBpbiBzdGVwc1wiIDprZXk9XCJzdGVwLm5hbWVcIj5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1pZj1cImlzRmluaXNoZWRTdGVwKGkpXCJcclxuICAgICAgICAgIDpocmVmPVwic3RlcC5ocmVmXCJcclxuICAgICAgICAgIDpjbGFzcz1cImxpbmtDbGFzc2VzXCJcclxuICAgICAgICAgIEBjbGljaz1cIihlKSA9PiBzd2l0Y2hTdGVwKGksIGUpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC01IHctNSBmbGV4LXNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8c3BhbiB2LWlmPVwiYmFzaWNcIiBjbGFzcz1cImgtMyB3LTMgcm91bmRlZC1mdWxsIGJnLWZvcmVncm91bmQtMlwiIC8+XHJcbiAgICAgICAgICAgIDxDaGVja0NpcmNsZUljb25cclxuICAgICAgICAgICAgICB2LWVsc2VcclxuICAgICAgICAgICAgICBjbGFzcz1cImgtZnVsbCB3LWZ1bGwgdGV4dC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gOmNsYXNzPVwiWyd0ZXh0LWZvcmVncm91bmQnLCBsYWJlbENsYXNzZXNdXCI+XHJcbiAgICAgICAgICAgIHt7IHN0ZXAubmFtZSB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1lbHNlLWlmPVwiaXNDdXJyZW50U3RlcChpKVwiXHJcbiAgICAgICAgICA6aHJlZj1cInN0ZXAuaHJlZlwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJsaW5rQ2xhc3Nlc1wiXHJcbiAgICAgICAgICBhcmlhLWN1cnJlbnQ9XCJzdGVwXCJcclxuICAgICAgICAgIEBjbGljaz1cIihlKSA9PiBzd2l0Y2hTdGVwKGksIGUpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC01IHctNSBmbGV4LXNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiYmFzaWNcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImgtMyB3LTMgcm91bmRlZC1mdWxsIGJnLWZvcmVncm91bmRcIiAvPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWJzb2x1dGUgaC00IHctNCByb3VuZGVkLWZ1bGwgYmctb3V0bGluZS0yXCIgLz5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlbGF0aXZlIGJsb2NrIGgtMiB3LTIgcm91bmRlZC1mdWxsIGJnLXByaW1hcnktZm9jdXNcIiAvPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gOmNsYXNzPVwiWyd0ZXh0LXByaW1hcnktZm9jdXMnLCBsYWJlbENsYXNzZXNdXCI+XHJcbiAgICAgICAgICAgIHt7IHN0ZXAubmFtZSB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgICA6aHJlZj1cInN0ZXAuaHJlZlwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJsaW5rQ2xhc3Nlc1wiXHJcbiAgICAgICAgICBAY2xpY2s9XCIoZSkgPT4gc3dpdGNoU3RlcChpLCBlKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC01IHctNSBmbGV4LXNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJiYXNpY1wiIGNsYXNzPVwiaC0zIHctMyByb3VuZGVkLWZ1bGwgYmctZm9yZWdyb3VuZC0yXCIgLz5cclxuICAgICAgICAgICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJoLTQgdy00IHJvdW5kZWQtZnVsbCBiZy1mb3JlZ3JvdW5kLWRpc2FibGVkXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHAgOmNsYXNzPVwiWyd0ZXh0LWZvcmVncm91bmQtZGlzYWJsZWQnLCBsYWJlbENsYXNzZXNdXCI+XHJcbiAgICAgICAgICAgIHt7IHN0ZXAubmFtZSB9fVxyXG4gICAgICAgICAgPC9wPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9saT5cclxuICAgIDwvb2w+XHJcbiAgPC9uYXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IENoZWNrQ2lyY2xlSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzIwL3NvbGlkJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgdG9SZWZzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyB1c2VTdGVwc0ludGVybmFscyB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9jb21tb24vc3RlcHMnXHJcbmltcG9ydCB0eXBlIHsgU3RlcHNQYWRkaW5nIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2NvbW1vbi9zdGVwcydcclxuaW1wb3J0IHR5cGUge1xyXG4gIEJ1bGxldFN0ZXBUeXBlLFxyXG4gIEhvcml6b250YWxPclZlcnRpY2FsXHJcbn0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvY29tbW9uL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IFRhaWx3aW5kQnJlYWtwb2ludHMgfSBmcm9tICd+fi9zcmMvaGVscGVycy90YWlsd2luZCdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbDogbnVtYmVyKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBhcmlhTGFiZWw/OiBzdHJpbmdcclxuICBiYXNpYz86IGJvb2xlYW5cclxuICBvcmllbnRhdGlvbj86IEhvcml6b250YWxPclZlcnRpY2FsXHJcbiAgc3RlcHM6IEJ1bGxldFN0ZXBUeXBlW11cclxuICBtb2RlbFZhbHVlPzogbnVtYmVyXHJcbiAgZ29WZXJ0aWNhbEJlbG93PzogVGFpbHdpbmRCcmVha3BvaW50c1xyXG4gIG5vbkludGVyYWN0aXZlPzogYm9vbGVhblxyXG4gIHN0ZXBzUGFkZGluZz86IFN0ZXBzUGFkZGluZ1xyXG59PigpXHJcblxyXG5jb25zdCB7IGlzQ3VycmVudFN0ZXAsIGlzRmluaXNoZWRTdGVwLCBzd2l0Y2hTdGVwLCBsaXN0Q2xhc3NlcywgbGlua0NsYXNzZXMgfSA9XHJcbiAgdXNlU3RlcHNJbnRlcm5hbHMoe1xyXG4gICAgcHJvcHM6IHRvUmVmcyhwcm9wcyksXHJcbiAgICBlbWl0XHJcbiAgfSlcclxuXHJcbmNvbnN0IGxhYmVsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsnaDYgZm9udC1tZWRpdW0gbGVhZGluZy03J11cclxuXHJcbiAgbGV0IGxlZnRNYXJnaW46IHN0cmluZ1xyXG4gIGlmIChwcm9wcy5zdGVwc1BhZGRpbmcgPT09ICd4cycpIHtcclxuICAgIGxlZnRNYXJnaW4gPSAnbWwtMSdcclxuICB9IGVsc2UgaWYgKHByb3BzLnN0ZXBzUGFkZGluZyA9PT0gJ3NtJykge1xyXG4gICAgbGVmdE1hcmdpbiA9ICdtbC0yJ1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZWZ0TWFyZ2luID0gJ21sLTMnXHJcbiAgfVxyXG5cclxuICBjbGFzc1BhcnRzLnB1c2gobGVmdE1hcmdpbilcclxuXHJcbiAgaWYgKHByb3BzLmJhc2ljKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3NyLW9ubHknKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBleHRyYUxpc3RDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gW11cclxuXHJcbiAgaWYgKHByb3BzLmJhc2ljKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2Jhc2ljJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxzdmdcclxuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgY2xhc3M9XCJpY29uIGljb24tdGFibGVyIGljb24tdGFibGVyLXBvaW50ZXJcIlxyXG4gICAgd2lkdGg9XCI0NFwiXHJcbiAgICBoZWlnaHQ9XCI0NFwiXHJcbiAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC44KVwiXHJcbiAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICA+XHJcbiAgICA8cGF0aCBzdHJva2U9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XHJcbiAgICA8cGF0aFxyXG4gICAgICBkPVwiTTcuOTA0IDE3LjU2M2ExLjIgMS4yIDAgMCAwIDIuMjI4IC4zMDhsMi4wOSAtMy4wOTNsNC45MDcgNC45MDdhMS4wNjcgMS4wNjcgMCAwIDAgMS41MDkgMGwxLjA0NyAtMS4wNDdhMS4wNjcgMS4wNjcgMCAwIDAgMCAtMS41MDlsLTQuOTA3IC00LjkwN2wzLjExMyAtMi4wOWExLjIgMS4yIDAgMCAwIC0uMzA5IC0yLjIyOGwtMTMuNTgyIC0zLjkwNGwzLjkwNCAxMy41NjN6XCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTggMTdcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgIDxwYXRoXHJcbiAgICAgIGQ9XCJNOSAxLjI1VjMuNU0xNC44MzQgMy42NjZMMTMuMjQzIDUuMjU3TTE3LjI1IDkuNUgxNU00Ljc1NyAxMy43NDNMMy4xNjcgMTUuMzMzTTMgOS41SDAuNzVNNC43NTcgNS4yNTdMMy4xNjcgMy42NjdcIlxyXG4gICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICBzdHJva2Utd2lkdGg9XCIxXCJcclxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cInJlbGF0aXZlIGFzcGVjdC1zcXVhcmUgdy1mdWxsIGgtZnVsbCBtYXgtdy1bMjUwcHhdIG14LWF1dG8gbWItOCBib3JkZXItdCBib3JkZXItciBib3JkZXItb3V0bGluZS0zIHNlbGVjdC1ub25lXCJcclxuICA+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiYWJzb2x1dGUgei01MCB0ZXh0LWZvcmVncm91bmQgZGFyazp0ZXh0LWZvdW5kYXRpb25cIlxyXG4gICAgICA6c3R5bGU9XCJ7XHJcbiAgICAgICAgdHJhbnNpdGlvblByb3BlcnR5OiAnYWxsJyxcclxuICAgICAgICB0b3A6IG1vdXNlUG9zaXRpb24udG9wICsgJyUnLFxyXG4gICAgICAgIGxlZnQ6IG1vdXNlUG9zaXRpb24ubGVmdCArICclJyxcclxuICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb246IGFuaW1hdGlvbkR1cmF0aW9uICsgJ21zJ1xyXG4gICAgICB9XCJcclxuICAgID5cclxuICAgICAgPENsaWNrSWNvblxyXG4gICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgLXRvcC01IC1sZWZ0LTQgaC0xMiB3LTEyIC1yb3RhdGUtMTIgdGV4dC1mb3JlZ3JvdW5kXCJcclxuICAgICAgICA6Y2xhc3M9XCJbeyBoaWRkZW46ICFpc0NsaWNrZWQgfV1cIlxyXG4gICAgICAvPlxyXG4gICAgICA8TW91c2VJY29uIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAgbGVmdC0wIHJpZ2h0LTAgYm90dG9tLTAgaC0xMSB3LTExXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBoLWZ1bGwgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgIDxzbG90IG5hbWU9XCJiYWNrZ3JvdW5kXCI+PC9zbG90PlxyXG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCJzbG90T2JqZWN0IGluIGR5bmFtaWNTbG90c1wiIDprZXk9XCJzbG90T2JqZWN0Lm5hbWVcIj5cclxuICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RPYmplY3QudmlzaWJsZVwiPlxyXG4gICAgICAgICAgPHNsb3QgOm5hbWU9XCJzbG90T2JqZWN0Lm5hbWVcIj48L3Nsb3Q+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgcmVmLCBvbk1vdW50ZWQsIGRlZmluZVByb3BzLCB0eXBlIFByb3BUeXBlLCBvbkJlZm9yZVVubW91bnQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCBNb3VzZUljb24gZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvY29tbW9uL2FuaW1hdGlvbi9Nb3VzZUljb24udnVlJ1xyXG5pbXBvcnQgQ2xpY2tJY29uIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9hbmltYXRpb24vQ2xpY2tJY29uLnZ1ZSdcclxuaW1wb3J0IHsgd2FpdCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuXHJcbnR5cGUgQW5pbWF0aW9uQWN0aW9uID0ge1xyXG4gIHR5cGU6ICdhbmltYXRpb24nXHJcbiAgdG9wOiBudW1iZXJcclxuICBsZWZ0OiBudW1iZXJcclxuICBkdXJhdGlvbjogbnVtYmVyXHJcbn1cclxuXHJcbnR5cGUgQ2xpY2tBY3Rpb24gPSB7XHJcbiAgdHlwZTogJ2NsaWNrJ1xyXG59XHJcblxyXG50eXBlIERlbGF5QWN0aW9uID0ge1xyXG4gIHR5cGU6ICdkZWxheSdcclxuICBkdXJhdGlvbjogbnVtYmVyXHJcbn1cclxuXHJcbnR5cGUgU2xvdEFjdGlvbiA9IHtcclxuICB0eXBlOiAnc2xvdCdcclxuICBzbG90OiBzdHJpbmdcclxufVxyXG5cclxudHlwZSBBY3Rpb24gPSBBbmltYXRpb25BY3Rpb24gfCBDbGlja0FjdGlvbiB8IFNsb3RBY3Rpb24gfCBEZWxheUFjdGlvblxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XHJcbiAgYWN0aW9uczogQXJyYXkgYXMgUHJvcFR5cGU8QWN0aW9uW10+LFxyXG4gIGluaXRpYWxQb3NpdGlvbjoge1xyXG4gICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9PlxyXG4gIH0sXHJcbiAgc2xvdHNDb25maWc6IEFycmF5IGFzIFByb3BUeXBlPHsgbmFtZTogc3RyaW5nOyB2aXNpYmxlOiBib29sZWFuIH1bXT5cclxufSlcclxuXHJcbmNvbnN0IGlzQW5pbWF0aW5nID0gcmVmKHRydWUpXHJcbmNvbnN0IG1vdXNlUG9zaXRpb24gPSByZWYoeyAuLi5wcm9wcy5pbml0aWFsUG9zaXRpb24gfSlcclxuY29uc3QgaXNDbGlja2VkID0gcmVmKGZhbHNlKVxyXG5jb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHJlZig1MDApXHJcbmNvbnN0IGlzTW91c2VWaXNpYmxlID0gcmVmKHRydWUpXHJcbmNvbnN0IGR5bmFtaWNTbG90cyA9IHJlZihwcm9wcy5zbG90c0NvbmZpZyB8fCBbXSlcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGF5KGFjdGlvbjogRGVsYXlBY3Rpb24pIHtcclxuICBhd2FpdCB3YWl0KGFjdGlvbi5kdXJhdGlvbilcclxufVxyXG5cclxuZnVuY3Rpb24gdG9nZ2xlU2xvdFZpc2liaWxpdHkoYWN0aW9uOiBTbG90QWN0aW9uKSB7XHJcbiAgY29uc3Qgc2xvdFRvVG9nZ2xlID0gZHluYW1pY1Nsb3RzLnZhbHVlLmZpbmQoKHNsb3QpID0+IHNsb3QubmFtZSA9PT0gYWN0aW9uLnNsb3QpXHJcbiAgaWYgKHNsb3RUb1RvZ2dsZSkge1xyXG4gICAgc2xvdFRvVG9nZ2xlLnZpc2libGUgPSAhc2xvdFRvVG9nZ2xlLnZpc2libGVcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUFjdGlvbihhY3Rpb246IEFjdGlvbikge1xyXG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcclxuICAgIGNhc2UgJ2FuaW1hdGlvbic6XHJcbiAgICAgIG1vdXNlUG9zaXRpb24udmFsdWUgPSB7IHRvcDogYWN0aW9uLnRvcCwgbGVmdDogYWN0aW9uLmxlZnQgfVxyXG4gICAgICBhbmltYXRpb25EdXJhdGlvbi52YWx1ZSA9IGFjdGlvbi5kdXJhdGlvblxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnY2xpY2snOlxyXG4gICAgICBpc0NsaWNrZWQudmFsdWUgPSB0cnVlXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gKGlzQ2xpY2tlZC52YWx1ZSA9IGZhbHNlKSwgNTAwKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnZGVsYXknOlxyXG4gICAgICByZXR1cm4gZGVsYXkoYWN0aW9uKVxyXG4gICAgY2FzZSAnc2xvdCc6XHJcbiAgICAgIHRvZ2dsZVNsb3RWaXNpYmlsaXR5KGFjdGlvbilcclxuICAgICAgYnJlYWtcclxuICB9XHJcbn1cclxuXHJcbm9uTW91bnRlZCgoKSA9PiB7XHJcbiAgY29uc3QgbG9vcEFjdGlvbnMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICB3aGlsZSAoaXNBbmltYXRpbmcudmFsdWUpIHtcclxuICAgICAgYXdhaXQgZGVsYXkoeyB0eXBlOiAnZGVsYXknLCBkdXJhdGlvbjogODAwIH0pXHJcbiAgICAgIGlzTW91c2VWaXNpYmxlLnZhbHVlID0gdHJ1ZVxyXG4gICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBwcm9wcy5hY3Rpb25zIHx8IFtdKSB7XHJcbiAgICAgICAgYXdhaXQgaGFuZGxlQWN0aW9uKGFjdGlvbilcclxuICAgICAgfVxyXG4gICAgICBpc01vdXNlVmlzaWJsZS52YWx1ZSA9IGZhbHNlXHJcbiAgICAgIG1vdXNlUG9zaXRpb24udmFsdWUgPSB7IC4uLnByb3BzLmluaXRpYWxQb3NpdGlvbiB9XHJcbiAgICAgIGF3YWl0IGRlbGF5KHsgdHlwZTogJ2RlbGF5JywgZHVyYXRpb246IDIwMCB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdm9pZCBsb29wQWN0aW9ucygpXHJcbn0pXHJcblxyXG5vbkJlZm9yZVVubW91bnQoKCkgPT4ge1xyXG4gIGlzQW5pbWF0aW5nLnZhbHVlID0gZmFsc2VcclxufSlcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnXHJcbiAgICB3aWR0aD1cIjI0XCJcclxuICAgIGhlaWdodD1cIjI2XCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMjQgMjZcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk0yMi41IDExLjI2OEMyMy44MzMzIDEyLjAzNzggMjMuODMzMyAxMy45NjIyIDIyLjUgMTQuNzMyTDMuNzUgMjUuNTU3NEMyLjQxNjY3IDI2LjMyNzIgMC43NTAwMDQgMjUuMzY0OSAwLjc1MDAwNSAyMy44MjUzTDAuNzUwMDA1IDIuMTc0NjhDMC43NTAwMDYgMC42MzUwNzkgMi40MTY2NyAtMC4zMjcxNjkgMy43NTAwMSAwLjQ0MjYzMUwyMi41IDExLjI2OFpcIlxyXG4gICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgYXNwZWN0LXZpZGVvIHctZnVsbFwiPlxyXG4gICAgPGlmcmFtZVxyXG4gICAgICA6dGl0bGU9XCJ0aXRsZVwiXHJcbiAgICAgIDpzcmM9XCJgaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLyR7dmltZW9JZH0/YmFkZ2U9MCZhdXRvcGF1c2U9MCZwbGF5ZXJfaWQ9MCZhcHBfaWQ9NTg0NzkmYXV0b3BsYXk9JHtcclxuICAgICAgICBpc1BsYXlpbmcgPyAnMScgOiAnMCdcclxuICAgICAgfSZtdXRlZD0ke211dGVkID8gJzEnIDogJzAnfSZjb250cm9scz0ke2NvbnRyb2xzID8gJzEnIDogJzAnfWBcIlxyXG4gICAgICBmcmFtZWJvcmRlcj1cIjBcIlxyXG4gICAgICBhbGxvdz1cImF1dG9wbGF5OyBmdWxsc2NyZWVuOyBhY2NlbGVyb21ldGVyOyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIlxyXG4gICAgICBhbGxvd2Z1bGxzY3JlZW5cclxuICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsXCJcclxuICAgID48L2lmcmFtZT5cclxuXHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHYtaWY9XCIhaXNQbGF5aW5nICYmIChkYXJrUGxhY2Vob2xkZXIgfHwgbGlnaHRQbGFjZWhvbGRlcilcIlxyXG4gICAgICBjbGFzcz1cImdyb3VwIGFic29sdXRlIHRvcC0wIGxlZnQtMCB3LWZ1bGwgaC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcclxuICAgICAgQGNsaWNrPVwicGxheVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0wIGxlZnQtMCB3LWZ1bGwgaC1mdWxsIGJnLWZvdW5kYXRpb24gcG9pbnRlci1ldmVudHMtbm9uZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICB2LWlmPVwiZGFya1BsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIDpzcmM9XCJkYXJrUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgY2xhc3M9XCJoaWRkZW4gZGFyazpibG9jayB3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXHJcbiAgICAgICAgICA6YWx0PVwicGxhY2Vob2xkZXJBbHQgfHwgJ1BsYXkgdmlkZW8nXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxpbWdcclxuICAgICAgICAgIHYtaWY9XCJsaWdodFBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIDpzcmM9XCJsaWdodFBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIGNsYXNzPVwiZGFyazpoaWRkZW4gdy1mdWxsIGgtZnVsbCBvYmplY3QtY292ZXJcIlxyXG4gICAgICAgICAgOmFsdD1cInBsYWNlaG9sZGVyQWx0IHx8ICdQbGF5IHZpZGVvJ1wiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHotMTAgYmctcHJpbWFyeSBncm91cC1ob3ZlcjpiZy1wcmltYXJ5LWZvY3VzIGgtMjggdy0yOCByb3VuZGVkLWZ1bGwgYm9yZGVyLVs0cHhdIGJvcmRlci13aGl0ZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzaGFkb3ctbWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEljb25QbGF5IGNsYXNzPVwiaC0xMCB3LTEwIG1sLTIgdGV4dC13aGl0ZVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyByZWYgfSBmcm9tICd2dWUnXHJcbmltcG9ydCBJY29uUGxheSBmcm9tICcuLi9nbG9iYWwvaWNvbi9QbGF5LnZ1ZSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICdvblBsYXknKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICB2aW1lb0lkOiBzdHJpbmdcclxuICB0aXRsZTogc3RyaW5nXHJcbiAgYXV0b3BsYXk/OiBib29sZWFuXHJcbiAgbXV0ZWQ/OiBib29sZWFuXHJcbiAgY29udHJvbHM/OiBib29sZWFuXHJcbiAgZGFya1BsYWNlaG9sZGVyPzogc3RyaW5nXHJcbiAgbGlnaHRQbGFjZWhvbGRlcj86IHN0cmluZ1xyXG4gIHBsYWNlaG9sZGVyQWx0Pzogc3RyaW5nXHJcbn0+KClcclxuXHJcbmNvbnN0IGlzUGxheWluZyA9IHJlZihwcm9wcy5hdXRvcGxheSB8fCBmYWxzZSlcclxuXHJcbmNvbnN0IHBsYXkgPSAoKSA9PiB7XHJcbiAgaXNQbGF5aW5nLnZhbHVlID0gdHJ1ZVxyXG4gIGVtaXQoJ29uUGxheScpXHJcbn1cclxuXHJcbmRlZmluZUV4cG9zZSh7XHJcbiAgcGxheVxyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxidXR0b24gOmNsYXNzPVwiY29tcHV0ZWRDbGFzc2VzXCIgOmRpc2FibGVkPVwiZGlzYWJsZWRcIiBAY2xpY2s9XCJvbkNsaWNrXCI+XHJcbiAgICA8c2xvdD5UZXh0PC9zbG90PlxyXG4gIDwvYnV0dG9uPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHY6IGJvb2xlYW4pOiB2b2lkXHJcbiAgKGU6ICdjbGljaycsIHY6IE1vdXNlRXZlbnQpOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIGRpc2FibGVkPzogYm9vbGVhblxyXG4gIG1vZGVsVmFsdWU/OiBib29sZWFuXHJcbn0+KClcclxuXHJcbmNvbnN0IGNvbXB1dGVkQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtcclxuICAgICdoLTIwIGJnLWZvdW5kYXRpb24tMiBpbmxpbmUtZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgb3V0bGluZS1ub25lJyxcclxuICAgICdub3JtYWwgcHgtMTYgcHktNSBzaGFkb3cgcm91bmRlZCB0cmFuc2l0aW9uIGFjdGl2ZTpzY2FsZS05NSdcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5kaXNhYmxlZCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1mb3VuZGF0aW9uLWRpc2FibGVkIHRleHQtZm9yZWdyb3VuZC0yIGN1cnNvci1ub3QtYWxsb3dlZCcpXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgcHJvcHMubW9kZWxWYWx1ZVxyXG4gICAgICAgID8gJ2JnLXByaW1hcnktZm9jdXMgdGV4dC1mb3JlZ3JvdW5kLW9uLXByaW1hcnknXHJcbiAgICAgICAgOiAnYmctZm91bmRhdGlvbiB0ZXh0LWZvcmVncm91bmQnXHJcbiAgICApXHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3Jpbmctb3V0bGluZS0yIGhvdmVyOnJpbmctNCcpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IG9uQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xyXG4gIGlmIChwcm9wcy5kaXNhYmxlZCkge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgIXByb3BzLm1vZGVsVmFsdWUpXHJcbiAgZW1pdCgnY2xpY2snLCBlKVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGl0ZW1zLWNlbnRlclwiXHJcbiAgICA6Y2xhc3M9XCJbXHJcbiAgICAgIGxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JyAmJiAnZmxleC1yb3ctcmV2ZXJzZSBpdGVtcy1jZW50ZXInLFxyXG4gICAgICBsYWJlbFBvc2l0aW9uID09PSAndG9wJyAmJiAnaXRlbXMtc3RhcnQnLFxyXG4gICAgICBsYWJlbFBvc2l0aW9uID09PSAncmlnaHQnICYmICdpdGVtcy1jZW50ZXInXHJcbiAgICBdXCJcclxuICA+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgaC0zLjUgdy0zLjVcIlxyXG4gICAgICA6Y2xhc3M9XCJsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgPyAndy0xLzIganVzdGlmeS1lbmQgbXItMicgOiAnJ1wiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGgtZnVsbCB3LWZ1bGxcIj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIDppZD1cImZpbmFsSWRcIlxyXG4gICAgICAgICAgOmNoZWNrZWQ9XCJjb3JlQ2hlY2tlZFwiXHJcbiAgICAgICAgICA6YXJpYS1kZXNjcmliZWRieT1cImRlc2NyaXB0aW9uSWRcIlxyXG4gICAgICAgICAgOm5hbWU9XCJuYW1lXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIDp2YWx1ZT1cImNoZWNrYm94VmFsdWVcIlxyXG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgIDpjbGFzcz1cImNoZWNrYm94Q2xhc3Nlc1wiXHJcbiAgICAgICAgICB2LWJpbmQ9XCIkYXR0cnNcIlxyXG4gICAgICAgICAgQGNoYW5nZT1cIm9uQ2hhbmdlXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDwhLS0gSW5kZXRlcm1pbmF0ZSBzdGF0ZSBvdmVybGF5IC0tPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCJpbmRldGVybWluYXRlXCJcclxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdy1mdWxsIGgtZnVsbCB0b3AtMCBsZWZ0LTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcG9pbnRlci1ldmVudHMtbm9uZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPE1pbnVzIGNsYXNzPVwidy0zIGgtMyB0ZXh0LWZvcmVncm91bmRcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHQtc21cIiA6Y2xhc3M9XCJsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgPyAndy0xLzInIDogJ21sLTInXCI+XHJcbiAgICAgIDxsYWJlbCA6Zm9yPVwiZmluYWxJZFwiIDpjbGFzcz1cInsgJ3NyLW9ubHknOiBoaWRlTGFiZWwgfVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXhzIHRleHQtZm9yZWdyb3VuZCBmb250LW1lZGl1bVwiIDpjbGFzcz1cImxhYmVsQ2xhc3Nlc1wiPlxyXG4gICAgICAgICAge3sgdGl0bGUgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gdi1pZj1cInNob3dSZXF1aXJlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXIgbWwtMVwiPio8L3NwYW4+XHJcbiAgICAgICAgPHAgdi1pZj1cImRlc2NyaXB0aW9uVGV4dFwiIDppZD1cImRlc2NyaXB0aW9uSWRcIiA6Y2xhc3M9XCJkZXNjcmlwdGlvbkNsYXNzZXNcIj5cclxuICAgICAgICAgIHt7IGRlc2NyaXB0aW9uVGV4dCB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cclxuaW1wb3J0IHsgdXNlRmllbGQgfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB0eXBlIHsgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvbk1vdW50ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBQcm9wVHlwZSB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBPcHRpb25hbCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJ1xyXG5pbXBvcnQgdHlwZSB7IExhYmVsUG9zaXRpb24gfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS9pbnB1dCdcclxuaW1wb3J0IHsgTWludXMgfSBmcm9tICdsdWNpZGUtdnVlLW5leHQnXHJcblxyXG4vKipcclxuICogVHJvdWJsZXNob290aW5nOlxyXG4gKiAtIElmIGNsaWNraW5nIG9uIHRoZSBjaGVja2JveCBkb2Vzbid0IGRvIGFueXRoaW5nLCBjaGVjayBpZiBhbnkgb2YgaXRzIGFuY2VzdG9yIGVsZW1lbnRzXHJcbiAqIGhhdmUgYSBAY2xpY2sucHJldmVudCBvbiB0aGVtIGFueXdoZXJlLlxyXG4gKiAtIElmIHlvdSdyZSBub3QgdXNpbmcgdGhlIGNoZWNrYm94IGluIGEgZ3JvdXAsIGl0J3Mgc3VnZ2VzdGVkIHRoYXQgeW91IHNldCA6dmFsdWU9XCJ0cnVlXCIsXHJcbiAqIHNvIHRoYXQgYSB2LW1vZGVsIGF0dGFjaGVkIHRvIHRoZSBjaGVja2JveCB3aWxsIGJlIGVpdGhlciAndHJ1ZScgb3IgJ3VuZGVmaW5lZCcgZGVwZW5kaW5nIG9uIHRoZVxyXG4gKiBjaGVja2VkIHN0YXRlXHJcbiAqL1xyXG5cclxudHlwZSBWYWx1ZVR5cGUgPSBPcHRpb25hbDxzdHJpbmcgfCB0cnVlPiB8IHN0cmluZ1tdXHJcblxyXG5kZWZpbmVPcHRpb25zKHtcclxuICBpbmhlcml0QXR0cnM6IGZhbHNlXHJcbn0pXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICAvKipcclxuICAgKiBJbnB1dCBuYW1lL2lkLiBJbiBhIGNoZWNrYm94IGdyb3VwLCBhbGwgY2hlY2tib3hlcyBtdXN0IGhhdmUgdGhlIHNhbWUgbmFtZSBhbmQgZGlmZmVyZW50IHZhbHVlcy5cclxuICAgKi9cclxuICBuYW1lOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICByZXF1aXJlZDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWRcclxuICAgKi9cclxuICBkaXNhYmxlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBTZXQgbGFiZWwgdGV4dFxyXG4gICAqL1xyXG4gIGxhYmVsOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFNldCBsYWJlbCBjbGFzc2VzXHJcbiAgICovXHJcbiAgbGFiZWxDbGFzc2VzOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIEhlbHAgdGV4dFxyXG4gICAqL1xyXG4gIGRlc2NyaXB0aW9uOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gaW5saW5lIHRoZSBoZWxwIGRlc2NyaXB0aW9uXHJcbiAgICovXHJcbiAgaW5saW5lRGVzY3JpcHRpb246IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogdmVlLXZhbGlkYXRlIHZhbGlkYXRpb24gcnVsZXNcclxuICAgKi9cclxuICBydWxlczoge1xyXG4gICAgdHlwZTogW1N0cmluZywgT2JqZWN0LCBGdW5jdGlvbiwgQXJyYXldIGFzIFByb3BUeXBlPFJ1bGVFeHByZXNzaW9uPFZhbHVlVHlwZT4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiB2ZWUtdmFsaWRhdGUgdmFsaWRhdGlvbigpIG9uIGNvbXBvbmVudCBtb3VudFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25Nb3VudDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHJlZCBcInJlcXVpcmVkXCIgYXN0ZXJpc2tcclxuICAgKi9cclxuICBzaG93UmVxdWlyZWQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tib3ggZ3JvdXAncyB2YWx1ZVxyXG4gICAqL1xyXG4gIG1vZGVsVmFsdWU6IHtcclxuICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dIGFzIFByb3BUeXBlPFZhbHVlVHlwZSB8IGZhbHNlPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tib3gncyBvd24gdmFsdWUuIElmIGl0IGlzIGNoZWNrZWQsIG1vZGVsVmFsdWUgd2lsbCBpbmNsdWRlIHRoaXMgdmFsdWUgKGFtb25nc3QgYW55IG90aGVyIGNoZWNrZWQgdmFsdWVzIGZyb20gdGhlIHNhbWUgZ3JvdXApLlxyXG4gICAqIElmIG5vdCBzZXQgd2lsbCBkZWZhdWx0IHRvICduYW1lJyB2YWx1ZS5cclxuICAgKi9cclxuICB2YWx1ZToge1xyXG4gICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0gYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nIHwgdHJ1ZT4+LFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogSFRNTCBJRCB0byB1c2UsIG11c3QgYmUgZ2xvYmFsbHkgdW5pcXVlLiBJZiBub3Qgc3BlY2lmaWVkLCBhIHJhbmRvbSBJRCB3aWxsIGJlIGdlbmVyYXRlZC4gT25lIGlzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBhc3NvY2lhdGUgdGhlIGxhYmVsIGFuZCBjaGVja2JveC5cclxuICAgKi9cclxuICBpZDoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBoaWRlTGFiZWw6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgbGFiZWxQb3NpdGlvbjoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPExhYmVsUG9zaXRpb24+LFxyXG4gICAgZGVmYXVsdDogJ3RvcCdcclxuICB9LFxyXG4gIGluZGV0ZXJtaW5hdGU6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGdlbmVyYXRlUmFuZG9tSWQgPSAocHJlZml4OiBzdHJpbmcpID0+IGAke3ByZWZpeH0tJHtuYW5vaWQoKX1gXHJcblxyXG5kZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbDogVmFsdWVUeXBlKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBjaGVja2JveFZhbHVlID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMudmFsdWUgfHwgcHJvcHMubmFtZSlcclxuXHJcbmNvbnN0IHtcclxuICBjaGVja2VkOiBjb3JlQ2hlY2tlZCxcclxuICBlcnJvck1lc3NhZ2UsXHJcbiAgaGFuZGxlQ2hhbmdlLFxyXG4gIHZhbHVlOiBjb3JlVmFsdWVcclxufSA9IHVzZUZpZWxkPFZhbHVlVHlwZT4ocHJvcHMubmFtZSwgcHJvcHMucnVsZXMsIHtcclxuICB2YWxpZGF0ZU9uTW91bnQ6IHByb3BzLnZhbGlkYXRlT25Nb3VudCxcclxuICB0eXBlOiAnY2hlY2tib3gnLFxyXG4gIGNoZWNrZWRWYWx1ZTogY2hlY2tib3hWYWx1ZSxcclxuICBpbml0aWFsVmFsdWU6IHByb3BzLm1vZGVsVmFsdWUgfHwgdW5kZWZpbmVkXHJcbn0pXHJcblxyXG5jb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmxhYmVsIHx8IHByb3BzLm5hbWUpXHJcblxyXG5jb25zdCBkZXNjcmlwdGlvblRleHQgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5kZXNjcmlwdGlvbiB8fCBlcnJvck1lc3NhZ2UudmFsdWUpXHJcbmNvbnN0IGRlc2NyaXB0aW9uSWQgPSBjb21wdXRlZCgoKSA9PiBgJHtwcm9wcy5uYW1lfS1kZXNjcmlwdGlvbmApXHJcbmNvbnN0IGRlc2NyaXB0aW9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWyd0ZXh0LWJvZHktMnhzJ11cclxuXHJcbiAgaWYgKHByb3BzLmlubGluZURlc2NyaXB0aW9uKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2lubGluZSBtbC0yJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdibG9jaycpXHJcbiAgfVxyXG5cclxuICBpZiAoZXJyb3JNZXNzYWdlLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZGFuZ2VyJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQtMicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGltcGxpY2l0SWQgPSByZWY8T3B0aW9uYWw8c3RyaW5nPj4oZ2VuZXJhdGVSYW5kb21JZCgnY2hlY2tib3gnKSlcclxuY29uc3QgZmluYWxJZCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmlkIHx8IGltcGxpY2l0SWQudmFsdWUpXHJcblxyXG5jb25zdCBjaGVja2JveENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdoLTMuNSB3LTMuNSByb3VuZGVkJyxcclxuICAgICdib3JkZXIgYmctZm91bmRhdGlvbiB0ZXh0LXByaW1hcnknLFxyXG4gICAgJ2hvdmVyOmJvcmRlci1mb3JlZ3JvdW5kLTIgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctb3V0bGluZS00IGZvY3VzOnJpbmctb2Zmc2V0LTEnLFxyXG4gICAgJ2Rpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTYwJ1xyXG4gIF1cclxuXHJcbiAgaWYgKGVycm9yTWVzc2FnZS52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItZGFuZ2VyLWxpZ2h0ZXInKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2JvcmRlci1vdXRsaW5lLTUnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBvbkNoYW5nZSA9IChlOiB1bmtub3duKSA9PiB7XHJcbiAgaWYgKHByb3BzLmRpc2FibGVkKSByZXR1cm5cclxuICBoYW5kbGVDaGFuZ2UoZSlcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1Z2ZpeCBmb3Igc3RyYW5nZSBpc3N1ZSB3aGVyZSBjaGVja2JveCBhcHBlYXJzIGNoZWNrZWQgZXZlbiB0aG8gaXQgc2hvdWxkbnQgYmUuXHJcbiAqIEl0J3Mgbm90IGNsZWFyIHdoeSB0aGlzIGhhcHBlbnMsIGJ1dCBmb3Igc29tZSByZWFzb24gY29yZVZhbHVlLnZhbHVlIHNob3dzIHRoYXQgdGhlIGNoZWNrYm94XHJcbiAqIGlzIGNoZWNrZWQsIGV2ZW4gdGhvIHByb3BzLm1vZGVsVmFsdWUgaXMgdW5kZWZpbmVkLlxyXG4gKi9cclxub25Nb3VudGVkKCgpID0+IHtcclxuICBjb25zdCBuZXdNb2RlbFZhbHVlID0gcHJvcHMubW9kZWxWYWx1ZVxyXG4gIGNvbnN0IG5ld0NvcmVWYWx1ZSA9IGNvcmVWYWx1ZS52YWx1ZVxyXG5cclxuICBjb25zdCBzaG91bGRCZUNoZWNrZWQgPSBBcnJheS5pc0FycmF5KG5ld01vZGVsVmFsdWUpXHJcbiAgICA/IG5ld01vZGVsVmFsdWUuaW5jbHVkZXMocHJvcHMudmFsdWUgYXMgYW55KVxyXG4gICAgOiBuZXdNb2RlbFZhbHVlID09PSBwcm9wcy52YWx1ZVxyXG5cclxuICBjb25zdCBpc0NvcmVDaGVja2VkID0gQXJyYXkuaXNBcnJheShuZXdDb3JlVmFsdWUpXHJcbiAgICA/IG5ld0NvcmVWYWx1ZS5pbmNsdWRlcyhwcm9wcy52YWx1ZSBhcyBhbnkpXHJcbiAgICA6IG5ld0NvcmVWYWx1ZSA9PT0gcHJvcHMudmFsdWVcclxuXHJcbiAgaWYgKHNob3VsZEJlQ2hlY2tlZCAhPT0gaXNDb3JlQ2hlY2tlZCkge1xyXG4gICAgaGFuZGxlQ2hhbmdlKG5ld01vZGVsVmFsdWUpXHJcbiAgfVxyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCBzcGFjZS14LTIgbWItMiBsYXN0Om1iLTBcIlxyXG4gICAgOmNsYXNzPVwiZGVzY3JpcHRpb24gJiYgaW5saW5lRGVzY3JpcHRpb24gPyAnaXRlbXMtc3RhcnQnIDogJ2l0ZW1zLWNlbnRlcidcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiIDpjbGFzcz1cInNpemUgPT09ICdzbScgPyAnaC00JyA6ICdoLTYnXCI+XHJcbiAgICAgIDwhLS0gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvZm9ybS1jb250cm9sLWhhcy1sYWJlbCAtLT5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgOmlkPVwiZmluYWxJZFwiXHJcbiAgICAgICAgOmNoZWNrZWQ9XCJjb3JlQ2hlY2tlZFwiXHJcbiAgICAgICAgOmFyaWEtZGVzY3JpYmVkYnk9XCJkZXNjcmlwdGlvbklkXCJcclxuICAgICAgICA6bmFtZT1cIm5hbWVcIlxyXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICA6dmFsdWU9XCJyYWRpb1ZhbHVlXCJcclxuICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgIGNsYXNzPVwiaC00IHctNCByb3VuZGVkLWZ1bGwgdGV4dC1wcmltYXJ5IGZvY3VzOnJpbmctcHJpbWFyeSBiZy1mb3VuZGF0aW9uIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpiZy1kaXNhYmxlZCBkaXNhYmxlZDp0ZXh0LWRpc2FibGVkLTJcIlxyXG4gICAgICAgIDpjbGFzcz1cImNvbXB1dGVkQ2xhc3Nlc1wiXHJcbiAgICAgICAgdi1iaW5kPVwiJGF0dHJzXCJcclxuICAgICAgICBAY2hhbmdlPVwib25DaGFuZ2VcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICBpbmxpbmVEZXNjcmlwdGlvbiA/ICdmbGV4IHNwYWNlLXgtMiBpdGVtcy1jZW50ZXInIDogJycsXHJcbiAgICAgICAgc2l6ZSA9PT0gJ3NtJyA/ICd0ZXh0LWJvZHktMnhzJyA6ICd0ZXh0LWJvZHkteHMnXHJcbiAgICAgIF1cIlxyXG4gICAgPlxyXG4gICAgICA8bGFiZWxcclxuICAgICAgICA6Zm9yPVwiZmluYWxJZFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQgZmxleCBzcGFjZS14LTIgaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICA6Y2xhc3M9XCJ7ICdzci1vbmx5JzogaGlkZUxhYmVsLCAnIWN1cnNvci1ub3QtYWxsb3dlZCBvcGFjaXR5LTcwJzogZGlzYWJsZWQgfVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IHYtaWY9XCJpY29uXCI+XHJcbiAgICAgICAgICA8Y29tcG9uZW50XHJcbiAgICAgICAgICAgIDppcz1cImljb25cIlxyXG4gICAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgICAgc2l6ZSA9PT0gJ3NtJyA/ICdoLTYgc206aC04IHctNiBzbTp3LTgnIDogJ2gtOCB3LTggc206aC0xMCBzbTp3LTEwJ1xyXG4gICAgICAgICAgICBdXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cclxuICAgICAgICAgIDxzcGFuIDpjbGFzcz1cImxhYmVsQ2xhc3NlcyA/IGxhYmVsQ2xhc3NlcyA6ICcnXCI+e3sgdGl0bGUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8cFxyXG4gICAgICAgICAgICB2LWlmPVwiZGVzY3JpcHRpb25UZXh0ICYmICFpbmxpbmVEZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgIDppZD1cImRlc2NyaXB0aW9uSWRcIlxyXG4gICAgICAgICAgICA6Y2xhc3M9XCJkZXNjcmlwdGlvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBkZXNjcmlwdGlvblRleHQgfX1cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhbiB2LWlmPVwic2hvd1JlcXVpcmVkXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBtbC0xXCI+Kjwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPHBcclxuICAgICAgICB2LWlmPVwiZGVzY3JpcHRpb25UZXh0ICYmIGlubGluZURlc2NyaXB0aW9uXCJcclxuICAgICAgICA6aWQ9XCJkZXNjcmlwdGlvbklkXCJcclxuICAgICAgICA6Y2xhc3M9XCJkZXNjcmlwdGlvbkNsYXNzZXNcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZGVzY3JpcHRpb25UZXh0IH19XHJcbiAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cclxuaW1wb3J0IHsgdXNlRmllbGQgfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB0eXBlIHsgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvbk1vdW50ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBQcm9wVHlwZSwgQ29uY3JldGVDb21wb25lbnQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgT3B0aW9uYWwgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCdcclxuXHJcbi8qKlxyXG4gKiBUcm91Ymxlc2hvb3Rpbmc6XHJcbiAqIC0gSWYgY2xpY2tpbmcgb24gdGhlIHJhZGlvIGRvZXNuJ3QgZG8gYW55dGhpbmcsIGNoZWNrIGlmIGFueSBvZiBpdHMgYW5jZXN0b3IgZWxlbWVudHNcclxuICogaGF2ZSBhIEBjbGljay5wcmV2ZW50IG9uIHRoZW0gYW55d2hlcmUuXHJcbiAqIC0gSWYgeW91J3JlIG5vdCB1c2luZyB0aGUgcmFkaW8gaW4gYSBncm91cCwgaXQncyBzdWdnZXN0ZWQgdGhhdCB5b3Ugc2V0IDp2YWx1ZT1cInRydWVcIixcclxuICogc28gdGhhdCBhIHYtbW9kZWwgYXR0YWNoZWQgdG8gdGhlIHJhZGlvIHdpbGwgYmUgZWl0aGVyICd0cnVlJyBvciAndW5kZWZpbmVkJyBkZXBlbmRpbmcgb24gdGhlXHJcbiAqIGNoZWNrZWQgc3RhdGVcclxuICovXHJcblxyXG50eXBlIFZhbHVlVHlwZSA9IE9wdGlvbmFsPHN0cmluZyB8IHRydWU+IHwgc3RyaW5nW11cclxudHlwZSBTaXplID0gJ3NtJyB8ICdiYXNlJ1xyXG5cclxuZGVmaW5lT3B0aW9ucyh7XHJcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZVxyXG59KVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XHJcbiAgLyoqXHJcbiAgICogSW5wdXQgbmFtZS9pZC4gSW4gYSByYWRpbyBncm91cCwgYWxsIHJhZGlvcyBtdXN0IGhhdmUgdGhlIHNhbWUgbmFtZSBhbmQgZGlmZmVyZW50IHZhbHVlcy5cclxuICAgKi9cclxuICBuYW1lOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICByZXF1aXJlZDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWRcclxuICAgKi9cclxuICBkaXNhYmxlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBTZXQgbGFiZWwgdGV4dFxyXG4gICAqL1xyXG4gIGxhYmVsOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFNldCBsYWJlbCB0ZXh0IGNsYXNzZXNcclxuICAgKi9cclxuICBsYWJlbENsYXNzZXM6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxzdHJpbmc+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogSGVscCB0ZXh0XHJcbiAgICovXHJcbiAgZGVzY3JpcHRpb246IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxzdHJpbmc+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBpbmxpbmUgdGhlIGhlbHAgZGVzY3JpcHRpb25cclxuICAgKi9cclxuICBpbmxpbmVEZXNjcmlwdGlvbjoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBPcHRpb25hbCBJY29uXHJcbiAgICovXHJcbiAgaWNvbjoge1xyXG4gICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPENvbmNyZXRlQ29tcG9uZW50PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogdmVlLXZhbGlkYXRlIHZhbGlkYXRpb24gcnVsZXNcclxuICAgKi9cclxuICBydWxlczoge1xyXG4gICAgdHlwZTogW1N0cmluZywgT2JqZWN0LCBGdW5jdGlvbiwgQXJyYXldIGFzIFByb3BUeXBlPFJ1bGVFeHByZXNzaW9uPFZhbHVlVHlwZT4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiB2ZWUtdmFsaWRhdGUgdmFsaWRhdGlvbigpIG9uIGNvbXBvbmVudCBtb3VudFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25Nb3VudDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHJlZCBcInJlcXVpcmVkXCIgYXN0ZXJpc2tcclxuICAgKi9cclxuICBzaG93UmVxdWlyZWQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogUmFkaW8gZ3JvdXAncyB2YWx1ZVxyXG4gICAqL1xyXG4gIG1vZGVsVmFsdWU6IHtcclxuICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dIGFzIFByb3BUeXBlPFZhbHVlVHlwZSB8IGZhbHNlPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogUmFkaW8ncyBvd24gdmFsdWUuIElmIGl0IGlzIGNoZWNrZWQsIG1vZGVsVmFsdWUgd2lsbCBpbmNsdWRlIHRoaXMgdmFsdWUgKGFtb25nc3QgYW55IG90aGVyIGNoZWNrZWQgdmFsdWVzIGZyb20gdGhlIHNhbWUgZ3JvdXApLlxyXG4gICAqIElmIG5vdCBzZXQgd2lsbCBkZWZhdWx0IHRvICduYW1lJyB2YWx1ZS5cclxuICAgKi9cclxuICB2YWx1ZToge1xyXG4gICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0gYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nIHwgdHJ1ZT4+LFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogSFRNTCBJRCB0byB1c2UsIG11c3QgYmUgZ2xvYmFsbHkgdW5pcXVlLiBJZiBub3Qgc3BlY2lmaWVkLCBhIHJhbmRvbSBJRCB3aWxsIGJlIGdlbmVyYXRlZC4gT25lIGlzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBhc3NvY2lhdGUgdGhlIGxhYmVsIGFuZCByYWRpby5cclxuICAgKi9cclxuICBpZDoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBoaWRlTGFiZWw6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgc2l6ZToge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPFNpemU+PixcclxuICAgIGRlZmF1bHQ6ICdiYXNlJ1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGdlbmVyYXRlUmFuZG9tSWQgPSAocHJlZml4OiBzdHJpbmcpID0+IGAke3ByZWZpeH0tJHtuYW5vaWQoKX1gXHJcblxyXG5kZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbDogVmFsdWVUeXBlKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCByYWRpb1ZhbHVlID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMudmFsdWUgfHwgcHJvcHMubmFtZSlcclxuXHJcbmNvbnN0IHtcclxuICBjaGVja2VkOiBjb3JlQ2hlY2tlZCxcclxuICBlcnJvck1lc3NhZ2UsXHJcbiAgaGFuZGxlQ2hhbmdlLFxyXG4gIHZhbHVlOiBjb3JlVmFsdWVcclxufSA9IHVzZUZpZWxkPFZhbHVlVHlwZT4ocHJvcHMubmFtZSwgcHJvcHMucnVsZXMsIHtcclxuICB2YWxpZGF0ZU9uTW91bnQ6IHByb3BzLnZhbGlkYXRlT25Nb3VudCxcclxuICB0eXBlOiAncmFkaW8nLFxyXG4gIGNoZWNrZWRWYWx1ZTogcmFkaW9WYWx1ZSxcclxuICBpbml0aWFsVmFsdWU6IHByb3BzLm1vZGVsVmFsdWUgfHwgdW5kZWZpbmVkXHJcbn0pXHJcblxyXG5jb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmxhYmVsIHx8IHByb3BzLm5hbWUpXHJcblxyXG5jb25zdCBjb21wdXRlZENsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICByZXR1cm4gZXJyb3JNZXNzYWdlLnZhbHVlID8gJ2JvcmRlci1kYW5nZXItbGlnaHRlcicgOiAnYm9yZGVyLWZvcmVncm91bmQtNCAnXHJcbn0pXHJcblxyXG5jb25zdCBkZXNjcmlwdGlvblRleHQgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5kZXNjcmlwdGlvbiB8fCBlcnJvck1lc3NhZ2UudmFsdWUpXHJcbmNvbnN0IGRlc2NyaXB0aW9uSWQgPSBjb21wdXRlZCgoKSA9PiBgJHtwcm9wcy5uYW1lfS1kZXNjcmlwdGlvbmApXHJcbmNvbnN0IGRlc2NyaXB0aW9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWyd0ZXh0LWJvZHktM3hzJ11cclxuXHJcbiAgaWYgKGVycm9yTWVzc2FnZS52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWRhbmdlcicpXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1mb3JlZ3JvdW5kLTInKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBpbXBsaWNpdElkID0gcmVmPE9wdGlvbmFsPHN0cmluZz4+KGdlbmVyYXRlUmFuZG9tSWQoJ3JhZGlvJykpXHJcbmNvbnN0IGZpbmFsSWQgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5pZCB8fCBpbXBsaWNpdElkLnZhbHVlKVxyXG5cclxuY29uc3Qgb25DaGFuZ2UgPSAoZTogdW5rbm93bikgPT4ge1xyXG4gIGlmIChwcm9wcy5kaXNhYmxlZCkgcmV0dXJuXHJcbiAgaGFuZGxlQ2hhbmdlKGUpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWdmaXggZm9yIHN0cmFuZ2UgaXNzdWUgd2hlcmUgcmFkaW8gYXBwZWFycyBjaGVja2VkIGV2ZW4gdGhvIGl0IHNob3VsZG50IGJlLlxyXG4gKiBJdCdzIG5vdCBjbGVhciB3aHkgdGhpcyBoYXBwZW5zLCBidXQgZm9yIHNvbWUgcmVhc29uIGNvcmVWYWx1ZS52YWx1ZSBzaG93cyB0aGF0IHRoZSByYWRpb1xyXG4gKiBpcyBjaGVja2VkLCBldmVuIHRobyBwcm9wcy5tb2RlbFZhbHVlIGlzIHVuZGVmaW5lZC5cclxuICovXHJcbm9uTW91bnRlZCgoKSA9PiB7XHJcbiAgY29uc3QgbmV3TW9kZWxWYWx1ZSA9IHByb3BzLm1vZGVsVmFsdWVcclxuICBjb25zdCBuZXdDb3JlVmFsdWUgPSBjb3JlVmFsdWUudmFsdWVcclxuXHJcbiAgY29uc3Qgc2hvdWxkQmVDaGVja2VkID0gQXJyYXkuaXNBcnJheShuZXdNb2RlbFZhbHVlKVxyXG4gICAgPyBuZXdNb2RlbFZhbHVlLmluY2x1ZGVzKHByb3BzLnZhbHVlIGFzIGFueSlcclxuICAgIDogbmV3TW9kZWxWYWx1ZSA9PT0gcHJvcHMudmFsdWVcclxuXHJcbiAgY29uc3QgaXNDb3JlQ2hlY2tlZCA9IEFycmF5LmlzQXJyYXkobmV3Q29yZVZhbHVlKVxyXG4gICAgPyBuZXdDb3JlVmFsdWUuaW5jbHVkZXMocHJvcHMudmFsdWUgYXMgYW55KVxyXG4gICAgOiBuZXdDb3JlVmFsdWUgPT09IHByb3BzLnZhbHVlXHJcblxyXG4gIGlmIChzaG91bGRCZUNoZWNrZWQgIT09IGlzQ29yZUNoZWNrZWQpIHtcclxuICAgIGhhbmRsZUNoYW5nZShuZXdNb2RlbFZhbHVlKVxyXG4gIH1cclxufSlcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1zdHJldGNoIHctZnVsbFwiXHJcbiAgICAgIDpjbGFzcz1cIlxyXG4gICAgICAgIGlzU3RhY2tlZFxyXG4gICAgICAgICAgPyAnZmxleC1jb2wgc3BhY2UteS0zICdcclxuICAgICAgICAgIDogJ2ZsZXgtY29sIHNtOmZsZXgtcm93IHNwYWNlLXktMyBzbTpzcGFjZS15LTAgc206c3BhY2UteC0zJ1xyXG4gICAgICBcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IHYtZm9yPVwib3B0aW9uIGluIG9wdGlvbnNcIiA6a2V5PVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJ3LWZ1bGwgZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGNsYXNzPVwiYmctZm91bmRhdGlvbiByZWxhdGl2ZSB3LWZ1bGwgaC1mdWxsIHNlbGVjdC1ub25lIHJvdW5kZWQtbWQgYm9yZGVyIHNoYWRvd1wiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgIHNlbGVjdGVkID09PSBvcHRpb24udmFsdWUgPyAnYm9yZGVyLW91dGxpbmUtNCcgOiAnYm9yZGVyLW91dGxpbmUtMicsXHJcbiAgICAgICAgICAgIGRpc2FibGVkIHx8IG9wdGlvbi5kaXNhYmxlZFxyXG4gICAgICAgICAgICAgID8gJ29wYWNpdHktNjAgY3Vyc29yLW5vdC1hbGxvd2VkJ1xyXG4gICAgICAgICAgICAgIDogJ2hvdmVyOmJvcmRlci1vdXRsaW5lLTEnXHJcbiAgICAgICAgICBdXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IG9wdGlvbi5kaXNhYmxlZFwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIEBjbGljaz1cInNlbGVjdEl0ZW0ob3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgc3BhY2UteS0yIGgtZnVsbFwiXHJcbiAgICAgICAgICAgIDpjbGFzcz1cInByb3BzLnNpemUgPT09ICdzbScgPyAncC0zJyA6ICdwLTQgJ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGdhcC14LTNcIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cIm9wdGlvbi5pY29uID8gJ2l0ZW1zLXN0YXJ0JyA6ICdpdGVtcy1jZW50ZXInXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBpdGVtcy1jZW50ZXIgdGV4dC1sZWZ0IGdhcC14LTJcIj5cclxuICAgICAgICAgICAgICAgIDxjb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgOmlzPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZm9yZWdyb3VuZCBoLTUgdy01XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZm9yZWdyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwicHJvcHMuc2l6ZSA9PT0gJ3NtJyA/ICd0ZXh0LWhlYWRpbmctc20nIDogJ3RleHQtaGVhZGluZydcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLnRpdGxlIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgIDxoNSB2LWlmPVwib3B0aW9uLnN1YnRpdGxlXCIgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMyB0ZXh0LWJvZHkteHNcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb24uc3VidGl0bGUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC01IHctNSByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLVsxLjVweF0gYm9yZGVyLW91dGxpbmUtNVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwic2VsZWN0ZWQgPT09IG9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC0yLjUgdy0yLjUgcm91bmRlZC1mdWxsIGJnLXByaW1hcnkgZmxleFwiXHJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgdi1pZj1cIm9wdGlvbi5pbnRyb2R1Y3Rpb25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmQtMiBzZWxlY3Qtbm9uZSB0ZXh0LWxlZnQgcHItOFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBvcHRpb24uaW50cm9kdWN0aW9uIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c2xvdCA6bmFtZT1cIm9wdGlvbi52YWx1ZVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICB2LWlmPVwib3B0aW9uLmhlbHBcIlxyXG4gICAgICAgICAgY2xhc3M9XCJzbTpoaWRkZW4gdGV4dC14cyBmbGV4IHNwYWNlLXgtMC41IG10LTIgdGV4dC1mb3JlZ3JvdW5kXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8SW5mb3JtYXRpb25DaXJjbGVJY29uIGNsYXNzPVwiaC00IHctNFwiIC8+XHJcbiAgICAgICAgICB7eyBvcHRpb24uaGVscCB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiB2LWlmPVwiIWlzU3RhY2tlZFwiIGNsYXNzPVwiaGlkZGVuIHNtOmZsZXggc3BhY2UteC0zIHctZnVsbFwiPlxyXG4gICAgICA8ZGl2IHYtZm9yPVwib3B0aW9uIGluIG9wdGlvbnNcIiA6a2V5PVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICB2LWlmPVwib3B0aW9uLmhlbHBcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzIGZsZXggc3BhY2UteC0wLjUgbXQtMiB0ZXh0LWZvcmVncm91bmQgc2VsZWN0LW5vbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxJbmZvcm1hdGlvbkNpcmNsZUljb24gY2xhc3M9XCJoLTQgdy00XCIgLz5cclxuICAgICAgICAgIHt7IG9wdGlvbi5oZWxwIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IHYtaWY9XCJlcnJvck1lc3NhZ2VcIiBjbGFzcz1cInRleHQtZGFuZ2VyIHRleHQtYm9keS0yeHMgbXQtMlwiPlxyXG4gICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIiBnZW5lcmljPVwiVmFsdWUgZXh0ZW5kcyBzdHJpbmdcIj5cclxuaW1wb3J0IHsgSW5mb3JtYXRpb25DaXJjbGVJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHsgdXNlRmllbGQsIHR5cGUgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IEZvcm1SYWRpb0dyb3VwSXRlbSB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2NvbW1vbi9jb21wb25lbnRzJ1xyXG5cclxuZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOm1vZGVsVmFsdWUnLCB2OiBWYWx1ZSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgbmFtZT86IHN0cmluZ1xyXG4gICAgbW9kZWxWYWx1ZT86IFZhbHVlXHJcbiAgICBvcHRpb25zOiBGb3JtUmFkaW9Hcm91cEl0ZW08VmFsdWU+W11cclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gICAgaXNTdGFja2VkPzogYm9vbGVhblxyXG4gICAgc2l6ZT86ICdzbScgfCAnYmFzZSdcclxuICAgIHJ1bGVzPzogUnVsZUV4cHJlc3Npb248VmFsdWU+XHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBzaXplOiAnYmFzZScsXHJcbiAgICBuYW1lOiAnZm9ybVJhZGlvR3JvdXAnXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCB7IHZhbHVlLCBlcnJvck1lc3NhZ2UgfSA9IHVzZUZpZWxkPFZhbHVlPihwcm9wcy5uYW1lLCBwcm9wcy5ydWxlcywge1xyXG4gIGluaXRpYWxWYWx1ZTogcHJvcHMubW9kZWxWYWx1ZSBhcyBWYWx1ZVxyXG59KVxyXG5cclxuY29uc3Qgc2VsZWN0ZWQgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiB2YWx1ZS52YWx1ZSxcclxuICBzZXQ6IChuZXdWYWw6IFZhbHVlKSA9PiAodmFsdWUudmFsdWUgPSBuZXdWYWwpXHJcbn0pXHJcblxyXG5jb25zdCBzZWxlY3RJdGVtID0gKHZhbHVlOiBWYWx1ZSkgPT4ge1xyXG4gIHNlbGVjdGVkLnZhbHVlID0gdmFsdWVcclxufVxyXG48L3NjcmlwdD5cclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50ICovXHJcbmltcG9ydCB7IHVzZUZpZWxkIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgdHlwZSB7IFJ1bGVFeHByZXNzaW9uIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgb25Nb3VudGVkLCByZWYsIHVucmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBSZWYsIFRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZU51bGxPclVuZGVmaW5lZCwgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCdcclxuaW1wb3J0IHtcclxuICBkZWJvdW5jZSxcclxuICBpbmNsdWRlcyxcclxuICBpc0FycmF5LFxyXG4gIGlzQm9vbGVhbixcclxuICBpc1N0cmluZyxcclxuICBpc1VuZGVmaW5lZCxcclxuICBub29wXHJcbn0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHR5cGUgeyBMYWJlbFBvc2l0aW9uIH0gZnJvbSAnLi9pbnB1dCdcclxuXHJcbmV4cG9ydCB0eXBlIElucHV0Q29sb3IgPSAncGFnZScgfCAnZm91bmRhdGlvbicgfCAndHJhbnNwYXJlbnQnIHwgJ2Z1bGx5LXRyYW5zcGFyZW50J1xyXG5cclxuLyoqXHJcbiAqIENvbW1vbiBzZXR1cCBmb3IgdGV4dCBpbnB1dCAmIHRleHRhcmVhIGZpZWxkc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRleHRJbnB1dENvcmU8ViBleHRlbmRzIHN0cmluZyB8IHN0cmluZ1tdID0gc3RyaW5nPihwYXJhbXM6IHtcclxuICBwcm9wczogVG9SZWZzPHtcclxuICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgaGVscD86IHN0cmluZ1xyXG4gICAgbGFiZWw/OiBzdHJpbmdcclxuICAgIHNob3dMYWJlbD86IGJvb2xlYW5cclxuICAgIHJ1bGVzPzogUnVsZUV4cHJlc3Npb248Vj5cclxuICAgIHZhbGlkYXRlT25Nb3VudD86IGJvb2xlYW5cclxuICAgIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZT86IGJvb2xlYW5cclxuICAgIG1vZGVsVmFsdWU/OiBWXHJcbiAgICBhdXRvRm9jdXM/OiBib29sZWFuXHJcbiAgICBzaG93Q2xlYXI/OiBib29sZWFuXHJcbiAgICB1c2VMYWJlbEluRXJyb3JzPzogYm9vbGVhblxyXG4gICAgY3VzdG9tRXJyb3JNZXNzYWdlPzogc3RyaW5nXHJcbiAgICBoaWRlRXJyb3JNZXNzYWdlPzogYm9vbGVhblxyXG4gICAgY29sb3I/OiBJbnB1dENvbG9yXHJcbiAgICBsYWJlbFBvc2l0aW9uPzogTGFiZWxQb3NpdGlvblxyXG4gICAgY3VzdG9tSGVscENsYXNzPzogc3RyaW5nXHJcbiAgfT5cclxuICBlbWl0OiB7XHJcbiAgICAoZTogJ2NoYW5nZScsIHZhbDogeyBldmVudD86IEV2ZW50OyB2YWx1ZTogViB9KTogdm9pZFxyXG4gICAgKGU6ICdjbGVhcicpOiB2b2lkXHJcbiAgfVxyXG4gIGlucHV0RWw6IFJlZjxOdWxsYWJsZTxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4+XHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgY3VzdG9tQ2xlYXI6ICgpID0+IHZvaWRcclxuICB9PlxyXG59KSB7XHJcbiAgY29uc3QgeyBwcm9wcywgaW5wdXRFbCwgZW1pdCwgb3B0aW9ucyB9ID0gcGFyYW1zXHJcblxyXG4gIGNvbnN0IHsgdmFsdWUsIGVycm9yTWVzc2FnZTogdmVlRXJyb3JNZXNzYWdlIH0gPSB1c2VGaWVsZDxWPihcclxuICAgIHByb3BzLm5hbWUsXHJcbiAgICBwcm9wcy5ydWxlcyxcclxuICAgIHtcclxuICAgICAgdmFsaWRhdGVPbk1vdW50OiB1bnJlZihwcm9wcy52YWxpZGF0ZU9uTW91bnQpLFxyXG4gICAgICB2YWxpZGF0ZU9uVmFsdWVVcGRhdGU6IHVucmVmKHByb3BzLnZhbGlkYXRlT25WYWx1ZVVwZGF0ZSksXHJcbiAgICAgIGluaXRpYWxWYWx1ZTogdW5yZWYocHJvcHMubW9kZWxWYWx1ZSkgfHwgdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgKVxyXG5cclxuICBjb25zdCBsYWJlbENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgICAnZmxleCB0ZXh0LWJvZHkteHMgZm9udC1tZWRpdW0gZ2FwLTEgaXRlbXMtY2VudGVyJyxcclxuICAgICAgdW5yZWYocHJvcHMuY29sb3IpID09PSAnZm91bmRhdGlvbicgPyAndGV4dC1mb3JlZ3JvdW5kJyA6ICd0ZXh0LWZvcmVncm91bmQtMicsXHJcbiAgICAgIHVucmVmKHByb3BzLmxhYmVsUG9zaXRpb24pICE9PSAnbGVmdCcgPyAncGItMScgOiBudWxsXHJcbiAgICBdXHJcbiAgICBpZiAoIXVucmVmKHByb3BzLnNob3dMYWJlbCkpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdzci1vbmx5JylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxuICB9KVxyXG5cclxuICBjb25zdCBjb3JlSW5wdXRDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXHJcbiAgICAgICdmb2N1czpvdXRsaW5lLW5vbmUgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOmJnLWZvdW5kYXRpb24tZGlzYWJsZWQnLFxyXG4gICAgICAnZGlzYWJsZWQ6dGV4dC1kaXNhYmxlZC1tdXRlZCBwbGFjZWhvbGRlcjp0ZXh0LWZvcmVncm91bmQtMicsXHJcbiAgICAgICdyb3VuZGVkLW1kJ1xyXG4gICAgXVxyXG5cclxuICAgIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IGNvcmVDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgY29sb3IgPSB1bnJlZihwcm9wcy5jb2xvcilcclxuICAgIGNvbnN0IGNsYXNzUGFydHMgPSBbJ2Jsb2NrIHctZnVsbCB0ZXh0LWZvcmVncm91bmQnLCBjb3JlSW5wdXRDbGFzc2VzLnZhbHVlXVxyXG5cclxuICAgIGlmIChjb2xvciAhPT0gJ2Z1bGx5LXRyYW5zcGFyZW50Jykge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3B5LTIgcHgtMycpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3AtMCcpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0Vycm9yLnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnIWJvcmRlci1kYW5nZXInKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItMCcpXHJcbiAgICAgIGlmIChjb2xvciAhPT0gJ2Z1bGx5LXRyYW5zcGFyZW50Jykge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaCgndHJhbnNpdGlvbi1hbGwgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb3V0bGluZS0yJylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ2ZvY3VzOnJpbmctMCcpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sb3IgPT09ICdmb3VuZGF0aW9uJykge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goXHJcbiAgICAgICAgJ2JnLWZvdW5kYXRpb24gIWJvcmRlciBib3JkZXItb3V0bGluZS0yIGhvdmVyOmJvcmRlci1vdXRsaW5lLTUgZm9jdXMtdmlzaWJsZTpib3JkZXItb3V0bGluZS00ICFyaW5nLTAgZm9jdXMtdmlzaWJsZTohb3V0bGluZS0wJ1xyXG4gICAgICApXHJcbiAgICB9IGVsc2UgaWYgKGluY2x1ZGVzKFsndHJhbnNwYXJlbnQnLCAnZnVsbHktdHJhbnNwYXJlbnQnXSwgY29sb3IpKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctdHJhbnNwYXJlbnQnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1mb3VuZGF0aW9uLXBhZ2UnKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IGludGVybmFsSGVscFRpcElkID0gcmVmKG5hbm9pZCgpKVxyXG5cclxuICBjb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHVucmVmKHByb3BzLmxhYmVsKSB8fCB1bnJlZihwcm9wcy5uYW1lKSlcclxuXHJcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKHVucmVmKHByb3BzLmN1c3RvbUVycm9yTWVzc2FnZSkpIHtcclxuICAgICAgcmV0dXJuIHVucmVmKHByb3BzLmN1c3RvbUVycm9yTWVzc2FnZSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYXNlID0gdmVlRXJyb3JNZXNzYWdlLnZhbHVlXHJcbiAgICBpZiAoIWJhc2UgfHwgIXVucmVmKHByb3BzLnVzZUxhYmVsSW5FcnJvcnMpKSByZXR1cm4gYmFzZVxyXG4gICAgcmV0dXJuIGJhc2UucmVwbGFjZSgnVmFsdWUnLCB0aXRsZS52YWx1ZSlcclxuICB9KVxyXG5cclxuICBjb25zdCBoYXNFcnJvciA9IGNvbXB1dGVkKCgpID0+ICEhZXJyb3JNZXNzYWdlLnZhbHVlKVxyXG5cclxuICBjb25zdCBoaWRlSGVscFRpcCA9IGNvbXB1dGVkKFxyXG4gICAgKCkgPT4gZXJyb3JNZXNzYWdlLnZhbHVlICYmIHVucmVmKHByb3BzLmhpZGVFcnJvck1lc3NhZ2UpXHJcbiAgKVxyXG4gIGNvbnN0IGhlbHBUaXAgPSBjb21wdXRlZCgoKSA9PiBlcnJvck1lc3NhZ2UudmFsdWUgfHwgdW5yZWYocHJvcHMuaGVscCkpXHJcbiAgY29uc3QgaGFzSGVscFRpcCA9IGNvbXB1dGVkKCgpID0+ICEhaGVscFRpcC52YWx1ZSlcclxuICBjb25zdCBjdXN0b21IZWxwVGlwQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB1bnJlZihwcm9wcy5jdXN0b21IZWxwQ2xhc3MpKVxyXG4gIGNvbnN0IGhlbHBUaXBJZCA9IGNvbXB1dGVkKCgpID0+XHJcbiAgICBoYXNIZWxwVGlwLnZhbHVlID8gYCR7dW5yZWYocHJvcHMubmFtZSl9LSR7aW50ZXJuYWxIZWxwVGlwSWQudmFsdWV9YCA6IHVuZGVmaW5lZFxyXG4gIClcclxuXHJcbiAgY29uc3QgaGVscFRpcENsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IGNsYXNzUGFydHMgPSBbJ3RleHQtYm9keS0yeHMgYnJlYWstd29yZHMnXVxyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKGhhc0Vycm9yLnZhbHVlID8gJ3RleHQtZGFuZ2VyJyA6ICd0ZXh0LWZvcmVncm91bmQtMicpXHJcbiAgICBpZiAoY3VzdG9tSGVscFRpcENsYXNzLnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaChjdXN0b21IZWxwVGlwQ2xhc3MudmFsdWUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxuICB9KVxyXG5cclxuICBjb25zdCBzaG91bGRTaG93Q2xlYXIgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBpZiAoIXVucmVmKHByb3BzLnNob3dDbGVhcikpIHJldHVybiBmYWxzZVxyXG4gICAgcmV0dXJuICh2YWx1ZS52YWx1ZT8ubGVuZ3RoIHx8IDApID4gMFxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IGZvY3VzID0gKCkgPT4ge1xyXG4gICAgaW5wdXRFbC52YWx1ZT8uZm9jdXMoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xlYXIgPSAoKSA9PiB7XHJcbiAgICB2YWx1ZS52YWx1ZSA9IChpc0FycmF5KHZhbHVlLnZhbHVlKSA/IFtdIDogJycpIGFzIFZcclxuICAgIG9wdGlvbnM/LmN1c3RvbUNsZWFyPy4oKVxyXG5cclxuICAgIGVtaXQoJ2NoYW5nZScsIHsgdmFsdWU6IHZhbHVlLnZhbHVlIH0pXHJcbiAgICBlbWl0KCdjbGVhcicpXHJcbiAgfVxyXG5cclxuICBvbk1vdW50ZWQoKCkgPT4ge1xyXG4gICAgaWYgKHVucmVmKHByb3BzLmF1dG9Gb2N1cykpIHtcclxuICAgICAgZm9jdXMoKVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBjb3JlSW5wdXRDbGFzc2VzLFxyXG4gICAgY29yZUNsYXNzZXMsXHJcbiAgICB0aXRsZSxcclxuICAgIHZhbHVlLFxyXG4gICAgaGVscFRpcElkLFxyXG4gICAgaGVscFRpcENsYXNzZXMsXHJcbiAgICBoZWxwVGlwLFxyXG4gICAgaGlkZUhlbHBUaXAsXHJcbiAgICBlcnJvck1lc3NhZ2UsXHJcbiAgICBjbGVhcixcclxuICAgIGZvY3VzLFxyXG4gICAgbGFiZWxDbGFzc2VzLFxyXG4gICAgc2hvdWxkU2hvd0NsZWFyLFxyXG4gICAgaGFzRXJyb3JcclxuICB9XHJcbn1cclxuXHJcbnR5cGUgRm9ybUlucHV0Q2hhbmdlRXZlbnQgPSB7IGV2ZW50PzogRXZlbnQ7IHZhbHVlOiBzdHJpbmcgfVxyXG5cclxuLyoqXHJcbiAqIEF0dGFjaCByZXR1cm5lZCBvbiBhbmQgYmluZCB1c2luZyB2LW9uIGFuZCB2LWJpbmQsIGFuZCB0aGVuIHlvdSBjYW4gdXNlIHRoZSByZXR1cm5lZCBgdmFsdWVgXHJcbiAqIHJlZiB0byBnZXQgdGhlIGlucHV0J3MgdmFsdWUgd2hpbGUgZW5zdXJpbmcgbm9ybWFsIGlucHV0IGV2ZW50cyBhcmUgZGVib3VuY2VkIGFuZCBvbmx5IGNoYW5nZS9jbGVhclxyXG4gKiBldmVudHMgY2F1c2UgdGhlIHZhbHVlIHRvIHByb3BhZ2F0ZSBpbW1lZGlhdGVseVxyXG4gKlxyXG4gKiBWZXJ5IHVzZWZ1bCBmb3Igc2VhcmNoIGlucHV0cyBhbmQgb3RoZXIga2luZCBvZiBhdXRvLXN1Ym1pdHRpbmcgaW5wdXRzIVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZURlYm91bmNlZFRleHRJbnB1dChwYXJhbXM/OiB7XHJcbiAgLyoqXHJcbiAgICogRm9yIGhvdyBsb25nIHNob3VsZCBiYXNpYyBpbnB1dCBldmVudHMgYmUgZGVib3VuY2VkLlxyXG4gICAqIERlZmF1bHQ6IDEwMDAgKG1zKVxyXG4gICAqL1xyXG4gIGRlYm91bmNlZEJ5PzogbnVtYmVyXHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGVuYWJsZWQsIHZhbHVlIHdpbGwgb25seSBjaGFuZ2Ugb24gc3VibWl0L2VudGVyLCBhbmQganVzdCB0eXBpbmcgaW4gdmFsdWVzIHdpbGwgbmV2ZXJcclxuICAgKiByZWdpc3Rlci5cclxuICAgKiBEZWZhdWx0OiBmYWxzZVxyXG4gICAqL1xyXG4gIGRpc2FibGVEZWJvdW5jZWRJbnB1dD86IGJvb2xlYW5cclxuXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWxseSBwYXNzIGluIHRoZSBtb2RlbCByZWYgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgc291cmNlIG9mIHRydXRoXHJcbiAgICovXHJcbiAgbW9kZWw/OiBSZWY8TWF5YmVOdWxsT3JVbmRlZmluZWQ8c3RyaW5nPj5cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIHRydWUgaWYgeW91J3JlIHRyYWNraW5nIGNoYW5nZXMgb24gYSBiYXNpYyBIVE1MIGlucHV0IGVsZW1lbnQuIFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGV2ZW50c1xyXG4gICAqIGJlaW5nIHVzZWQgKGUuZy4gaW5wdXQgaW5zdGVhZCBvZiB1cGRhdGU6bW9kZWxWYWx1ZSlcclxuICAgKlxyXG4gICAqIERlZmF1bHQ6IGZhbHNlXHJcbiAgICovXHJcbiAgaXNCYXNpY0h0bWxJbnB1dD86IGJvb2xlYW5cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50IHRoZSBjaGFuZ2UgZXZlbnQgdG8gYmUgZW1pdHRlZCBvbiBFbnRlciBrZXkgcHJlc3MuXHJcbiAgICogU2V0dGluZyBvbmx5IHdvcmtzIGZvciBiYXNpYyBodG1sIGlucHV0cyBjdXJyZW50bHkhXHJcbiAgICpcclxuICAgKiBEZWZhdWx0OiBEZWZhdWx0IGJlaGF2aW9yICh0cnVlIGZvciBpbnB1dCwgZmFsc2UgZm9yIHRleHRhcmVhKVxyXG4gICAqL1xyXG4gIHN1Ym1pdE9uRW50ZXI/OiBib29sZWFuXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHNlZSBkZWJ1ZyBvdXRwdXQgZm9yIGhvdyBldmVudHMgZmlyZSBhbmQgYXJlIGhhbmRsZWRcclxuICAgKi9cclxuICBkZWJ1Zz86IGJvb2xlYW4gfCAoKC4uLmxvZ0FyZ3M6IHVua25vd25bXSkgPT4gdm9pZClcclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCB3aGVuIGEgbmV3IHZhbHVlIGlzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIG1vZGVsXHJcbiAgICovXHJcbiAgb25Xcml0ZT86ICh2YWw6IHN0cmluZykgPT4gdm9pZFxyXG59KSB7XHJcbiAgY29uc3Qge1xyXG4gICAgZGVib3VuY2VkQnkgPSAxMDAwLFxyXG4gICAgaXNCYXNpY0h0bWxJbnB1dCA9IGZhbHNlLFxyXG4gICAgc3VibWl0T25FbnRlcixcclxuICAgIGRpc2FibGVEZWJvdW5jZWRJbnB1dCxcclxuICAgIG9uV3JpdGVcclxuICB9ID0gcGFyYW1zIHx8IHt9XHJcbiAgY29uc3QgbG9nID0gcGFyYW1zPy5kZWJ1Z1xyXG4gICAgPyBpc0Jvb2xlYW4ocGFyYW1zLmRlYnVnKVxyXG4gICAgICA/IGNvbnNvbGUuZGVidWdcclxuICAgICAgOiBwYXJhbXMuZGVidWdcclxuICAgIDogbm9vcFxyXG5cclxuICAvLyBUaGUgYWN0dWFsIHNvdXJjZSBvZiB0cnV0aCBob2xkaW5nIHRoZSBmaW5hbCB2YWx1ZVxyXG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5tb2RlbCB8fCByZWYoJycpXHJcblxyXG4gIC8vIFRoZSBpbnRlcm5hbCBtb2RlbCBvZiB0aGUgaW5wdXRcclxuICBjb25zdCBtb2RlbCA9IHJlZih2YWx1ZS52YWx1ZSlcclxuXHJcbiAgY29uc3QgZ2V0VmFsdWUgPSAodmFsOiBzdHJpbmcgfCBJbnB1dEV2ZW50IHwgRXZlbnQgfCBGb3JtSW5wdXRDaGFuZ2VFdmVudCkgPT4ge1xyXG4gICAgaWYgKGlzU3RyaW5nKHZhbCkpIHJldHVybiB2YWxcclxuICAgIGlmICgndmFsdWUnIGluIHZhbCkgcmV0dXJuIHZhbC52YWx1ZVxyXG5cclxuICAgIGNvbnN0IHRhcmdldCA9IHZhbC50YXJnZXQgYXMgTnVsbGFibGU8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XHJcbiAgICByZXR1cm4gdGFyZ2V0Py52YWx1ZSB8fCAnJ1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSBjb3JlIHVuZGVybHlpbmcgc291cmNlIG9mIHRydXRoIHRoYXQncyBhdmFpbGFibGUgb3V0d2FyZHNcclxuICAgKi9cclxuICBjb25zdCBwZXJzaXN0VmFsdWUgPSAodmFsOiBzdHJpbmcpID0+IHtcclxuICAgIHZhbHVlLnZhbHVlID0gdmFsXHJcbiAgICBsb2coJ1ZhbHVlIHVwZGF0ZWQ6ICcgKyB2YWwpXHJcbiAgICBvbldyaXRlPy4odmFsKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZGVib3VuY2VkVmFsdWVVcGRhdGUgPSBkaXNhYmxlRGVib3VuY2VkSW5wdXRcclxuICAgID8gdW5kZWZpbmVkXHJcbiAgICA6IGRlYm91bmNlKCh2YWw6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHBlcnNpc3RWYWx1ZSh2YWwpXHJcbiAgICAgIH0sIGRlYm91bmNlZEJ5KVxyXG5cclxuICBjb25zdCBpbnB1dEV2ZW50TmFtZSA9IGlzQmFzaWNIdG1sSW5wdXQgPyAnaW5wdXQnIDogJ3VwZGF0ZTptb2RlbFZhbHVlJ1xyXG4gIGNvbnN0IG9uID0ge1xyXG4gICAgW2lucHV0RXZlbnROYW1lXTogKHZhbDogc3RyaW5nIHwgSW5wdXRFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBuZXdWYWwgPSBnZXRWYWx1ZSh2YWwpXHJcbiAgICAgIG1vZGVsLnZhbHVlID0gbmV3VmFsXHJcbiAgICAgIGRlYm91bmNlZFZhbHVlVXBkYXRlPy4obmV3VmFsKVxyXG4gICAgICBsb2coYElucHV0IGV2ZW50IFske2lucHV0RXZlbnROYW1lfV0gdHJpZ2dlcmVkOiAke25ld1ZhbH1gKVxyXG4gICAgfSxcclxuICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgIGRlYm91bmNlZFZhbHVlVXBkYXRlPy5jYW5jZWwoKVxyXG4gICAgICBtb2RlbC52YWx1ZSA9ICcnXHJcbiAgICAgIHBlcnNpc3RWYWx1ZSgnJylcclxuICAgICAgbG9nKCdDbGVhciBldmVudCcpXHJcbiAgICB9LFxyXG4gICAgY2hhbmdlOiAodmFsOiBGb3JtSW5wdXRDaGFuZ2VFdmVudCB8IEV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1ZhbCA9IGdldFZhbHVlKHZhbClcclxuICAgICAgZGVib3VuY2VkVmFsdWVVcGRhdGU/LmNhbmNlbCgpXHJcbiAgICAgIHBlcnNpc3RWYWx1ZShuZXdWYWwpXHJcbiAgICAgIG1vZGVsLnZhbHVlID0gbmV3VmFsXHJcbiAgICAgIGxvZygnQ2hhbmdlIGV2ZW50OiAnICsgbmV3VmFsKVxyXG4gICAgfSxcclxuICAgIGtleWRvd246IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmICghaXNCYXNpY0h0bWxJbnB1dCkgcmV0dXJuXHJcbiAgICAgIGlmIChpc1VuZGVmaW5lZChzdWJtaXRPbkVudGVyKSkgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBpc0VudGVyID0gZS5rZXkgPT09ICdFbnRlcidcclxuICAgICAgaWYgKCFpc0VudGVyKSByZXR1cm5cclxuXHJcbiAgICAgIGNvbnN0IGlzVGV4dGFyZWEgPSBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnRcclxuXHJcbiAgICAgIGlmIChpc1RleHRhcmVhKSB7XHJcbiAgICAgICAgaWYgKHN1Ym1pdE9uRW50ZXIpIHtcclxuICAgICAgICAgIGxvZygnVHJpZ2dlcmluZyBzdWJtaXQgb24gZW50ZXInKVxyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgICAgICBvbi5jaGFuZ2UoZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCFzdWJtaXRPbkVudGVyKSB7XHJcbiAgICAgICAgICBsb2coJ1ByZXZlbnRpbmcgc3VibWl0IG9uIGVudGVyJylcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCBiaW5kID0gY29tcHV0ZWQoKCkgPT4gKHtcclxuICAgIG1vZGVsVmFsdWU6IG1vZGVsLnZhbHVlIHx8ICcnXHJcbiAgfSkpXHJcblxyXG4gIHdhdGNoKHZhbHVlLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICAgIGlmIChvbGRWYWwgPT09IG5ld1ZhbCAmJiAhb2xkVmFsICYmICFuZXdWYWwpIHJldHVyblxyXG4gICAgaWYgKG1vZGVsLnZhbHVlID09PSB2YWx1ZS52YWx1ZSkgcmV0dXJuXHJcbiAgICBtb2RlbC52YWx1ZSA9IHZhbHVlLnZhbHVlXHJcbiAgfSlcclxuXHJcbiAgY29uc3Qgc3luY0Zyb21WYWx1ZSA9ICgpID0+IHtcclxuICAgIGRlYm91bmNlZFZhbHVlVXBkYXRlPy5jYW5jZWwoKVxyXG4gICAgbW9kZWwudmFsdWUgPSB2YWx1ZS52YWx1ZVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG9uLFxyXG4gICAgYmluZCxcclxuICAgIHZhbHVlLFxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZSBzeW5jIGludGVybmFsIHN0YXRlIGZyb20gdGhlIHNvdXJjZSBvZiB0cnV0aFxyXG4gICAgICovXHJcbiAgICBzeW5jRnJvbVZhbHVlXHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XHJcbjx0ZW1wbGF0ZT5cclxuICA8ZGl2IDpjbGFzcz1cImNvbXB1dGVkV3JhcHBlckNsYXNzZXNcIj5cclxuICAgIDxkaXZcclxuICAgICAgOmNsYXNzPVwiXHJcbiAgICAgICAgbGFiZWxQb3NpdGlvbiA9PT0gJ2xlZnQnXHJcbiAgICAgICAgICA/ICd3LWZ1bGwgbWQ6dy02LzEyIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXInXHJcbiAgICAgICAgICA6ICd3LWZ1bGwnXHJcbiAgICAgIFwiXHJcbiAgICA+XHJcbiAgICAgIDxsYWJlbCA6Zm9yPVwibmFtZVwiIDpjbGFzcz1cImxhYmVsQ2xhc3Nlc1wiPlxyXG4gICAgICAgIDxzcGFuPnt7IHRpdGxlIH19PC9zcGFuPlxyXG4gICAgICAgIDxkaXYgdi1pZj1cIiFzaG93UmVxdWlyZWRcIiBjbGFzcz1cInRleHQtYm9keS0yeHMgZm9udC1ub3JtYWxcIj4ob3B0aW9uYWwpPC9kaXY+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxzcGFuXHJcbiAgICAgICAgdi1pZj1cImxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JyAmJiBoZWxwVGlwSWRMZWZ0XCJcclxuICAgICAgICA6aWQ9XCJoZWxwVGlwSWRMZWZ0XCJcclxuICAgICAgICA6Y2xhc3M9XCJoZWxwVGlwQ2xhc3Nlc1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBoZWxwVGlwIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cInJlbGF0aXZlXCJcclxuICAgICAgOmNsYXNzPVwibGFiZWxQb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ3ctZnVsbCBtZDp3LTYvMTInIDogJ3ctZnVsbCdcIlxyXG4gICAgPlxyXG4gICAgICA8dGV4dGFyZWFcclxuICAgICAgICA6aWQ9XCJuYW1lXCJcclxuICAgICAgICByZWY9XCJpbnB1dEVsZW1lbnRcIlxyXG4gICAgICAgIHYtbW9kZWw9XCJ2YWx1ZVwiXHJcbiAgICAgICAgOm5hbWU9XCJuYW1lXCJcclxuICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICBjb3JlQ2xhc3NlcyxcclxuICAgICAgICAgIGljb25DbGFzc2VzLFxyXG4gICAgICAgICAgc2l6ZUNsYXNzZXMsXHJcbiAgICAgICAgICB0ZXh0YXJlYUNsYXNzZXMgfHwgJycsXHJcbiAgICAgICAgICAnbWluLWgtWzZyZW1dIHNtOm1pbi1oLVszcmVtXSBzaW1wbGUtc2Nyb2xsYmFyJ1xyXG4gICAgICAgIF1cIlxyXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgOmFyaWEtaW52YWxpZD1cImVycm9yTWVzc2FnZSA/ICd0cnVlJyA6ICdmYWxzZSdcIlxyXG4gICAgICAgIDphcmlhLWRlc2NyaWJlZGJ5PVwibGFiZWxQb3NpdGlvbiA9PT0gJ2xlZnQnID8gaGVscFRpcElkTGVmdCA6IGhlbHBUaXBJZFRvcFwiXHJcbiAgICAgICAgdi1iaW5kPVwiJGF0dHJzXCJcclxuICAgICAgICBAY2hhbmdlPVwiJGVtaXQoJ2NoYW5nZScsIHsgZXZlbnQ6ICRldmVudCwgdmFsdWUgfSlcIlxyXG4gICAgICAgIEBpbnB1dD1cIiRlbWl0KCdpbnB1dCcsIHsgZXZlbnQ6ICRldmVudCwgdmFsdWUgfSlcIlxyXG4gICAgICAgIEBrZXlkb3duLnN0b3BcclxuICAgICAgLz5cclxuICAgICAgPGFcclxuICAgICAgICB2LWlmPVwic2hvdWxkU2hvd0NsZWFyXCJcclxuICAgICAgICB0aXRsZT1cIkNsZWFyIGlucHV0XCJcclxuICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0yIHJpZ2h0LTAgZmxleCBpdGVtcy1jZW50ZXIgcHItMiBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgQGNsaWNrPVwiY2xlYXJcIlxyXG4gICAgICAgIEBrZXlkb3duPVwiY2xlYXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHNyLW9ubHlcIj5DbGVhciBpbnB1dDwvc3Bhbj5cclxuICAgICAgICA8WE1hcmtJY29uIGNsYXNzPVwiaC01IHctNSB0ZXh0LWZvcmVncm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxyXG4gICAgICA8L2E+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwXHJcbiAgICAgIHYtaWY9XCJsYWJlbFBvc2l0aW9uID09PSAndG9wJyAmJiBoZWxwVGlwSWRUb3BcIlxyXG4gICAgICA6aWQ9XCJoZWxwVGlwSWRUb3BcIlxyXG4gICAgICA6Y2xhc3M9XCJbJ210LTEuNScsIGhlbHBUaXBDbGFzc2VzXVwiXHJcbiAgICA+XHJcbiAgICAgIHt7IGhlbHBUaXAgfX1cclxuICAgIDwvcD5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgWE1hcmtJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjAvc29saWQnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB0eXBlIHsgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCByZWYsIHRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBMYWJlbFBvc2l0aW9uIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2Zvcm0vaW5wdXQnXHJcbmltcG9ydCB0eXBlIHsgSW5wdXRDb2xvciB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL3RleHRJbnB1dCdcclxuaW1wb3J0IHsgdXNlVGV4dElucHV0Q29yZSB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL3RleHRJbnB1dCdcclxuXHJcbnR5cGUgSW5wdXRTaXplID0gJ3NtJyB8ICdiYXNlJyB8ICdsZycgfCAneGwnXHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWw6IHN0cmluZyk6IHZvaWRcclxuICAoZTogJ2NoYW5nZScsIHZhbDogeyBldmVudD86IEV2ZW50OyB2YWx1ZTogc3RyaW5nIH0pOiB2b2lkXHJcbiAgKGU6ICdpbnB1dCcsIHZhbDogeyBldmVudD86IEV2ZW50OyB2YWx1ZTogc3RyaW5nIH0pOiB2b2lkXHJcbiAgKGU6ICdjbGVhcicpOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIC8qKlxyXG4gICAgICogVW5pcXVlIElEIGZvciB0aGUgaW5wdXQgKG11c3QgYmUgdW5pcXVlIHBhZ2Utd2lkZSlcclxuICAgICAqL1xyXG4gICAgbmFtZTogc3RyaW5nXHJcbiAgICBzaG93TGFiZWw/OiBib29sZWFuXHJcbiAgICBoZWxwPzogc3RyaW5nXHJcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZ1xyXG4gICAgbGFiZWw/OiBzdHJpbmdcclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gICAgcnVsZXM/OiBSdWxlRXhwcmVzc2lvbjxzdHJpbmc+XHJcbiAgICB2YWxpZGF0ZU9uTW91bnQ/OiBib29sZWFuXHJcbiAgICB2YWxpZGF0ZU9uVmFsdWVVcGRhdGU/OiBib29sZWFuXHJcbiAgICB1c2VMYWJlbEluRXJyb3JzPzogYm9vbGVhblxyXG4gICAgYXV0b0ZvY3VzPzogYm9vbGVhblxyXG4gICAgbW9kZWxWYWx1ZT86IHN0cmluZ1xyXG4gICAgc2hvd0NsZWFyPzogYm9vbGVhblxyXG4gICAgZnVsbFdpZHRoPzogYm9vbGVhblxyXG4gICAgc2hvd1JlcXVpcmVkPzogYm9vbGVhblxyXG4gICAgc2hvd09wdGlvbmFsPzogYm9vbGVhblxyXG4gICAgY29sb3I/OiBJbnB1dENvbG9yXHJcbiAgICB0ZXh0YXJlYUNsYXNzZXM/OiBzdHJpbmdcclxuICAgIHNpemU/OiBJbnB1dFNpemVcclxuICAgIGxhYmVsUG9zaXRpb24/OiBMYWJlbFBvc2l0aW9uXHJcbiAgICB3cmFwcGVyQ2xhc3Nlcz86IHN0cmluZ1xyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgdXNlTGFiZWxJbkVycm9yczogdHJ1ZSxcclxuICAgIG1vZGVsVmFsdWU6ICcnLFxyXG4gICAgY29sb3I6ICdwYWdlJyxcclxuICAgIGxhYmVsUG9zaXRpb246ICd0b3AnLFxyXG4gICAgd3JhcHBlckNsYXNzZXM6ICcnXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCBpbnB1dEVsZW1lbnQgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MVGV4dEFyZWFFbGVtZW50PilcclxuXHJcbmNvbnN0IHtcclxuICBjb3JlQ2xhc3NlcyxcclxuICB0aXRsZSxcclxuICB2YWx1ZSxcclxuICBoZWxwVGlwQ2xhc3NlcyxcclxuICBoZWxwVGlwLFxyXG4gIGVycm9yTWVzc2FnZSxcclxuICBsYWJlbENsYXNzZXMsXHJcbiAgY2xlYXIsXHJcbiAgZm9jdXMsXHJcbiAgc2hvdWxkU2hvd0NsZWFyXHJcbn0gPSB1c2VUZXh0SW5wdXRDb3JlKHtcclxuICBwcm9wczogdG9SZWZzKHByb3BzKSxcclxuICBlbWl0LFxyXG4gIGlucHV0RWw6IGlucHV0RWxlbWVudFxyXG59KVxyXG5cclxuY29uc3QgaGVscFRpcElkVG9wID0gY29tcHV0ZWQoKCkgPT4gYCR7cHJvcHMubmFtZX0taGVscC10b3BgKVxyXG5jb25zdCBoZWxwVGlwSWRMZWZ0ID0gY29tcHV0ZWQoKCkgPT4gYCR7cHJvcHMubmFtZX0taGVscC1sZWZ0YClcclxuXHJcbmNvbnN0IGljb25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWydwbC0yJ11cclxuXHJcbiAgaWYgKHNob3VsZFNob3dDbGVhci52YWx1ZSAmJiBlcnJvck1lc3NhZ2UudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncHItMTInKVxyXG4gIH0gZWxzZSBpZiAoc2hvdWxkU2hvd0NsZWFyLnZhbHVlIHx8IGVycm9yTWVzc2FnZS52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdwci04JylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgc2l6ZUNsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ3NtJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LWJvZHkgc206dGV4dC1ib2R5LTJ4cydcclxuICAgIGNhc2UgJ2xnJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LWJvZHkgc206dGV4dC1zbSdcclxuICAgIGNhc2UgJ3hsJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LWJvZHkgc206dGV4dC1iYXNlJ1xyXG4gICAgY2FzZSAnYmFzZSc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gJ3RleHQtYm9keSBzbTp0ZXh0LWJvZHkteHMnXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgY29tcHV0ZWRXcmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc2VzID0gWydmbGV4JywgcHJvcHMud3JhcHBlckNsYXNzZXNdXHJcbiAgaWYgKHByb3BzLmZ1bGxXaWR0aCkge1xyXG4gICAgY2xhc3Nlcy5wdXNoKCd3LWZ1bGwnKVxyXG4gIH1cclxuXHJcbiAgaWYgKHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICd0b3AnKSB7XHJcbiAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtY29sJylcclxuICB9XHJcbiAgaWYgKHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICdsZWZ0Jykge1xyXG4gICAgY2xhc3Nlcy5wdXNoKFxyXG4gICAgICAndy1mdWxsIHNwYWNlLXktMSBzbTpzcGFjZS15LTAgc206c3BhY2UteC04IGZsZXgtY29sIHNtOmZsZXgtcm93IGl0ZW1zLXN0YXJ0J1xyXG4gICAgKVxyXG4gIH1cclxuICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJylcclxufSlcclxuXHJcbmRlZmluZUV4cG9zZSh7IGZvY3VzIH0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdiA6Y2xhc3M9XCJjb21wdXRlZFdyYXBwZXJDbGFzc2VzXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIDpjbGFzcz1cIlxyXG4gICAgICAgIGxhYmVsUG9zaXRpb24gPT09ICdsZWZ0J1xyXG4gICAgICAgICAgPyAndy1mdWxsIG1kOnctNi8xMiBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyJ1xyXG4gICAgICAgICAgOiAndy1mdWxsJ1xyXG4gICAgICBcIlxyXG4gICAgPlxyXG4gICAgICA8bGFiZWwgOmZvcj1cIm5hbWVcIiA6Y2xhc3M9XCJsYWJlbENsYXNzZXNcIj5cclxuICAgICAgICA8c3Bhbj57eyB0aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICA8ZGl2IHYtaWY9XCJzaG93UmVxdWlyZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyIHRleHQtYm9keS14cyBvcGFjaXR5LTgwXCI+KjwvZGl2PlxyXG4gICAgICAgIDxkaXYgdi1lbHNlLWlmPVwic2hvd09wdGlvbmFsXCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGZvbnQtbm9ybWFsXCI+KG9wdGlvbmFsKTwvZGl2PlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8cFxyXG4gICAgICAgIHYtaWY9XCJsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgJiYgaGVscFRpcElkICYmICFoaWRlSGVscFRpcFwiXHJcbiAgICAgICAgOmlkPVwiaGVscFRpcElkXCJcclxuICAgICAgICA6Y2xhc3M9XCJoZWxwVGlwQ2xhc3Nlc1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBoZWxwVGlwIH19XHJcbiAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJncm91cCByZWxhdGl2ZVwiXHJcbiAgICAgIDpjbGFzcz1cImxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JyA/ICd3LWZ1bGwgbWQ6dy02LzEyJyA6ICd3LWZ1bGwnXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtaWY9XCJjdXN0b21JY29uXCJcclxuICAgICAgICBjbGFzcz1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgbGVmdC0wIGZsZXggaXRlbXMtY2VudGVyIHBsLTJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPENvbXBvbmVudFxyXG4gICAgICAgICAgOmlzPVwiY3VzdG9tSWNvblwiXHJcbiAgICAgICAgICB2LWlmPVwiY3VzdG9tSWNvblwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJsZWFkaW5nSWNvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtaWY9XCJsb2FkaW5nXCJcclxuICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0wIGgtZnVsbCByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyIHByLTIgdGV4dC1mb3JlZ3JvdW5kLTNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPENvbW1vbkxvYWRpbmdJY29uIC8+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiB2LXRpcHB5PVwidG9vbHRpcFRleHRcIj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIDppZD1cIm5hbWVcIlxyXG4gICAgICAgICAgcmVmPVwiaW5wdXRFbGVtZW50XCJcclxuICAgICAgICAgIHYtbW9kZWw9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICA6dHlwZT1cInR5cGVcIlxyXG4gICAgICAgICAgOm5hbWU9XCJuYW1lXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltjb3JlQ2xhc3NlcywgaWNvbkNsYXNzZXMsIHNpemVDbGFzc2VzLCBpbnB1dENsYXNzZXMgfHwgJyddXCJcclxuICAgICAgICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIDphcmlhLWludmFsaWQ9XCJlcnJvck1lc3NhZ2UgPyAndHJ1ZScgOiAnZmFsc2UnXCJcclxuICAgICAgICAgIDphcmlhLWRlc2NyaWJlZGJ5PVwiaGVscFRpcElkXCJcclxuICAgICAgICAgIDpyZWFkb25seT1cInJlYWRPbmx5XCJcclxuICAgICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcclxuICAgICAgICAgIHYtYmluZD1cIiRhdHRyc1wiXHJcbiAgICAgICAgICA6c3R5bGU9XCJpbnB1dFN0eWxlXCJcclxuICAgICAgICAgIEBjaGFuZ2U9XCIkZW1pdCgnY2hhbmdlJywgeyBldmVudDogJGV2ZW50LCB2YWx1ZSB9KVwiXHJcbiAgICAgICAgICBAaW5wdXQ9XCIkZW1pdCgnaW5wdXQnLCB7IGV2ZW50OiAkZXZlbnQsIHZhbHVlIH0pXCJcclxuICAgICAgICAgIEBmb2N1cz1cIiRlbWl0KCdmb2N1cycpXCJcclxuICAgICAgICAgIEBibHVyPVwiJGVtaXQoJ2JsdXInKVwiXHJcbiAgICAgICAgICBAa2V5ZG93bi5zdG9wXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxzbG90IG5hbWU9XCJpbnB1dC1yaWdodFwiPlxyXG4gICAgICAgIDxhXHJcbiAgICAgICAgICB2LWlmPVwicmlnaHRJY29uXCJcclxuICAgICAgICAgIDp0aXRsZT1cInJpZ2h0SWNvblRpdGxlXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgICAgc2l6ZUNsYXNzZXMsXHJcbiAgICAgICAgICAgIHJlYWRPbmx5XHJcbiAgICAgICAgICAgICAgPyAndy1mdWxsIGN1cnNvci10ZXh0IGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgZ3JvdXAtaG92ZXI6Ym9yZGVyLW91dGxpbmUtNSByb3VuZGVkLW1kJ1xyXG4gICAgICAgICAgICAgIDogJ2N1cnNvci1wb2ludGVyJ1xyXG4gICAgICAgICAgXVwiXHJcbiAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0wIHJpZ2h0LTAgaGlkZGVuIGdyb3VwLWhvdmVyOmZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIHByLTEgdGV4dC1mb3JlZ3JvdW5kLTJcIlxyXG4gICAgICAgICAgQGNsaWNrPVwib25SaWdodEljb25DbGlja1wiXHJcbiAgICAgICAgICBAa2V5ZG93bj1cIm9uUmlnaHRJY29uQ2xpY2tcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXhzIHNyLW9ubHlcIj57eyByaWdodEljb25UaXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxDb21wb25lbnRcclxuICAgICAgICAgICAgOmlzPVwicmlnaHRJY29uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJoLTYgdy02IHRleHQtZm9yZWdyb3VuZFwiXHJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1lbHNlLWlmPVwic2hvdWxkU2hvd0NsZWFyXCJcclxuICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgaW5wdXRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyIHByLTIgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiY2xlYXJcIlxyXG4gICAgICAgICAgQGtleWRvd249XCJjbGVhclwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWJvZHkteHMgc3Itb25seVwiPkNsZWFyIGlucHV0PC9zcGFuPlxyXG4gICAgICAgICAgPFhNYXJrSWNvbiBjbGFzcz1cImgtNSB3LTUgdGV4dC1mb3JlZ3JvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1lbHNlLWlmPVwiIXNob3dMYWJlbCAmJiBzaG93UmVxdWlyZWQgJiYgIWVycm9yTWVzc2FnZVwiXHJcbiAgICAgICAgICBjbGFzcz1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgbXQtMiB0ZXh0LWJvZHkgcmlnaHQtMCBmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LWRhbmdlciBwci0yLjVcIlxyXG4gICAgICAgICAgOmNsYXNzPVwiW3Nob3VsZFNob3dDbGVhciA/ICdwci04JyA6ICdwci0yJ11cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICpcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zbG90PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8cFxyXG4gICAgICB2LWlmPVwibGFiZWxQb3NpdGlvbiA9PT0gJ3RvcCcgJiYgaGVscFRpcElkICYmICFoaWRlSGVscFRpcFwiXHJcbiAgICAgIDppZD1cImhlbHBUaXBJZFwiXHJcbiAgICAgIDpjbGFzcz1cIlsnbXQtMS41JywgaGVscFRpcENsYXNzZXNdXCJcclxuICAgID5cclxuICAgICAge3sgaGVscFRpcCB9fVxyXG4gICAgPC9wPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgdHlwZSB7IFJ1bGVFeHByZXNzaW9uIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgeyBYTWFya0ljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yMC9zb2xpZCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiwgdG9SZWZzLCB1c2VTbG90cyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzLCBQcm9wVHlwZSB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZVRleHRJbnB1dENvcmUgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS90ZXh0SW5wdXQnXHJcbmltcG9ydCB0eXBlIHsgUHJvcEFueUNvbXBvbmVudCB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2NvbW1vbi9jb21wb25lbnRzJ1xyXG5pbXBvcnQgdHlwZSB7IElucHV0Q29sb3IgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS90ZXh0SW5wdXQnXHJcbmltcG9ydCB0eXBlIHsgTGFiZWxQb3NpdGlvbiB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL2lucHV0J1xyXG5pbXBvcnQgeyBDb21tb25Mb2FkaW5nSWNvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB7IGRpcmVjdGl2ZSBhcyB2VGlwcHkgfSBmcm9tICd2dWUtdGlwcHknXHJcblxyXG50eXBlIElucHV0VHlwZSA9ICd0ZXh0JyB8ICdlbWFpbCcgfCAncGFzc3dvcmQnIHwgJ3VybCcgfCAnc2VhcmNoJyB8ICdudW1iZXInIHwgc3RyaW5nXHJcbnR5cGUgSW5wdXRTaXplID0gJ3NtJyB8ICdiYXNlJyB8ICdsZycgfCAneGwnXHJcblxyXG5kZWZpbmVPcHRpb25zKHtcclxuICBpbmhlcml0QXR0cnM6IGZhbHNlXHJcbn0pXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICAvKipcclxuICAgKiBJbnB1dCBcInR5cGVcIiB2YWx1ZSAoY2hhbmdlcyBiZWhhdmlvdXIgJiBsb29rKVxyXG4gICAqL1xyXG4gIHR5cGU6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxJbnB1dFR5cGU+LFxyXG4gICAgZGVmYXVsdDogJ3RleHQnXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBVbmlxdWUgSUQgZm9yIHRoZSBpbnB1dCAobXVzdCBiZSB1bmlxdWUgcGFnZS13aWRlKVxyXG4gICAqL1xyXG4gIG5hbWU6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgbGFiZWwgKGxhYmVsIHdpbGwgYWx3YXlzIGJlIHNob3duIHRvIHNjcmVlbiByZWFkZXJzKVxyXG4gICAqL1xyXG4gIHNob3dMYWJlbDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgaGVscCB0ZXh0XHJcbiAgICovXHJcbiAgaGVscDoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBQbGFjZWhvbGRlciB0ZXh0XHJcbiAgICovXHJcbiAgcGxhY2Vob2xkZXI6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxzdHJpbmc+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogU2V0IGxhYmVsIHRleHQgZXhwbGljaXRseVxyXG4gICAqL1xyXG4gIGxhYmVsOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8c3RyaW5nPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgcmVkIFwicmVxdWlyZWRcIiBhc3Rlcmlza1xyXG4gICAqL1xyXG4gIHNob3dSZXF1aXJlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIFwib3B0aW9uYWxcIiB0ZXh0XHJcbiAgICovXHJcbiAgc2hvd09wdGlvbmFsOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgY29tcG9uZW50LCBibG9ja2luZyBpdCBmcm9tIHVzZXIgaW5wdXRcclxuICAgKi9cclxuICBkaXNhYmxlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgZWRpdGluZyB0aGUgY29tcG9uZW50LCBtYWtpbmcgaXQgcmVhZCBvbmx5XHJcbiAgICovXHJcbiAgcmVhZE9ubHk6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogdmVlLXZhbGlkYXRlIHZhbGlkYXRpb24gcnVsZXNcclxuICAgKi9cclxuICBydWxlczoge1xyXG4gICAgdHlwZTogW1N0cmluZywgT2JqZWN0LCBGdW5jdGlvbiwgQXJyYXldIGFzIFByb3BUeXBlPFJ1bGVFeHByZXNzaW9uPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiB2ZWUtdmFsaWRhdGUgdmFsaWRhdGlvbigpIG9uIGNvbXBvbmVudCBtb3VudFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25Nb3VudDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHRyaWdnZXIgdmFsaWRhdGlvbiB3aGVuZXZlciB0aGUgdmFsdWUgY2hhbmdlc1xyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaWxsIHJlcGxhY2UgdGhlIGdlbmVyaWMgXCJWYWx1ZVwiIHRleHQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgaW4gZXJyb3IgbWVzc2FnZXNcclxuICAgKi9cclxuICB1c2VMYWJlbEluRXJyb3JzOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogU2V0IGEgY3VzdG9tIGljb24gdG8gdXNlIGluc2lkZSB0aGUgaW5wdXRcclxuICAgKi9cclxuICBjdXN0b21JY29uOiB7XHJcbiAgICB0eXBlOiBbT2JqZWN0LCBGdW5jdGlvbl0gYXMgUHJvcFR5cGU8T3B0aW9uYWw8UHJvcEFueUNvbXBvbmVudD4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBpY29uQ2xhc3Nlczoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogbnVsbFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBmb2N1cyBvbiB0aGUgaW5wdXQgd2hlbiBjb21wb25lbnQgaXMgbW91bnRlZFxyXG4gICAqL1xyXG4gIGF1dG9Gb2N1czoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBtb2RlbFZhbHVlOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiAnJ1xyXG4gIH0sXHJcbiAgc2l6ZToge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPElucHV0U2l6ZT4sXHJcbiAgICBkZWZhdWx0OiAnYmFzZSdcclxuICB9LFxyXG4gIHNob3dDbGVhcjoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBpbnB1dENsYXNzZXM6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIGRlZmF1bHQ6IG51bGxcclxuICB9LFxyXG4gIGZ1bGxXaWR0aDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBsb2FkaW5nOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGhpZGVFcnJvck1lc3NhZ2U6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgY3VzdG9tRXJyb3JNZXNzYWdlOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiBudWxsXHJcbiAgfSxcclxuICB3cmFwcGVyQ2xhc3Nlczoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogKCkgPT4gJydcclxuICB9LFxyXG4gIGNvbG9yOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8SW5wdXRDb2xvcj4sXHJcbiAgICBkZWZhdWx0OiAncGFnZSdcclxuICB9LFxyXG4gIGxhYmVsUG9zaXRpb246IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxMYWJlbFBvc2l0aW9uPixcclxuICAgIGRlZmF1bHQ6ICd0b3AnXHJcbiAgfSxcclxuICByaWdodEljb246IHtcclxuICAgIHR5cGU6IFtPYmplY3QsIEZ1bmN0aW9uXSBhcyBQcm9wVHlwZTxPcHRpb25hbDxQcm9wQW55Q29tcG9uZW50Pj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIHJpZ2h0SWNvblRpdGxlOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIHRvb2x0aXBUZXh0OiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIGN1c3RvbUhlbHBDbGFzczoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsOiBzdHJpbmcpOiB2b2lkXHJcbiAgKGU6ICdjaGFuZ2UnLCB2YWw6IHsgZXZlbnQ/OiBFdmVudDsgdmFsdWU6IHN0cmluZyB9KTogdm9pZFxyXG4gIChlOiAnaW5wdXQnLCB2YWw6IHsgZXZlbnQ/OiBFdmVudDsgdmFsdWU6IHN0cmluZyB9KTogdm9pZFxyXG4gIChlOiAnY2xlYXInKTogdm9pZFxyXG4gIChlOiAnZm9jdXMnKTogdm9pZFxyXG4gIChlOiAnYmx1cicpOiB2b2lkXHJcbiAgKGU6ICdyaWdodEljb25DbGljaycpOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHNsb3RzID0gdXNlU2xvdHMoKVxyXG5cclxuY29uc3QgaW5wdXRFbGVtZW50ID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTElucHV0RWxlbWVudD4pXHJcblxyXG5jb25zdCB7XHJcbiAgY29yZUNsYXNzZXMsXHJcbiAgdGl0bGUsXHJcbiAgdmFsdWUsXHJcbiAgaGVscFRpcElkLFxyXG4gIGhlbHBUaXBDbGFzc2VzLFxyXG4gIGhlbHBUaXAsXHJcbiAgaGlkZUhlbHBUaXAsXHJcbiAgZXJyb3JNZXNzYWdlLFxyXG4gIGNsZWFyLFxyXG4gIGZvY3VzLFxyXG4gIGxhYmVsQ2xhc3NlcyxcclxuICBzaG91bGRTaG93Q2xlYXJcclxufSA9IHVzZVRleHRJbnB1dENvcmUoe1xyXG4gIHByb3BzOiB0b1JlZnMocHJvcHMpLFxyXG4gIGVtaXQsXHJcbiAgaW5wdXRFbDogaW5wdXRFbGVtZW50XHJcbn0pXHJcblxyXG5jb25zdCBpbnB1dFN0eWxlID0gY29tcHV0ZWQoKCk6IENTU1Byb3BlcnRpZXMgPT4ge1xyXG4gIGlmIChwcm9wcy5jb2xvciAhPT0gJ2Z1bGx5LXRyYW5zcGFyZW50JykgcmV0dXJuIHt9XHJcblxyXG4gIC8vIEluIGZ1bGx5IHRyYW5zcGFyZW50IG1vZGUsIHdlIHdhbnQgdGhlIGlucHV0IHRvIGZ1bGx5IGJsZW5kIGluIHcvIHBhcmVudCBzdHlsaW5nXHJcbiAgY29uc3Qgc3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XHJcbiAgICBmb250U2l6ZTogJ2luaGVyaXQnXHJcbiAgfVxyXG4gIHJldHVybiBzdHlsZVxyXG59KVxyXG5cclxuY29uc3QgbGVhZGluZ0ljb25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWydoLTQgdy00J11cclxuXHJcbiAgaWYgKHByb3BzLmljb25DbGFzc2VzKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2gocHJvcHMuaWNvbkNsYXNzZXMpXHJcbiAgfVxyXG5cclxuICBpZiAoZXJyb3JNZXNzYWdlLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZGFuZ2VyJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQtMicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGljb25DbGFzc2VzID0gY29tcHV0ZWQoKCk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXVxyXG5cclxuICBpZiAocHJvcHMuY3VzdG9tSWNvbikge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdwbC04JylcclxuICB9XHJcblxyXG4gIGlmICghc2xvdHNbJ2lucHV0LXJpZ2h0J10pIHtcclxuICAgIGlmIChwcm9wcy5yaWdodEljb24gfHwgZXJyb3JNZXNzYWdlLnZhbHVlIHx8IHNob3VsZFNob3dDbGVhci52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3ByLTgnKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBzaXplQ2xhc3NlcyA9IGNvbXB1dGVkKCgpOiBzdHJpbmcgPT4ge1xyXG4gIC8vIGZ1bGx5IHRyYW5zcGFyZW50IHNob3VsZCBnZXQgc2l6aW5nL2NvbG9yaW5nIGluZm8gZnJvbSBwYXJlbnQgZWxlbWVudHMsXHJcbiAgLy8gaXRzIHN1cHBvc2VkIHRvIGZpdCBpbnRvIHRoZSBleGlzdGluZyBzdHlsZVxyXG4gIGNvbnN0IGlmTm90RnVsbHlUcmFuc3BhcmVudCA9ICh2YWw6IHN0cmluZykgPT5cclxuICAgIHByb3BzLmNvbG9yID09PSAnZnVsbHktdHJhbnNwYXJlbnQnID8gJycgOiB2YWxcclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICdzbSc6XHJcbiAgICAgIHJldHVybiBgaC02ICR7aWZOb3RGdWxseVRyYW5zcGFyZW50KCd0ZXh0LWJvZHkgc206dGV4dC1ib2R5LXNtJyl9YFxyXG4gICAgY2FzZSAnbGcnOlxyXG4gICAgICByZXR1cm4gYGgtMTAgJHtpZk5vdEZ1bGx5VHJhbnNwYXJlbnQoJ3RleHQtYm9keSBzbTp0ZXh0LVsxM3B4XScpfWBcclxuICAgIGNhc2UgJ3hsJzpcclxuICAgICAgcmV0dXJuIGBoLTE0ICR7aWZOb3RGdWxseVRyYW5zcGFyZW50KCd0ZXh0LWJvZHkgc206dGV4dC1zbScpfWBcclxuICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIGBoLTggJHtpZk5vdEZ1bGx5VHJhbnNwYXJlbnQoJ3RleHQtYm9keSBzbTp0ZXh0LWJvZHktc20nKX1gXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgY29tcHV0ZWRXcmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc2VzID0gWydmbGV4JywgcHJvcHMud3JhcHBlckNsYXNzZXNdXHJcbiAgaWYgKHByb3BzLmZ1bGxXaWR0aCkge1xyXG4gICAgY2xhc3Nlcy5wdXNoKCd3LWZ1bGwnKVxyXG4gIH1cclxuXHJcbiAgaWYgKHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICd0b3AnKSB7XHJcbiAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtY29sJylcclxuICB9XHJcbiAgaWYgKHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICdsZWZ0Jykge1xyXG4gICAgY2xhc3Nlcy5wdXNoKCd3LWZ1bGwgc3BhY2UteS0xIHNtOnNwYWNlLXktMCBzbTpzcGFjZS14LTggZmxleC1jb2wgc206ZmxleC1yb3cnKVxyXG4gIH1cclxuICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IG9uUmlnaHRJY29uQ2xpY2sgPSAoKSA9PiB7XHJcbiAgZW1pdCgncmlnaHRJY29uQ2xpY2snKVxyXG59XHJcblxyXG5kZWZpbmVFeHBvc2UoeyBmb2N1cyB9KVxyXG48L3NjcmlwdD5cclxuIiwiaW1wb3J0IHsgaXNTdHJpbmcsIGlzVW5kZWZpbmVkIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHR5cGUgeyBHZW5lcmljVmFsaWRhdGVGdW5jdGlvbiB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcblxyXG5leHBvcnQgY29uc3QgVkFMSURfSFRUUF9VUkwgPSAvXmh0dHBzPzpcXC9cXC8vXHJcbmV4cG9ydCBjb25zdCBWQUxJRF9FTUFJTCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvXHJcblxyXG4vKipcclxuICogTm90ZSBhYm91dCBuZXcgdmFsaWRhdG9yczpcclxuICogTWFrZSBzdXJlIHlvdSB1c2UgdGhlIHdvcmQgXCJWYWx1ZVwiIHRvIHJlZmVyIHRvIHRoZSB2YWx1ZSBiZWluZyB2YWxpZGF0ZWQgaW4gYWxsIGVycm9yIG1lc3NhZ2VzLCBjYXVzZSB0aGUgZHluYW1pYyBzdHJpbmcgcmVwbGFjZVxyXG4gKiB0aGF0IHJlcGxhY2VzIHRoYXQgcGFydCB3aXRoIHRoZSBhY3R1YWwgZmllbGQgbmFtZSB3b3JrcyBiYXNlZCBvbiB0aGF0XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEUtbWFpbCB2YWxpZGF0aW9uIHJ1bGUgKG5vdCBwZXJmZWN0LCBidXQgZS1tYWlscyBzaG91bGQgYmUgdmFsaWRhdGVkIGJ5IHNlbmRpbmcgb3V0IGNvbmZpcm1hdGlvbiBlLW1haWxzIGFueXdheSlcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc0VtYWlsOiBHZW5lcmljVmFsaWRhdGVGdW5jdGlvbjxzdHJpbmc+ID0gKHZhbCkgPT5cclxuICAodmFsIHx8ICcnKS5tYXRjaChWQUxJRF9FTUFJTCkgPyB0cnVlIDogJ1ZhbHVlIHNob3VsZCBiZSBhIHZhbGlkIGUtbWFpbCBhZGRyZXNzJ1xyXG5cclxuLyoqXHJcbiAqIFVzZWQgZm9yIHBsYWNlaG9sZGVycyBpbnB1dHMgd2hlcmUgdGhlIHVzZXIgY2FuIGxlYXZlIHRoZSBmaWVsZCBlbXB0eVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzRW1haWxPckVtcHR5OiBHZW5lcmljVmFsaWRhdGVGdW5jdGlvbjxzdHJpbmc+ID0gKHZhbCkgPT5cclxuICAodmFsIHx8ICcnKS5tYXRjaChWQUxJRF9FTUFJTCkgfHwgIXZhbFxyXG4gICAgPyB0cnVlXHJcbiAgICA6ICdWYWx1ZSBzaG91bGQgYmUgYSB2YWxpZCBlLW1haWwgYWRkcmVzcydcclxuXHJcbmV4cG9ydCBjb25zdCBpc09uZU9yTXVsdGlwbGVFbWFpbHM6IEdlbmVyaWNWYWxpZGF0ZUZ1bmN0aW9uPHN0cmluZz4gPSAodmFsKSA9PiB7XHJcbiAgY29uc3QgZW1haWxzID0gKHZhbCB8fCAnJykuc3BsaXQoJywnKS5tYXAoKGkpID0+IGkudHJpbSgpKVxyXG4gIGNvbnN0IHZhbGlkID0gZW1haWxzLmV2ZXJ5KChlKSA9PiBlLm1hdGNoKFZBTElEX0VNQUlMKSlcclxuICByZXR1cm4gdmFsaWQgfHwgJ1ZhbHVlIHNob3VsZCBiZSBvbmUgb3IgbXVsdGlwbGUgY29tbWEtZGVsaW1pdGVkIGUtbWFpbCBhZGRyZXNzZXMnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc1JlcXVpcmVkOiBHZW5lcmljVmFsaWRhdGVGdW5jdGlvbjx1bmtub3duPiA9ICh2YWwpID0+IHtcclxuICBpZiAoaXNTdHJpbmcodmFsKSkge1xyXG4gICAgdmFsID0gdmFsLnRyaW0oKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHZhbCA/IHRydWUgOiAnVmFsdWUgaXMgcmVxdWlyZWQnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc1NhbWVBczogKFxyXG4gIG90aGVyRmllbGROYW1lOiBzdHJpbmcsXHJcbiAgb3RoZXJGaWVsZERpc3BsYXlOYW1lPzogc3RyaW5nXHJcbikgPT4gR2VuZXJpY1ZhbGlkYXRlRnVuY3Rpb248dW5rbm93bj4gPVxyXG4gIChvdGhlckZpZWxkTmFtZSwgb3RoZXJGaWVsZERpc3BsYXlOYW1lKSA9PiAodmFsLCBtZXRhKSA9PiB7XHJcbiAgICByZXR1cm4gdmFsID09PSBtZXRhLmZvcm1bb3RoZXJGaWVsZE5hbWVdXHJcbiAgICAgID8gdHJ1ZVxyXG4gICAgICA6IGBWYWx1ZSBtdXN0IGJlIHRoZSBzYW1lIGFzIGluIGZpZWxkICcke1xyXG4gICAgICAgICAgb3RoZXJGaWVsZERpc3BsYXlOYW1lIHx8IG90aGVyRmllbGROYW1lXHJcbiAgICAgICAgfSdgXHJcbiAgfVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzU3RyaW5nT2ZMZW5ndGggPVxyXG4gIChwYXJhbXM6IHtcclxuICAgIG1pbkxlbmd0aD86IG51bWJlclxyXG4gICAgbWF4TGVuZ3RoPzogbnVtYmVyXHJcbiAgfSk6IEdlbmVyaWNWYWxpZGF0ZUZ1bmN0aW9uPHN0cmluZz4gPT5cclxuICAodmFsKSA9PiB7XHJcbiAgICBjb25zdCB7IG1pbkxlbmd0aCwgbWF4TGVuZ3RoIH0gPSBwYXJhbXNcclxuICAgIHZhbCA9IGlzTnVsbE9yVW5kZWZpbmVkKHZhbCkgPyAnJyA6IHZhbFxyXG5cclxuICAgIGlmICghaXNTdHJpbmcodmFsKSkgcmV0dXJuICdWYWx1ZSBzaG91bGQgYmUgYSB0ZXh0IHN0cmluZydcclxuICAgIGlmICghaXNVbmRlZmluZWQobWluTGVuZ3RoKSAmJiB2YWwubGVuZ3RoIDwgbWluTGVuZ3RoKVxyXG4gICAgICByZXR1cm4gYFZhbHVlIG5lZWRzIHRvIGJlIGF0IGxlYXN0ICR7bWluTGVuZ3RofSBjaGFyYWN0ZXJzIGxvbmdgXHJcbiAgICBpZiAoIWlzVW5kZWZpbmVkKG1heExlbmd0aCkgJiYgdmFsLmxlbmd0aCA+IG1heExlbmd0aClcclxuICAgICAgcmV0dXJuIGBWYWx1ZSBjYW4ndCBiZSBsb25nZXIgdGhhbiAke21heExlbmd0aH0gY2hhcmFjdGVyc2BcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuZXhwb3J0IGNvbnN0IHN0cmluZ0NvbnRhaW5zID1cclxuICAocGFyYW1zOiB7XHJcbiAgICBtYXRjaDogc3RyaW5nIHwgUmVnRXhwXHJcbiAgICBtZXNzYWdlOiBzdHJpbmdcclxuICB9KTogR2VuZXJpY1ZhbGlkYXRlRnVuY3Rpb248c3RyaW5nPiA9PlxyXG4gICh2YWwpID0+IHtcclxuICAgIGNvbnN0IHsgbWF0Y2gsIG1lc3NhZ2UgfSA9IHBhcmFtc1xyXG5cclxuICAgIGlmICghaXNTdHJpbmcodmFsKSkgcmV0dXJuICdWYWx1ZSBzaG91bGQgYmUgYSB0ZXh0IHN0cmluZydcclxuICAgIGlmICghbWF0Y2gpIHJldHVybiB0cnVlXHJcblxyXG4gICAgaWYgKGlzU3RyaW5nKG1hdGNoKSkge1xyXG4gICAgICByZXR1cm4gdmFsLmluY2x1ZGVzKG1hdGNoKSA/IHRydWUgOiBtZXNzYWdlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbWF0Y2gudGVzdCh2YWwpID8gdHJ1ZSA6IG1lc3NhZ2VcclxuICAgIH1cclxuICB9XHJcblxyXG5leHBvcnQgY29uc3QgaXNVcmw6IEdlbmVyaWNWYWxpZGF0ZUZ1bmN0aW9uPHN0cmluZz4gPSAodmFsdWUpID0+IHtcclxuICBpZiAoVkFMSURfSFRUUF9VUkwudGVzdCh2YWx1ZSkpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIHJldHVybiAnVmFsdWUgaXMgbm90IGEgdmFsaWQgVVJMJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtU2VsZWN0ZWQ6IEdlbmVyaWNWYWxpZGF0ZUZ1bmN0aW9uPHVua25vd25bXT4gPSAodmFsKSA9PiB7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID4gMCkge1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgcmV0dXJuICdWYWx1ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBhIHNpbmdsZSBpdGVtIHNlbGVjdGVkJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNNdWx0aUl0ZW1TZWxlY3RlZCA9IDxUPih2YWw6IFRbXSB8IHVua25vd24pOiB0cnVlIHwgc3RyaW5nID0+IHtcclxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPiAwKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICByZXR1cm4gJ1ZhbHVlIHNob3VsZCBoYXZlIGF0IGxlYXN0IGEgc2luZ2xlIGl0ZW0gc2VsZWN0ZWQnXHJcbn1cclxuIiwiaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZU11dGF0aW9uT2JzZXJ2ZXIsIHVzZVJlc2l6ZU9ic2VydmVyIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBSZWYsIENvbXB1dGVkUmVmIH0gZnJvbSAndnVlJ1xyXG5cclxuLyoqXHJcbiAqIFVzZSB0aGlzIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGhpZGRlbiBlbGVtZW50cyAoZS5nLiB1c2VyIGF2YXRhcnMpIGluIGEgd3JhcHBpbmcgZmxleCByb3cgdGhhdFxyXG4gKiBpcyBzdHlsZWQgdG8gb25seSBzaG93IHRoZSBmaXJzdCByb3cuIEZvciBleGFtcGxlLCB0aGVyZSBhcmUgMTIgdXNlcnMgdG90YWwsIHRoZXJlJ3Mgb25seSBzcGFjZSBmb3IgNSxcclxuICogYW5kIHRoaXMgY29tcG9zYWJsZSB3aWxsIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGhpZGRlbiBvbmVzIHRvIHVzZSBmb3IgdGhlIFwiK1hcIiBsYWJlbCAoKzcgaW4gdGhlIGV4YW1wbGUpXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBcImhpZGRlblwiIGl0ZW1zIG11c3Qgd3JhcCBpbnRvIGFub3RoZXIgbGluZSwgYmVjYXVzZSB3ZSB1c2UgdGhlaXIgb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgcGFyZW50XHJcbiAqIHRvIGNoZWNrIGlmIHRoZXkncmUgaGlkZGVuIChjb21wYXJlZCB0byBpdGVtcyBpbiB0aGUgMXN0IHJvdylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VXcmFwcGluZ0NvbnRhaW5lckhpZGRlbkNvdW50KHBhcmFtczoge1xyXG4gIC8qKlxyXG4gICAqIEVsZW1lbnQgdG8gd2F0Y2ggZm9yIGFueSBjaGFuZ2VzXHJcbiAgICovXHJcbiAgZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzOiBSZWY8TnVsbGFibGU8SFRNTEVsZW1lbnQ+PlxyXG4gIC8qKlxyXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhlIHBvdGVudGlhbGx5IHZpc2libGUvaGlkZGVuIGl0ZW1zIGFzIGRpcmVjdCBjaGlsZHJlblxyXG4gICAqL1xyXG4gIGl0ZW1Db250YWluZXI6IFJlZjxOdWxsYWJsZTxIVE1MRWxlbWVudD4+XHJcblxyXG4gIC8qKlxyXG4gICAqIEFsbG93cyB5b3UgdG8gcGF1c2UgY2FsY3VsYXRpb25zIGNvbmRpdGlvbmFsbHlcclxuICAgKi9cclxuICBza2lwQ2FsY3VsYXRpb24/OiBDb21wdXRlZFJlZjxib29sZWFuPlxyXG5cclxuICAvKipcclxuICAgKiBJZiB0cnVlLCB3aWxsIHRyYWNrIHJlc2l6aW5nIG9mICdlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMnLlxyXG4gICAqIERlZmF1bHQ6IGZhbHNlXHJcbiAgICovXHJcbiAgdHJhY2tSZXNpemU/OiBib29sZWFuXHJcblxyXG4gIC8qKlxyXG4gICAqIElmIHRydWUsIHdpbGwgdHJhY2sgZGVzY2VuZGFudHMgYmVpbmcgYWRkZWQvcmVtb3ZlZCB0byAnZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzJy5cclxuICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICovXHJcbiAgdHJhY2tNdXRhdGlvbnM/OiBib29sZWFuXHJcbn0pIHtcclxuICBjb25zdCB7XHJcbiAgICBza2lwQ2FsY3VsYXRpb24sXHJcbiAgICBlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMsXHJcbiAgICBpdGVtQ29udGFpbmVyLFxyXG4gICAgdHJhY2tSZXNpemUgPSBmYWxzZSxcclxuICAgIHRyYWNrTXV0YXRpb25zID0gdHJ1ZVxyXG4gIH0gPSBwYXJhbXMgfHwge31cclxuXHJcbiAgLyoqXHJcbiAgICogRHluYW1pY2FsbHkgdXBkYXRlZCB0byBzaG93IHRoZSBudW1iZXIgb2YgaXRlbXMgY3VycmVudGx5IG5vdCB2aXNpYmxlIGluIHRoZSBjb250YWluZXJcclxuICAgKi9cclxuICBjb25zdCBoaWRkZW5JdGVtQ291bnQgPSByZWYoMClcclxuXHJcbiAgY29uc3QgcmVjYWxjdWxhdGUgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBpdGVtQ29udGFpbmVyLnZhbHVlXHJcbiAgICBpZiAoc2tpcENhbGN1bGF0aW9uPy52YWx1ZSB8fCAhdGFyZ2V0KSByZXR1cm5cclxuXHJcbiAgICBjb25zdCBhdmF0YXJFbGVtZW50cyA9IHRhcmdldC5jaGlsZHJlblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGFyaW5nIG9mZnNldCBmcm9tIHBhcmVudCB0byBiZXR3ZWVuIGFsbCBhdmF0YXJzIHRvIHNlZSB3aGVuIHRoZXkgYnJlYWsgb2ZmIGludG8gYW5vdGhlciBsaW5lXHJcbiAgICAgKiBhbmQgYmVjb21lIGludmlzaWJsZVxyXG4gICAgICovXHJcbiAgICBsZXQgdmlzaWJsZUNvdW50ID0gMFxyXG4gICAgbGV0IHRvdGFsQ291bnQgPSAwXHJcbiAgICBsZXQgZmlyc3RFbE9mZnNldFRvcCA9IHVuZGVmaW5lZCBhcyBPcHRpb25hbDxudW1iZXI+XHJcbiAgICBmb3IgKGNvbnN0IGF2YXRhckVsIG9mIGF2YXRhckVsZW1lbnRzKSB7XHJcbiAgICAgIGNvbnN0IG9mZnNldFRvcCA9IChhdmF0YXJFbCBhcyBIVE1MRWxlbWVudCkub2Zmc2V0VG9wXHJcbiAgICAgIGlmIChpc1VuZGVmaW5lZChmaXJzdEVsT2Zmc2V0VG9wKSkge1xyXG4gICAgICAgIGZpcnN0RWxPZmZzZXRUb3AgPSBvZmZzZXRUb3BcclxuICAgICAgICB2aXNpYmxlQ291bnQgKz0gMVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChvZmZzZXRUb3AgPT09IGZpcnN0RWxPZmZzZXRUb3ApIHtcclxuICAgICAgICAgIHZpc2libGVDb3VudCArPSAxXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0b3RhbENvdW50ICs9IDFcclxuICAgIH1cclxuXHJcbiAgICBoaWRkZW5JdGVtQ291bnQudmFsdWUgPSB0b3RhbENvdW50IC0gdmlzaWJsZUNvdW50XHJcbiAgfVxyXG5cclxuICBpZiAodHJhY2tSZXNpemUpIHtcclxuICAgIHVzZVJlc2l6ZU9ic2VydmVyKGVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlcywgcmVjYWxjdWxhdGUpXHJcbiAgfVxyXG5cclxuICBpZiAodHJhY2tNdXRhdGlvbnMpIHtcclxuICAgIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzLCByZWNhbGN1bGF0ZSwge1xyXG4gICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgIHN1YnRyZWU6IHRydWVcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgaGlkZGVuSXRlbUNvdW50XHJcbiAgfVxyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVybiAqL1xyXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBSZWYsIFRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgdXNlV3JhcHBpbmdDb250YWluZXJIaWRkZW5Db3VudCB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9sYXlvdXQvcmVzaXplJ1xyXG5cclxudHlwZSBHZW5lcmljU2VsZWN0VmFsdWVUeXBlPFQ+ID0gVCB8IFRbXSB8IHVuZGVmaW5lZFxyXG5cclxuLyoqXHJcbiAqIENvbW1vbiBzZXR1cCBmb3IgRm9ybVNlbGVjdEJhc2Ugd3JhcHBpbmcgc2VsZWN0b3IgY29tcG9uZW50c1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZUZvcm1TZWxlY3RDaGlsZEludGVybmFsczxUPihwYXJhbXM6IHtcclxuICBwcm9wczogVG9SZWZzPHtcclxuICAgIG1vZGVsVmFsdWU/OiBHZW5lcmljU2VsZWN0VmFsdWVUeXBlPFQ+XHJcbiAgICBtdWx0aXBsZT86IGJvb2xlYW5cclxuICB9PlxyXG4gIGVtaXQ6IHtcclxuICAgIChlOiAndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWw6IEdlbmVyaWNTZWxlY3RWYWx1ZVR5cGU8VD4pOiB2b2lkXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBzZWUge3VzZVdyYXBwaW5nQ29udGFpbmVySGlkZGVuQ291bnQoKX1cclxuICAgKi9cclxuICBkeW5hbWljVmlzaWJpbGl0eT86IHtcclxuICAgIGVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlczogUmVmPE51bGxhYmxlPEhUTUxFbGVtZW50Pj5cclxuICAgIGl0ZW1Db250YWluZXI6IFJlZjxOdWxsYWJsZTxIVE1MRWxlbWVudD4+XHJcbiAgfVxyXG59KSB7XHJcbiAgY29uc3QgeyBwcm9wcywgZW1pdCwgZHluYW1pY1Zpc2liaWxpdHkgfSA9IHBhcmFtc1xyXG5cclxuICBsZXQgaGlkZGVuSXRlbUNvdW50OiBSZWY8bnVtYmVyPlxyXG4gIGlmIChkeW5hbWljVmlzaWJpbGl0eSkge1xyXG4gICAgY29uc3QgeyBlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMsIGl0ZW1Db250YWluZXIgfSA9IGR5bmFtaWNWaXNpYmlsaXR5XHJcbiAgICBjb25zdCBoaWRkZW5Db3VudERhdGEgPSB1c2VXcmFwcGluZ0NvbnRhaW5lckhpZGRlbkNvdW50KHtcclxuICAgICAgc2tpcENhbGN1bGF0aW9uOiBjb21wdXRlZCgoKSA9PiAhcHJvcHMubXVsdGlwbGU/LnZhbHVlKSxcclxuICAgICAgZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzLFxyXG4gICAgICBpdGVtQ29udGFpbmVyXHJcbiAgICB9KVxyXG4gICAgaGlkZGVuSXRlbUNvdW50ID0gaGlkZGVuQ291bnREYXRhLmhpZGRlbkl0ZW1Db3VudFxyXG4gIH0gZWxzZSB7XHJcbiAgICBoaWRkZW5JdGVtQ291bnQgPSByZWYoMClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZSB0aGlzIHRvIGdldCBvciBzZXQgdGhlIHYtbW9kZWwgdmFsdWUgb2YgdGhlIHNlbGVjdCBpbnB1dCBpbiBhIHByb3BlciB3YXlcclxuICAgKi9cclxuICBjb25zdCBzZWxlY3RlZFZhbHVlID0gY29tcHV0ZWQoe1xyXG4gICAgZ2V0OiAoKTogR2VuZXJpY1NlbGVjdFZhbHVlVHlwZTxUPiA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHByb3BzLm1vZGVsVmFsdWU/LnZhbHVlXHJcbiAgICAgIGlmIChwcm9wcy5tdWx0aXBsZT8udmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gaXNBcnJheShjdXJyZW50VmFsdWUpID8gY3VycmVudFZhbHVlIDogW11cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gaXNBcnJheShjdXJyZW50VmFsdWUpID8gdW5kZWZpbmVkIDogY3VycmVudFZhbHVlXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBzZXQ6IChuZXdWYWw6IEdlbmVyaWNTZWxlY3RWYWx1ZVR5cGU8VD4pID0+IHtcclxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlPy52YWx1ZSAmJiAhaXNBcnJheShuZXdWYWwpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdBdHRlbXB0aW5nIHRvIHNldCBub24tYXJyYXkgdmFsdWUgaW4gc2VsZWN0b3Igdy8gbXVsdGlwbGU9dHJ1ZScpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlPy52YWx1ZSAmJiBpc0FycmF5KG5ld1ZhbCkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0F0dGVtcHRpbmcgdG8gc2V0IGFycmF5IHZhbHVlIGluIHNlbGVjdG9yIHcvIG11bHRpcGxlPWZhbHNlJylcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG5cclxuICAgICAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBwcm9wcy5tdWx0aXBsZT8udmFsdWUgPyBuZXdWYWwgfHwgW10gOiBuZXdWYWwpXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgY29uc3QgaXNBcnJheVZhbHVlID0gKHY6IEdlbmVyaWNTZWxlY3RWYWx1ZVR5cGU8VD4pOiB2IGlzIFRbXSA9PiBpc0FycmF5KHYpXHJcbiAgY29uc3QgaXNNdWx0aUl0ZW1BcnJheVZhbHVlID0gKHY6IEdlbmVyaWNTZWxlY3RWYWx1ZVR5cGU8VD4pOiB2IGlzIFRbXSA9PlxyXG4gICAgaXNBcnJheSh2KSAmJiB2Lmxlbmd0aCA+IDFcclxuICBjb25zdCBmaXJzdEl0ZW0gPSAodjogTm9uTnVsbGFibGU8R2VuZXJpY1NlbGVjdFZhbHVlVHlwZTxUPj4pOiBUID0+XHJcbiAgICBpc0FycmF5VmFsdWUodikgPyB2WzBdIDogdlxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2VsZWN0ZWRWYWx1ZSxcclxuICAgIGhpZGRlblNlbGVjdGVkSXRlbUNvdW50OiBoaWRkZW5JdGVtQ291bnQsXHJcbiAgICBpc0FycmF5VmFsdWUsXHJcbiAgICBpc011bHRpSXRlbUFycmF5VmFsdWUsXHJcbiAgICBmaXJzdEl0ZW1cclxuICB9XHJcbn1cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXZcclxuICAgIDpjbGFzcz1cIltcclxuICAgICAgJ3JlbGF0aXZlIHctZnVsbCBoLTEgYmctYmx1ZS01MDAvMzAgdGV4dC14cyB0ZXh0LWZvcmVncm91bmQtb24tcHJpbWFyeSBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC14bCcsXHJcbiAgICAgIHNob3dCYXIgPyAnb3BhY2l0eS0xMDAnIDogJ29wYWNpdHktMCdcclxuICAgIF1cIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJzd29vc2hlciByZWxhdGl2ZSB0b3AtMCBiZy1ibHVlLTUwMC81MFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VNb3VudGVkIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8eyBsb2FkaW5nOiBib29sZWFuOyBjbGllbnRPbmx5PzogYm9vbGVhbiB9PigpXHJcblxyXG5jb25zdCBtb3VudGVkID0gdXNlTW91bnRlZCgpXHJcbmNvbnN0IHNob3dCYXIgPSBjb21wdXRlZCgoKSA9PiAobW91bnRlZC52YWx1ZSB8fCAhcHJvcHMuY2xpZW50T25seSkgJiYgcHJvcHMubG9hZGluZylcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBzY29wZWQ+XHJcbi5zd29vc2hlciB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGFuaW1hdGlvbjogc3dvb3NoIDFzIGluZmluaXRlIGxpbmVhcjtcclxuICB0cmFuc2Zvcm0tb3JpZ2luOiAwJSAzMCU7XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc3dvb3NoIHtcclxuICAwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCkgc2NhbGVYKDApO1xyXG4gIH1cclxuXHJcbiAgNDAlIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKSBzY2FsZVgoMC40KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgwLjUpO1xyXG4gIH1cclxufVxyXG48L3N0eWxlPlxyXG4iLCJpbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBpc0NsaWVudCB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgZGVib3VuY2UsIGlzVW5kZWZpbmVkLCB0aHJvdHRsZSB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvbkJlZm9yZVVubW91bnQsIG9uTW91bnRlZCwgcmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tICd2dWUnXHJcblxyXG5leHBvcnQgZW51bSBUaHJvdHRsZU9yRGVib3VuY2Uge1xyXG4gIFRocm90dGxlLFxyXG4gIERlYm91bmNlXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEhvcml6b250YWxEaXJlY3Rpb24ge1xyXG4gIExlZnQsXHJcbiAgUmlnaHRcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVdpbmRvd1Jlc2l6ZUhhbmRsZXIoXHJcbiAgaGFuZGxlcjogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgd2FpdDogbnVtYmVyXHJcbiAgICB0aHJvdHRsZU9yRGVib3VuY2U6IFRocm90dGxlT3JEZWJvdW5jZVxyXG4gIH0+XHJcbikge1xyXG4gIGlmICghaXNDbGllbnQpIHJldHVyblxyXG5cclxuICBjb25zdCB7IHdhaXQgPSAxMDAsIHRocm90dGxlT3JEZWJvdW5jZSA9IFRocm90dGxlT3JEZWJvdW5jZS5UaHJvdHRsZSB9ID0gb3B0aW9ucyB8fCB7fVxyXG4gIGNvbnN0IGZpbmFsSGFuZGxlciA9IHdhaXRcclxuICAgID8gdGhyb3R0bGVPckRlYm91bmNlID09PSBUaHJvdHRsZU9yRGVib3VuY2UuVGhyb3R0bGVcclxuICAgICAgPyB0aHJvdHRsZShoYW5kbGVyLCB3YWl0KVxyXG4gICAgICA6IGRlYm91bmNlKGhhbmRsZXIsIHdhaXQpXHJcbiAgICA6IGhhbmRsZXJcclxuXHJcbiAgb25Nb3VudGVkKCgpID0+IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmaW5hbEhhbmRsZXIpKVxyXG4gIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZmluYWxIYW5kbGVyKSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZU9uQmVmb3JlV2luZG93VW5sb2FkKGhhbmRsZXI6IChlOiBCZWZvcmVVbmxvYWRFdmVudCkgPT4gdm9pZCkge1xyXG4gIG9uTW91bnRlZCgoKSA9PiB7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgaGFuZGxlcilcclxuICB9KVxyXG5cclxuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGhhbmRsZXIpXHJcbiAgfSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlc3BvbnNpdmVIb3Jpem9udGFsRGlyZWN0aW9uQ2FsY3VsYXRpb24ocGFyYW1zOiB7XHJcbiAgZWw6IE1heWJlUmVmPE51bGxhYmxlPEhUTUxFbGVtZW50Pj5cclxuICBkZWZhdWx0RGlyZWN0aW9uPzogSG9yaXpvbnRhbERpcmVjdGlvblxyXG4gIC8qKlxyXG4gICAqIFN0b3AgcmVjYWxjdWxhdGlvbiBiZWxvdyB0aGlzIHNjcmVlbiBzaXplLiBEZWZhdWx0cyB0byBlbC53aWR0aCAqIDJcclxuICAgKi9cclxuICBzdG9wVXBkYXRlc0JlbG93V2lkdGg/OiBNYXliZVJlZjxudW1iZXI+XHJcbn0pIHtcclxuICBjb25zdCB7IGVsLCBkZWZhdWx0RGlyZWN0aW9uIH0gPSBwYXJhbXNcclxuXHJcbiAgY29uc3QgZGlyZWN0aW9uID0gcmVmPEhvcml6b250YWxEaXJlY3Rpb24+KFxyXG4gICAgIWlzVW5kZWZpbmVkKGRlZmF1bHREaXJlY3Rpb24pID8gZGVmYXVsdERpcmVjdGlvbiA6IEhvcml6b250YWxEaXJlY3Rpb24uUmlnaHRcclxuICApXHJcbiAgY29uc3Qgc3RvcFVwZGF0ZXNCZWxvd1dpZHRoID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3Qgc3RvcFVwZGF0ZXNCZWxvd1dpZHRoID0gdW5yZWYocGFyYW1zLnN0b3BVcGRhdGVzQmVsb3dXaWR0aClcclxuICAgIGlmICghaXNVbmRlZmluZWQoc3RvcFVwZGF0ZXNCZWxvd1dpZHRoKSkgcmV0dXJuIHN0b3BVcGRhdGVzQmVsb3dXaWR0aFxyXG5cclxuICAgIGNvbnN0IGVsZW1lbnQgPSB1bnJlZihlbClcclxuICAgIHJldHVybiBlbGVtZW50Py5vZmZzZXRXaWR0aCA/IGVsZW1lbnQub2Zmc2V0V2lkdGggKiAyIDogdW5kZWZpbmVkXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgcmVjYWxjdWxhdGVEaXJlY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBpZiAoIWlzQ2xpZW50KSByZXR1cm5cclxuXHJcbiAgICBjb25zdCBlbGVtZW50ID0gdW5yZWYoZWwpXHJcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcbiAgICBjb25zdCBzaG93T25MZWZ0U2lkZSA9IHJlY3QueCArIHJlY3Qud2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aFxyXG4gICAgY29uc3Qgc2hvd09uUmlnaHRTaWRlID0gcmVjdC54IDwgMFxyXG5cclxuICAgIC8vIFNjcmVlbiB0b28gc21hbGwgLSBkbyBub3RoaW5nXHJcbiAgICBpZiAoXHJcbiAgICAgIChzaG93T25MZWZ0U2lkZSAmJiBzaG93T25SaWdodFNpZGUpIHx8XHJcbiAgICAgICghaXNVbmRlZmluZWQoc3RvcFVwZGF0ZXNCZWxvd1dpZHRoLnZhbHVlKSAmJlxyXG4gICAgICAgIHdpbmRvdy5pbm5lcldpZHRoIDwgc3RvcFVwZGF0ZXNCZWxvd1dpZHRoLnZhbHVlKVxyXG4gICAgKVxyXG4gICAgICByZXR1cm5cclxuXHJcbiAgICBpZiAoc2hvd09uTGVmdFNpZGUpIHtcclxuICAgICAgZGlyZWN0aW9uLnZhbHVlID0gSG9yaXpvbnRhbERpcmVjdGlvbi5MZWZ0XHJcbiAgICB9IGVsc2UgaWYgKHNob3dPblJpZ2h0U2lkZSkge1xyXG4gICAgICBkaXJlY3Rpb24udmFsdWUgPSBIb3Jpem9udGFsRGlyZWN0aW9uLlJpZ2h0XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1c2VXaW5kb3dSZXNpemVIYW5kbGVyKCgpID0+IHJlY2FsY3VsYXRlRGlyZWN0aW9uKCkpXHJcblxyXG4gIHdhdGNoKFxyXG4gICAgKCkgPT4gdW5yZWYoZWwpLFxyXG4gICAgKGVsZW1lbnQpID0+IHtcclxuICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICByZWNhbGN1bGF0ZURpcmVjdGlvbigpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBkaXJlY3Rpb246IGNvbXB1dGVkKCgpID0+IGRpcmVjdGlvbi52YWx1ZSksXHJcbiAgICByZWNhbGN1bGF0ZURpcmVjdGlvblxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBpc0NsaWVudCwgdHlwZSBVc2VFbGVtZW50Qm91bmRpbmdSZXR1cm4gfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHVucmVmLCB0eXBlIENvbXB1dGVkUmVmLCB0eXBlIENTU1Byb3BlcnRpZXMgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB7IEhvcml6b250YWxEaXJlY3Rpb24gfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvY29tbW9uL3dpbmRvdydcclxuXHJcbi8qKlxyXG4gKiBTaW1wbGlmaWVzIGNvcnJlY3RseSBhbmQgcmVzcG9uc2l2ZWx5IHBvc2l0aW9uaW5nIChkcm9wZG93bi9yaWdodC1jbGljay9ldGMpIG1lbnVzIHNvIHRoYXQgdGhleSBvcGVuXHJcbiAqIHRvIHRoZSBjb3JyZWN0IGRpcmVjdGlvbiwgY2FuIGNoYW5nZSBkaXJlY3Rpb25zIGlmIHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBvciBldmVuIGdvIGZ1bGwgc2NyZWVuXHJcbiAqIGlmIHRoZXJlJ3Mgbm8gc3BhY2UgaW4gZWl0aGVyIGRpcmVjdGlvbi5cclxuICpcclxuICogQWxzbyBzdXBwb3J0cyB1cGRhdGluZyB2ZXJ0aWNhbCBwb3NpdGlvbiwgaW5jYXNlIHRoZSBtZW51IHdvdWxkIGNsaXAgdy8gdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlQm9keU1vdW50ZWRNZW51UG9zaXRpb25pbmcgPSAocGFyYW1zOiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIGRpcmVjdGlvbiB0aGUgb3BlbiBzaG91bGQgcHJlZmVyYWJseSBvcGVuIGluLCBhc3N1bWluZyBpdCBoYXMgdGhlIHNwYWNlIHRvIGRvIHNvXHJcbiAgICovXHJcbiAgbWVudU9wZW5EaXJlY3Rpb24/OiBDb21wdXRlZFJlZjxIb3Jpem9udGFsRGlyZWN0aW9uPlxyXG4gIC8qKlxyXG4gICAqIHVzZUVsZW1lbnRCb3VuZGluZygpIG9mIHRoZSBidXR0b24gdGhhdCBvcGVucyB0aGUgbWVudVxyXG4gICAqL1xyXG4gIGJ1dHRvbkJvdW5kaW5nQm94OiBVc2VFbGVtZW50Qm91bmRpbmdSZXR1cm5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHRhcmdldCBtZW51IHdpZHRoLiBJZiBub3QgYXZhaWxhYmxlLCB3aWxsIHRyeSBhIHZlcnkgYmFzaWMgcG9zaXRpb25pbmcgbWV0aG9kXHJcbiAgICogdGhhdCBqdXN0IHVzZXMgdGhlIGJ1dHRvbiB3aWR0aC5cclxuICAgKi9cclxuICBtZW51V2lkdGg6IENvbXB1dGVkUmVmPG51bWJlciB8IHVuZGVmaW5lZD5cclxuICAvKipcclxuICAgKiBPcHRpb25hbGx5IGFsc28gY29udHJvbCB0YXJnZXQgbWVudSBoZWlnaHQuXHJcbiAgICovXHJcbiAgbWVudUhlaWdodD86IENvbXB1dGVkUmVmPG51bWJlciB8IHVuZGVmaW5lZD5cclxufSkgPT4ge1xyXG4gIGNvbnN0IG1lbnVTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge31cclxuICAgIGlmICghaXNDbGllbnQpIHJldHVybiBzdHlsZSAvLyBOb3QgU1NSIGNvbXBhdGlibGVcclxuXHJcbiAgICAvKipcclxuICAgICAqIDEuYS4gSWYgbWVudVdpZHRoIGlzIGJpZ2dlciB0aGFuIHNjcmVlbiB3aWR0aCwgdXNlIHNjcmVlbiB3aWR0aFxyXG4gICAgICogMS5iLiBJZiBtZW51V2lkdGggaXMgc21hbGxlciB0aGFuIHNjcmVlbiB3aWR0aCwgdXNlIG1lbnVXaWR0aFxyXG4gICAgICogMi4gSWYgMS5iLiBidXQgbWVudSBpcyBsZWF2aW5nIHNjcmVlbiBib3VuZHMsIG1ha2UgaXQgb3BlbiB0byBvdGhlciBkaXJlY3Rpb25cclxuICAgICAqXHJcbiAgICAgKiBBbHNvOlxyXG4gICAgICogMS5hLiBJZiBtZW51SGVpZ2h0IGlzIGJpZ2dlciB0aGFuIHNjcmVlbiBoZWlnaHQsIHVzZSBzY3JlZW4gaGVpZ2h0XHJcbiAgICAgKiAxLmIuIElmIG1lbnVIZWlnaHQgaXMgc21hbGxlciB0aGFuIHNjcmVlbiBoZWlnaHQsIHVzZSBzY3JlZW5IZWlnaHRcclxuICAgICAqIDIuIElmIDEuYi4gYnV0IG1lbnUgaXMgbGVhdmluZyBzY3JlZW4gYm91bmRzLCBtYWtlIGl0IG9wZW4gdG8gb3RoZXIgZGlyZWN0aW9uICh1cHdhcmRzKVxyXG4gICAgICovXHJcblxyXG4gICAgY29uc3Qgb3BlblRvTGVmdCA9IHVucmVmKHBhcmFtcy5tZW51T3BlbkRpcmVjdGlvbikgPT09IEhvcml6b250YWxEaXJlY3Rpb24uTGVmdFxyXG5cclxuICAgIGNvbnN0IHRvcCA9IHBhcmFtcy5idXR0b25Cb3VuZGluZ0JveC50b3AudmFsdWVcclxuICAgIGNvbnN0IGxlZnQgPSBwYXJhbXMuYnV0dG9uQm91bmRpbmdCb3gubGVmdC52YWx1ZVxyXG4gICAgY29uc3Qgd2lkdGggPSBwYXJhbXMuYnV0dG9uQm91bmRpbmdCb3gud2lkdGgudmFsdWVcclxuICAgIGNvbnN0IGhlaWdodCA9IHBhcmFtcy5idXR0b25Cb3VuZGluZ0JveC5oZWlnaHQudmFsdWVcclxuICAgIGNvbnN0IG1hcmdpbiA9IDQgLy8gaG93IG11Y2ggc3BhY2UgdG8gbGVhdmUgaW4gZnVsbC1zY3JlZW4gbW9kZSBvciBiZXR3ZWVuIGJ1dHRvbiBhbmQgbWVudVxyXG5cclxuICAgIGxldCBmaW5hbFdpZHRoID0gd2lkdGhcclxuICAgIGxldCBmaW5hbExlZnQgPSBsZWZ0XHJcbiAgICBsZXQgZmluYWxUb3AgPSB0b3AgKyBoZWlnaHQgKyBtYXJnaW5cclxuXHJcbiAgICBjb25zdCBtZW51V2lkdGggPSB1bnJlZihwYXJhbXMubWVudVdpZHRoKVxyXG4gICAgY29uc3QgbWVudUhlaWdodCA9IHVucmVmKHBhcmFtcz8ubWVudUhlaWdodClcclxuXHJcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGhcclxuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0XHJcblxyXG4gICAgY29uc3Qgdmlld3BvcnRXaWR0aFdpdGhvdXRNYXJnaW5zID0gdmlld3BvcnRXaWR0aCAtIG1hcmdpbiAqIDJcclxuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0V2l0aG91dE1hcmdpbnMgPSB2aWV3cG9ydEhlaWdodCAtIG1hcmdpbiAqIDJcclxuXHJcbiAgICBpZiAoIWlzVW5kZWZpbmVkKG1lbnVXaWR0aCkpIHtcclxuICAgICAgaWYgKG1lbnVXaWR0aCA+IHZpZXdwb3J0V2lkdGhXaXRob3V0TWFyZ2lucykge1xyXG4gICAgICAgIC8vIE1lbnUgdG9vIGJpZzogdXNlIGZ1bGwgc2NyZWVuIHdpZHRoXHJcbiAgICAgICAgZmluYWxXaWR0aCA9IHZpZXdwb3J0V2lkdGhXaXRob3V0TWFyZ2luc1xyXG4gICAgICAgIGZpbmFsTGVmdCA9IG1hcmdpblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIE9wZW4gdG8gcmlnaHQgb3IgbGVmdCBkZXBlbmRpbmcgb24gYXZhaWxhYmxlIHNwYWNlXHJcbiAgICAgICAgZmluYWxXaWR0aCA9IG1lbnVXaWR0aFxyXG5cclxuICAgICAgICBpZiAob3BlblRvTGVmdCkge1xyXG4gICAgICAgICAgZmluYWxMZWZ0ID0gbGVmdCArIHdpZHRoIC0gbWVudVdpZHRoXHJcbiAgICAgICAgICBpZiAoZmluYWxMZWZ0IDwgbWFyZ2luKSB7XHJcbiAgICAgICAgICAgIGZpbmFsTGVmdCA9IG1hcmdpblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAobGVmdCArIG1lbnVXaWR0aCA+IHZpZXdwb3J0V2lkdGhXaXRob3V0TWFyZ2lucykge1xyXG4gICAgICAgICAgICBmaW5hbExlZnQgPSBNYXRoLm1heChsZWZ0ICsgd2lkdGggLSBtZW51V2lkdGgsIG1hcmdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWlzVW5kZWZpbmVkKG1lbnVIZWlnaHQpKSB7XHJcbiAgICAgIGlmIChtZW51SGVpZ2h0ID4gdmlld3BvcnRIZWlnaHRXaXRob3V0TWFyZ2lucykge1xyXG4gICAgICAgIGZpbmFsVG9wID0gbWFyZ2luXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQnkgZGVmYXVsdCBvcGVucyBkb3dud2FyZCwgc2VlIGlmIHdlIG5lZWQgdG8gbW92ZSB1cHdhcmQgaW5zdGVhZFxyXG4gICAgICAgIGlmICh0b3AgKyBoZWlnaHQgKyBtZW51SGVpZ2h0ID4gdmlld3BvcnRIZWlnaHRXaXRob3V0TWFyZ2lucykge1xyXG4gICAgICAgICAgZmluYWxUb3AgPSB0b3AgLSBtZW51SGVpZ2h0IC0gbWFyZ2luXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3R5bGUubGVmdCA9IGAke2ZpbmFsTGVmdH1weGBcclxuICAgIHN0eWxlLndpZHRoID0gYCR7ZmluYWxXaWR0aH1weGBcclxuICAgIHN0eWxlLnRvcCA9IGAke2ZpbmFsVG9wfXB4YFxyXG5cclxuICAgIHJldHVybiBzdHlsZVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7IG1lbnVTdHlsZSB9XHJcbn1cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDwhLS0gSWYgbXVsdGlwbGUsIHVzZSBGb3JtU2VsZWN0TXVsdGlwbGUgaW5zdGVhZCAtLT5cclxuICA8ZGl2PlxyXG4gICAgPExpc3Rib3hcclxuICAgICAgOmtleT1cImZvcmNlVXBkYXRlS2V5XCJcclxuICAgICAgdi1tb2RlbD1cIndyYXBwZWRWYWx1ZVwiXHJcbiAgICAgIDpuYW1lPVwibmFtZVwiXHJcbiAgICAgIDptdWx0aXBsZT1cIm11bHRpcGxlXCJcclxuICAgICAgOmJ5PVwiYnlcIlxyXG4gICAgICA6ZGlzYWJsZWQ9XCJpc0Rpc2FibGVkXCJcclxuICAgICAgYXM9XCJkaXZcIlxyXG4gICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgJ21kOmZsZXggbWQ6aXRlbXMtY2VudGVyIG1kOnNwYWNlLXgtMiBtZDpqdXN0aWZ5LWJldHdlZW4nOiBpc0xlZnRMYWJlbFBvc2l0aW9uXHJcbiAgICAgIH1cIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiIDpjbGFzcz1cInsgJ3BiLTEnOiBzaG93TGFiZWwgJiYgIWlzTGVmdExhYmVsUG9zaXRpb24gfVwiPlxyXG4gICAgICAgIDxMaXN0Ym94TGFiZWxcclxuICAgICAgICAgIDppZD1cImxhYmVsSWRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IHRleHQtYm9keS14cyB0ZXh0LWZvcmVncm91bmQgZm9udC1tZWRpdW1cIlxyXG4gICAgICAgICAgOmNsYXNzPVwiW3sgJ3NyLW9ubHknOiAhc2hvd0xhYmVsIH0sIHsgJ2l0ZW1zLWNlbnRlciBnYXAtMSc6IHNob3dPcHRpb25hbCB9XVwiXHJcbiAgICAgICAgICA6Zm9yPVwiYnV0dG9uSWRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGxhYmVsIH19XHJcbiAgICAgICAgICA8ZGl2IHYtaWY9XCJzaG93UmVxdWlyZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyIHRleHQteHMgb3BhY2l0eS04MFwiPio8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1lbHNlLWlmPVwic2hvd09wdGlvbmFsXCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGZvbnQtbm9ybWFsXCI+XHJcbiAgICAgICAgICAgIChvcHRpb25hbClcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvTGlzdGJveExhYmVsPlxyXG4gICAgICAgIDxwXHJcbiAgICAgICAgICB2LWlmPVwiaGVscFRpcElkICYmIGlzTGVmdExhYmVsUG9zaXRpb25cIlxyXG4gICAgICAgICAgOmlkPVwiaGVscFRpcElkXCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC14c1wiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJoZWxwVGlwQ2xhc3Nlc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgaGVscFRpcCB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgdi10aXBweT1cInRvb2x0aXBUZXh0XCI+XHJcbiAgICAgICAgPGRpdiA6Y2xhc3M9XCJidXR0b25zV3JhcHBlckNsYXNzZXNcIj5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXhcIj4gLS0+XHJcbiAgICAgICAgICA8TGlzdGJveEJ1dHRvblxyXG4gICAgICAgICAgICA6aWQ9XCJidXR0b25JZFwiXHJcbiAgICAgICAgICAgIHJlZj1cImxpc3Rib3hCdXR0b25cIlxyXG4gICAgICAgICAgICB2LXNsb3Q9XCJ7IG9wZW4gfVwiXHJcbiAgICAgICAgICAgIDpjbGFzcz1cImJ1dHRvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cImJ1dHRvblN0eWxlID09PSAnc2ltcGxlJyA/ICdqdXN0aWZ5LXN0YXJ0JyA6ICdqdXN0aWZ5LWJldHdlZW4nXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdHJ1bmNhdGUgdGV4dC1sZWZ0IHRleHQteHMgc206dGV4dC1bMTNweF1cIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiW1xyXG4gICAgICAgICAgICAgICAgICBoYXNWYWx1ZVNlbGVjdGVkID8gJ3RleHQtZm9yZWdyb3VuZCcgOiAndGV4dC1mb3JlZ3JvdW5kLTInLFxyXG4gICAgICAgICAgICAgICAgICBidXR0b25TdHlsZSA9PT0gJ3NpbXBsZScgPyAnJyA6ICdncm93J1xyXG4gICAgICAgICAgICAgICAgXVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgIHYtaWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAhd3JhcHBlZFZhbHVlIHx8IChpc0FycmF5KHdyYXBwZWRWYWx1ZSkgJiYgIXdyYXBwZWRWYWx1ZS5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJub3RoaW5nLXNlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgcGxhY2Vob2xkZXIgPyBwbGFjZWhvbGRlciA6IGxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvc2xvdD5cclxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwic29tZXRoaW5nLXNlbGVjdGVkXCIgOnZhbHVlPVwid3JhcHBlZFZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgc2ltcGxlRGlzcGxheVRleHQod3JhcHBlZFZhbHVlKSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicG9pbnRlci1ldmVudHMtbm9uZSBzaHJpbmstMCBtbC0xIGZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMlwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPEV4Y2xhbWF0aW9uQ2lyY2xlSWNvblxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwiZXJyb3JNZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTQgdy00IHRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cIiFzaG93TGFiZWwgJiYgc2hvd1JlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTR4bCB0ZXh0LWRhbmdlciBvcGFjaXR5LTUwIGgtNCB3LTQgbGVhZGluZy02XCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8Q2hldnJvblVwSWNvblxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwib3BlblwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxDaGV2cm9uRG93bkljb25cclxuICAgICAgICAgICAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gU3luYyBpc09wZW4gd2l0aCBkcm9wZG93biBvcGVuIHN0YXRlIC0tPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cIihpc09wZW4gPSBvcGVuKVwiPjwvdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L0xpc3Rib3hCdXR0b24+XHJcbiAgICAgICAgICA8IS0tIDwvZGl2PiAtLT5cclxuICAgICAgICAgIDwhLS0gQ2xlYXIgQnV0dG9uIC0tPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB2LWlmPVwicmVuZGVyQ2xlYXJCdXR0b25cIlxyXG4gICAgICAgICAgICA6Y2xhc3M9XCJjbGVhckJ1dHRvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIEBjbGljaz1cImNsZWFyVmFsdWUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxYTWFya0ljb24gY2xhc3M9XCJ3LTMgaC0zXCIgLz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPFRyYW5zaXRpb25cclxuICAgICAgICAgICAgdi1pZj1cImlzTW91bnRlZFwiXHJcbiAgICAgICAgICAgIGxlYXZlLWFjdGl2ZS1jbGFzcz1cInRyYW5zaXRpb24gZWFzZS1pbiBkdXJhdGlvbi0xMDBcIlxyXG4gICAgICAgICAgICBsZWF2ZS1mcm9tLWNsYXNzPVwib3BhY2l0eS0xMDBcIlxyXG4gICAgICAgICAgICBsZWF2ZS10by1jbGFzcz1cIm9wYWNpdHktMFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxUZWxlcG9ydCB0bz1cImJvZHlcIiA6ZGlzYWJsZWQ9XCIhbW91bnRNZW51T25Cb2R5XCI+XHJcbiAgICAgICAgICAgICAgPExpc3Rib3hPcHRpb25zXHJcbiAgICAgICAgICAgICAgICByZWY9XCJtZW51RWxcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwibGlzdGJveE9wdGlvbnNDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgIDpzdHlsZT1cImxpc3Rib3hPcHRpb25zU3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgQGZvY3VzPVwic2VhcmNoSW5wdXQ/LmZvY3VzKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCB2LWlmPVwiaGFzU2VhcmNoXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIG14LTEgbWItMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHkgbGFiZWwgdGV4dC1mb3JlZ3JvdW5kXCI+U2VhcmNoPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgbGVmdC0wIGZsZXggaXRlbXMtY2VudGVyIHBsLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxNYWduaWZ5aW5nR2xhc3NJY29uIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmQtMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICByZWY9XCJzZWFyY2hJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB2LW1vZGVsPVwic2VhcmNoVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweS0xIHBsLTcgdy1mdWxsIGJnLWZvdW5kYXRpb24gcGxhY2Vob2xkZXI6Zm9udC1ub3JtYWwgbm9ybWFsIHBsYWNlaG9sZGVyOnRleHQtZm9yZWdyb3VuZC0yIHRleHQtWzEzcHhdIGZvY3VzLXZpc2libGU6W2JveC1zaGFkb3c6bm9uZV0gcm91bmRlZC1tZCBob3Zlcjpib3JkZXItb3V0bGluZS01IGZvY3VzLXZpc2libGU6Ym9yZGVyLW91dGxpbmUtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA6cGxhY2Vob2xkZXI9XCJzZWFyY2hQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBAa2V5ZG93bi5zdG9wXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm92ZXJmbG93LWF1dG8gc2ltcGxlLXNjcm9sbGJhclwiXHJcbiAgICAgICAgICAgICAgICAgIDpjbGFzcz1cInByb3BzLm1lbnVNYXhIZWlnaHRDbGFzc2VzIHx8ICdtYXgtaC1bNTB2aF0geGw6bWF4LWgtODAnXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwiaXNBc3luY1NlYXJjaE1vZGUgJiYgaXNBc3luY0xvYWRpbmdcIiBjbGFzcz1cInB4LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Q29tbW9uTG9hZGluZ0JhciA6bG9hZGluZz1cInRydWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB2LWVsc2UtaWY9XCJpc0FzeW5jU2VhcmNoTW9kZSAmJiAhY3VycmVudEl0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMiB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cIm5vdGhpbmctZm91bmRcIj5Ob3RoaW5nIGZvdW5kPC9zbG90PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCIhaXNBc3luY1NlYXJjaE1vZGUgfHwgIWlzQXN5bmNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPExpc3Rib3hPcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgIHYtZm9yPVwiaXRlbSBpbiBmaW5hbEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDprZXk9XCJpdGVtS2V5KGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHYtc2xvdD1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgfToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGJvb2xlYW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBib29sZWFuXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIDp2YWx1ZT1cIihpdGVtIGFzIFNpbmdsZUl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi10aXBweT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRpc2FibGVkSXRlbVRvb2x0aXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rib3hPcHRpb25DbGFzc2VzKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZEl0ZW1QcmVkaWNhdGU/LihpdGVtKSB8fCBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJibG9jayBweC0yIHB5LTEuNSByb3VuZGVkLW1kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA/ICdiZy1oaWdobGlnaHQtMycgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoaWRlQ2hlY2ttYXJrcyA/ICdwci04JyA6ICdwci0yJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkaXNhYmxlZEl0ZW1QcmVkaWNhdGU/LihpdGVtKSAmJiAhc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnaG92ZXI6YmctaGlnaGxpZ2h0LTEnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbG90XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwib3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOml0ZW09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDphY3RpdmU9XCJhY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNlbGVjdGVkPVwic2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRJdGVtUHJlZGljYXRlPy4oaXRlbSkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbXBsZURpc3BsYXlUZXh0KGl0ZW0pIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbG90PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdi1pZj1cIiFoaWRlQ2hlY2ttYXJrcyAmJiBzZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCByaWdodC0wIHRleHQtZm9yZWdyb3VuZCBmbGV4IGl0ZW1zLWNlbnRlciBwci00J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrSWNvbiBjbGFzcz1cImgtNCB3LTRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L0xpc3Rib3hPcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L0xpc3Rib3hPcHRpb25zPlxyXG4gICAgICAgICAgICA8L1RlbGVwb3J0PlxyXG4gICAgICAgICAgPC9UcmFuc2l0aW9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvTGlzdGJveD5cclxuICAgIDxwXHJcbiAgICAgIHYtaWY9XCJoZWxwVGlwSWQgJiYgIWlzTGVmdExhYmVsUG9zaXRpb25cIlxyXG4gICAgICA6aWQ9XCJoZWxwVGlwSWRcIlxyXG4gICAgICBjbGFzcz1cIm10LTIgdGV4dC14c1wiXHJcbiAgICAgIDpjbGFzcz1cImhlbHBUaXBDbGFzc2VzXCJcclxuICAgID5cclxuICAgICAge3sgaGVscFRpcCB9fVxyXG4gICAgPC9wPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0XHJcbiAgc2V0dXBcclxuICBsYW5nPVwidHNcIlxyXG4gIGdlbmVyaWM9XCJTaW5nbGVJdGVtIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBzdHJpbmcgfCBudW1iZXJcIlxyXG4+XHJcbmltcG9ydCB7XHJcbiAgTGlzdGJveCxcclxuICBMaXN0Ym94QnV0dG9uLFxyXG4gIExpc3Rib3hPcHRpb24sXHJcbiAgTGlzdGJveE9wdGlvbnMsXHJcbiAgTGlzdGJveExhYmVsXHJcbn0gZnJvbSAnQGhlYWRsZXNzdWkvdnVlJ1xyXG5pbXBvcnQge1xyXG4gIENoZXZyb25Eb3duSWNvbixcclxuICBDaGVja0ljb24sXHJcbiAgQ2hldnJvblVwSWNvbixcclxuICBNYWduaWZ5aW5nR2xhc3NJY29uLFxyXG4gIFhNYXJrSWNvbixcclxuICBFeGNsYW1hdGlvbkNpcmNsZUljb25cclxufSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yMC9zb2xpZCdcclxuaW1wb3J0IHsgZGVib3VuY2UsIGlzQXJyYXksIGlzT2JqZWN0TGlrZSB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcywgUHJvcFR5cGUsIFJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIG9uTW91bnRlZCwgcmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgTWF5YmVBc3luYywgTnVsbGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VGaWVsZCB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHR5cGUgeyBSdWxlRXhwcmVzc2lvbiB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJ1xyXG5pbXBvcnQgQ29tbW9uTG9hZGluZ0JhciBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9CYXIudnVlJ1xyXG5pbXBvcnQge1xyXG4gIHVzZUVsZW1lbnRCb3VuZGluZyxcclxuICB1c2VNb3VudGVkLFxyXG4gIHVzZUludGVyc2VjdGlvbk9ic2VydmVyLFxyXG4gIGlzQ2xpZW50XHJcbn0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgdHlwZSB7IExhYmVsUG9zaXRpb24gfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS9pbnB1dCdcclxuaW1wb3J0IHsgZGlyZWN0aXZlIGFzIHZUaXBweSB9IGZyb20gJ3Z1ZS10aXBweSdcclxuaW1wb3J0IHsgdXNlQm9keU1vdW50ZWRNZW51UG9zaXRpb25pbmcgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvbGF5b3V0L21lbnUnXHJcbmltcG9ydCB7IEhvcml6b250YWxEaXJlY3Rpb24gfSBmcm9tICd+fi9zcmMvbGliJ1xyXG5cclxudHlwZSBCdXR0b25TdHlsZSA9ICdiYXNlJyB8ICdzaW1wbGUnIHwgJ3RpbnRlZCdcclxudHlwZSBWYWx1ZVR5cGUgPSBTaW5nbGVJdGVtIHwgU2luZ2xlSXRlbVtdIHwgdW5kZWZpbmVkXHJcbnR5cGUgSW5wdXRTaXplID0gJ3NtJyB8ICdiYXNlJyB8ICdsZycgfCAneGwnXHJcblxyXG5jb25zdCBpc09iamVjdExpa2VUeXBlID0gKHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IGlzT2JqZWN0TGlrZSh2KVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdjogVmFsdWVUeXBlKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICBzaXplOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8SW5wdXRTaXplPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIG11bHRpcGxlOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGl0ZW1zOiB7XHJcbiAgICB0eXBlOiBBcnJheSBhcyBQcm9wVHlwZTxTaW5nbGVJdGVtW10+LFxyXG4gICAgZGVmYXVsdDogKCkgPT4gW11cclxuICB9LFxyXG4gIG1vZGVsVmFsdWU6IHtcclxuICAgIHR5cGU6IFtPYmplY3QsIEFycmF5LCBTdHJpbmddIGFzIFByb3BUeXBlPFZhbHVlVHlwZT4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRoZSBzZWFyY2ggYmFyLiBZb3UgbXVzdCBhbHNvIHNldCBvbmUgb2YgdGhlIGZvbGxvd2luZzpcclxuICAgKiAqIGZpbHRlclByZWRpY2F0ZSAtIHRvIGFsbG93IGZpbHRlcmluZyBwYXNzZWQgaW4gYGl0ZW1zYCBiYXNlZCBvbiBzZWFyY2ggYmFyXHJcbiAgICogKiBnZXRTZWFyY2hSZXN1bHRzIC0gdG8gYWxsb3cgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBpdGVtcyBmcm9tIHNlcnZlciAocHJvcHMuaXRlbXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGluIHRoaXMgY2FzZSxcclxuICAgKiAgYnV0IGNhbiBiZSB1c2VkIHRvIHByZWZpbGwgaW5pdGlhbCB2YWx1ZXMpXHJcbiAgICovXHJcbiAgc2VhcmNoOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIElmIHNlYXJjaD10cnVlIGFuZCB0aGlzIGlzIHNldCwgeW91IGNhbiB1c2UgdGhpcyB0byBmaWx0ZXIgcGFzc2VkIGluIGl0ZW1zIGJhc2VkIG9uIHdoYXRldmVyXHJcbiAgICogdGhlIHVzZXIgZW50ZXJzIGluIHRoZSBzZWFyY2ggYmFyXHJcbiAgICovXHJcbiAgZmlsdGVyUHJlZGljYXRlOiB7XHJcbiAgICB0eXBlOiBGdW5jdGlvbiBhcyBQcm9wVHlwZTxcclxuICAgICAgT3B0aW9uYWw8KGl0ZW06IFNpbmdsZUl0ZW0sIHNlYXJjaFN0cmluZzogc3RyaW5nKSA9PiBib29sZWFuPlxyXG4gICAgPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoaXMgdG8gZGlzYWJsZSBjZXJ0YWluIGl0ZW1zIGluIHRoZSBsaXN0XHJcbiAgICovXHJcbiAgZGlzYWJsZWRJdGVtUHJlZGljYXRlOiB7XHJcbiAgICB0eXBlOiBGdW5jdGlvbiBhcyBQcm9wVHlwZTxPcHRpb25hbDwoaXRlbTogU2luZ2xlSXRlbSkgPT4gYm9vbGVhbj4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBJZiBzZWFyY2g9dHJ1ZSBhbmQgdGhpcyBpcyBzZXQsIHlvdSBjYW4gdXNlIHRoaXMgdG8gbG9hZCBkYXRhIGFzeW5jaHJvbm91c2x5IGRlcGVuZGluZ1xyXG4gICAqIG9uIHRoZSBzZWFyY2ggcXVlcnlcclxuICAgKi9cclxuICBnZXRTZWFyY2hSZXN1bHRzOiB7XHJcbiAgICB0eXBlOiBGdW5jdGlvbiBhcyBQcm9wVHlwZTxcclxuICAgICAgT3B0aW9uYWw8KHNlYXJjaFN0cmluZzogc3RyaW5nKSA9PiBNYXliZUFzeW5jPFNpbmdsZUl0ZW1bXT4+XHJcbiAgICA+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICBzZWFyY2hQbGFjZWhvbGRlcjoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogJ1NlYXJjaCdcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIExhYmVsIGlzIHJlcXVpcmVkIGF0IHRoZSB2ZXJ5IGxlYXN0IGZvciBzY3JlZW4tcmVhZGVyc1xyXG4gICAqL1xyXG4gIGxhYmVsOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICByZXF1aXJlZDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgdGV4dCB0aGF0IHJlcGxhY2VzIHRoZSBsYWJlbCBhcyB0aGUgcGxhY2Vob2xkZXIgd2hlbiBzZXQuXHJcbiAgICovXHJcbiAgcGxhY2Vob2xkZXI6IHtcclxuICAgIHR5cGU6IFN0cmluZ1xyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBsYWJlbCB2aXN1YWxseVxyXG4gICAqL1xyXG4gIHNob3dMYWJlbDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBuYW1lOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICByZXF1aXJlZDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogT2JqZWN0cyB3aWxsIGJlIGNvbXBhcmVkIGJ5IHRoZSB2YWx1ZXMgaW4gdGhlIHNwZWNpZmllZCBwcm9wXHJcbiAgICovXHJcbiAgYnk6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gIH0sXHJcbiAgZGlzYWJsZWQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8T3B0aW9uYWw8Ym9vbGVhbj4+LFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGJ1dHRvblN0eWxlOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8QnV0dG9uU3R5bGU+PixcclxuICAgIGRlZmF1bHQ6ICdiYXNlJ1xyXG4gIH0sXHJcbiAgaGlkZUNoZWNrbWFya3M6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8T3B0aW9uYWw8Ym9vbGVhbj4+LFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGFsbG93VW5zZXQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8T3B0aW9uYWw8Ym9vbGVhbj4+LFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgY2xlYXJhYmxlOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRpb24gc3R1ZmZcclxuICAgKi9cclxuICBydWxlczoge1xyXG4gICAgdHlwZTogW1N0cmluZywgT2JqZWN0LCBGdW5jdGlvbiwgQXJyYXldIGFzIFByb3BUeXBlPFxyXG4gICAgICBPcHRpb25hbDxSdWxlRXhwcmVzc2lvbjxWYWx1ZVR5cGU+PlxyXG4gICAgPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogdmVlLXZhbGlkYXRlIHZhbGlkYXRpb24oKSBvbiBjb21wb25lbnQgbW91bnRcclxuICAgKi9cclxuICB2YWxpZGF0ZU9uTW91bnQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byB0cmlnZ2VyIHZhbGlkYXRpb24gd2hlbmV2ZXIgdGhlIHZhbHVlIGNoYW5nZXNcclxuICAgKi9cclxuICB2YWxpZGF0ZU9uVmFsdWVVcGRhdGU6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2lsbCByZXBsYWNlIHRoZSBnZW5lcmljIFwiVmFsdWVcIiB0ZXh0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGlucHV0IGluIGVycm9yIG1lc3NhZ2VzXHJcbiAgICovXHJcbiAgdXNlTGFiZWxJbkVycm9yczoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IHRydWVcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIGhlbHAgdGV4dFxyXG4gICAqL1xyXG4gIGhlbHA6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxzdHJpbmc+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHNpemUgYXR0cmlidXRlIGluc3RlYWRcclxuICAgKi9cclxuICBmaXhlZEhlaWdodDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBCeSBkZWZhdWx0IGNvbXBvbmVudCBob2xkcyBpdHMgb3duIGludGVybmFsIHZhbHVlIHN0YXRlIHNvIHRoYXQgZXZlbiBpZiB5b3UgZG9uJ3QgaGF2ZSBpdCB0aWVkIHVwIHRvIGEgcmVhbCBgbW9kZWxWYWx1ZWAgcmVmIHNvbWV3aGVyZVxyXG4gICAqIGl0IGtub3dzIGl0cyBpbnRlcm5hbCBzdGF0ZSBhbmQgY2FuIHJlcG9ydCBpdCBvbiBmb3JtIHN1Ym1pdHMuXHJcbiAgICpcclxuICAgKiBJZiB5b3Ugc2V0IHRoaXMgdG8gdHJ1ZSwgaXRzIG9ubHkgZ29pbmcgdG8gcmVseSBvbiBgbW9kZWxWYWx1ZWAgYXMgaXRzIHByaW1hcnkgc291cmNlIG9mIHRydXRoIHNvIHRoYXQgeW91IGNhbiByZWplY3QgdXBkYXRlcyBldGMuXHJcbiAgICovXHJcbiAgZnVsbHlDb250cm9sVmFsdWU6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBzaG93IHRoZSByZWQgXCJyZXF1aXJlZFwiIGFzdGVyaXNrXHJcbiAgICovXHJcbiAgc2hvd1JlcXVpcmVkOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgb3B0aW9uYWwgdGV4dFxyXG4gICAqL1xyXG4gIHNob3dPcHRpb25hbDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIG1vdW50IHRoZSBtZW51IG9uIHRoZSBib2R5IGluc3RlYWQgb2YgaW5zaWRlIHRoZSBjb21wb25lbnQuIFVzZWZ1bCB3aGVuIHNlbGVjdCBib3ggaXMgbW91bnRlZCB3aXRoaW5cclxuICAgKiBkaWFsb2cgd2luZG93cyBhbmQgdGhlIG1lbnUgY2F1c2VzIHVubmVjZXNzYXJ5IG92ZXJmbG93LlxyXG4gICAqL1xyXG4gIG1vdW50TWVudU9uQm9keToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBsYWJlbElkOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIGJ1dHRvbklkOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFRvb2x0aXAgc2hvd24gb24gZGlzYWJsZWQgaXRlbXNcclxuICAgKi9cclxuICBkaXNhYmxlZEl0ZW1Ub29sdGlwOiB7XHJcbiAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICB0eXBlOiBTdHJpbmdcclxuICB9LFxyXG4gIGxhYmVsUG9zaXRpb246IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxMYWJlbFBvc2l0aW9uPixcclxuICAgIGRlZmF1bHQ6ICd0b3AnXHJcbiAgfSxcclxuICB0b29sdGlwVGV4dDoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBPcHRpb25hbGx5IG1ha2UgdGhlIG1lbnUgd2lkdGggd2lkZXIvbmFycm93ZXIgdGhhbiB0aGUgYnV0dG9uIHdpZHRoIGJ5IHNwZWNpZnlpbmcgdGhlIG1heCB3aWR0aCBpbiBwaXhlbHMuXHJcbiAgICogT25seSBzdXBwb3J0ZWQgd2hlbiBgbW91bnRNZW51T25Cb2R5YCBpcyB0cnVlLlxyXG4gICAqL1xyXG4gIG1lbnVNYXhXaWR0aDoge1xyXG4gICAgdHlwZTogTnVtYmVyLFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBJZiBtZW51TWF4V2lkdGggaXMgc2V0IGFuZCBtZW51IGlzIHdpZGVyIHRoYW4gdGhlIGJ1dHRvbiwgdGhpcyB3aWxsIGRldGVybWluZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtZW51IG9wZW5pbmcuXHJcbiAgICogRGVmYXVsdDogJ2xlZnQnIChvcGVucyB0byB0aGUgbGVmdCBvZiB0aGUgYnV0dG9uKVxyXG4gICAqL1xyXG4gIG1lbnVPcGVuRGlyZWN0aW9uOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8J2xlZnQnIHwgJ3JpZ2h0Jz4sXHJcbiAgICBkZWZhdWx0OiAnbGVmdCdcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIEN1c3RvbSBtYXggaGVpZ2h0IGNsYXNzZXMgZm9yIHRoZSBkcm9wZG93biBtZW51LiBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvICdtYXgtaC1bNTB2aF0geGw6bWF4LWgtODAnXHJcbiAgICovXHJcbiAgbWVudU1heEhlaWdodENsYXNzZXM6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHsgdmFsdWUsIGVycm9yTWVzc2FnZTogZXJyb3IgfSA9IHVzZUZpZWxkPFZhbHVlVHlwZT4ocHJvcHMubmFtZSwgcHJvcHMucnVsZXMsIHtcclxuICB2YWxpZGF0ZU9uTW91bnQ6IHByb3BzLnZhbGlkYXRlT25Nb3VudCxcclxuICB2YWxpZGF0ZU9uVmFsdWVVcGRhdGU6IHByb3BzLnZhbGlkYXRlT25WYWx1ZVVwZGF0ZSxcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXHJcbiAgaW5pdGlhbFZhbHVlOiBwcm9wcy5tb2RlbFZhbHVlIGFzIFZhbHVlVHlwZVxyXG59KVxyXG5cclxuY29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpXHJcblxyXG5jb25zdCBzZWFyY2hJbnB1dCA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxJbnB1dEVsZW1lbnQ+KVxyXG5jb25zdCBtZW51RWwgPSByZWYobnVsbCBhcyBOdWxsYWJsZTx7IGVsOiBOdWxsYWJsZTxIVE1MRWxlbWVudD4gfT4pXHJcbmNvbnN0IGxpc3Rib3hCdXR0b24gPSByZWYobnVsbCBhcyBOdWxsYWJsZTx7IGVsOiBOdWxsYWJsZTxIVE1MQnV0dG9uRWxlbWVudD4gfT4pXHJcbmNvbnN0IHNlYXJjaFZhbHVlID0gcmVmKCcnKVxyXG5jb25zdCBjdXJyZW50SXRlbXMgPSByZWYoW10pIGFzIFJlZjxTaW5nbGVJdGVtW10+XHJcbmNvbnN0IGlzQXN5bmNMb2FkaW5nID0gcmVmKGZhbHNlKVxyXG5jb25zdCBmb3JjZVVwZGF0ZUtleSA9IHJlZigxKVxyXG5jb25zdCBpbnRlcm5hbEhlbHBUaXBJZCA9IHJlZihuYW5vaWQoKSlcclxuY29uc3QgaXNPcGVuID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3QgbGlzdGJveEJ1dHRvbkJvdW5kaW5nID0gdXNlRWxlbWVudEJvdW5kaW5nKFxyXG4gIGNvbXB1dGVkKCgpID0+IGxpc3Rib3hCdXR0b24udmFsdWU/LmVsKSxcclxuICB7IHdpbmRvd1Jlc2l6ZTogdHJ1ZSwgd2luZG93U2Nyb2xsOiB0cnVlLCBpbW1lZGlhdGU6IHRydWUgfVxyXG4pXHJcblxyXG51c2VJbnRlcnNlY3Rpb25PYnNlcnZlcihcclxuICBjb21wdXRlZCgoKSA9PiBtZW51RWwudmFsdWU/LmVsKSxcclxuICAoW3sgaXNJbnRlcnNlY3RpbmcgfV0pID0+IHtcclxuICAgIGlmIChpc0ludGVyc2VjdGluZyAmJiBwcm9wcy5tb3VudE1lbnVPbkJvZHkpIHtcclxuICAgICAgbGlzdGJveEJ1dHRvbkJvdW5kaW5nLnVwZGF0ZSgpXHJcbiAgICB9XHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCB7IG1lbnVTdHlsZSB9ID0gdXNlQm9keU1vdW50ZWRNZW51UG9zaXRpb25pbmcoe1xyXG4gIG1lbnVPcGVuRGlyZWN0aW9uOiBjb21wdXRlZCgoKSA9PlxyXG4gICAgcHJvcHMubWVudU9wZW5EaXJlY3Rpb24gPT09ICdsZWZ0J1xyXG4gICAgICA/IEhvcml6b250YWxEaXJlY3Rpb24uTGVmdFxyXG4gICAgICA6IEhvcml6b250YWxEaXJlY3Rpb24uUmlnaHRcclxuICApLFxyXG4gIG1lbnVXaWR0aDogY29tcHV0ZWQoKCkgPT4gcHJvcHMubWVudU1heFdpZHRoKSxcclxuICBidXR0b25Cb3VuZGluZ0JveDogbGlzdGJveEJ1dHRvbkJvdW5kaW5nXHJcbn0pXHJcblxyXG5jb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHVucmVmKHByb3BzLmxhYmVsKSB8fCB1bnJlZihwcm9wcy5uYW1lKSlcclxuY29uc3QgZXJyb3JNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGJhc2UgPSBlcnJvci52YWx1ZVxyXG4gIGlmICghYmFzZSB8fCAhdW5yZWYocHJvcHMudXNlTGFiZWxJbkVycm9ycykpIHJldHVybiBiYXNlXHJcbiAgcmV0dXJuIGJhc2UucmVwbGFjZSgnVmFsdWUnLCB0aXRsZS52YWx1ZSlcclxufSlcclxuY29uc3QgaGVscFRpcCA9IGNvbXB1dGVkKCgpID0+IGVycm9yTWVzc2FnZS52YWx1ZSB8fCB1bnJlZihwcm9wcy5oZWxwKSlcclxuY29uc3QgaGFzSGVscFRpcCA9IGNvbXB1dGVkKCgpID0+ICEhaGVscFRpcC52YWx1ZSlcclxuY29uc3QgaGVscFRpcElkID0gY29tcHV0ZWQoKCkgPT5cclxuICBoYXNIZWxwVGlwLnZhbHVlID8gYCR7dW5yZWYocHJvcHMubmFtZSl9LSR7aW50ZXJuYWxIZWxwVGlwSWQudmFsdWV9YCA6IHVuZGVmaW5lZFxyXG4pXHJcbmNvbnN0IGhlbHBUaXBDbGFzc2VzID0gY29tcHV0ZWQoKCk6IHN0cmluZyA9PlxyXG4gIGVycm9yLnZhbHVlID8gJ3RleHQtZGFuZ2VyJyA6ICd0ZXh0LWZvcmVncm91bmQtMidcclxuKVxyXG5cclxuY29uc3QgaXNMZWZ0TGFiZWxQb3NpdGlvbiA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JylcclxuXHJcbmNvbnN0IHJlbmRlckNsZWFyQnV0dG9uID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnICYmIHByb3BzLmNsZWFyYWJsZSAmJiAhcHJvcHMuZGlzYWJsZWRcclxuKVxyXG5cclxuY29uc3Qgc2l6ZUNsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICBpZiAoIXByb3BzLnNpemUpIHJldHVybiAnJ1xyXG5cclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ3NtJzpcclxuICAgICAgcmV0dXJuICdoLTYgdGV4dC1ib2R5LXNtJ1xyXG4gICAgY2FzZSAnbGcnOlxyXG4gICAgICByZXR1cm4gJ2gtMTAgdGV4dC1bMTNweF0nXHJcbiAgICBjYXNlICd4bCc6XHJcbiAgICAgIHJldHVybiAnaC0xNCB0ZXh0LXNtJ1xyXG4gICAgY2FzZSAnYmFzZSc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gJ2gtOCB0ZXh0LWJvZHktc20nXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgYnV0dG9uc1dyYXBwZXJDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWydyZWxhdGl2ZSBmbGV4IGdyb3VwJ11cclxuXHJcbiAgaWYgKGVycm9yLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2hvdmVyOnNoYWRvdyByb3VuZGVkLW1kJylcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1kYW5nZXItZGFya2VyIGZvY3VzOmJvcmRlci1kYW5nZXInKVxyXG5cclxuICAgIGlmIChwcm9wcy5idXR0b25TdHlsZSAhPT0gJ3NpbXBsZScpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXIgYm9yZGVyLWRhbmdlcicpXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChwcm9wcy5idXR0b25TdHlsZSAhPT0gJ3NpbXBsZScpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncm91bmRlZC1tZCBib3JkZXInKVxyXG4gICAgaWYgKGlzT3Blbi52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2JvcmRlci1vdXRsaW5lLTQnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItb3V0bGluZS0yIGhvdmVyOmJvcmRlci1vdXRsaW5lLTUgZm9jdXM6b3V0bGluZS0wJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5maXhlZEhlaWdodCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTgnKVxyXG4gIH0gZWxzZSBpZiAoc2l6ZUNsYXNzZXMudmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKHNpemVDbGFzc2VzLnZhbHVlKVxyXG4gIH1cclxuXHJcbiAgaWYgKGlzTGVmdExhYmVsUG9zaXRpb24udmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnbWQ6YmFzaXMtMS8yJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgY29tbW9uQnV0dG9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtdXHJcblxyXG4gIGlmIChwcm9wcy5idXR0b25TdHlsZSAhPT0gJ3NpbXBsZScpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgaXNEaXNhYmxlZC52YWx1ZSA/ICdiZy1mb3VuZGF0aW9uLWRpc2FibGVkIHRleHQtZm9yZWdyb3VuZC1kaXNhYmxlZCcgOiAnJ1xyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgaWYgKGlzRGlzYWJsZWQudmFsdWUpIGNsYXNzUGFydHMucHVzaCgnY3Vyc29yLW5vdC1hbGxvd2VkJylcclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBjbGVhckJ1dHRvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdyZWxhdGl2ZSB6LVsxXScsXHJcbiAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1jZW50ZXIgc2hyaW5rLTAnLFxyXG4gICAgJ3JvdW5kZWQtci1tZCBvdmVyZmxvdy1oaWRkZW4gdHJhbnNpdGlvbi1hbGwnLFxyXG4gICAgJ3RleHQtZm9yZWdyb3VuZCcsXHJcbiAgICBoYXNWYWx1ZVNlbGVjdGVkLnZhbHVlID8gYHctNiAke2NvbW1vbkJ1dHRvbkNsYXNzZXMudmFsdWV9YCA6ICd3LTAnXHJcbiAgXVxyXG5cclxuICBpZiAoIWlzRGlzYWJsZWQudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgJ2hvdmVyOmJnLXByaW1hcnkgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kLW9uLXByaW1hcnkgZGFyazp0ZXh0LWZvcmVncm91bmQtb24tcHJpbWFyeSdcclxuICAgIClcclxuICAgIGlmIChwcm9wcy5idXR0b25TdHlsZSA9PT0gJ3RpbnRlZCcpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1vdXRsaW5lLTMnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1wcmltYXJ5LW11dGVkJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgYnV0dG9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ3JlbGF0aXZlIHotWzJdJyxcclxuICAgICdub3JtYWwgcm91bmRlZC1tZCBjdXJzb3ItcG9pbnRlciB0cmFuc2l0aW9uIHRydW5jYXRlIGZsZXgtMScsXHJcbiAgICAnZmxleCBpdGVtcy1jZW50ZXIgZm9jdXM6b3V0bGluZS1vdXRsaW5lLTQgZm9jdXM6b3V0bGluZS0xJyxcclxuICAgIGNvbW1vbkJ1dHRvbkNsYXNzZXMudmFsdWVcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5idXR0b25TdHlsZSAhPT0gJ3NpbXBsZScpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncC0yJylcclxuXHJcbiAgICBpZiAoIWlzRGlzYWJsZWQudmFsdWUpIHtcclxuICAgICAgaWYgKHByb3BzLmJ1dHRvblN0eWxlID09PSAndGludGVkJykge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctZm91bmRhdGlvbiB0ZXh0LWZvcmVncm91bmQnKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctZm91bmRhdGlvbiB0ZXh0LWZvcmVncm91bmQnKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAocmVuZGVyQ2xlYXJCdXR0b24udmFsdWUgJiYgaGFzVmFsdWVTZWxlY3RlZC52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdyb3VuZGVkLXItbm9uZScpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGhhc1NlYXJjaCA9IGNvbXB1dGVkKFxyXG4gICgpID0+ICEhKHByb3BzLnNlYXJjaCAmJiAocHJvcHMuZmlsdGVyUHJlZGljYXRlIHx8IHByb3BzLmdldFNlYXJjaFJlc3VsdHMpKVxyXG4pXHJcbmNvbnN0IGlzQXN5bmNTZWFyY2hNb2RlID0gY29tcHV0ZWQoKCkgPT4gaGFzU2VhcmNoLnZhbHVlICYmIHByb3BzLmdldFNlYXJjaFJlc3VsdHMpXHJcbmNvbnN0IGlzRGlzYWJsZWQgPSBjb21wdXRlZChcclxuICAoKSA9PiBwcm9wcy5kaXNhYmxlZCB8fCAoIXByb3BzLml0ZW1zLmxlbmd0aCAmJiAhaXNBc3luY1NlYXJjaE1vZGUudmFsdWUpXHJcbilcclxuXHJcbmNvbnN0IHdyYXBwZWRWYWx1ZSA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlLnZhbHVlXHJcbiAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcclxuICAgICAgcmV0dXJuIGlzQXJyYXkoY3VycmVudFZhbHVlKSA/IGN1cnJlbnRWYWx1ZSA6IFtdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gaXNBcnJheShjdXJyZW50VmFsdWUpID8gdW5kZWZpbmVkIDogY3VycmVudFZhbHVlXHJcbiAgICB9XHJcbiAgfSxcclxuICBzZXQ6IChuZXdWYWwpID0+IHtcclxuICAgIGlmIChwcm9wcy5tdWx0aXBsZSAmJiAhaXNBcnJheShuZXdWYWwpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignQXR0ZW1wdGluZyB0byBzZXQgbm9uLWFycmF5IHZhbHVlIGluIHNlbGVjdG9yIHcvIG11bHRpcGxlPXRydWUnKVxyXG4gICAgICByZXR1cm5cclxuICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIGlzQXJyYXkobmV3VmFsKSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0F0dGVtcHRpbmcgdG8gc2V0IGFycmF5IHZhbHVlIGluIHNlbGVjdG9yIHcvIG11bHRpcGxlPWZhbHNlJylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpbmFsVmFsdWU6IHR5cGVvZiB2YWx1ZS52YWx1ZVxyXG4gICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XHJcbiAgICAgIGZpbmFsVmFsdWUgPSBuZXdWYWwgfHwgW11cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWwgPSB2YWx1ZS52YWx1ZVxyXG4gICAgICBjb25zdCBpc1Vuc2V0ID1cclxuICAgICAgICBwcm9wcy5hbGxvd1Vuc2V0ICYmXHJcbiAgICAgICAgY3VycmVudFZhbCAmJlxyXG4gICAgICAgIG5ld1ZhbCAmJlxyXG4gICAgICAgIGl0ZW1LZXkoY3VycmVudFZhbCBhcyBTaW5nbGVJdGVtKSA9PT0gaXRlbUtleShuZXdWYWwgYXMgU2luZ2xlSXRlbSlcclxuICAgICAgZmluYWxWYWx1ZSA9IGlzVW5zZXQgPyB1bmRlZmluZWQgOiBuZXdWYWxcclxuICAgIH1cclxuXHJcbiAgICBpZiAocHJvcHMuZnVsbHlDb250cm9sVmFsdWUpIHtcclxuICAgICAgLy8gTm90IHNldHRpbmcgdmFsdWUudmFsdWUsIGNhdXNlIHRoZW4gd2UgZG9uJ3QgZ2l2ZSBhIGNoYW5jZSBmb3IgdGhlIHBhcmVudFxyXG4gICAgICAvLyBjb21wb25lbnQgdG8gcmVqZWN0IHRoZSB1cGRhdGVcclxuICAgICAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBmaW5hbFZhbHVlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUudmFsdWUgPSBmaW5hbFZhbHVlXHJcbiAgICB9XHJcblxyXG4gICAgLy8gaGFja3ksIGJ1dCB0aGVyZSdzIG5vIG90aGVyIHdheSB0byBmb3JjZSBMaXN0Qm94IHRvIHJlLXJlYWQgdGhlIG1vZGVsVmFsdWUgcHJvcCB3aGljaFxyXG4gICAgLy8gd2UgbmVlZCBpbiBjYXNlIHRoZSB1cGRhdGUgd2FzIHJlamVjdGVkIGFuZCBMaXN0Qm94IHN0aWxsIHRoaW5rcyB0aGUgdmFsdWUgaXMgdGhlIG9uZVxyXG4gICAgLy8gdGhhdCB3YXMgY2xpY2tlZCBvblxyXG4gICAgZm9yY2VVcGRhdGVLZXkudmFsdWUgKz0gMVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGhhc1ZhbHVlU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLm11bHRpcGxlICYmIGlzQXJyYXkod3JhcHBlZFZhbHVlLnZhbHVlKSlcclxuICAgIHJldHVybiB3cmFwcGVkVmFsdWUudmFsdWUubGVuZ3RoICE9PSAwXHJcbiAgZWxzZSByZXR1cm4gISF3cmFwcGVkVmFsdWUudmFsdWVcclxufSlcclxuXHJcbmNvbnN0IGNsZWFyVmFsdWUgPSAoKSA9PiB7XHJcbiAgaWYgKHByb3BzLm11bHRpcGxlKSB3cmFwcGVkVmFsdWUudmFsdWUgPSBbXVxyXG4gIGVsc2Ugd3JhcHBlZFZhbHVlLnZhbHVlID0gdW5kZWZpbmVkXHJcbn1cclxuXHJcbmNvbnN0IGZpbmFsSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3Qgc2VhcmNoVmFsID0gc2VhcmNoVmFsdWUudmFsdWVcclxuICBpZiAoIWhhc1NlYXJjaC52YWx1ZSB8fCAhc2VhcmNoVmFsPy5sZW5ndGgpIHJldHVybiBjdXJyZW50SXRlbXMudmFsdWVcclxuXHJcbiAgaWYgKHByb3BzLmZpbHRlclByZWRpY2F0ZSkge1xyXG4gICAgcmV0dXJuIGN1cnJlbnRJdGVtcy52YWx1ZS5maWx0ZXIoXHJcbiAgICAgIChpKSA9PiBwcm9wcy5maWx0ZXJQcmVkaWNhdGU/LihpLCBzZWFyY2hWYWwpIHx8IGZhbHNlXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY3VycmVudEl0ZW1zLnZhbHVlXHJcbn0pXHJcblxyXG5jb25zdCBsaXN0Ym94T3B0aW9uc0NsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdyb3VuZGVkLW1kIGJnLWZvdW5kYXRpb24gcHktMSBsYWJlbCBsYWJlbC0tbGlnaHQgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMgc2hhZG93LW1kJ1xyXG4gIF1cclxuXHJcbiAgaWYgKHByb3BzLm1vdW50TWVudU9uQm9keSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdmaXhlZCB6LTUwJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdhYnNvbHV0ZSB0b3AtWzEwMCVdIHctZnVsbCB6LTQwIG10LTEnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBsaXN0Ym94T3B0aW9uc1N0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGxldCBzdHlsZTogQ1NTUHJvcGVydGllcyA9IHt9XHJcbiAgaWYgKCFpc0NsaWVudCB8fCAhcHJvcHMubW91bnRNZW51T25Cb2R5KSByZXR1cm4gc3R5bGVcclxuXHJcbiAgc3R5bGUgPSB7XHJcbiAgICAuLi5zdHlsZSxcclxuICAgIC4uLm1lbnVTdHlsZS52YWx1ZVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHN0eWxlXHJcbn0pXHJcblxyXG5jb25zdCBzaW1wbGVEaXNwbGF5VGV4dCA9ICh2OiBWYWx1ZVR5cGUpID0+IEpTT04uc3RyaW5naWZ5KHYpXHJcbmNvbnN0IGl0ZW1LZXkgPSAodjogU2luZ2xlSXRlbSk6IHN0cmluZyB8IG51bWJlciA9PiB7XHJcbiAgaWYgKGlzT2JqZWN0TGlrZVR5cGUodikpIHtcclxuICAgIHJldHVybiB2W3Byb3BzLmJ5IHx8ICdpZCddIGFzIHN0cmluZ1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgdHJpZ2dlclNlYXJjaCA9IGFzeW5jICgpID0+IHtcclxuICBpZiAoIWlzQXN5bmNTZWFyY2hNb2RlLnZhbHVlIHx8ICFwcm9wcy5nZXRTZWFyY2hSZXN1bHRzKSByZXR1cm5cclxuXHJcbiAgaXNBc3luY0xvYWRpbmcudmFsdWUgPSB0cnVlXHJcbiAgdHJ5IHtcclxuICAgIGN1cnJlbnRJdGVtcy52YWx1ZSA9IGF3YWl0IHByb3BzLmdldFNlYXJjaFJlc3VsdHMoc2VhcmNoVmFsdWUudmFsdWUpXHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIGlzQXN5bmNMb2FkaW5nLnZhbHVlID0gZmFsc2VcclxuICB9XHJcbn1cclxuY29uc3QgZGVib3VuY2VkU2VhcmNoID0gZGVib3VuY2UodHJpZ2dlclNlYXJjaCwgMTAwMClcclxuXHJcbmNvbnN0IGxpc3Rib3hPcHRpb25DbGFzc2VzID0gKHBhcmFtczogeyBhY3RpdmU6IGJvb2xlYW47IGRpc2FibGVkOiBib29sZWFuIH0pID0+IHtcclxuICBjb25zdCB7IGRpc2FibGVkIH0gPSBwYXJhbXMgfHwge31cclxuXHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFsncmVsYXRpdmUgdHJhbnNpdGlvbiBzZWxlY3Qtbm9uZSBweS0xIHB4LTInXVxyXG5cclxuICBpZiAoZGlzYWJsZWQpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZm9yZWdyb3VuZCBjdXJzb3ItcG9pbnRlcicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufVxyXG5cclxud2F0Y2goXHJcbiAgKCkgPT4gcHJvcHMuaXRlbXMsXHJcbiAgKG5ld0l0ZW1zKSA9PiB7XHJcbiAgICBjdXJyZW50SXRlbXMudmFsdWUgPSBuZXdJdGVtcy5zbGljZSgpXHJcbiAgfSxcclxuICB7IGltbWVkaWF0ZTogdHJ1ZSB9XHJcbilcclxuXHJcbndhdGNoKHNlYXJjaFZhbHVlLCAoKSA9PiB7XHJcbiAgaWYgKCFpc0FzeW5jU2VhcmNoTW9kZS52YWx1ZSkgcmV0dXJuXHJcbiAgdm9pZCBkZWJvdW5jZWRTZWFyY2goKVxyXG59KVxyXG5cclxud2F0Y2goaXNPcGVuLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICBpZiAobmV3VmFsICYmICFvbGRWYWwpIHtcclxuICAgIC8vIFVwZGF0ZSBtZW51IGxvY2F0aW9uICh0byBhdm9pZCBmbGFzaGluZylcclxuICAgIGxpc3Rib3hCdXR0b25Cb3VuZGluZy51cGRhdGUoKVxyXG4gIH1cclxufSlcclxuXHJcbm9uTW91bnRlZCgoKSA9PiB7XHJcbiAgaWYgKGlzQXN5bmNTZWFyY2hNb2RlLnZhbHVlICYmICFwcm9wcy5pdGVtcy5sZW5ndGgpIHtcclxuICAgIHZvaWQgdHJpZ2dlclNlYXJjaCgpXHJcbiAgfVxyXG59KVxyXG5cclxuZGVmaW5lRXhwb3NlKHsgdHJpZ2dlclNlYXJjaCB9KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxDb21tb25CYWRnZVxyXG4gICAgY29sb3ItY2xhc3Nlcz1cInRleHQtZm9yZWdyb3VuZC1vbi1wcmltYXJ5XCJcclxuICAgIHJvdW5kZWRcclxuICAgIDpzdHlsZT1cInsgYmFja2dyb3VuZENvbG9yOiBzb3VyY2VBcHAuYmdDb2xvciB9XCJcclxuICA+XHJcbiAgICB7eyBzb3VyY2VBcHAuc2hvcnQgfX1cclxuICA8L0NvbW1vbkJhZGdlPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgQ29tbW9uQmFkZ2UgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvY29tbW9uL0JhZGdlLnZ1ZSdcclxuaW1wb3J0IHR5cGUgeyBTb3VyY2VBcHBEZWZpbml0aW9uIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5cclxuZGVmaW5lUHJvcHM8e1xyXG4gIHNvdXJjZUFwcDogU291cmNlQXBwRGVmaW5pdGlvblxyXG59PigpXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPEZvcm1TZWxlY3RCYXNlXHJcbiAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXHJcbiAgICA6bXVsdGlwbGU9XCJtdWx0aXBsZVwiXHJcbiAgICA6aXRlbXM9XCJpdGVtcyA/PyBTb3VyY2VBcHBzXCJcclxuICAgIDpzZWFyY2g9XCJzZWFyY2hcIlxyXG4gICAgOnNlYXJjaC1wbGFjZWhvbGRlcj1cInNlYXJjaFBsYWNlaG9sZGVyXCJcclxuICAgIDpsYWJlbD1cImxhYmVsXCJcclxuICAgIDpzaG93LWxhYmVsPVwic2hvd0xhYmVsXCJcclxuICAgIDpuYW1lPVwibmFtZSB8fCAnc291cmNlQXBwcydcIlxyXG4gICAgOmZpbHRlci1wcmVkaWNhdGU9XCJzZWFyY2hGaWx0ZXJQcmVkaWNhdGVcIlxyXG4gICAgOmNsZWFyYWJsZT1cImNsZWFyYWJsZVwiXHJcbiAgICA6aGVscD1cImhlbHBcIlxyXG4gICAgOmxhYmVsLWlkPVwibGFiZWxJZFwiXHJcbiAgICA6YnV0dG9uLWlkPVwiYnV0dG9uSWRcIlxyXG4gICAgYnk9XCJuYW1lXCJcclxuICA+XHJcbiAgICA8dGVtcGxhdGUgI25vdGhpbmctc2VsZWN0ZWQ+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2VsZWN0b3JQbGFjZWhvbGRlclwiPlxyXG4gICAgICAgIHt7IHNlbGVjdG9yUGxhY2Vob2xkZXIgfX1cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgICB7eyBtdWx0aXBsZSA/ICdTZWxlY3QgYXBwcycgOiAnU2VsZWN0IGFuIGFwcCcgfX1cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI3NvbWV0aGluZy1zZWxlY3RlZD1cInsgdmFsdWUgfVwiPlxyXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cImlzTXVsdGlJdGVtQXJyYXlWYWx1ZSh2YWx1ZSlcIj5cclxuICAgICAgICA8ZGl2IHJlZj1cImVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlc1wiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0wLjUgaC01XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHJlZj1cIml0ZW1Db250YWluZXJcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC13cmFwIG92ZXJmbG93LWhpZGRlbiBzcGFjZS14LTAuNSBoLTVcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8U291cmNlQXBwQmFkZ2Ugdi1mb3I9XCJpdGVtIGluIHZhbHVlXCIgOmtleT1cIml0ZW0ubmFtZVwiIDpzb3VyY2UtYXBwPVwiaXRlbVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1pZj1cImhpZGRlblNlbGVjdGVkSXRlbUNvdW50ID4gMFwiIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTIgbm9ybWFsXCI+XHJcbiAgICAgICAgICAgICt7eyBoaWRkZW5TZWxlY3RlZEl0ZW1Db3VudCB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiaC0yIHctMiByb3VuZGVkLWZ1bGwgbXItMlwiXHJcbiAgICAgICAgICAgIDpzdHlsZT1cInsgYmFja2dyb3VuZENvbG9yOiBmaXJzdEl0ZW0odmFsdWUpLmJnQ29sb3IgfVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZVwiPnt7IGZpcnN0SXRlbSh2YWx1ZSkubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI29wdGlvbj1cInsgaXRlbSB9XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiaC0yIHctMiByb3VuZGVkLWZ1bGwgbXItMlwiXHJcbiAgICAgICAgICA6c3R5bGU9XCJ7IGJhY2tncm91bmRDb2xvcjogaXRlbS5iZ0NvbG9yIH1cIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZVwiPnt7IGl0ZW0ubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gIDwvRm9ybVNlbGVjdEJhc2U+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUsIE9wdGlvbmFsLCBTb3VyY2VBcHBEZWZpbml0aW9uIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBTb3VyY2VBcHBzIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyByZWYsIHRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBQcm9wVHlwZSB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHsgdXNlRm9ybVNlbGVjdENoaWxkSW50ZXJuYWxzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2Zvcm0vc2VsZWN0J1xyXG5pbXBvcnQgRm9ybVNlbGVjdEJhc2UgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QvQmFzZS52dWUnXHJcbmltcG9ydCBTb3VyY2VBcHBCYWRnZSBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9Tb3VyY2VBcHBCYWRnZS52dWUnXHJcblxyXG50eXBlIFZhbHVlVHlwZSA9IFNvdXJjZUFwcERlZmluaXRpb24gfCBTb3VyY2VBcHBEZWZpbml0aW9uW10gfCB1bmRlZmluZWRcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHY6IFZhbHVlVHlwZSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBhbGxvdyBzZWxlY3RpbmcgbXVsdGlwbGUgc291cmNlIGFwcHNcclxuICAgKi9cclxuICBtdWx0aXBsZToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBtb2RlbFZhbHVlOiB7XHJcbiAgICB0eXBlOiBbT2JqZWN0LCBBcnJheV0gYXMgUHJvcFR5cGU8VmFsdWVUeXBlPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBhbGxvdyBmaWx0ZXJpbmcgc291cmNlIGFwcHMgdGhyb3VnaCBhIHNlYXJjaCBib3hcclxuICAgKi9cclxuICBzZWFyY2g6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogU2VhcmNoIHBsYWNlaG9sZGVyIHRleHRcclxuICAgKi9cclxuICBzZWFyY2hQbGFjZWhvbGRlcjoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgZGVmYXVsdDogJ1NlYXJjaCBhcHBzJ1xyXG4gIH0sXHJcbiAgc2VsZWN0b3JQbGFjZWhvbGRlcjoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBMYWJlbCBpcyByZXF1aXJlZCBhdCB0aGUgdmVyeSBsZWFzdCBmb3Igc2NyZWVuLXJlYWRlcnNcclxuICAgKi9cclxuICBsYWJlbDoge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgcmVxdWlyZWQ6IHRydWVcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgbGFiZWwgdmlzdWFsbHlcclxuICAgKi9cclxuICBzaG93TGFiZWw6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgbmFtZToge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBDb250cm9sIHNvdXJjZSBhcHBzIHRvIHNob3cuIElmIGxlZnQgdW5kZWZpbmVkLCB3aWxsIHNob3cgYWxsIGF2YWlsYWJsZSBvcHRpb25zLlxyXG4gICAqL1xyXG4gIGl0ZW1zOiB7XHJcbiAgICB0eXBlOiBBcnJheSBhcyBQcm9wVHlwZTxPcHRpb25hbDxTb3VyY2VBcHBEZWZpbml0aW9uW10+PixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgY2xlYXJhYmxlOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuXHJcbiAgfSxcclxuICBoZWxwOiB7XHJcbiAgICB0eXBlOiBTdHJpbmdcclxuICB9LFxyXG4gIGxhYmVsSWQ6IHtcclxuICAgIHR5cGU6IFN0cmluZ1xyXG4gIH0sXHJcbiAgYnV0dG9uSWQ6IHtcclxuICAgIHR5cGU6IFN0cmluZ1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGVsZW1lbnRUb1dhdGNoRm9yQ2hhbmdlcyA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxFbGVtZW50PilcclxuY29uc3QgaXRlbUNvbnRhaW5lciA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxFbGVtZW50PilcclxuXHJcbmNvbnN0IHsgc2VsZWN0ZWRWYWx1ZSwgaGlkZGVuU2VsZWN0ZWRJdGVtQ291bnQsIGlzTXVsdGlJdGVtQXJyYXlWYWx1ZSwgZmlyc3RJdGVtIH0gPVxyXG4gIHVzZUZvcm1TZWxlY3RDaGlsZEludGVybmFsczxTb3VyY2VBcHBEZWZpbml0aW9uPih7XHJcbiAgICBwcm9wczogdG9SZWZzKHByb3BzKSxcclxuICAgIGVtaXQsXHJcbiAgICBkeW5hbWljVmlzaWJpbGl0eTogeyBlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMsIGl0ZW1Db250YWluZXIgfVxyXG4gIH0pXHJcblxyXG5jb25zdCBzZWFyY2hGaWx0ZXJQcmVkaWNhdGUgPSAoaTogU291cmNlQXBwRGVmaW5pdGlvbiwgc2VhcmNoOiBzdHJpbmcpID0+XHJcbiAgaS5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoLnRvTG9jYWxlTG93ZXJDYXNlKCkpXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPEZvcm1TZWxlY3RCYXNlXHJcbiAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXHJcbiAgICA6bXVsdGlwbGU9XCJtdWx0aXBsZVwiXHJcbiAgICA6aXRlbXM9XCJpdGVtc1wiXHJcbiAgICA6bGFiZWw9XCJsYWJlbFwiXHJcbiAgICA6bmFtZT1cIm5hbWVcIlxyXG4gICAgOmhlbHA9XCJoZWxwXCJcclxuICAgIDpydWxlcz1cInJ1bGVzXCJcclxuICAgIDpieT1cImJ5XCJcclxuICAgIDpsYWJlbC1pZD1cImxhYmVsSWRcIlxyXG4gICAgOmJ1dHRvbi1pZD1cImJ1dHRvbklkXCJcclxuICA+XHJcbiAgICA8dGVtcGxhdGUgI3NvbWV0aGluZy1zZWxlY3RlZD1cInsgdmFsdWUgfVwiPlxyXG4gICAgICA8dWwgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMS41XCI+XHJcbiAgICAgICAgPGxpIHYtZm9yPVwiaXRlbSBpbiBpc0FycmF5VmFsdWUodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdXCIgOmtleT1cIml0ZW1bYnldXCI+XHJcbiAgICAgICAgICA8Q29tbW9uQmFkZ2VcclxuICAgICAgICAgICAgc2l6ZT1cImxnXCJcclxuICAgICAgICAgICAgY29sb3ItY2xhc3Nlcz1cImJvcmRlciBib3JkZXItb3V0bGluZS0yIGJnLWZvdW5kYXRpb24tcGFnZVwiXHJcbiAgICAgICAgICAgIGRvdC1pY29uLWNvbG9yLWNsYXNzZXM9XCJ0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICByb3VuZGVkXHJcbiAgICAgICAgICAgIDpjbGlja2FibGUtaWNvbj1cInRydWVcIlxyXG4gICAgICAgICAgICA6aWNvbi1sZWZ0PVwiWE1hcmtJY29uXCJcclxuICAgICAgICAgICAgQGNsaWNrLWljb24uc3RvcD1cImRlc2VsZWN0SXRlbShpdGVtKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGl0ZW0udGV4dCB9fVxyXG4gICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICA8L2xpPlxyXG4gICAgICA8L3VsPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSAjb3B0aW9uPVwieyBpdGVtIH1cIj5cclxuICAgICAge3sgaXRlbS50ZXh0IH19XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gIDwvRm9ybVNlbGVjdEJhc2U+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG4vLyBWdWUgY29tcG9uZW50cyBkb24ndCBzdXBwb3J0IGdlbmVyaWMgcHJvcHMsIHNvIGhhdmluZyB0byByZWx5IG9uIGFueVxyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xyXG5cclxuaW1wb3J0IHsgdG9SZWZzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgRm9ybVNlbGVjdEJhc2UgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QvQmFzZS52dWUnXHJcbmltcG9ydCBDb21tb25CYWRnZSBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9jb21tb24vQmFkZ2UudnVlJ1xyXG5pbXBvcnQgeyB1c2VGb3JtU2VsZWN0Q2hpbGRJbnRlcm5hbHMgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS9zZWxlY3QnXHJcbmltcG9ydCB7IFhNYXJrSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L3NvbGlkJ1xyXG5cclxudHlwZSBTaW5nbGVJdGVtID0gYW55XHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWw6IEFycmF5PFNpbmdsZUl0ZW0+KTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBpdGVtczogQXJyYXk8U2luZ2xlSXRlbT5cclxuICBsYWJlbDogc3RyaW5nXHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgaGVscD86IHN0cmluZ1xyXG4gIG1vZGVsVmFsdWU/OiBTaW5nbGVJdGVtIHwgU2luZ2xlSXRlbVtdIHwgdW5kZWZpbmVkXHJcbiAgbXVsdGlwbGU/OiBib29sZWFuXHJcbiAgcnVsZXM/OiBBcnJheTxhbnk+XHJcbiAgYnk6IHN0cmluZ1xyXG4gIGxhYmVsSWQ/OiBzdHJpbmdcclxuICBidXR0b25JZD86IHN0cmluZ1xyXG59PigpXHJcblxyXG5jb25zdCB7IHNlbGVjdGVkVmFsdWUsIGlzQXJyYXlWYWx1ZSB9ID0gdXNlRm9ybVNlbGVjdENoaWxkSW50ZXJuYWxzPFNpbmdsZUl0ZW0+KHtcclxuICBwcm9wczogdG9SZWZzKHByb3BzKSxcclxuICBlbWl0XHJcbn0pXHJcblxyXG5jb25zdCBkZXNlbGVjdEl0ZW0gPSAoaXRlbTogU2luZ2xlSXRlbSkgPT4ge1xyXG4gIGlmIChpc0FycmF5VmFsdWUoc2VsZWN0ZWRWYWx1ZS52YWx1ZSkpIHtcclxuICAgIHNlbGVjdGVkVmFsdWUudmFsdWUgPSBzZWxlY3RlZFZhbHVlLnZhbHVlLmZpbHRlcigoaSkgPT4gaS5pZCAhPT0gaXRlbS5pZClcclxuICB9IGVsc2Uge1xyXG4gICAgc2VsZWN0ZWRWYWx1ZS52YWx1ZSA9IHVuZGVmaW5lZFxyXG4gIH1cclxufVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIDprZXk9XCJmb3JjZVVwZGF0ZUtleVwiXHJcbiAgICAgIDpjbGFzcz1cIntcclxuICAgICAgICAnbWQ6ZmxleCBtZDppdGVtcy1jZW50ZXIgbWQ6c3BhY2UteC0yIG1kOmp1c3RpZnktYmV0d2Vlbic6IGlzTGVmdExhYmVsUG9zaXRpb25cclxuICAgICAgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgOmNsYXNzPVwieyAncGItMSc6IHNob3dMYWJlbCAmJiAhaXNMZWZ0TGFiZWxQb3NpdGlvbiB9XCI+XHJcbiAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICA6aWQ9XCJsYWJlbElkXCJcclxuICAgICAgICAgIGNsYXNzPVwiZmxleCB0ZXh0LWJvZHkteHMgdGV4dC1mb3JlZ3JvdW5kIGZvbnQtbWVkaXVtIHBvaW50ZXItZXZlbnRzLW5vbmVcIlxyXG4gICAgICAgICAgOmNsYXNzPVwiW3sgJ3NyLW9ubHknOiAhc2hvd0xhYmVsIH0sIHsgJ2l0ZW1zLWNlbnRlciBnYXAtMSc6IHNob3dPcHRpb25hbCB9XVwiXHJcbiAgICAgICAgICA6Zm9yPVwiYnV0dG9uSWRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGxhYmVsIH19XHJcbiAgICAgICAgICA8ZGl2IHYtaWY9XCJzaG93UmVxdWlyZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyIHRleHQteHMgb3BhY2l0eS04MFwiPio8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1lbHNlLWlmPVwic2hvd09wdGlvbmFsXCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGZvbnQtbm9ybWFsXCI+XHJcbiAgICAgICAgICAgIChvcHRpb25hbClcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPHBcclxuICAgICAgICAgIHYtaWY9XCJoZWxwVGlwSWQgJiYgaXNMZWZ0TGFiZWxQb3NpdGlvblwiXHJcbiAgICAgICAgICA6aWQ9XCJoZWxwVGlwSWRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzXCJcclxuICAgICAgICAgIDpjbGFzcz1cImhlbHBUaXBDbGFzc2VzXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBoZWxwVGlwIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiB2LXRpcHB5PVwidG9vbHRpcFRleHRcIj5cclxuICAgICAgICA8ZGl2IDpjbGFzcz1cImJ1dHRvbnNXcmFwcGVyQ2xhc3Nlc1wiPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICA6aWQ9XCJidXR0b25JZFwiXHJcbiAgICAgICAgICAgIHJlZj1cImxpc3Rib3hCdXR0b25cIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgOmNsYXNzPVwiYnV0dG9uQ2xhc3Nlc1wiXHJcbiAgICAgICAgICAgIDphcmlhLWV4cGFuZGVkPVwiaXNPcGVuXCJcclxuICAgICAgICAgICAgOmFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwidG9nZ2xlRHJvcGRvd25cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHctZnVsbFwiPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdHJ1bmNhdGUgZ3JvdyB0ZXh0LWxlZnQgdGV4dC14cyBzbTp0ZXh0LVsxM3B4XVwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbaGFzVmFsdWVTZWxlY3RlZCA/ICd0ZXh0LWZvcmVncm91bmQnIDogJ3RleHQtZm9yZWdyb3VuZC0yJ11cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICB2LWlmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIXdyYXBwZWRWYWx1ZSB8fCAoaXNBcnJheSh3cmFwcGVkVmFsdWUpICYmICF3cmFwcGVkVmFsdWUubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwibm90aGluZy1zZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHBsYWNlaG9sZGVyID8gcGxhY2Vob2xkZXIgOiBsYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNvbWV0aGluZy1zZWxlY3RlZFwiIDp2YWx1ZT1cIndyYXBwZWRWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHNpbXBsZURpc3BsYXlUZXh0KHdyYXBwZWRWYWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9zbG90PlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXItZXZlbnRzLW5vbmUgc2hyaW5rLTAgbWwtMSBmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxFeGNsYW1hdGlvbkNpcmNsZUljb25cclxuICAgICAgICAgICAgICAgICAgdi1pZj1cImVycm9yTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICB2LWVsc2UtaWY9XCIhc2hvd0xhYmVsICYmIHNob3dSZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC00eGwgdGV4dC1kYW5nZXIgb3BhY2l0eS01MCBoLTQgdy00IGxlYWRpbmctNlwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPENoZXZyb25VcEljb25cclxuICAgICAgICAgICAgICAgICAgdi1pZj1cImlzT3BlblwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxDaGV2cm9uRG93bkljb25cclxuICAgICAgICAgICAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHYtaWY9XCJyZW5kZXJDbGVhckJ1dHRvblwiXHJcbiAgICAgICAgICAgIDpjbGFzcz1cImNsZWFyQnV0dG9uQ2xhc3Nlc1wiXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwiY2xlYXJWYWx1ZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPFhNYXJrSWNvbiBjbGFzcz1cInctMyBoLTNcIiAvPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPFRyYW5zaXRpb25cclxuICAgICAgICAgICAgdi1pZj1cImlzTW91bnRlZFwiXHJcbiAgICAgICAgICAgIGxlYXZlLWFjdGl2ZS1jbGFzcz1cInRyYW5zaXRpb24gZWFzZS1pbiBkdXJhdGlvbi0xMDBcIlxyXG4gICAgICAgICAgICBsZWF2ZS1mcm9tLWNsYXNzPVwib3BhY2l0eS0xMDBcIlxyXG4gICAgICAgICAgICBsZWF2ZS10by1jbGFzcz1cIm9wYWNpdHktMFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxUZWxlcG9ydCB0bz1cImJvZHlcIiA6ZGlzYWJsZWQ9XCIhbW91bnRNZW51T25Cb2R5XCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgdi1pZj1cImlzT3BlblwiXHJcbiAgICAgICAgICAgICAgICByZWY9XCJtZW51RWxcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwibGlzdGJveE9wdGlvbnNDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgIDpzdHlsZT1cImxpc3Rib3hPcHRpb25zU3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxyXG4gICAgICAgICAgICAgICAgOmFyaWEtbGFiZWxsZWRieT1cImxhYmVsSWRcIlxyXG4gICAgICAgICAgICAgICAgQGZvY3VzPVwic2VhcmNoSW5wdXQ/LmZvY3VzKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGlucHV0IHNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgdi1pZj1cImhhc1NlYXJjaFwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBteC0xIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5IGxhYmVsIHRleHQtZm9yZWdyb3VuZFwiPlNlYXJjaDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIHRvcC0wIGJvdHRvbS0wIGxlZnQtMCBmbGV4IGl0ZW1zLWNlbnRlciBwbC0yXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8TWFnbmlmeWluZ0dsYXNzSWNvbiBjbGFzcz1cImgtNCB3LTQgdGV4dC1mb3JlZ3JvdW5kLTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVmPVwic2VhcmNoSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cInNlYXJjaFZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHktMSBwbC03IHctZnVsbCBiZy1mb3VuZGF0aW9uIHBsYWNlaG9sZGVyOmZvbnQtbm9ybWFsIG5vcm1hbCBwbGFjZWhvbGRlcjp0ZXh0LWZvcmVncm91bmQtMiB0ZXh0LVsxM3B4XSBmb2N1cy12aXNpYmxlOltib3gtc2hhZG93Om5vbmVdIHJvdW5kZWQtbWQgaG92ZXI6Ym9yZGVyLW91dGxpbmUtNSBmb2N1cy12aXNpYmxlOmJvcmRlci1vdXRsaW5lLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOnBsYWNlaG9sZGVyPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGtleWRvd24uc3RvcFxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIHJlZj1cIm9wdGlvbnNDb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm92ZXJmbG93LWF1dG8gc2ltcGxlLXNjcm9sbGJhciBtYXgtaC02MCB4bDptYXgtaC04MCBnYXAtMSBmbGV4IGZsZXgtY29sXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwiaXNBc3luY1NlYXJjaE1vZGUgJiYgaXNBc3luY0xvYWRpbmdcIiBjbGFzcz1cInB4LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Q29tbW9uTG9hZGluZ0JhciA6bG9hZGluZz1cInRydWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB2LWVsc2UtaWY9XCJpc0FzeW5jU2VhcmNoTW9kZSAmJiAhY3VycmVudEl0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMiB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cIm5vdGhpbmctZm91bmRcIj5Ob3RoaW5nIGZvdW5kPC9zbG90PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCIhaXNBc3luY1NlYXJjaE1vZGUgfHwgIWlzQXN5bmNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGZpbmFsSXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOmtleT1cIml0ZW1LZXkoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdi10aXBweT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZEl0ZW1QcmVkaWNhdGU/LihpdGVtKSA/IGRpc2FibGVkSXRlbVRvb2x0aXAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOmFyaWEtc2VsZWN0ZWQ9XCJpc1NlbGVjdGVkKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpjbGFzcz1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0Ym94T3B0aW9uQ2xhc3Nlcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pIHx8IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPVwiKGUpID0+IHNlbGVjdEl0ZW0oaXRlbSwgZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJibG9jayB3LWZ1bGwgcHgtMiBweS0xLjUgcm91bmRlZC1tZCB0ZXh0LWxlZnQgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWhpZGVDaGVja21hcmtzID8gJ3ByLTgnIDogJ3ByLTInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFkaXNhYmxlZEl0ZW1QcmVkaWNhdGU/LihpdGVtKSAmJiAhaXNTZWxlY3RlZChpdGVtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnaG92ZXI6YmctaGlnaGxpZ2h0LTEnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Rm9ybUNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOm5hbWU9XCJgc2VsZWN0LSR7aXRlbUtleShpdGVtKX1gXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2hlY2tlZD1cImlzU2VsZWN0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkSXRlbVByZWRpY2F0ZT8uKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6aGlkZS1sYWJlbD1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBjaGFuZ2Uuc3RvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2xvdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJvcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDppdGVtPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOnNlbGVjdGVkPVwiaXNTZWxlY3RlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRJdGVtUHJlZGljYXRlPy4oaXRlbSkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2ltcGxlRGlzcGxheVRleHQoaXRlbSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbG90PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9UZWxlcG9ydD5cclxuICAgICAgICAgIDwvVHJhbnNpdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwXHJcbiAgICAgIHYtaWY9XCJoZWxwVGlwSWQgJiYgIWlzTGVmdExhYmVsUG9zaXRpb25cIlxyXG4gICAgICA6aWQ9XCJoZWxwVGlwSWRcIlxyXG4gICAgICBjbGFzcz1cIm10LTIgdGV4dC14c1wiXHJcbiAgICAgIDpjbGFzcz1cImhlbHBUaXBDbGFzc2VzXCJcclxuICAgID5cclxuICAgICAge3sgaGVscFRpcCB9fVxyXG4gICAgPC9wPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0XHJcbiAgc2V0dXBcclxuICBsYW5nPVwidHNcIlxyXG4gIGdlbmVyaWM9XCJTaW5nbGVJdGVtIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBzdHJpbmcgfCBudW1iZXJcIlxyXG4+XHJcbmltcG9ydCB7XHJcbiAgQ2hldnJvbkRvd25JY29uLFxyXG4gIENoZXZyb25VcEljb24sXHJcbiAgTWFnbmlmeWluZ0dsYXNzSWNvbixcclxuICBYTWFya0ljb24sXHJcbiAgRXhjbGFtYXRpb25DaXJjbGVJY29uXHJcbn0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjAvc29saWQnXHJcbmltcG9ydCB7IGRlYm91bmNlLCBpc0FycmF5LCBpc09iamVjdExpa2UgfSBmcm9tICcjbG9kYXNoJ1xyXG5pbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMsIFByb3BUeXBlLCBSZWYgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvbk1vdW50ZWQsIHJlZiwgdW5yZWYsIHdhdGNoLCBuZXh0VGljayB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZUFzeW5jLCBOdWxsYWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZUZpZWxkIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgdHlwZSB7IFJ1bGVFeHByZXNzaW9uIH0gZnJvbSAndmVlLXZhbGlkYXRlJ1xyXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnXHJcbmltcG9ydCBDb21tb25Mb2FkaW5nQmFyIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9sb2FkaW5nL0Jhci52dWUnXHJcbmltcG9ydCB7XHJcbiAgdXNlRWxlbWVudEJvdW5kaW5nLFxyXG4gIHVzZU1vdW50ZWQsXHJcbiAgdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIsXHJcbiAgb25DbGlja091dHNpZGVcclxufSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB0eXBlIHsgTGFiZWxQb3NpdGlvbiB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL2lucHV0J1xyXG5pbXBvcnQgeyBkaXJlY3RpdmUgYXMgdlRpcHB5IH0gZnJvbSAndnVlLXRpcHB5J1xyXG5pbXBvcnQgRm9ybUNoZWNrYm94IGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2Zvcm0vQ2hlY2tib3gudnVlJ1xyXG5cclxudHlwZSBCdXR0b25TdHlsZSA9ICdiYXNlJyB8ICdzaW1wbGUnIHwgJ3RpbnRlZCdcclxudHlwZSBWYWx1ZVR5cGUgPSBTaW5nbGVJdGVtIHwgU2luZ2xlSXRlbVtdIHwgdW5kZWZpbmVkXHJcbnR5cGUgSW5wdXRTaXplID0gJ3NtJyB8ICdiYXNlJyB8ICdsZycgfCAneGwnXHJcblxyXG5jb25zdCBpc09iamVjdExpa2VUeXBlID0gKHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IGlzT2JqZWN0TGlrZSh2KVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdjogVmFsdWVUeXBlKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICBzaXplOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8T3B0aW9uYWw8SW5wdXRTaXplPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIGl0ZW1zOiB7XHJcbiAgICB0eXBlOiBBcnJheSBhcyBQcm9wVHlwZTxTaW5nbGVJdGVtW10+LFxyXG4gICAgZGVmYXVsdDogKCkgPT4gW11cclxuICB9LFxyXG4gIG1vZGVsVmFsdWU6IHtcclxuICAgIHR5cGU6IFtBcnJheSwgT2JqZWN0LCBTdHJpbmcsIE51bWJlcl0gYXMgUHJvcFR5cGU8VmFsdWVUeXBlPixcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBlbmFibGUgdGhlIHNlYXJjaCBiYXIuIFlvdSBtdXN0IGFsc28gc2V0IG9uZSBvZiB0aGUgZm9sbG93aW5nOlxyXG4gICAqICogZmlsdGVyUHJlZGljYXRlIC0gdG8gYWxsb3cgZmlsdGVyaW5nIHBhc3NlZCBpbiBgaXRlbXNgIGJhc2VkIG9uIHNlYXJjaCBiYXJcclxuICAgKiAqIGdldFNlYXJjaFJlc3VsdHMgLSB0byBhbGxvdyBhc3luY2hyb25vdXNseSBsb2FkaW5nIGl0ZW1zIGZyb20gc2VydmVyIChwcm9wcy5pdGVtcyBubyBsb25nZXIgcmVxdWlyZWQgaW4gdGhpcyBjYXNlLFxyXG4gICAqICBidXQgY2FuIGJlIHVzZWQgdG8gcHJlZmlsbCBpbml0aWFsIHZhbHVlcylcclxuICAgKi9cclxuICBzZWFyY2g6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogSWYgc2VhcmNoPXRydWUgYW5kIHRoaXMgaXMgc2V0LCB5b3UgY2FuIHVzZSB0aGlzIHRvIGZpbHRlciBwYXNzZWQgaW4gaXRlbXMgYmFzZWQgb24gd2hhdGV2ZXJcclxuICAgKiB0aGUgdXNlciBlbnRlcnMgaW4gdGhlIHNlYXJjaCBiYXJcclxuICAgKi9cclxuICBmaWx0ZXJQcmVkaWNhdGU6IHtcclxuICAgIHR5cGU6IEZ1bmN0aW9uIGFzIFByb3BUeXBlPFxyXG4gICAgICBPcHRpb25hbDwoaXRlbTogU2luZ2xlSXRlbSwgc2VhcmNoU3RyaW5nOiBzdHJpbmcpID0+IGJvb2xlYW4+XHJcbiAgICA+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBTZXQgdGhpcyB0byBkaXNhYmxlIGNlcnRhaW4gaXRlbXMgaW4gdGhlIGxpc3RcclxuICAgKi9cclxuICBkaXNhYmxlZEl0ZW1QcmVkaWNhdGU6IHtcclxuICAgIHR5cGU6IEZ1bmN0aW9uIGFzIFByb3BUeXBlPE9wdGlvbmFsPChpdGVtOiBTaW5nbGVJdGVtKSA9PiBib29sZWFuPj4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIElmIHNlYXJjaD10cnVlIGFuZCB0aGlzIGlzIHNldCwgeW91IGNhbiB1c2UgdGhpcyB0byBsb2FkIGRhdGEgYXN5bmNocm9ub3VzbHkgZGVwZW5kaW5nXHJcbiAgICogb24gdGhlIHNlYXJjaCBxdWVyeVxyXG4gICAqL1xyXG4gIGdldFNlYXJjaFJlc3VsdHM6IHtcclxuICAgIHR5cGU6IEZ1bmN0aW9uIGFzIFByb3BUeXBlPFxyXG4gICAgICBPcHRpb25hbDwoc2VhcmNoU3RyaW5nOiBzdHJpbmcpID0+IE1heWJlQXN5bmM8U2luZ2xlSXRlbVtdPj5cclxuICAgID4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9LFxyXG4gIHNlYXJjaFBsYWNlaG9sZGVyOiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiAnU2VhcmNoJ1xyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogTGFiZWwgaXMgcmVxdWlyZWQgYXQgdGhlIHZlcnkgbGVhc3QgZm9yIHNjcmVlbi1yZWFkZXJzXHJcbiAgICovXHJcbiAgbGFiZWw6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBPcHRpb25hbCB0ZXh0IHRoYXQgcmVwbGFjZXMgdGhlIGxhYmVsIGFzIHRoZSBwbGFjZWhvbGRlciB3aGVuIHNldC5cclxuICAgKi9cclxuICBwbGFjZWhvbGRlcjoge1xyXG4gICAgdHlwZTogU3RyaW5nXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIGxhYmVsIHZpc3VhbGx5XHJcbiAgICovXHJcbiAgc2hvd0xhYmVsOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIG5hbWU6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBPYmplY3RzIHdpbGwgYmUgY29tcGFyZWQgYnkgdGhlIHZhbHVlcyBpbiB0aGUgc3BlY2lmaWVkIHByb3BcclxuICAgKi9cclxuICBieToge1xyXG4gICAgdHlwZTogU3RyaW5nLFxyXG4gICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgfSxcclxuICBkaXNhYmxlZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxPcHRpb25hbDxib29sZWFuPj4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgYnV0dG9uU3R5bGU6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxPcHRpb25hbDxCdXR0b25TdHlsZT4+LFxyXG4gICAgZGVmYXVsdDogJ2Jhc2UnXHJcbiAgfSxcclxuICBoaWRlQ2hlY2ttYXJrczoge1xyXG4gICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxPcHRpb25hbDxib29sZWFuPj4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgYWxsb3dVbnNldDoge1xyXG4gICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxPcHRpb25hbDxib29sZWFuPj4sXHJcbiAgICBkZWZhdWx0OiB0cnVlXHJcbiAgfSxcclxuICBjbGVhcmFibGU6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGlvbiBzdHVmZlxyXG4gICAqL1xyXG4gIHJ1bGVzOiB7XHJcbiAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3QsIEZ1bmN0aW9uLCBBcnJheV0gYXMgUHJvcFR5cGU8XHJcbiAgICAgIE9wdGlvbmFsPFJ1bGVFeHByZXNzaW9uPFZhbHVlVHlwZT4+XHJcbiAgICA+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiB2ZWUtdmFsaWRhdGUgdmFsaWRhdGlvbigpIG9uIGNvbXBvbmVudCBtb3VudFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25Nb3VudDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHRyaWdnZXIgdmFsaWRhdGlvbiB3aGVuZXZlciB0aGUgdmFsdWUgY2hhbmdlc1xyXG4gICAqL1xyXG4gIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaWxsIHJlcGxhY2UgdGhlIGdlbmVyaWMgXCJWYWx1ZVwiIHRleHQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgaW4gZXJyb3IgbWVzc2FnZXNcclxuICAgKi9cclxuICB1c2VMYWJlbEluRXJyb3JzOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogdHJ1ZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgaGVscCB0ZXh0XHJcbiAgICovXHJcbiAgaGVscDoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPE9wdGlvbmFsPHN0cmluZz4+LFxyXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugc2l6ZSBhdHRyaWJ1dGUgaW5zdGVhZFxyXG4gICAqL1xyXG4gIGZpeGVkSGVpZ2h0OiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIEJ5IGRlZmF1bHQgY29tcG9uZW50IGhvbGRzIGl0cyBvd24gaW50ZXJuYWwgdmFsdWUgc3RhdGUgc28gdGhhdCBldmVuIGlmIHlvdSBkb24ndCBoYXZlIGl0IHRpZWQgdXAgdG8gYSByZWFsIGBtb2RlbFZhbHVlYCByZWYgc29tZXdoZXJlXHJcbiAgICogaXQga25vd3MgaXRzIGludGVybmFsIHN0YXRlIGFuZCBjYW4gcmVwb3J0IGl0IG9uIGZvcm0gc3VibWl0cy5cclxuICAgKlxyXG4gICAqIElmIHlvdSBzZXQgdGhpcyB0byB0cnVlLCBpdHMgb25seSBnb2luZyB0byByZWx5IG9uIGBtb2RlbFZhbHVlYCBhcyBpdHMgcHJpbWFyeSBzb3VyY2Ugb2YgdHJ1dGggc28gdGhhdCB5b3UgY2FuIHJlamVjdCB1cGRhdGVzIGV0Yy5cclxuICAgKi9cclxuICBmdWxseUNvbnRyb2xWYWx1ZToge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHJlZCBcInJlcXVpcmVkXCIgYXN0ZXJpc2tcclxuICAgKi9cclxuICBzaG93UmVxdWlyZWQ6IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBvcHRpb25hbCB0ZXh0XHJcbiAgICovXHJcbiAgc2hvd09wdGlvbmFsOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gbW91bnQgdGhlIG1lbnUgb24gdGhlIGJvZHkgaW5zdGVhZCBvZiBpbnNpZGUgdGhlIGNvbXBvbmVudC4gVXNlZnVsIHdoZW4gc2VsZWN0IGJveCBpcyBtb3VudGVkIHdpdGhpblxyXG4gICAqIGRpYWxvZyB3aW5kb3dzIGFuZCB0aGUgbWVudSBjYXVzZXMgdW5uZWNlc3Nhcnkgb3ZlcmZsb3cuXHJcbiAgICovXHJcbiAgbW91bnRNZW51T25Cb2R5OiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIGxhYmVsSWQ6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgYnV0dG9uSWQ6IHtcclxuICAgIHR5cGU6IFN0cmluZyxcclxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogVG9vbHRpcCBzaG93biBvbiBkaXNhYmxlZCBpdGVtc1xyXG4gICAqL1xyXG4gIGRpc2FibGVkSXRlbVRvb2x0aXA6IHtcclxuICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgIHR5cGU6IFN0cmluZ1xyXG4gIH0sXHJcbiAgbGFiZWxQb3NpdGlvbjoge1xyXG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPExhYmVsUG9zaXRpb24+LFxyXG4gICAgZGVmYXVsdDogJ3RvcCdcclxuICB9LFxyXG4gIHRvb2x0aXBUZXh0OiB7XHJcbiAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB7IHZhbHVlLCBlcnJvck1lc3NhZ2U6IGVycm9yIH0gPSB1c2VGaWVsZDxWYWx1ZVR5cGU+KHByb3BzLm5hbWUsIHByb3BzLnJ1bGVzLCB7XHJcbiAgdmFsaWRhdGVPbk1vdW50OiBwcm9wcy52YWxpZGF0ZU9uTW91bnQsXHJcbiAgdmFsaWRhdGVPblZhbHVlVXBkYXRlOiBwcm9wcy52YWxpZGF0ZU9uVmFsdWVVcGRhdGUsXHJcbiAgaW5pdGlhbFZhbHVlOiBpc0FycmF5KHByb3BzLm1vZGVsVmFsdWUpID8gcHJvcHMubW9kZWxWYWx1ZSA6IFtdXHJcbn0pXHJcblxyXG5jb25zdCBpc01vdW50ZWQgPSB1c2VNb3VudGVkKClcclxuXHJcbmNvbnN0IHNlYXJjaElucHV0ID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTElucHV0RWxlbWVudD4pXHJcbmNvbnN0IG1lbnVFbCA9IHJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpXHJcbmNvbnN0IGxpc3Rib3hCdXR0b24gPSByZWY8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKVxyXG5jb25zdCBzZWFyY2hWYWx1ZSA9IHJlZignJylcclxuY29uc3QgY3VycmVudEl0ZW1zID0gcmVmKFtdKSBhcyBSZWY8U2luZ2xlSXRlbVtdPlxyXG5jb25zdCBpc0FzeW5jTG9hZGluZyA9IHJlZihmYWxzZSlcclxuY29uc3QgZm9yY2VVcGRhdGVLZXkgPSByZWYoMSlcclxuY29uc3QgaW50ZXJuYWxIZWxwVGlwSWQgPSByZWYobmFub2lkKCkpXHJcbmNvbnN0IGlzT3BlbiA9IHJlZihmYWxzZSlcclxuXHJcbmNvbnN0IGxpc3Rib3hCdXR0b25Cb3VuZGluZyA9IHVzZUVsZW1lbnRCb3VuZGluZyhsaXN0Ym94QnV0dG9uLCB7XHJcbiAgd2luZG93UmVzaXplOiB0cnVlLFxyXG4gIHdpbmRvd1Njcm9sbDogdHJ1ZSxcclxuICBpbW1lZGlhdGU6IHRydWVcclxufSlcclxuXHJcbnVzZUludGVyc2VjdGlvbk9ic2VydmVyKFxyXG4gIGNvbXB1dGVkKCgpID0+IG1lbnVFbC52YWx1ZSksXHJcbiAgKFt7IGlzSW50ZXJzZWN0aW5nIH1dKSA9PiB7XHJcbiAgICBpZiAoaXNJbnRlcnNlY3RpbmcgJiYgcHJvcHMubW91bnRNZW51T25Cb2R5KSB7XHJcbiAgICAgIGxpc3Rib3hCdXR0b25Cb3VuZGluZy51cGRhdGUoKVxyXG4gICAgfVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgdGl0bGUgPSBjb21wdXRlZCgoKSA9PiB1bnJlZihwcm9wcy5sYWJlbCkgfHwgdW5yZWYocHJvcHMubmFtZSkpXHJcbmNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBiYXNlID0gZXJyb3IudmFsdWVcclxuICBpZiAoIWJhc2UgfHwgIXVucmVmKHByb3BzLnVzZUxhYmVsSW5FcnJvcnMpKSByZXR1cm4gYmFzZVxyXG4gIHJldHVybiBiYXNlLnJlcGxhY2UoJ1ZhbHVlJywgdGl0bGUudmFsdWUpXHJcbn0pXHJcbmNvbnN0IGhlbHBUaXAgPSBjb21wdXRlZCgoKSA9PiBlcnJvck1lc3NhZ2UudmFsdWUgfHwgdW5yZWYocHJvcHMuaGVscCkpXHJcbmNvbnN0IGhhc0hlbHBUaXAgPSBjb21wdXRlZCgoKSA9PiAhIWhlbHBUaXAudmFsdWUpXHJcbmNvbnN0IGhlbHBUaXBJZCA9IGNvbXB1dGVkKCgpID0+XHJcbiAgaGFzSGVscFRpcC52YWx1ZSA/IGAke3VucmVmKHByb3BzLm5hbWUpfS0ke2ludGVybmFsSGVscFRpcElkLnZhbHVlfWAgOiB1bmRlZmluZWRcclxuKVxyXG5jb25zdCBoZWxwVGlwQ2xhc3NlcyA9IGNvbXB1dGVkKCgpOiBzdHJpbmcgPT5cclxuICBlcnJvci52YWx1ZSA/ICd0ZXh0LWRhbmdlcicgOiAndGV4dC1mb3JlZ3JvdW5kLTInXHJcbilcclxuXHJcbmNvbnN0IGlzTGVmdExhYmVsUG9zaXRpb24gPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5sYWJlbFBvc2l0aW9uID09PSAnbGVmdCcpXHJcblxyXG5jb25zdCByZW5kZXJDbGVhckJ1dHRvbiA9IGNvbXB1dGVkKFxyXG4gICgpID0+IHByb3BzLmJ1dHRvblN0eWxlICE9PSAnc2ltcGxlJyAmJiBwcm9wcy5jbGVhcmFibGUgJiYgIXByb3BzLmRpc2FibGVkXHJcbilcclxuXHJcbmNvbnN0IHNpemVDbGFzc2VzID0gY29tcHV0ZWQoKCk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKCFwcm9wcy5zaXplKSByZXR1cm4gJydcclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICdzbSc6XHJcbiAgICAgIHJldHVybiAnaC02IHRleHQtYm9keS1zbSdcclxuICAgIGNhc2UgJ2xnJzpcclxuICAgICAgcmV0dXJuICdoLTEwIHRleHQtWzEzcHhdJ1xyXG4gICAgY2FzZSAneGwnOlxyXG4gICAgICByZXR1cm4gJ2gtMTQgdGV4dC1zbSdcclxuICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICdoLTggdGV4dC1ib2R5LXNtJ1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGJ1dHRvbnNXcmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsncmVsYXRpdmUgZmxleCBncm91cCddXHJcblxyXG4gIGlmIChlcnJvci52YWx1ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdob3ZlcjpzaGFkb3cgcm91bmRlZC1tZCcpXHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZGFuZ2VyLWRhcmtlciBmb2N1czpib3JkZXItZGFuZ2VyJylcclxuXHJcbiAgICBpZiAocHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyIGJvcmRlci1kYW5nZXInKVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3JvdW5kZWQtbWQgYm9yZGVyJylcclxuICAgIGlmIChpc09wZW4udmFsdWUpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItb3V0bGluZS00JylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLW91dGxpbmUtMiBob3Zlcjpib3JkZXItb3V0bGluZS01IGZvY3VzOm91dGxpbmUtMCcpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAocHJvcHMuZml4ZWRIZWlnaHQpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnaC04JylcclxuICB9IGVsc2UgaWYgKHNpemVDbGFzc2VzLnZhbHVlPy5sZW5ndGgpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaChzaXplQ2xhc3Nlcy52YWx1ZSlcclxuICB9XHJcblxyXG4gIGlmIChpc0xlZnRMYWJlbFBvc2l0aW9uLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ21kOmJhc2lzLTEvMicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGNvbW1vbkJ1dHRvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXVxyXG5cclxuICBpZiAocHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goXHJcbiAgICAgIGlzRGlzYWJsZWQudmFsdWUgPyAnYmctZm91bmRhdGlvbi1kaXNhYmxlZCB0ZXh0LWZvcmVncm91bmQtZGlzYWJsZWQnIDogJydcclxuICAgIClcclxuICB9XHJcblxyXG4gIGlmIChpc0Rpc2FibGVkLnZhbHVlKSBjbGFzc1BhcnRzLnB1c2goJ2N1cnNvci1ub3QtYWxsb3dlZCcpXHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgY2xlYXJCdXR0b25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbXHJcbiAgICAncmVsYXRpdmUgei1bMV0nLFxyXG4gICAgJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtY2VudGVyIHNocmluay0wJyxcclxuICAgICdyb3VuZGVkLXItbWQgb3ZlcmZsb3ctaGlkZGVuIHRyYW5zaXRpb24tYWxsJyxcclxuICAgICd0ZXh0LWZvcmVncm91bmQnLFxyXG4gICAgaGFzVmFsdWVTZWxlY3RlZC52YWx1ZSA/IGB3LTYgJHtjb21tb25CdXR0b25DbGFzc2VzLnZhbHVlfWAgOiAndy0wJ1xyXG4gIF1cclxuXHJcbiAgaWYgKCFpc0Rpc2FibGVkLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goXHJcbiAgICAgICdob3ZlcjpiZy1wcmltYXJ5IGhvdmVyOnRleHQtZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGRhcms6dGV4dC1mb3JlZ3JvdW5kLW9uLXByaW1hcnknXHJcbiAgICApXHJcbiAgICBpZiAocHJvcHMuYnV0dG9uU3R5bGUgPT09ICd0aW50ZWQnKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctb3V0bGluZS0zJylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctcHJpbWFyeS1tdXRlZCcpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGJ1dHRvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdyZWxhdGl2ZSB6LVsyXScsXHJcbiAgICAnbm9ybWFsIHJvdW5kZWQtbWQgY3Vyc29yLXBvaW50ZXIgdHJhbnNpdGlvbiB0cnVuY2F0ZSBmbGV4LTEnLFxyXG4gICAgJ2ZsZXggaXRlbXMtY2VudGVyIGZvY3VzOm91dGxpbmUtb3V0bGluZS00IGZvY3VzOm91dGxpbmUtMScsXHJcbiAgICBjb21tb25CdXR0b25DbGFzc2VzLnZhbHVlXHJcbiAgXVxyXG5cclxuICBpZiAocHJvcHMuYnV0dG9uU3R5bGUgIT09ICdzaW1wbGUnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3AtMicpXHJcblxyXG4gICAgaWYgKCFpc0Rpc2FibGVkLnZhbHVlKSB7XHJcbiAgICAgIGlmIChwcm9wcy5idXR0b25TdHlsZSA9PT0gJ3RpbnRlZCcpIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLWZvdW5kYXRpb24gdGV4dC1mb3JlZ3JvdW5kJylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLWZvdW5kYXRpb24gdGV4dC1mb3JlZ3JvdW5kJylcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKHJlbmRlckNsZWFyQnV0dG9uLnZhbHVlICYmIGhhc1ZhbHVlU2VsZWN0ZWQudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncm91bmRlZC1yLW5vbmUnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBoYXNTZWFyY2ggPSBjb21wdXRlZChcclxuICAoKSA9PiAhIShwcm9wcy5zZWFyY2ggJiYgKHByb3BzLmZpbHRlclByZWRpY2F0ZSB8fCBwcm9wcy5nZXRTZWFyY2hSZXN1bHRzKSlcclxuKVxyXG5jb25zdCBpc0FzeW5jU2VhcmNoTW9kZSA9IGNvbXB1dGVkKCgpID0+IGhhc1NlYXJjaC52YWx1ZSAmJiBwcm9wcy5nZXRTZWFyY2hSZXN1bHRzKVxyXG5jb25zdCBpc0Rpc2FibGVkID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMuZGlzYWJsZWQgfHwgKCFwcm9wcy5pdGVtcy5sZW5ndGggJiYgIWlzQXN5bmNTZWFyY2hNb2RlLnZhbHVlKVxyXG4pXHJcblxyXG5jb25zdCB3cmFwcGVkVmFsdWUgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YWx1ZS52YWx1ZVxyXG4gICAgcmV0dXJuIGlzQXJyYXkoY3VycmVudFZhbHVlKSA/IGN1cnJlbnRWYWx1ZSA6IFtdXHJcbiAgfSxcclxuICBzZXQ6IChuZXdWYWwpID0+IHtcclxuICAgIGlmICghaXNBcnJheShuZXdWYWwpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignQXR0ZW1wdGluZyB0byBzZXQgbm9uLWFycmF5IHZhbHVlIGluIHNlbGVjdG9yJylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHByb3BzLmZ1bGx5Q29udHJvbFZhbHVlKSB7XHJcbiAgICAgIGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgbmV3VmFsKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUudmFsdWUgPSBuZXdWYWxcclxuICAgIH1cclxuXHJcbiAgICBmb3JjZVVwZGF0ZUtleS52YWx1ZSArPSAxXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgaGFzVmFsdWVTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoaXNBcnJheSh3cmFwcGVkVmFsdWUudmFsdWUpKSByZXR1cm4gd3JhcHBlZFZhbHVlLnZhbHVlLmxlbmd0aCAhPT0gMFxyXG4gIGVsc2UgcmV0dXJuICEhd3JhcHBlZFZhbHVlLnZhbHVlXHJcbn0pXHJcblxyXG5jb25zdCBjbGVhclZhbHVlID0gKCkgPT4ge1xyXG4gIHdyYXBwZWRWYWx1ZS52YWx1ZSA9IFtdXHJcbn1cclxuXHJcbmNvbnN0IGZpbmFsSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3Qgc2VhcmNoVmFsID0gc2VhcmNoVmFsdWUudmFsdWVcclxuICBpZiAoIWhhc1NlYXJjaC52YWx1ZSB8fCAhc2VhcmNoVmFsPy5sZW5ndGgpIHJldHVybiBjdXJyZW50SXRlbXMudmFsdWVcclxuXHJcbiAgaWYgKHByb3BzLmZpbHRlclByZWRpY2F0ZSkge1xyXG4gICAgcmV0dXJuIGN1cnJlbnRJdGVtcy52YWx1ZS5maWx0ZXIoXHJcbiAgICAgIChpKSA9PiBwcm9wcy5maWx0ZXJQcmVkaWNhdGU/LihpLCBzZWFyY2hWYWwpIHx8IGZhbHNlXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY3VycmVudEl0ZW1zLnZhbHVlXHJcbn0pXHJcblxyXG5jb25zdCBsaXN0Ym94T3B0aW9uc0NsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICdyb3VuZGVkLW1kIGJnLWZvdW5kYXRpb24gcHktMSBsYWJlbCBsYWJlbC0tbGlnaHQgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMgc2hhZG93LW1kIG10LTEgJ1xyXG4gIF1cclxuXHJcbiAgaWYgKHByb3BzLm1vdW50TWVudU9uQm9keSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdmaXhlZCB6LTUwJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdhYnNvbHV0ZSB0b3AtWzEwMCVdIHctZnVsbCB6LTQwJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgbGlzdGJveE9wdGlvbnNTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBzdHlsZTogQ1NTUHJvcGVydGllcyA9IHt9XHJcblxyXG4gIGlmIChwcm9wcy5tb3VudE1lbnVPbkJvZHkpIHtcclxuICAgIGNvbnN0IHRvcCA9IGxpc3Rib3hCdXR0b25Cb3VuZGluZy50b3AudmFsdWVcclxuICAgIGNvbnN0IGxlZnQgPSBsaXN0Ym94QnV0dG9uQm91bmRpbmcubGVmdC52YWx1ZVxyXG4gICAgY29uc3Qgd2lkdGggPSBsaXN0Ym94QnV0dG9uQm91bmRpbmcud2lkdGgudmFsdWVcclxuICAgIGNvbnN0IGhlaWdodCA9IGxpc3Rib3hCdXR0b25Cb3VuZGluZy5oZWlnaHQudmFsdWVcclxuXHJcbiAgICBzdHlsZS50b3AgPSBgJHt0b3AgKyBoZWlnaHR9cHhgXHJcbiAgICBzdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGBcclxuICAgIHN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgXHJcbiAgfVxyXG5cclxuICByZXR1cm4gc3R5bGVcclxufSlcclxuXHJcbmNvbnN0IHNpbXBsZURpc3BsYXlUZXh0ID0gKHY6IFZhbHVlVHlwZSkgPT4gSlNPTi5zdHJpbmdpZnkodilcclxuY29uc3QgaXRlbUtleSA9ICh2OiBTaW5nbGVJdGVtKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcclxuICBpZiAoaXNPYmplY3RMaWtlVHlwZSh2KSkge1xyXG4gICAgcmV0dXJuIHZbcHJvcHMuYnkgfHwgJ2lkJ10gYXMgc3RyaW5nXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB2XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCB0cmlnZ2VyU2VhcmNoID0gYXN5bmMgKCkgPT4ge1xyXG4gIGlmICghaXNBc3luY1NlYXJjaE1vZGUudmFsdWUgfHwgIXByb3BzLmdldFNlYXJjaFJlc3VsdHMpIHJldHVyblxyXG5cclxuICBpc0FzeW5jTG9hZGluZy52YWx1ZSA9IHRydWVcclxuICB0cnkge1xyXG4gICAgY3VycmVudEl0ZW1zLnZhbHVlID0gYXdhaXQgcHJvcHMuZ2V0U2VhcmNoUmVzdWx0cyhzZWFyY2hWYWx1ZS52YWx1ZSlcclxuICB9IGZpbmFsbHkge1xyXG4gICAgaXNBc3luY0xvYWRpbmcudmFsdWUgPSBmYWxzZVxyXG4gIH1cclxufVxyXG5jb25zdCBkZWJvdW5jZWRTZWFyY2ggPSBkZWJvdW5jZSh0cmlnZ2VyU2VhcmNoLCAxMDAwKVxyXG5cclxuY29uc3QgbGlzdGJveE9wdGlvbkNsYXNzZXMgPSAocGFyYW1zOiB7IGRpc2FibGVkOiBib29sZWFuIH0pID0+IHtcclxuICBjb25zdCB7IGRpc2FibGVkIH0gPSBwYXJhbXNcclxuICBjb25zdCBjbGFzc1BhcnRzID0gWydyZWxhdGl2ZSB0cmFuc2l0aW9uIHNlbGVjdC1ub25lIHB4LTInXVxyXG5cclxuICBpZiAoZGlzYWJsZWQpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZm9yZWdyb3VuZCBjdXJzb3ItcG9pbnRlcicpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufVxyXG5cclxud2F0Y2goXHJcbiAgKCkgPT4gcHJvcHMuaXRlbXMsXHJcbiAgKG5ld0l0ZW1zKSA9PiB7XHJcbiAgICBjdXJyZW50SXRlbXMudmFsdWUgPSBuZXdJdGVtcy5zbGljZSgpXHJcbiAgfSxcclxuICB7IGltbWVkaWF0ZTogdHJ1ZSB9XHJcbilcclxuXHJcbndhdGNoKHNlYXJjaFZhbHVlLCAoKSA9PiB7XHJcbiAgaWYgKCFpc0FzeW5jU2VhcmNoTW9kZS52YWx1ZSkgcmV0dXJuXHJcbiAgdm9pZCBkZWJvdW5jZWRTZWFyY2goKVxyXG59KVxyXG5cclxub25Nb3VudGVkKCgpID0+IHtcclxuICBpZiAoaXNBc3luY1NlYXJjaE1vZGUudmFsdWUgJiYgIXByb3BzLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgdm9pZCB0cmlnZ2VyU2VhcmNoKClcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB0b2dnbGVEcm9wZG93biA9ICgpID0+IHtcclxuICBpZiAoIWlzRGlzYWJsZWQudmFsdWUpIHtcclxuICAgIGlzT3Blbi52YWx1ZSA9ICFpc09wZW4udmFsdWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGlzU2VsZWN0ZWQgPSAoaXRlbTogU2luZ2xlSXRlbSkgPT4ge1xyXG4gIHJldHVybiB3cmFwcGVkVmFsdWUudmFsdWUuc29tZSgodikgPT4gaXRlbUtleSh2KSA9PT0gaXRlbUtleShpdGVtKSlcclxufVxyXG5cclxuY29uc3Qgb3B0aW9uc0NvbnRhaW5lciA9IHJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpXHJcbmNvbnN0IHNjcm9sbFBvc2l0aW9uID0gcmVmKDApXHJcblxyXG5jb25zdCBzZWxlY3RJdGVtID0gKGl0ZW06IFNpbmdsZUl0ZW0sIGV2ZW50PzogRXZlbnQpID0+IHtcclxuICBpZiAocHJvcHMuZGlzYWJsZWRJdGVtUHJlZGljYXRlPy4oaXRlbSkpIHJldHVyblxyXG4gIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKVxyXG5cclxuICBzY3JvbGxQb3NpdGlvbi52YWx1ZSA9IG9wdGlvbnNDb250YWluZXIudmFsdWU/LnNjcm9sbFRvcCB8fCAwXHJcblxyXG4gIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHdyYXBwZWRWYWx1ZS52YWx1ZVxyXG4gIGNvbnN0IGl0ZW1FeGlzdHMgPSBjdXJyZW50VmFsdWUuc29tZSgodikgPT4gaXRlbUtleSh2KSA9PT0gaXRlbUtleShpdGVtKSlcclxuXHJcbiAgd3JhcHBlZFZhbHVlLnZhbHVlID0gaXRlbUV4aXN0c1xyXG4gICAgPyBjdXJyZW50VmFsdWUuZmlsdGVyKCh2KSA9PiBpdGVtS2V5KHYpICE9PSBpdGVtS2V5KGl0ZW0pKVxyXG4gICAgOiBbLi4uY3VycmVudFZhbHVlLCBpdGVtXVxyXG5cclxuICB2b2lkIG5leHRUaWNrKCgpID0+IHtcclxuICAgIGlmIChvcHRpb25zQ29udGFpbmVyLnZhbHVlKSB7XHJcbiAgICAgIG9wdGlvbnNDb250YWluZXIudmFsdWUuc2Nyb2xsVG9wID0gc2Nyb2xsUG9zaXRpb24udmFsdWVcclxuICAgIH1cclxuICB9KVxyXG59XHJcblxyXG5vbkNsaWNrT3V0c2lkZShcclxuICBtZW51RWwsXHJcbiAgKCkgPT4ge1xyXG4gICAgaWYgKGlzT3Blbi52YWx1ZSkge1xyXG4gICAgICBpc09wZW4udmFsdWUgPSBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAge1xyXG4gICAgaWdub3JlOiBbbGlzdGJveEJ1dHRvbl1cclxuICB9XHJcbilcclxuXHJcbmRlZmluZUV4cG9zZSh7IHRyaWdnZXJTZWFyY2ggfSlcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yXCI+XHJcbiAgICA8SGVhZGxlc3NTd2l0Y2hcclxuICAgICAgOmlkPVwiaWQgfHwgbmFtZVwiXHJcbiAgICAgIHYtbW9kZWw9XCJlbmFibGVkXCJcclxuICAgICAgOmNsYXNzPVwic3dpdGNoQ2xhc3Nlc1wiXHJcbiAgICAgIDpuYW1lPVwibmFtZVwiXHJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gOmNsYXNzPVwic2xpZGVyQ2xhc3Nlc1wiPjwvc3Bhbj5cclxuICAgIDwvSGVhZGxlc3NTd2l0Y2g+XHJcbiAgICA8bGFiZWwgOmZvcj1cImlkIHx8IG5hbWVcIiA6Y2xhc3M9XCJsYWJlbENsYXNzZXNcIj5cclxuICAgICAgPHNwYW4+e3sgdGl0bGUgfX08L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgU3dpdGNoIGFzIEhlYWRsZXNzU3dpdGNoIH0gZnJvbSAnQGhlYWRsZXNzdWkvdnVlJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIHNob3dMYWJlbD86IGJvb2xlYW5cclxuICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgbGFiZWw/OiBzdHJpbmdcclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gICAgaWQ/OiBzdHJpbmdcclxuICB9PigpLFxyXG4gIHtcclxuICAgIHNob3dMYWJlbDogdHJ1ZVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgZW5hYmxlZCA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KClcclxuXHJcbmNvbnN0IHRpdGxlID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMubGFiZWwgfHwgcHJvcHMubmFtZSlcclxuXHJcbmNvbnN0IGxhYmVsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gWydibG9jayBsYWJlbC1saWdodCddXHJcblxyXG4gIGlmICghcHJvcHMuc2hvd0xhYmVsKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3NyLW9ubHknKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBzd2l0Y2hDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbXHJcbiAgICAncmVsYXRpdmUgaW5saW5lLWZsZXggZmxleC1zaHJpbmstMCBoLVsxOHB4XSB3LVszMHB4XSByb3VuZGVkLWZ1bGwnLFxyXG4gICAgJ3RyYW5zaXRpb24tY29sb3JzIGVhc2UtaW4tb3V0IGR1cmF0aW9uLTIwMCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZm9jdXMtdmlzaWJsZTpyaW5nLXByaW1hcnknLFxyXG4gICAgJ2N1cnNvci1wb2ludGVyIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTQwJ1xyXG4gIF1cclxuXHJcbiAgaWYgKGVuYWJsZWQudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnYmctcHJpbWFyeScpXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnYmctZm9yZWdyb3VuZC0zJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgc2xpZGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgaW5saW5lLWJsb2NrIGgtMyB3LTMgcm91bmRlZC1mdWxsIG10LVszcHhdIG1sLVszcHhdJyxcclxuICAgICdyaW5nLTAgdHJhbnNpdGlvbiBlYXNlLWluLW91dCBkdXJhdGlvbi0yMDAgYmctZm9yZWdyb3VuZC1vbi1wcmltYXJ5J1xyXG4gIF1cclxuXHJcbiAgaWYgKGVuYWJsZWQudmFsdWUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndHJhbnNsYXRlLXgtWzEycHhdJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0cmFuc2xhdGUteC0wJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWVqcy1hY2Nlc3NpYmlsaXR5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAtLT5cclxuPHRlbXBsYXRlPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwicmVsYXRpdmUgZ3JvdXAgYmctZm91bmRhdGlvbiBib3JkZXIgYm9yZGVyLW91dGxpbmUtMiBwLTIgcm91bmRlZC1sZyBwci0yMFwiXHJcbiAgPlxyXG4gICAgPGRpdlxyXG4gICAgICB2LWlmPVwiaXNNdWx0aWxpbmVcIlxyXG4gICAgICBjbGFzcz1cInJlbGF0aXZlIHotMTAgdGV4dC1ib2R5LTJ4cyBzZWxlY3QtYWxsIHRleHQtZm9yZWdyb3VuZCBmb250LW1vbm8gYnJlYWstYWxsIHAtMiBwbC0zIG1heC1oLVs0LjhyZW1dIHNpbXBsZS1zY3JvbGxiYXIgb3ZlcmZsb3cteS1hdXRvXCJcclxuICAgICAgQGtleXByZXNzPVwia2V5Ym9hcmRDbGljayhzZWxlY3RBbGxUZXh0KVwiXHJcbiAgICA+XHJcbiAgICAgIHt7IHZhbHVlIH19XHJcbiAgICA8L2Rpdj5cclxuICAgIDxGb3JtVGV4dElucHV0XHJcbiAgICAgIHYtZWxzZVxyXG4gICAgICBjb2xvcj1cInRyYW5zcGFyZW50XCJcclxuICAgICAgbmFtZT1cImNvbnRlbnRJbnB1dFwiXHJcbiAgICAgIHJlYWRvbmx5XHJcbiAgICAgIDptb2RlbC12YWx1ZT1cInZhbHVlXCJcclxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwICF0ZXh0LWJvZHktMnhzIHNtOiF0ZXh0LWJvZHkteHMgdGV4dC1mb3JlZ3JvdW5kIGZvbnQtbW9ubyBzZWxlY3QtYWxsIHRydW5jYXRlXCJcclxuICAgIC8+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgdG9wLTMgcmlnaHQtMiBmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgIDpjb2xvcj1cImN0YUNvbG9yXCJcclxuICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgIDppY29uLWxlZnQ9XCJcclxuICAgICAgICAgIGlzSWNvbkJ1dHRvblxyXG4gICAgICAgICAgICA/IGNvcGllZFxyXG4gICAgICAgICAgICAgID8gQ2xpcGJvYXJkRG9jdW1lbnRDaGVja0ljb25cclxuICAgICAgICAgICAgICA6IENsaXBib2FyZERvY3VtZW50SWNvblxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgOmhpZGUtdGV4dD1cImlzSWNvbkJ1dHRvblwiXHJcbiAgICAgICAgQGNsaWNrPVwiaGFuZGxlQ29weVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBjb3BpZWQgPyAnQ29waWVkJyA6IGN0YVRleHQgfX1cclxuICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VDbGlwYm9hcmQgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7XHJcbiAgQ2xpcGJvYXJkRG9jdW1lbnRJY29uLFxyXG4gIENsaXBib2FyZERvY3VtZW50Q2hlY2tJY29uXHJcbn0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHsgRm9ybVRleHRJbnB1dCwgRm9ybUJ1dHRvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHsga2V5Ym9hcmRDbGljayB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2dsb2JhbC9hY2Nlc3NpYmlsaXR5J1xyXG5pbXBvcnQgdHlwZSB7IEZvcm1CdXR0b25TdHlsZSB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2Zvcm0vYnV0dG9uJ1xyXG5cclxudHlwZSBQcm9wcyA9IHtcclxuICB2YWx1ZTogc3RyaW5nXHJcbiAgaXNNdWx0aWxpbmU/OiBib29sZWFuXHJcbiAgaXNJY29uQnV0dG9uPzogYm9vbGVhblxyXG4gIHJvd3M/OiBudW1iZXJcclxuICBjdGFDb2xvcj86IEZvcm1CdXR0b25TdHlsZVxyXG4gIGN0YVRleHQ/OiBzdHJpbmdcclxufVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoZGVmaW5lUHJvcHM8UHJvcHM+KCksIHtcclxuICBpc011bHRpbGluZTogZmFsc2UsXHJcbiAgY3RhQ29sb3I6ICdvdXRsaW5lJyxcclxuICBjdGFUZXh0OiAnQ29weSdcclxufSlcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7IChlOiAnY29weScsIHZhbDogc3RyaW5nKTogdm9pZCB9PigpXHJcblxyXG5jb25zdCB7IGNvcHkgfSA9IHVzZUNsaXBib2FyZCh7IGxlZ2FjeTogdHJ1ZSB9KVxyXG5cclxuY29uc3QgY29waWVkID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3QgaGFuZGxlQ29weSA9IGFzeW5jICgpID0+IHtcclxuICBpZiAocHJvcHMudmFsdWUpIHtcclxuICAgIGF3YWl0IGNvcHkocHJvcHMudmFsdWUpXHJcbiAgICBjb3BpZWQudmFsdWUgPSB0cnVlXHJcbiAgICBlbWl0KCdjb3B5JywgcHJvcHMudmFsdWUpXHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvcGllZC52YWx1ZSA9IGZhbHNlXHJcbiAgICB9LCAyMDAwKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgc2VsZWN0QWxsVGV4dCA9IChldmVudDogRXZlbnQpID0+IHtcclxuICBjb25zdCB0ZXh0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxyXG5cclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcclxuICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcclxuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyh0ZXh0RWxlbWVudClcclxuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxyXG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxyXG4gIH1cclxufVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cclxuICAgICAgPGRpdiB2LWZvcj1cIihfLCBpbmRleCkgaW4gZGlnaXRDb3VudFwiIDprZXk9XCJpbmRleFwiIGNsYXNzPVwidy0xMFwiPlxyXG4gICAgICAgIDxGb3JtVGV4dElucHV0XHJcbiAgICAgICAgICByZWY9XCJpbnB1dFJlZnNcIlxyXG4gICAgICAgICAgdi1tb2RlbD1cImRpZ2l0c1tpbmRleF1cIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlciAhdGV4dC1bMTRweF0gcHktNiAhcHgtMiBmb250LXNlbWlib2xkXCJcclxuICAgICAgICAgIGNvbG9yPVwiZm91bmRhdGlvblwiXHJcbiAgICAgICAgICA6bmFtZT1cImBjb2RlLSR7aW5kZXh9YFwiXHJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIDplcnJvcj1cImludGVybmFsRXJyb3JcIlxyXG4gICAgICAgICAgOmN1c3RvbS1lcnJvci1tZXNzYWdlPVwiaW50ZXJuYWxFcnJvciA/ICcgJyA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICBtYXhsZW5ndGg9XCIxXCJcclxuICAgICAgICAgIHNpemU9XCJsZ1wiXHJcbiAgICAgICAgICBAaW5wdXQ9XCJvbklucHV0KGluZGV4KVwiXHJcbiAgICAgICAgICBAa2V5ZG93bj1cIm9uS2V5RG93bihpbmRleCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICBAcGFzdGU9XCJvblBhc3RlXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgb25Nb3VudGVkLCByZWYsIHdhdGNoIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyBGb3JtVGV4dElucHV0IH0gZnJvbSAnfn4vc3JjL2xpYidcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIG1vZGVsVmFsdWU6IHN0cmluZ1xyXG4gICAgZGlnaXRDb3VudD86IG51bWJlclxyXG4gICAgZGlzYWJsZWQ/OiBib29sZWFuXHJcbiAgICBlcnJvcj86IGJvb2xlYW5cclxuICAgIGNsZWFyRXJyb3JPbkVkaXQ/OiBib29sZWFuXHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBkaWdpdENvdW50OiA2LFxyXG4gICAgY2xlYXJFcnJvck9uRWRpdDogdHJ1ZVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY29tcGxldGUnXSlcclxuXHJcbmNvbnN0IGlucHV0UmVmcyA9IHJlZjxBcnJheTxIVE1MSW5wdXRFbGVtZW50IHwgbnVsbD4+KFtdKVxyXG5jb25zdCBkaWdpdHMgPSByZWY8c3RyaW5nW10+KG5ldyBBcnJheShwcm9wcy5kaWdpdENvdW50KS5maWxsKCcnKSBhcyBzdHJpbmdbXSlcclxuY29uc3QgaW50ZXJuYWxFcnJvciA9IHJlZihwcm9wcy5lcnJvcilcclxuXHJcbmNvbnN0IG9uSW5wdXQgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gIGlmIChwcm9wcy5jbGVhckVycm9yT25FZGl0KSB7XHJcbiAgICBpbnRlcm5hbEVycm9yLnZhbHVlID0gZmFsc2VcclxuICB9XHJcblxyXG4gIGRpZ2l0cy52YWx1ZVtpbmRleF0gPSBkaWdpdHMudmFsdWVbaW5kZXhdLnJlcGxhY2UoL1teMC05XS9nLCAnJylcclxuXHJcbiAgLy8gTW92ZSB0byBuZXh0IGlucHV0IGlmIGF2YWlsYWJsZVxyXG4gIGlmIChkaWdpdHMudmFsdWVbaW5kZXhdICYmIGluZGV4IDwgcHJvcHMuZGlnaXRDb3VudCAtIDEpIHtcclxuICAgIGlucHV0UmVmcy52YWx1ZVtpbmRleCArIDFdPy5mb2N1cygpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBvbktleURvd24gPSAoaW5kZXg6IG51bWJlciwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyAmJiAhZGlnaXRzLnZhbHVlW2luZGV4XSAmJiBpbmRleCA+IDApIHtcclxuICAgIGlmIChwcm9wcy5jbGVhckVycm9yT25FZGl0KSB7XHJcbiAgICAgIGludGVybmFsRXJyb3IudmFsdWUgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgLy8gTW92ZSB0byBwcmV2aW91cyBpbnB1dCBvbiBiYWNrc3BhY2UgaWYgY3VycmVudCBpcyBlbXB0eVxyXG4gICAgZGlnaXRzLnZhbHVlW2luZGV4IC0gMV0gPSAnJ1xyXG4gICAgaW5wdXRSZWZzLnZhbHVlW2luZGV4IC0gMV0/LmZvY3VzKClcclxuICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgaW5kZXggPiAwKSB7XHJcbiAgICAvLyBNb3ZlIHRvIHByZXZpb3VzIGlucHV0IG9uIGxlZnQgYXJyb3dcclxuICAgIGlucHV0UmVmcy52YWx1ZVtpbmRleCAtIDFdPy5mb2N1cygpXHJcbiAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyAmJiBpbmRleCA8IHByb3BzLmRpZ2l0Q291bnQgLSAxKSB7XHJcbiAgICAvLyBNb3ZlIHRvIG5leHQgaW5wdXQgb24gcmlnaHQgYXJyb3dcclxuICAgIGlucHV0UmVmcy52YWx1ZVtpbmRleCArIDFdPy5mb2N1cygpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBvblBhc3RlID0gKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xyXG4gIGlmIChwcm9wcy5jbGVhckVycm9yT25FZGl0KSB7XHJcbiAgICBpbnRlcm5hbEVycm9yLnZhbHVlID0gZmFsc2VcclxuICB9XHJcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gIGNvbnN0IHBhc3RlZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0JylcclxuICBpZiAoIXBhc3RlZERhdGEpIHJldHVyblxyXG5cclxuICBjb25zdCBudW1iZXJzID0gcGFzdGVkRGF0YS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNwbGl0KCcnKVxyXG5cclxuICBkaWdpdHMudmFsdWUgPSBbXHJcbiAgICAuLi5udW1iZXJzLnNsaWNlKDAsIHByb3BzLmRpZ2l0Q291bnQpLFxyXG4gICAgLi4uKEFycmF5KE1hdGgubWF4KDAsIHByb3BzLmRpZ2l0Q291bnQgLSBudW1iZXJzLmxlbmd0aCkpLmZpbGwoJycpIGFzIHN0cmluZ1tdKVxyXG4gIF1cclxuXHJcbiAgLy8gRm9jdXMgdGhlIG5leHQgZW1wdHkgaW5wdXQgb3IgdGhlIGxhc3QgaW5wdXRcclxuICBjb25zdCBuZXh0RW1wdHlJbmRleCA9IGRpZ2l0cy52YWx1ZS5maW5kSW5kZXgoKGQpID0+ICFkKVxyXG4gIGlmIChuZXh0RW1wdHlJbmRleCAhPT0gLTEpIHtcclxuICAgIGlucHV0UmVmcy52YWx1ZVtuZXh0RW1wdHlJbmRleF0/LmZvY3VzKClcclxuICB9IGVsc2Uge1xyXG4gICAgaW5wdXRSZWZzLnZhbHVlW3Byb3BzLmRpZ2l0Q291bnQgLSAxXT8uZm9jdXMoKVxyXG4gIH1cclxufVxyXG5cclxuLy8gRm9jdXMgZmlyc3QgaW5wdXQgb24gbW91bnRcclxub25Nb3VudGVkKCgpID0+IHtcclxuICBpZiAoaW5wdXRSZWZzLnZhbHVlWzBdKSB7XHJcbiAgICBpbnB1dFJlZnMudmFsdWVbMF0uZm9jdXMoKVxyXG4gIH1cclxufSlcclxuXHJcbi8vIFdhdGNoIGV4dGVybmFsIGVycm9yIHByb3AgY2hhbmdlc1xyXG53YXRjaChcclxuICAoKSA9PiBwcm9wcy5lcnJvcixcclxuICAobmV3VmFsdWUpID0+IHtcclxuICAgIGludGVybmFsRXJyb3IudmFsdWUgPSBuZXdWYWx1ZVxyXG4gIH1cclxuKVxyXG5cclxuLy8gV2F0Y2ggZm9yIGV4dGVybmFsIHZhbHVlIGNoYW5nZXNcclxud2F0Y2goXHJcbiAgKCkgPT4gcHJvcHMubW9kZWxWYWx1ZSxcclxuICAobmV3VmFsdWUpID0+IHtcclxuICAgIGlmIChuZXdWYWx1ZSkge1xyXG4gICAgICBjb25zdCBuZXdEaWdpdHMgPSBuZXdWYWx1ZS5zcGxpdCgnJylcclxuICAgICAgZGlnaXRzLnZhbHVlID0gW1xyXG4gICAgICAgIC4uLm5ld0RpZ2l0cyxcclxuICAgICAgICAuLi4oQXJyYXkocHJvcHMuZGlnaXRDb3VudCAtIG5ld0RpZ2l0cy5sZW5ndGgpLmZpbGwoJycpIGFzIHN0cmluZ1tdKVxyXG4gICAgICBdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkaWdpdHMudmFsdWUgPSBBcnJheShwcm9wcy5kaWdpdENvdW50KS5maWxsKCcnKSBhcyBzdHJpbmdbXVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgeyBpbW1lZGlhdGU6IHRydWUgfVxyXG4pXHJcblxyXG4vLyBXYXRjaCBmb3IgY29tcGxldGlvblxyXG53YXRjaChcclxuICBkaWdpdHMsXHJcbiAgKG5ld0RpZ2l0cykgPT4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSBuZXdEaWdpdHMuam9pbignJylcclxuICAgIGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXHJcblxyXG4gICAgLy8gRW1pdCBjb21wbGV0ZSB3aGVuIGFsbCBkaWdpdHMgYXJlIGZpbGxlZFxyXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gcHJvcHMuZGlnaXRDb3VudCkge1xyXG4gICAgICBlbWl0KCdjb21wbGV0ZScsIHZhbHVlKVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgeyBkZWVwOiB0cnVlIH1cclxuKVxyXG48L3NjcmlwdD5cclxuIiwiaW1wb3J0IHsgZ2V0Q2xpZW50T3BlcmF0aW5nU3lzdGVtLCBPcGVyYXRpbmdTeXN0ZW0gfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcblxyXG5leHBvcnQgZW51bSBNb2RpZmllcktleXMge1xyXG4gIEN0cmxPckNtZCA9ICdjbWQtb3ItY3RybCcsXHJcbiAgQWx0T3JPcHQgPSAnYWx0LW9yLW9wdCcsXHJcbiAgU2hpZnQgPSAnc2hpZnQnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjbGllbnRPcyA9IGdldENsaWVudE9wZXJhdGluZ1N5c3RlbSgpXHJcblxyXG5leHBvcnQgY29uc3QgTW9kaWZpZXJLZXlUaXRsZXM6IFJlY29yZDxNb2RpZmllcktleXMsIHN0cmluZz4gPSB7XHJcbiAgW01vZGlmaWVyS2V5cy5DdHJsT3JDbWRdOiBjbGllbnRPcyA9PT0gT3BlcmF0aW5nU3lzdGVtLk1hYyA/ICfijJgnIDogJ+KMgycsXHJcbiAgW01vZGlmaWVyS2V5cy5BbHRPck9wdF06IGNsaWVudE9zID09PSBPcGVyYXRpbmdTeXN0ZW0uTWFjID8gJ+KMpScgOiAnQWx0JyxcclxuICBbTW9kaWZpZXJLZXlzLlNoaWZ0XTogJ+KHpydcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleWJvYXJkU2hvcnRjdXRUaXRsZShrZXlzOiBBcnJheTxzdHJpbmcgfCBNb2RpZmllcktleXM+KSB7XHJcbiAgY29uc3QgaXNNb2RpZmllcktleSA9IChrOiBzdHJpbmcpOiBrIGlzIE1vZGlmaWVyS2V5cyA9PlxyXG4gICAgKE9iamVjdC52YWx1ZXMoTW9kaWZpZXJLZXlzKSBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoaylcclxuXHJcbiAgcmV0dXJuIGtleXMubWFwKCh2KSA9PiAoaXNNb2RpZmllcktleSh2KSA/IE1vZGlmaWVyS2V5VGl0bGVzW3ZdIDogdikpLmpvaW4oJycpXHJcbn1cclxuIiwiaW1wb3J0IHsgdXNlTWFnaWNLZXlzLCB3aGVuZXZlciB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgT3BlcmF0aW5nU3lzdGVtIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBjbGllbnRPcywgTW9kaWZpZXJLZXlzIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvZm9ybS9pbnB1dCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXHJcblxyXG5leHBvcnQgdHlwZSBMYWJlbFBvc2l0aW9uID0gJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnXHJcblxyXG4vKipcclxuICogb25LZXlEb3duIHdyYXBwZXIgdGhhdCBhbHNvIGNoZWNrcyBmb3IgbW9kaWZpZXIga2V5cyBiZWluZyBwcmVzc2VkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb25LZXlib2FyZFNob3J0Y3V0KFxyXG4gIG1vZGlmaWVyczogTW9kaWZpZXJLZXlzW10sXHJcbiAga2V5OiBzdHJpbmcsXHJcbiAgY2FsbGJhY2s6ICgpID0+IHZvaWRcclxuKSB7XHJcbiAgY29uc3Qga2V5cyA9IHVzZU1hZ2ljS2V5cygpXHJcblxyXG4gIGNvbnN0IG1vZGlmaWVyS2V5cyA9IG1vZGlmaWVycy5tYXAoKG1vZGlmaWVyKSA9PiB7XHJcbiAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XHJcbiAgICAgIGNhc2UgTW9kaWZpZXJLZXlzLkN0cmxPckNtZDpcclxuICAgICAgICByZXR1cm4gY2xpZW50T3MgPT09IE9wZXJhdGluZ1N5c3RlbS5NYWMgPyAnTWV0YScgOiAnQ29udHJvbCdcclxuICAgICAgY2FzZSBNb2RpZmllcktleXMuQWx0T3JPcHQ6XHJcbiAgICAgICAgcmV0dXJuICdBbHQnXHJcbiAgICAgIGNhc2UgTW9kaWZpZXJLZXlzLlNoaWZ0OlxyXG4gICAgICAgIHJldHVybiAnU2hpZnQnXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICcnXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgY29uc3Qga2V5Q29tYmluYXRpb24gPSBgJHttb2RpZmllcktleXMuam9pbignKycpfSske2tleX1gXHJcblxyXG4gIHdoZW5ldmVyKGtleXNba2V5Q29tYmluYXRpb25dLCBjYWxsYmFjaylcclxufVxyXG5cclxuLyoqXHJcbiAqIFRvIHN1cHBvcnQgZ3JvdXAgY2hlY2tib3hlcywgdGhlIGNoZWNrYm94IHYtbW9kZWwgQVBJIGlzIGEgYml0IGNvbmZ1c2luZzogVGhlIHZhbHVlIGlzIGB0cnVlYCBvciBgdW5kZWZpbmVkYFxyXG4gKiBub3QgYHRydWVgIG9yIGBmYWxzZWAuXHJcbiAqXHJcbiAqIFRvIHNpbXBsaWZ5IHdvcmtpbmcgd2l0aCBzaW5nbGUgY2hlY2tib3hlcywgeW91IGNhbiB1c2UgdGhlIG1vZGVsIHJldHVybmVkIGZyb20gdGhpcyBjb21wb3NhYmxlXHJcbiAqIGFzIHRoZSBtb2RlbCBhbmQgYGlzQ2hlY2tlZGAgYXMgYSBoZWxwZnVsIHdyYXBwZXIgdGhhdCBhbGxvd3MgeW91IHRvIGRlYWwgd2l0aCBib29sZWFuIHZhbHVlcyBvbmx5XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXNlRm9ybUNoZWNrYm94TW9kZWwoXHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgbW9kZWw6IFJlZjx0cnVlIHwgdW5kZWZpbmVkPlxyXG4gIH0+XHJcbikge1xyXG4gIGNvbnN0IG1vZGVsID0gb3B0aW9ucz8ubW9kZWwgfHwgcmVmPHRydWUgfCB1bmRlZmluZWQ+KClcclxuICBjb25zdCBpc0NoZWNrZWQgPSBjb21wdXRlZCh7XHJcbiAgICBnZXQ6ICgpID0+ICEhbW9kZWwudmFsdWUsXHJcbiAgICBzZXQ6IChuZXdWYWwpID0+IChtb2RlbC52YWx1ZSA9IG5ld1ZhbCA/IHRydWUgOiB1bmRlZmluZWQpXHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIHsgbW9kZWwsIGlzQ2hlY2tlZCB9XHJcbn1cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxUcmFuc2l0aW9uUm9vdCBhcz1cInRlbXBsYXRlXCIgOnNob3c9XCJvcGVuXCI+XHJcbiAgICA8RGlhbG9nIGFzPVwiZGl2XCIgY2xhc3M9XCJyZWxhdGl2ZSB6LTUwXCIgb3BlbiBAY2xvc2U9XCJvbkNsb3NlXCI+XHJcbiAgICAgIDxUcmFuc2l0aW9uQ2hpbGRcclxuICAgICAgICBhcz1cInRlbXBsYXRlXCJcclxuICAgICAgICBlbnRlcj1cImVhc2Utb3V0IGR1cmF0aW9uLTMwMFwiXHJcbiAgICAgICAgZW50ZXItZnJvbT1cIm9wYWNpdHktMFwiXHJcbiAgICAgICAgZW50ZXItdG89XCJvcGFjaXR5LTEwMFwiXHJcbiAgICAgICAgbGVhdmU9XCJlYXNlLWluIGR1cmF0aW9uLTQwMFwiXHJcbiAgICAgICAgbGVhdmUtZnJvbT1cIm9wYWNpdHktMTAwXCJcclxuICAgICAgICBsZWF2ZS10bz1cIm9wYWNpdHktMFwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZpeGVkIHRvcC0wIGxlZnQtMCB3LWZ1bGwgaC1mdWxsIGJhY2tkcm9wLWJsdXIteHMgYmctYmxhY2svNjAgZGFyazpiZy1uZXV0cmFsLTkwMC82MCB0cmFuc2l0aW9uLW9wYWNpdHlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvVHJhbnNpdGlvbkNoaWxkPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQgdG9wLTAgbGVmdC0wIHotMTAgaC1zY3JlZW4gIWgtWzEwMGR2aF0gdy1zY3JlZW5cIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggbWQ6anVzdGlmeS1jZW50ZXIgaC1mdWxsIHctZnVsbCBtZDpwLTZcIlxyXG4gICAgICAgICAgOmNsYXNzPVwiW1xyXG4gICAgICAgICAgICBmdWxsc2NyZWVuID09PSAnbm9uZScgfHwgZnVsbHNjcmVlbiA9PT0gJ2Rlc2t0b3AnXHJcbiAgICAgICAgICAgICAgPyAncC00IGl0ZW1zLWNlbnRlcidcclxuICAgICAgICAgICAgICA6ICdpdGVtcy1lbmQgbWQ6aXRlbXMtY2VudGVyJ1xyXG4gICAgICAgICAgXVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPFRyYW5zaXRpb25DaGlsZFxyXG4gICAgICAgICAgICBhcz1cInRlbXBsYXRlXCJcclxuICAgICAgICAgICAgZW50ZXI9XCJlYXNlLW91dCBkdXJhdGlvbi01MDAwXCJcclxuICAgICAgICAgICAgOmVudGVyLWZyb209XCJgbWQ6b3BhY2l0eS0wICR7XHJcbiAgICAgICAgICAgICAgZnVsbHNjcmVlbiA9PT0gJ21vYmlsZScgfHwgZnVsbHNjcmVlbiA9PT0gJ2FsbCdcclxuICAgICAgICAgICAgICAgID8gJ3RyYW5zbGF0ZS15LVsxMDAlXSdcclxuICAgICAgICAgICAgICAgIDogJ3RyYW5zbGF0ZS15LTQnXHJcbiAgICAgICAgICAgIH0gbWQ6dHJhbnNsYXRlLXktNGBcIlxyXG4gICAgICAgICAgICBlbnRlci10bz1cIm1kOm9wYWNpdHktMTAwIHRyYW5zbGF0ZS15LTBcIlxyXG4gICAgICAgICAgICBsZWF2ZT1cImVhc2UtaW4gZHVyYXRpb24tNTAwMFwiXHJcbiAgICAgICAgICAgIGxlYXZlLWZyb209XCJtZDpvcGFjaXR5LTEwMCB0cmFuc2xhdGUteS0wXCJcclxuICAgICAgICAgICAgOmxlYXZlLXRvPVwiYG1kOm9wYWNpdHktMCAke1xyXG4gICAgICAgICAgICAgIGZ1bGxzY3JlZW4gPT09ICdtb2JpbGUnIHx8IGZ1bGxzY3JlZW4gPT09ICdhbGwnXHJcbiAgICAgICAgICAgICAgICA/ICd0cmFuc2xhdGUteS1bMTAwJV0nXHJcbiAgICAgICAgICAgICAgICA6ICd0cmFuc2xhdGUteS00J1xyXG4gICAgICAgICAgICB9IG1kOnRyYW5zbGF0ZS15LTRgXCJcclxuICAgICAgICAgICAgQGFmdGVyLWxlYXZlPVwib25GdWxseUNsb3NlZFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxEaWFsb2dQYW5lbFxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cImRpYWxvZ1BhbmVsQ2xhc3Nlc1wiXHJcbiAgICAgICAgICAgICAgZGlhbG9nLXBhbmVsLWNsYXNzZXNcclxuICAgICAgICAgICAgICA6YXM9XCJpc0Zvcm0gPyAnZm9ybScgOiAnZGl2J1wiXHJcbiAgICAgICAgICAgICAgQHN1Ym1pdC5wcmV2ZW50PVwib25Gb3JtU3VibWl0XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIHYtaWY9XCJoYXNUaXRsZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlci1iIGJvcmRlci1vdXRsaW5lLTNcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwic2Nyb2xsZWRGcm9tVG9wICYmICdyZWxhdGl2ZSB6LTIwIHNoYWRvdy1sZydcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IHJvdW5kZWQtdC1sZyBzaHJpbmstMCBtaW4taC1bMnJlbV0gc206bWluLWgtWzNyZW1dIHB4LTYgcHktNCB0cnVuY2F0ZSB0ZXh0LWhlYWRpbmctc21cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHItMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Q2hldnJvbkxlZnRJY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICB2LWlmPVwic2hvd0JhY2tCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTUgaC01IC1tbC0xIG1yLTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPVwiJGVtaXQoJ2JhY2snKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyB0aXRsZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS1cclxuICAgICAgICAgICAgICAgIER1ZSB0byBob3cgZm9ybXMgd29yaywgaWYgdGhlcmUncyBubyBvdGhlciBzdWJtaXQgYnV0dG9uLCBvbiBmb3JtIHN1Ym1pc3Npb24gdGhlIGZpcnN0IGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgd2lsbCBiZSBjbGlja2VkLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byBwcmV2ZW50IHRoZSBjbG9zZSBidXR0b24gZnJvbSBiZWluZyB0aGF0IGZpcnN0IGJ1dHRvbi5cclxuICAgICAgICAgICAgICAgIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NzYzOTExLzMxOTQ1NzdcclxuICAgICAgICAgICAgICAtLT5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaGlkZGVuXCIgdHlwZT1cImJ1dHRvblwiIC8+XHJcblxyXG4gICAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiIWhpZGVDbG9zZXJcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgei0yMCB0b3AtNCByaWdodC01IHNocmluay0wICF3LTYgIWgtNiAhcC0wIHRleHQtZm9yZWdyb3VuZC0yXCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cImNsb3NlckNsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgQGNsaWNrPVwib3BlbiA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8WE1hcmtJY29uIGNsYXNzPVwiaC02IHctNlwiIC8+XHJcbiAgICAgICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIHJlZj1cInNsb3RDb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgdi1tZW1vPVwiaXNDbG9zaW5nID8gW21lbW9LZXldIDogWyhtZW1vS2V5ID0gTWF0aC5yYW5kb20oKSldXCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cInNsb3RDb250YWluZXJDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgIEBzY3JvbGw9XCJvblNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHNsb3Q+UHV0IHlvdXIgY29udGVudCBoZXJlITwvc2xvdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiaGFzQnV0dG9uc1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHotNTAgZmxleCBqdXN0aWZ5LWVuZCBweC02IHBiLTYgc3BhY2UteC0yIHNocmluay0wIGJnLWZvdW5kYXRpb24tcGFnZVwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgICAgICAgICAgICdzaGFkb3ctdCBwdC02JzogIXNjcm9sbGVkVG9Cb3R0b20sXHJcbiAgICAgICAgICAgICAgICAgIFtidXR0b25zV3JhcHBlckNsYXNzZXMgfHwgJyddOiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cImJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIHYtZm9yPVwiKGJ1dHRvbiwgaW5kZXgpIGluIGJ1dHRvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIDprZXk9XCJidXR0b24uaWQgfHwgaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIHYtdGlwcHk9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5wcm9wcz8uZGlzYWJsZWQgfHwgYnV0dG9uLmRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYnV0dG9uLmRpc2FibGVkTWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgdi1iaW5kPVwiYnV0dG9uLnByb3BzIHx8IHt9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImJ1dHRvbi5wcm9wcz8uZGlzYWJsZWQgfHwgYnV0dG9uLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDpzdWJtaXQ9XCJidXR0b24ucHJvcHM/LnN1Ym1pdCB8fCBidXR0b24uc3VibWl0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz1cIigkZXZlbnQpID0+IGJ1dHRvbi5vbkNsaWNrPy4oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgYnV0dG9uLnRleHQgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJidXR0b25zXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvRGlhbG9nUGFuZWw+XHJcbiAgICAgICAgICA8L1RyYW5zaXRpb25DaGlsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L0RpYWxvZz5cclxuICA8L1RyYW5zaXRpb25Sb290PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBEaWFsb2csIERpYWxvZ1BhbmVsLCBUcmFuc2l0aW9uQ2hpbGQsIFRyYW5zaXRpb25Sb290IH0gZnJvbSAnQGhlYWRsZXNzdWkvdnVlJ1xyXG5pbXBvcnQgeyBGb3JtQnV0dG9uLCB0eXBlIExheW91dERpYWxvZ0J1dHRvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB7IFhNYXJrSWNvbiwgQ2hldnJvbkxlZnRJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHsgaXNDbGllbnQsIHVzZVJlc2l6ZU9ic2VydmVyLCB0eXBlIFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2sgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCBvblVubW91bnRlZCwgcmVmLCB1c2VTbG90cywgd2F0Y2gsIHR5cGUgU2V0dXBDb250ZXh0IH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB7IGRpcmVjdGl2ZSBhcyB2VGlwcHkgfSBmcm9tICd2dWUtdGlwcHknXHJcblxyXG50eXBlIE1heFdpZHRoVmFsdWUgPSAneHMnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJ1xyXG50eXBlIEZ1bGxzY3JlZW5WYWx1ZXMgPSAnbW9iaWxlJyB8ICdkZXNrdG9wJyB8ICdhbGwnIHwgJ25vbmUnXHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOm9wZW4nLCB2OiBib29sZWFuKTogdm9pZFxyXG4gIChlOiAnZnVsbHktY2xvc2VkJyk6IHZvaWRcclxuICAoZTogJ2JhY2snKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhcclxuICBkZWZpbmVQcm9wczx7XHJcbiAgICBvcGVuOiBib29sZWFuXHJcbiAgICBtYXhXaWR0aD86IE1heFdpZHRoVmFsdWVcclxuICAgIGZ1bGxzY3JlZW4/OiBGdWxsc2NyZWVuVmFsdWVzXHJcbiAgICBoaWRlQ2xvc2VyPzogYm9vbGVhblxyXG4gICAgc2hvd0JhY2tCdXR0b24/OiBib29sZWFuXHJcbiAgICAvKipcclxuICAgICAqIFByZXZlbnQgbW9kYWwgZnJvbSBjbG9zaW5nIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgb2YgdGhlIG1vZGFsIG9yIHByZXNzZXMgRXNjXHJcbiAgICAgKi9cclxuICAgIHByZXZlbnRDbG9zZU9uQ2xpY2tPdXRzaWRlPzogYm9vbGVhblxyXG4gICAgdGl0bGU/OiBzdHJpbmdcclxuICAgIGJ1dHRvbnM/OiBBcnJheTxMYXlvdXREaWFsb2dCdXR0b24+XHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIGJ1dHRvbiBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIGJ1dHRvbnNXcmFwcGVyQ2xhc3Nlcz86IHN0cmluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBzZXQsIHRoZSBtb2RhbCB3aWxsIGJlIHdyYXBwZWQgaW4gYSBmb3JtIGVsZW1lbnQgYW5kIHRoZSBgb25TdWJtaXRgIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSB1c2VyIHN1Ym1pdHMgdGhlIGZvcm1cclxuICAgICAqL1xyXG4gICAgb25TdWJtaXQ/OiAoZTogU3VibWl0RXZlbnQpID0+IHZvaWRcclxuICAgIGlzVHJhbnNwYXJlbnQ/OiBib29sZWFuXHJcbiAgICBjbG9zZXJDbGFzc2VzPzogc3RyaW5nXHJcbiAgICBoaWRlVGl0bGU/OiBib29sZWFuXHJcbiAgICBoaWRlQnV0dG9ucz86IGJvb2xlYW5cclxuICB9PigpLFxyXG4gIHtcclxuICAgIGZ1bGxzY3JlZW46ICdtb2JpbGUnXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCBzbG90czogU2V0dXBDb250ZXh0WydzbG90cyddID0gdXNlU2xvdHMoKVxyXG5cclxuY29uc3QgaXNDbG9zaW5nID0gcmVmKGZhbHNlKVxyXG5jb25zdCBtZW1vS2V5ID0gcmVmKE1hdGgucmFuZG9tKCkpXHJcblxyXG5jb25zdCBzY3JvbGxlZEZyb21Ub3AgPSByZWYoZmFsc2UpXHJcbmNvbnN0IHNjcm9sbGVkVG9Cb3R0b20gPSByZWYodHJ1ZSlcclxuY29uc3Qgc2xvdENvbnRhaW5lciA9IHJlZjxIVE1MRWxlbWVudCB8IG51bGw+KG51bGwpXHJcblxyXG51c2VSZXNpemVPYnNlcnZlcihcclxuICBzbG90Q29udGFpbmVyLFxyXG4gIHRocm90dGxlPFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2s+KCgpID0+IHtcclxuICAgIC8vIFRyaWdnZXJpbmcgb25TY3JvbGwgb24gc2l6ZSBjaGFuZ2UgdG9vIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHN0dWNrIHdpdGggc2hhZG93c1xyXG4gICAgLy8gZXZlbiB0aG8gdGhlIG5ldyBjb250ZW50IGlzIG5vdCBzY3JvbGxhYmxlXHJcbiAgICBvblNjcm9sbCh7IHRhcmdldDogc2xvdENvbnRhaW5lci52YWx1ZSB9KVxyXG4gIH0sIDYwKVxyXG4pXHJcblxyXG5jb25zdCBpc0Zvcm0gPSBjb21wdXRlZCgoKSA9PiAhIXByb3BzLm9uU3VibWl0KVxyXG5jb25zdCBoYXNCdXR0b25zID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gKHByb3BzLmJ1dHRvbnMgfHwgc2xvdHMuYnV0dG9ucykgJiYgIXByb3BzLmhpZGVCdXR0b25zXHJcbilcclxuY29uc3QgaGFzVGl0bGUgPSBjb21wdXRlZCgoKSA9PiAhcHJvcHMuaGlkZVRpdGxlICYmICghIXByb3BzLnRpdGxlIHx8ICEhc2xvdHMuaGVhZGVyKSlcclxuXHJcbmNvbnN0IG9wZW4gPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBwcm9wcy5vcGVuLFxyXG4gIHNldDogKG5ld1ZhbCkgPT4gZW1pdCgndXBkYXRlOm9wZW4nLCBuZXdWYWwpXHJcbn0pXHJcblxyXG5jb25zdCBtYXhXaWR0aFdlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLm1heFdpZHRoKSB7XHJcbiAgICBjYXNlICd4cyc6XHJcbiAgICAgIHJldHVybiAwXHJcbiAgICBjYXNlICdzbSc6XHJcbiAgICAgIHJldHVybiAxXHJcbiAgICBjYXNlICdtZCc6XHJcbiAgICAgIHJldHVybiAyXHJcbiAgICBjYXNlICdsZyc6XHJcbiAgICAgIHJldHVybiAzXHJcbiAgICBjYXNlICd4bCc6XHJcbiAgICAgIHJldHVybiA0XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gMTAwMDBcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB3aWR0aENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ3ctZnVsbCcsICdzbTp3LWZ1bGwnXVxyXG5cclxuICBpZiAoIWlzRnVsbHNjcmVlbkRlc2t0b3AudmFsdWUpIHtcclxuICAgIGlmIChtYXhXaWR0aFdlaWdodC52YWx1ZSA9PT0gMCkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ21kOm1heC13LXNtJylcclxuICAgIH1cclxuICAgIGlmIChtYXhXaWR0aFdlaWdodC52YWx1ZSA+PSAxKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnbWQ6bWF4LXctbGcnKVxyXG4gICAgfVxyXG4gICAgaWYgKG1heFdpZHRoV2VpZ2h0LnZhbHVlID49IDIpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdtZDptYXgtdy0yeGwnKVxyXG4gICAgfVxyXG4gICAgaWYgKG1heFdpZHRoV2VpZ2h0LnZhbHVlID49IDMpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdsZzptYXgtdy0zeGwnKVxyXG4gICAgfVxyXG4gICAgaWYgKG1heFdpZHRoV2VpZ2h0LnZhbHVlID49IDQpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd4bDptYXgtdy02eGwnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdtZDptYXgtdy0yeGwnKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBpc0Z1bGxzY3JlZW5EZXNrdG9wID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMuZnVsbHNjcmVlbiA9PT0gJ2Rlc2t0b3AnIHx8IHByb3BzLmZ1bGxzY3JlZW4gPT09ICdhbGwnXHJcbilcclxuXHJcbmNvbnN0IGRpYWxvZ1BhbmVsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtcclxuICAgICd0cmFuc2Zvcm0gbWQ6cm91bmRlZC14bCB0ZXh0LWZvcmVncm91bmQgb3ZlcmZsb3ctaGlkZGVuIHRyYW5zaXRpb24tYWxsIHRleHQtbGVmdCBmbGV4IGZsZXgtY29sIG1kOmgtYXV0bydcclxuICBdXHJcblxyXG4gIGlmICghcHJvcHMuaXNUcmFuc3BhcmVudCkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdiZy1mb3VuZGF0aW9uLXBhZ2Ugc2hhZG93LXhsIGJvcmRlciBib3JkZXItb3V0bGluZS0yJylcclxuICB9XHJcblxyXG4gIGlmIChpc0Z1bGxzY3JlZW5EZXNrdG9wLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ21kOmgtZnVsbCcpXHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnbWQ6bWF4LWgtWzkwdmhdJylcclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5mdWxsc2NyZWVuID09PSAnbW9iaWxlJyB8fCBwcm9wcy5mdWxsc2NyZWVuID09PSAnYWxsJykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdtYXgtbWQ6aC1bOTh2aF0gbWF4LW1kOiFoLVs5OGR2aF0nKVxyXG4gIH1cclxuXHJcbiAgaWYgKHByb3BzLmZ1bGxzY3JlZW4gPT09ICdub25lJyB8fCBwcm9wcy5mdWxsc2NyZWVuID09PSAnZGVza3RvcCcpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncm91bmRlZC1sZyBtYXgtaC1bOTB2aF0nKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3JvdW5kZWQtdC1sZycpXHJcbiAgfVxyXG5cclxuICBjbGFzc1BhcnRzLnB1c2god2lkdGhDbGFzc2VzLnZhbHVlKVxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgc2xvdENvbnRhaW5lckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ2ZsZXgtMSBzaW1wbGUtc2Nyb2xsYmFyIG92ZXJmbG93LXktYXV0byB0ZXh0LWJvZHkteHMnXVxyXG5cclxuICBpZiAoIXByb3BzLmlzVHJhbnNwYXJlbnQpIHtcclxuICAgIGlmIChoYXNUaXRsZS52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3B4LTYgcHktNCcpXHJcbiAgICAgIGlmIChpc0Z1bGxzY3JlZW5EZXNrdG9wLnZhbHVlKSB7XHJcbiAgICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdtZDpwLTAnKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCFpc0Z1bGxzY3JlZW5EZXNrdG9wLnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgncHgtNiBweS00JylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3Qgb25DbG9zZSA9ICgpID0+IHtcclxuICBpZiAocHJvcHMucHJldmVudENsb3NlT25DbGlja091dHNpZGUpIHJldHVyblxyXG4gIG9wZW4udmFsdWUgPSBmYWxzZVxyXG59XHJcblxyXG5jb25zdCBvbkZ1bGx5Q2xvc2VkID0gKCkgPT4ge1xyXG4gIGVtaXQoJ2Z1bGx5LWNsb3NlZCcpXHJcbiAgaXNDbG9zaW5nLnZhbHVlID0gZmFsc2VcclxufVxyXG5cclxuY29uc3Qgb25Gb3JtU3VibWl0ID0gKGU6IFN1Ym1pdEV2ZW50KSA9PiB7XHJcbiAgcHJvcHMub25TdWJtaXQ/LihlKVxyXG59XHJcblxyXG5jb25zdCBvblNjcm9sbCA9IHRocm90dGxlKChlOiB7IHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsIH0pID0+IHtcclxuICBpZiAoIWUudGFyZ2V0KSByZXR1cm5cclxuXHJcbiAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnRcclxuICBjb25zdCB7IHNjcm9sbFRvcCwgb2Zmc2V0SGVpZ2h0LCBzY3JvbGxIZWlnaHQgfSA9IHRhcmdldFxyXG4gIHNjcm9sbGVkRnJvbVRvcC52YWx1ZSA9IHNjcm9sbFRvcCA+IDBcclxuICBzY3JvbGxlZFRvQm90dG9tLnZhbHVlID0gc2Nyb2xsVG9wICsgb2Zmc2V0SGVpZ2h0ID49IHNjcm9sbEhlaWdodFxyXG59LCA2MClcclxuXHJcbndhdGNoKFxyXG4gIG9wZW4sXHJcbiAgKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xyXG4gICAgaWYgKGlzQ2xpZW50KSB7XHJcbiAgICAgIC8vIFRvZ2dsZSAnZGlhbG9nLW9wZW4nIGNsYXNzIG9uIDxodG1sPiB0byBwcmV2ZW50IHNjcm9sbCBqdW1waW5nIGFuZCBkaXNhYmxlIGJhY2tncm91bmQgc2Nyb2xsLlxyXG4gICAgICAvLyBUaGlzIG1haW50YWlucyB1c2VyIHNjcm9sbCBwb3NpdGlvbiB3aGVuIEhlYWRsZXNzIFVJIGRpYWxvZ3MgYXJlIGFjdGl2YXRlZC5cclxuICAgICAgY29uc3QgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxyXG4gICAgICBpZiAobmV3VmFsdWUpIHtcclxuICAgICAgICBodG1sLmNsYXNzTGlzdC5hZGQoJ2RpYWxvZy1vcGVuJylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBodG1sLmNsYXNzTGlzdC5yZW1vdmUoJ2RpYWxvZy1vcGVuJylcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghbmV3VmFsdWUgJiYgb2xkVmFsdWUpIHtcclxuICAgICAgaXNDbG9zaW5nLnZhbHVlID0gdHJ1ZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgeyBmbHVzaDogJ3N5bmMnIH1cclxuKVxyXG5cclxuLy8gQ2xlYW4gdXAgd2hlbiB0aGUgY29tcG9uZW50IHVubW91bnRzXHJcbm9uVW5tb3VudGVkKCgpID0+IHtcclxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZGlhbG9nLW9wZW4nKVxyXG59KVxyXG48L3NjcmlwdD5cclxuPHN0eWxlPlxyXG5odG1sLmRpYWxvZy1vcGVuIHtcclxuICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50O1xyXG59XHJcbmh0bWwuZGlhbG9nLW9wZW4gYm9keSB7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgYm9yZGVyLXByaW1hcnktbXV0ZWRcIlxyXG4gICAgOmNsYXNzPVwie1xyXG4gICAgICAnYm9yZGVyLXQnOiBib3JkZXJULFxyXG4gICAgICAnYm9yZGVyLWInOiBib3JkZXJCLFxyXG4gICAgICAncmVsYXRpdmUgei0xMCc6IGlzRXhwYW5kZWRcclxuICAgIH1cIlxyXG4gID5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgc3BhY2UteC00IHNtOnNwYWNlLXgtOCBweS0yLjUgcHgtMlwiXHJcbiAgICAgIDpjbGFzcz1cImJhY2tncm91bmRDbGFzc1wiXHJcbiAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgIHYtb249XCJcclxuICAgICAgICAhYnV0dG9uICYmICFhbHdheXNPcGVuXHJcbiAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICBjbGljazogdG9nZ2xlRXhwYW5zaW9uLFxyXG4gICAgICAgICAgICAgIGtleXByZXNzOiBrZXlib2FyZENsaWNrKHRvZ2dsZUV4cGFuc2lvbilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgOiB7fVxyXG4gICAgICBcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWhlYWRpbmctc20gZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xIHNtOnNwYWNlLXgtMiBzZWxlY3Qtbm9uZVwiXHJcbiAgICAgICAgOmNsYXNzPVwidGl0bGVDbGFzc2VzXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgdi1pZj1cIiRzbG90cy5pY29uIHx8IGljb25cIiBjbGFzcz1cImgtNCB3LTQgZW1wdHk6aC0wIGVtcHR5OnctMFwiPlxyXG4gICAgICAgICAgPHNsb3Qgdi1pZj1cIiRzbG90cy5pY29uXCIgbmFtZT1cImljb25cIiAvPlxyXG4gICAgICAgICAgPENvbXBvbmVudCA6aXM9XCJpY29uXCIgdi1pZj1cImljb25cIiBjbGFzcz1cInctZnVsbCBoLWZ1bGxcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzcGFuPnt7IHRpdGxlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8Q2hldnJvbkRvd25JY29uXHJcbiAgICAgICAgICB2LWlmPVwiIWJ1dHRvbiAmJiAhYWx3YXlzT3BlblwiXHJcbiAgICAgICAgICBjbGFzcz1cInctNCBoLTQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tNDAwXCJcclxuICAgICAgICAgIDpjbGFzcz1cImlzRXhwYW5kZWQgJiYgJ3JvdGF0ZS0xODAnXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICB2LWlmPVwiYnV0dG9uXCJcclxuICAgICAgICAgIDp0bz1cImJ1dHRvbi5leHBhbmRDb250ZW50ID8gdW5kZWZpbmVkIDogYnV0dG9uLnRvXCJcclxuICAgICAgICAgIDpjb2xvcj1cImJ1dHRvbi5leHBhbmRDb250ZW50ICYmIGlzRXhwYW5kZWQgPyAnb3V0bGluZScgOiBidXR0b24uY29sb3JcIlxyXG4gICAgICAgICAgOmljb24tcmlnaHQ9XCJcclxuICAgICAgICAgICAgYnV0dG9uLmV4cGFuZENvbnRlbnQgJiYgaXNFeHBhbmRlZCA/IHVuZGVmaW5lZCA6IGJ1dHRvbi5pY29uUmlnaHRcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgQGNsaWNrPVwiYnV0dG9uPy5vbkNsaWNrXCJcclxuICAgICAgICAgIHYtb249XCJidXR0b24/LmV4cGFuZENvbnRlbnQgPyB7IGNsaWNrOiB0b2dnbGVFeHBhbnNpb24gfSA6IHt9XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBidXR0b24uZXhwYW5kQ29udGVudCAmJiBpc0V4cGFuZGVkID8gJ0NhbmNlbCcgOiBidXR0b24udGV4dCB9fVxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJ0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgb3ZlcmZsb3ctaGlkZGVuXCJcclxuICAgICAgOmNsYXNzPVwiW1xyXG4gICAgICAgIGFsbG93T3ZlcmZsb3cgJiYgaXNFeHBhbmRlZCA/ICchb3ZlcmZsb3ctdmlzaWJsZScgOiAnJyxcclxuICAgICAgICBpc0V4cGFuZGVkID8gJ21iLTIgbXQtMScgOiAnJyxcclxuICAgICAgICAhYnV0dG9uICYmICFhbHdheXNPcGVuID8gJ2N1cnNvci1wb2ludGVyIGhvdmVyOmJnLWZvdW5kYXRpb24tcGFnZScgOiAnJ1xyXG4gICAgICBdXCJcclxuICAgICAgOnN0eWxlPVwiXHJcbiAgICAgICAgYWx3YXlzT3BlblxyXG4gICAgICAgICAgPyAnbWF4LWhlaWdodDogbm9uZTsnXHJcbiAgICAgICAgICA6IGBtYXgtaGVpZ2h0OiAke2lzRXhwYW5kZWQgPyBjb250ZW50SGVpZ2h0ICsgJ3B4JyA6ICcwcHgnfWBcclxuICAgICAgXCJcclxuICAgID5cclxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJwcm9wcy5sYXp5TG9hZFwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCJpc0V4cGFuZGVkIHx8IHByb3BzLmFsd2F5c09wZW5cIlxyXG4gICAgICAgICAgcmVmPVwiY29udGVudFwiXHJcbiAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtbWQgdGV4dC1zbSBwYi0zIHB4LTIgbXQtMVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNsb3Q+UGFuZWwgY29udGVudHM8L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgIDxkaXYgcmVmPVwiY29udGVudFwiIGNsYXNzPVwicm91bmRlZC1tZCB0ZXh0LXNtIHBiLTMgcHgtMiBtdC0xXCI+XHJcbiAgICAgICAgICA8c2xvdD5QYW5lbCBjb250ZW50czwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgcmVmLCBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBQcm9wVHlwZSwgUmVmIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyBDaGV2cm9uRG93bkljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9vdXRsaW5lJ1xyXG5pbXBvcnQgeyBGb3JtQnV0dG9uIH0gZnJvbSAnfn4vc3JjL2xpYidcclxuaW1wb3J0IHsga2V5Ym9hcmRDbGljayB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2dsb2JhbC9hY2Nlc3NpYmlsaXR5J1xyXG5pbXBvcnQgdHlwZSB7IFByb3BBbnlDb21wb25lbnQgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuaW1wb3J0IHR5cGUgeyBGb3JtQnV0dG9uU3R5bGUgfSBmcm9tICd+fi9zcmMvaGVscGVycy9mb3JtL2J1dHRvbidcclxuaW1wb3J0IHsgdXNlRWxlbWVudFNpemUgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcblxyXG50eXBlIFRpdGxlQ29sb3IgPSAnZGVmYXVsdCcgfCAnZGFuZ2VyJyB8ICd3YXJuaW5nJyB8ICdzdWNjZXNzJyB8ICdzZWNvbmRhcnknIHwgJ2luZm8nXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcclxuICB0aXRsZTogU3RyaW5nLFxyXG4gIGJvcmRlclQ6IEJvb2xlYW4sXHJcbiAgYm9yZGVyQjogQm9vbGVhbixcclxuICBhbGxvd092ZXJmbG93OiBCb29sZWFuLFxyXG4gIHRpdGxlQ29sb3I6IHtcclxuICAgIHR5cGU6IFN0cmluZyBhcyAoKSA9PiBUaXRsZUNvbG9yLFxyXG4gICAgZGVmYXVsdDogJ2RlZmF1bHQnXHJcbiAgfSxcclxuICBidXR0b246IE9iamVjdCBhcyAoKSA9PlxyXG4gICAgfCB7XHJcbiAgICAgICAgZXhwYW5kQ29udGVudD86IGJvb2xlYW5cclxuICAgICAgICB0ZXh0OiBzdHJpbmdcclxuICAgICAgICB0bz86IHN0cmluZ1xyXG4gICAgICAgIGNvbG9yOiBGb3JtQnV0dG9uU3R5bGVcclxuICAgICAgICBpY29uUmlnaHQ/OiBQcm9wQW55Q29tcG9uZW50IHwgdW5kZWZpbmVkXHJcbiAgICAgICAgb25DbGljaz86ICgpID0+IHZvaWRcclxuICAgICAgfVxyXG4gICAgfCB1bmRlZmluZWQsXHJcbiAgYWx3YXlzT3BlbjogQm9vbGVhbixcclxuICBsYXp5TG9hZDoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBpY29uOiB7XHJcbiAgICB0eXBlOiBbRnVuY3Rpb24sIE9iamVjdF0gYXMgUHJvcFR5cGU8UHJvcEFueUNvbXBvbmVudD4sXHJcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBjb250ZW50OiBSZWY8SFRNTEVsZW1lbnQgfCBudWxsPiA9IHJlZihudWxsKVxyXG5jb25zdCB7IGhlaWdodDogc2Nyb2xsSGVpZ2h0IH0gPSB1c2VFbGVtZW50U2l6ZShjb250ZW50KVxyXG5cclxuY29uc3QgY29udGVudEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IChzY3JvbGxIZWlnaHQudmFsdWUgfHwgMCkgKyA2NClcclxuY29uc3QgaXNFeHBhbmRlZCA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdvcGVuJywgeyByZXF1aXJlZDogZmFsc2UgfSlcclxuXHJcbmNvbnN0IGJhY2tncm91bmRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc2VzID0gW11cclxuXHJcbiAgaWYgKCFwcm9wcy5idXR0b24gJiYgIXByb3BzLmFsd2F5c09wZW4pIHtcclxuICAgIGNsYXNzZXMucHVzaCgnY3Vyc29yLXBvaW50ZXInLCAnaG92ZXI6YmctZm91bmRhdGlvbi1wYWdlLTInKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzZXNcclxufSlcclxuXHJcbmNvbnN0IHRpdGxlQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLnRpdGxlQ29sb3IpIHtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIHJldHVybiAndGV4dC1kYW5nZXInXHJcbiAgICBjYXNlICd3YXJuaW5nJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LXdhcm5pbmcnXHJcbiAgICBjYXNlICdzdWNjZXNzJzpcclxuICAgICAgcmV0dXJuICd0ZXh0LXN1Y2Nlc3MnXHJcbiAgICBjYXNlICdzZWNvbmRhcnknOlxyXG4gICAgICByZXR1cm4gJ3RleHQtc2Vjb25kYXJ5J1xyXG4gICAgY2FzZSAnaW5mbyc6XHJcbiAgICAgIHJldHVybiAndGV4dC1pbmZvJ1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICd0ZXh0LWZvcmVncm91bmQnXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgdG9nZ2xlRXhwYW5zaW9uID0gKCkgPT4ge1xyXG4gIGlzRXhwYW5kZWQudmFsdWUgPSAhaXNFeHBhbmRlZC52YWx1ZVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdj5cclxuICAgIDxIZWFkbGVzc0Rpc2Nsb3N1cmU+XHJcbiAgICAgIDxEaXNjbG9zdXJlQnV0dG9uIDpjbGFzcz1cImJ1dHRvbkNsYXNzZXNcIiBAY2xpY2s9XCJ0b2dnbGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiBvdmVyZmxvdy1oaWRkZW4gcHItMSB3LWZ1bGxcIj5cclxuICAgICAgICAgIDxDb21wb25lbnQgOmlzPVwiaWNvblwiIHYtaWY9XCJpY29uXCIgY2xhc3M9XCJoLTUgdy01XCIgLz5cclxuICAgICAgICAgIDxzcGFuIHYtaWY9XCIhZWRpdFRpdGxlXCIgY2xhc3M9XCJ0ZXh0LWxlZnQgdy1mdWxsIHRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgIHt7IHRpdGxlIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8Rm9ybVRleHRJbnB1dFxyXG4gICAgICAgICAgICB2LWVsc2VcclxuICAgICAgICAgICAgdi1iaW5kPVwiYmluZFwiXHJcbiAgICAgICAgICAgIG5hbWU9XCJkaXNjbG9zdXJlVGl0bGVcIlxyXG4gICAgICAgICAgICBjb2xvcj1cImZ1bGx5LXRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgOmlucHV0LWNsYXNzZXM9XCJidXR0b25UZXh0Q2xhc3Nlc1wiXHJcbiAgICAgICAgICAgIDphdXRvLWZvY3VzPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIHdyYXBwZXItY2xhc3Nlcz1cImZsZXgtMVwiXHJcbiAgICAgICAgICAgIHYtb249XCJvblwiXHJcbiAgICAgICAgICAgIEBjbGljay5zdG9wXHJcbiAgICAgICAgICAgIEBibHVyPVwib25UaXRsZUlucHV0Qmx1clwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNsb3QgbmFtZT1cInRpdGxlLWFjdGlvbnNcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxDaGV2cm9uVXBJY29uIDpjbGFzcz1cImNoZXZyb25DbGFzc2VzXCIgLz5cclxuICAgICAgPC9EaXNjbG9zdXJlQnV0dG9uPlxyXG4gICAgICA8RGlzY2xvc3VyZVBhbmVsIHYtaWY9XCJvcGVuXCIgOmNsYXNzPVwicGFuZWxDbGFzc2VzXCIgc3RhdGljPlxyXG4gICAgICAgIDxkaXYgdi1pZj1cIiFsYXp5TG9hZCB8fCBvcGVuXCIgY2xhc3M9XCJsYWJlbC1saWdodFwiPlxyXG4gICAgICAgICAgPHNsb3Q+UGFuZWwgY29udGVudHM8L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvRGlzY2xvc3VyZVBhbmVsPlxyXG4gICAgPC9IZWFkbGVzc0Rpc2Nsb3N1cmU+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7XHJcbiAgRGlzY2xvc3VyZUJ1dHRvbixcclxuICBEaXNjbG9zdXJlIGFzIEhlYWRsZXNzRGlzY2xvc3VyZSxcclxuICBEaXNjbG9zdXJlUGFuZWxcclxufSBmcm9tICdAaGVhZGxlc3N1aS92dWUnXHJcbmltcG9ydCB7IENoZXZyb25VcEljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9zb2xpZCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHdhdGNoIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IFByb3BBbnlDb21wb25lbnQgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuaW1wb3J0IHsgRm9ybVRleHRJbnB1dCwgdXNlRGVib3VuY2VkVGV4dElucHV0IH0gZnJvbSAnfn4vc3JjL2xpYidcclxuXHJcbnR5cGUgRGlzY2xvc3VyZUNvbG9yID0gJ2RlZmF1bHQnIHwgJ2RhbmdlcicgfCAnc3VjY2VzcycgfCAnd2FybmluZycgfCAnc3VidGxlJ1xyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgLyoqXHJcbiAgICAgKiBIZWFkbGVzc1VJIGljb24gY29tcG9uZW50IHRvIHVzZVxyXG4gICAgICovXHJcbiAgICBpY29uPzogUHJvcEFueUNvbXBvbmVudFxyXG4gICAgY29sb3I/OiBEaXNjbG9zdXJlQ29sb3JcclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0byBsYXp5IGxvYWQgdGhlIHBhbmVsIGNvbnRlbnRzIG9ubHkgdXBvbiBvcGVuaW5nXHJcbiAgICAgKi9cclxuICAgIGxhenlMb2FkPzogYm9vbGVhblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBlZGl0IG1vZGUgZW5hYmxlZCAtIGl0IHdpbGwgZXhpdCBtb2RlIHdoZW4gdXNlciB1bmZvY3VzZXNcclxuICAgICAqL1xyXG4gICAgZXhpdEVkaXRNb2RlT25CbHVyPzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgY29sb3I6ICdkZWZhdWx0JyxcclxuICAgIGV4aXRFZGl0TW9kZU9uQmx1cjogdHJ1ZVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgZWRpdFRpdGxlID0gZGVmaW5lTW9kZWw8Ym9vbGVhbj4oJ2VkaXRUaXRsZScpXHJcbmNvbnN0IHRpdGxlID0gZGVmaW5lTW9kZWw8c3RyaW5nPigndGl0bGUnKVxyXG5jb25zdCBvcGVuID0gZGVmaW5lTW9kZWw8Ym9vbGVhbj4oJ29wZW4nLCB7XHJcbiAgZGVmYXVsdDogZmFsc2VcclxufSlcclxuXHJcbmNvbnN0IHsgb24sIGJpbmQsIHN5bmNGcm9tVmFsdWUgfSA9IHVzZURlYm91bmNlZFRleHRJbnB1dCh7XHJcbiAgZGlzYWJsZURlYm91bmNlZElucHV0OiB0cnVlLFxyXG4gIG1vZGVsOiB0aXRsZVxyXG59KVxyXG5cclxuY29uc3QgYnV0dG9uVGV4dENsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFsnZm9udC1tZWRpdW0nXVxyXG5cclxuICBzd2l0Y2ggKHByb3BzLmNvbG9yKSB7XHJcbiAgICBjYXNlICd3YXJuaW5nJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LXdhcm5pbmcnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc3VjY2Vzcyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1zdWNjZXNzJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1kYW5nZXInKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc3VidGxlJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQgdGV4dC1ib2R5LTJ4cycpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdkZWZhdWx0JzpcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1wcmltYXJ5JylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgYnV0dG9uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBsZXQgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXVxyXG5cclxuICAvLyBDb21tb24gY2xhc3NlcyBzaGFyZWQgYmV0d2VlbiBzdWJ0bGUgYW5kIG90aGVyIHZhcmlhbnRzXHJcbiAgY2xhc3NQYXJ0cyA9IFtcclxuICAgICd3LWZ1bGwnLFxyXG4gICAgJ2ZsZXgnLFxyXG4gICAgJ2l0ZW1zLWNlbnRlcicsXHJcbiAgICAndHJhbnNpdGlvbicsXHJcbiAgICAnZ3JvdXAvZGlzY2xvc3VyZScsXHJcblxyXG4gICAgYnV0dG9uVGV4dENsYXNzZXMudmFsdWVcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5jb2xvciA9PT0gJ3N1YnRsZScpIHtcclxuICAgIC8vIFN1YnRsZSB2YXJpYW50IHNwZWNpZmljIHN0eWxpbmdcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgJ2gtNycsXHJcbiAgICAgICdqdXN0aWZ5LW5vcm1hbCcsXHJcbiAgICAgICdwbC0xJyxcclxuICAgICAgJ3ByLTAuNScsXHJcblxyXG4gICAgICAncm91bmRlZC1tZCcsXHJcbiAgICAgICdob3ZlcjpiZy1oaWdobGlnaHQtMScsXHJcbiAgICAgICdyaW5nLW5vbmUnXHJcbiAgICApXHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIERlZmF1bHQgc3R5bGluZyBmb3Igb3RoZXIgdmFyaWFudHNcclxuICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgJ3ByLTMnLFxyXG4gICAgICAnaC0xMCcsXHJcbiAgICAgICdqdXN0aWZ5LWJldHdlZW4nLFxyXG4gICAgICAnYm9yZGVyLWwtMicsXHJcbiAgICAgICdweC0yJyxcclxuICAgICAgJ3JvdW5kZWQnLFxyXG4gICAgICAncmluZy0xJ1xyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgLy8gQWRkIGNvbG9yLXNwZWNpZmljIHN0eWxpbmdcclxuICBzd2l0Y2ggKHByb3BzLmNvbG9yKSB7XHJcbiAgICBjYXNlICd3YXJuaW5nJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItd2FybmluZyByaW5nLXdhcm5pbmctbGlnaHRlciBob3ZlcjpyaW5nLXdhcm5pbmcnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc3VjY2Vzcyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLXN1Y2Nlc3MgcmluZy1zdWNjZXNzLWxpZ2h0ZXIgaG92ZXI6cmluZy1zdWNjZXNzJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLWRhbmdlciByaW5nLWRhbmdlci1saWdodGVyIGhvdmVyOnJpbmctZGFuZ2VyJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3N1YnRsZSc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLW5vbmUgcmluZy1ub25lIGZsZXgtcm93LXJldmVyc2UgZ2FwLXgtMSBqdXN0aWZ5LWVuZCcpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdkZWZhdWx0JzpcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLXByaW1hcnkgcmluZy1wcmltYXJ5LW11dGVkIGhvdmVyOnJpbmctcHJpbWFyeScpXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IHBhbmVsQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gWydwLTMgYm9yZGVyLXggYm9yZGVyLWIgcm91bmRlZC1iLW1kJ11cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5jb2xvcikge1xyXG4gICAgY2FzZSAnd2FybmluZyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLXdhcm5pbmctbGlnaHRlcicpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdzdWNjZXNzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdib3JkZXItc3VjY2Vzcy1saWdodGVyJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLWRhbmdlci1saWdodGVyJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3N1YnRsZSc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyLW5vbmUgcGwtMCBwci0wIHBiLTAgcHQtMCByb3VuZGVkLW5vbmUnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnZGVmYXVsdCc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2JvcmRlci1wcmltYXJ5LW11dGVkJylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgY2hldnJvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgYmFzZUNsYXNzZXMgPSAnaC00IHctNCB0cmFuc2l0aW9uLXRyYW5zZm9ybSBzaHJpbmstMCBkdXJhdGlvbi0yMDAgZWFzZS1pbi1vdXQnXHJcblxyXG4gIGlmIChwcm9wcy5jb2xvciA9PT0gJ3N1YnRsZScpIHtcclxuICAgIC8vIFN1YnRsZSB2YXJpYW50OiA5MMKwIHdoZW4gY2xvc2VkLCAwwrAgd2hlbiBvcGVuXHJcbiAgICByZXR1cm4gb3Blbi52YWx1ZVxyXG4gICAgICA/IGAke2Jhc2VDbGFzc2VzfSByb3RhdGUtMTgwIHRyYW5zZm9ybWBcclxuICAgICAgOiBgJHtiYXNlQ2xhc3Nlc30gcm90YXRlLTkwIHRyYW5zZm9ybWBcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gT3RoZXIgdmFyaWFudHM6IHJvdGF0ZSB3aGVuIGNsb3NlZCAoZGVmYXVsdCBiZWhhdmlvcilcclxuICAgIHJldHVybiAhb3Blbi52YWx1ZSA/IGAke2Jhc2VDbGFzc2VzfSByb3RhdGUtMTgwIHRyYW5zZm9ybWAgOiBiYXNlQ2xhc3Nlc1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHRvZ2dsZSA9ICgpID0+IHtcclxuICBvcGVuLnZhbHVlID0gIW9wZW4udmFsdWVcclxufVxyXG5cclxuY29uc3Qgb25UaXRsZUlucHV0Qmx1ciA9ICgpID0+IHtcclxuICBpZiAoIXByb3BzLmV4aXRFZGl0TW9kZU9uQmx1cikgcmV0dXJuXHJcblxyXG4gIGVkaXRUaXRsZS52YWx1ZSA9IGZhbHNlXHJcbn1cclxuXHJcbndhdGNoKGVkaXRUaXRsZSwgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XHJcbiAgLy8gUmVzZXQgaW5wdXQgdmFsdWUgb24gdHVybmluZyBvbiBlZGl0IG1vZGVcclxuICBpZiAobmV3VmFsICYmICFvbGRWYWwpIHtcclxuICAgIHN5bmNGcm9tVmFsdWUoKVxyXG4gIH1cclxufSlcclxuPC9zY3JpcHQ+XHJcbiIsImltcG9ydCB0eXBlIHsgQ29uY3JldGVDb21wb25lbnQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgRm9ybUJ1dHRvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcblxyXG50eXBlIEZvcm1CdXR0b25Qcm9wcyA9IEluc3RhbmNlVHlwZTx0eXBlb2YgRm9ybUJ1dHRvbj5bJyRwcm9wcyddXHJcbmltcG9ydCB0eXBlIHsgUHJvcEFueUNvbXBvbmVudCB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2NvbW1vbi9jb21wb25lbnRzJ1xyXG5pbXBvcnQgdHlwZSB7IE1heWJlTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5cclxuZXhwb3J0IGVudW0gR3JpZExpc3RUb2dnbGVWYWx1ZSB7XHJcbiAgR3JpZCA9ICdncmlkJyxcclxuICBMaXN0ID0gJ2xpc3QnXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIExheW91dFRhYkl0ZW08SSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XHJcbiAgdGl0bGU6IHN0cmluZ1xyXG4gIGlkOiBJXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIExheW91dFBhZ2VUYWJJdGVtPEkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xyXG4gIHRpdGxlOiBzdHJpbmdcclxuICBpZDogSVxyXG4gIGNvdW50PzogbnVtYmVyXHJcbiAgdGFnPzogc3RyaW5nXHJcbiAgaWNvbj86IFByb3BBbnlDb21wb25lbnRcclxuICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICBkaXNhYmxlZE1lc3NhZ2U/OiBzdHJpbmdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGF5b3V0TWVudUl0ZW08SSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XHJcbiAgaWNvbj86IENvbmNyZXRlQ29tcG9uZW50XHJcbiAgdGl0bGU6IHN0cmluZ1xyXG4gIGlkOiBJXHJcbiAgZGlzYWJsZWQ/OiBNYXliZU51bGxPclVuZGVmaW5lZDxib29sZWFuPlxyXG4gIGRpc2FibGVkVG9vbHRpcD86IE1heWJlTnVsbE9yVW5kZWZpbmVkPHN0cmluZz5cclxuICBjb2xvcj86ICdkYW5nZXInIHwgJ2luZm8nXHJcbiAgYWN0aXZlPzogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBMYXlvdXREaWFsb2dCdXR0b24gPSB7XHJcbiAgdGV4dDogc3RyaW5nXHJcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIEZvcm1CdXR0b25Qcm9wc1xyXG4gIG9uQ2xpY2s/OiAoZTogTW91c2VFdmVudCkgPT4gdm9pZFxyXG4gIGRpc2FibGVkPzogYm9vbGVhblxyXG4gIGRpc2FibGVkTWVzc2FnZT86IHN0cmluZ1xyXG4gIHN1Ym1pdD86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBUaGlzIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgYnV0dG9uIHdpdGhpbiB0aGUgZm9ybS4gRXZlbiBpZiB5b3UgaGF2ZSBkaWZmZXJlbnQgc2V0c1xyXG4gICAqIG9mIGJ1dHRvbnMgcmVuZGVyZWQgb24gZGlmZmVyZW50IHN0ZXBzIG9mIGEgd2l6YXJkLCBhbGwgb2YgdGhlbSBzaG91bGQgaGF2ZSB1bmlxdWUgSURzIHRvXHJcbiAgICogZW5zdXJlIHByb3BlciBmb3JtIGZ1bmN0aW9uYWxpdHkuXHJcbiAgICovXHJcbiAgaWQ/OiBzdHJpbmdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGF5b3V0SGVhZGVyQnV0dG9uID0ge1xyXG4gIGxhYmVsOiBzdHJpbmdcclxuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBGb3JtQnV0dG9uUHJvcHNcclxuICBvbkNsaWNrPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWRcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGF5b3V0VGFibGVDb2xvdXJzID0gJ3ByaW1hcnknIHwgJ291dGxpbmUnIHwgJ3N1YnRsZScgfCAnZGFuZ2VyJ1xyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGJ1dHRvblxyXG4gICAgY2xhc3M9XCJtYXgtdy1tYXggdHJhbnNpdGlvbiBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgb3V0bGluZS1ub25lIHNlbGVjdC1ub25lIGgtOCB0ZXh0LWZvcmVncm91bmQgYm9yZGVyLTIgYm9yZGVyLXByaW1hcnktbXV0ZWQgZGFyazpib3JkZXItZm91bmRhdGlvbiBiZy1wcmltYXJ5LW11dGVkIHJvdW5kZWQtbWQgYWN0aXZlOnNjYWxlLVswLjk3XSBncm93XCJcclxuICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGJnLXByaW1hcnktbXV0ZWQgcm91bmRlZC1tZFwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0cmFuc2l0aW9uXCJcclxuICAgICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgICAndHJhbnNsYXRlLXgtNyc6IHZhbHVlICE9PSBHcmlkTGlzdFRvZ2dsZVZhbHVlLkxpc3RcclxuICAgICAgICB9XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwidy03IGgtNyBiZy1mb3VuZGF0aW9uIGRhcms6YmctZm91bmRhdGlvbi0yIHRyYW5zaXRpb24gcm91bmRlZCBzaGFkb3dcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi10aXBweT1cIidMaXN0IFZpZXcnXCJcclxuICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHotMTAgZmxleCBzcGFjZS14LTEgaXRlbXMtY2VudGVyIHAtMSByb3VuZGVkLWxcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEJhcnMzSWNvbiBjbGFzcz1cImgtNSB3LTVcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtdGlwcHk9XCInR3JpZCBWaWV3J1wiXHJcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwIGZsZXggc3BhY2UteC0xIGl0ZW1zLWNlbnRlciBwLTEgcm91bmRlZC1yXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxTcXVhcmVzMlgySWNvbiBjbGFzcz1cImgtNSB3LTVcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvYnV0dG9uPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgQmFyczNJY29uLCBTcXVhcmVzMlgySWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L3NvbGlkJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHsgR3JpZExpc3RUb2dnbGVWYWx1ZSB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2xheW91dC9jb21wb25lbnRzJ1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ2NsaWNrJywgdjogTW91c2VFdmVudCk6IHZvaWRcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdjogR3JpZExpc3RUb2dnbGVWYWx1ZSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgbW9kZWxWYWx1ZT86IEdyaWRMaXN0VG9nZ2xlVmFsdWVcclxufT4oKVxyXG5cclxuY29uc3QgdmFsdWUgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBwcm9wcy5tb2RlbFZhbHVlIHx8IEdyaWRMaXN0VG9nZ2xlVmFsdWUuR3JpZCxcclxuICBzZXQ6IChuZXdWYWwpID0+IGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgbmV3VmFsKVxyXG59KVxyXG5cclxuY29uc3Qgb25DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgZW1pdCgnY2xpY2snLCBlKVxyXG5cclxuICBjb25zdCBuZXdWYWwgPVxyXG4gICAgdmFsdWUudmFsdWUgPT09IEdyaWRMaXN0VG9nZ2xlVmFsdWUuR3JpZFxyXG4gICAgICA/IEdyaWRMaXN0VG9nZ2xlVmFsdWUuTGlzdFxyXG4gICAgICA6IEdyaWRMaXN0VG9nZ2xlVmFsdWUuR3JpZFxyXG4gIHZhbHVlLnZhbHVlID0gbmV3VmFsXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnXHJcbiAgICB3aWR0aD1cIjE2XCJcclxuICAgIGhlaWdodD1cIjE2XCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPHBhdGhcclxuICAgICAgZmlsbC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICBkPVwiTTEyLjg4NDkgNS45MTg1MUw3LjI1NjE0IDExLjc0TDMuOTk5NTEgOC40ODMzN0w0LjkzMzg4IDcuNTQ5TDcuMjQwMjggOS44NTU0TDExLjkzNDkgNUwxMi44ODQ5IDUuOTE4NTFaXCJcclxuICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAvPlxyXG4gIDwvc3ZnPlxyXG48L3RlbXBsYXRlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPEhlYWRsZXNzTWVudSB2LXNsb3Q9XCJ7IG9wZW46IGlzTWVudU9wZW4gfVwiIGFzPVwiZGl2XCIgY2xhc3M9XCJyZWxhdGl2ZSBpbmxpbmUtYmxvY2tcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxNZW51QnV0dG9uIDppZD1cIm1lbnVJZFwiIHJlZj1cIm1lbnVCdXR0b25cIiBjbGFzcz1cImhpZGRlblwiIEBjbGljay5zdG9wLnByZXZlbnQgLz5cclxuICAgICAgPCEtLSBjb25kaXRpb25hbCBwb2ludGVyLWV2ZW50cy1ub25lIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkb3VibGUgZXZlbnRzIHdoZW4gY2xpY2tpbmcgb24gdGhlIGJ1dHRvbiB3aGVuIHRoZSBtZW51IGlzIGFscmVhZHkgb3BlbiAtLT5cclxuICAgICAgPGRpdiByZWY9XCJtZW51QnV0dG9uV3JhcHBlclwiIDpjbGFzcz1cImlzTWVudU9wZW4gPyAncG9pbnRlci1ldmVudHMtbm9uZScgOiAnJ1wiPlxyXG4gICAgICAgIDxzbG90IDp0b2dnbGU9XCJ0b2dnbGVcIiA6b3Blbj1cInByb2Nlc3NPcGVuKGlzTWVudU9wZW4pXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxUZWxlcG9ydCB0bz1cImJvZHlcIiA6ZGlzYWJsZWQ9XCIhbW91bnRNZW51T25Cb2R5XCI+XHJcbiAgICAgIDxNZW51SXRlbXNcclxuICAgICAgICB2LWlmPVwiaXNNZW51T3BlblwiXHJcbiAgICAgICAgcmVmPVwibWVudUl0ZW1zXCJcclxuICAgICAgICA6Y2xhc3M9XCJtZW51SXRlbXNDbGFzc2VzXCJcclxuICAgICAgICA6c3R5bGU9XCJtZW51SXRlbXNTdHlsZXNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiB2LWZvcj1cIihncm91cCwgaSkgaW4gaXRlbXNcIiA6a2V5PVwiaVwiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICA8TWVudUl0ZW1cclxuICAgICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGdyb3VwXCJcclxuICAgICAgICAgICAgdi1zbG90PVwieyBhY3RpdmUsIGRpc2FibGVkIH1cIlxyXG4gICAgICAgICAgICA6a2V5PVwiaXRlbS5pZFwiXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWQgfHwgdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgOmNvbG9yPVwiaXRlbS5jb2xvclwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIHYtdGlwcHk9XCJpdGVtLmRpc2FibGVkICYmIGl0ZW0uZGlzYWJsZWRUb29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiYnVpbGRCdXR0b25DbGFzc3Nlcyh7IGFjdGl2ZSwgZGlzYWJsZWQsIGNvbG9yOiBpdGVtLmNvbG9yIH0pXCJcclxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIEBjbGljaz1cImNob29zZUl0ZW0oaXRlbSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPENvbXBvbmVudCA6aXM9XCJpdGVtLmljb25cIiB2LWlmPVwiaXRlbS5pY29uXCIgY2xhc3M9XCJoLTQgdy00XCIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cInNob3dUaWNrcyA9PT0gdHJ1ZVwiIGNsYXNzPVwidy01IHNocmluay0wXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxJY29uQ2hlY2sgdi1pZj1cIml0ZW0uYWN0aXZlXCIgY2xhc3M9XCJoLTQgdy00IHRleHQtZm9yZWdyb3VuZC0yXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cIml0ZW1cIiA6aXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiA6Y2xhc3M9XCJ7IGdyb3c6ICEhc2hvd1RpY2tzIH1cIj57eyBpdGVtLnRpdGxlIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzaG93VGlja3MgPT09ICdyaWdodCcgJiYgaXRlbS5hY3RpdmVcIiBjbGFzcz1cInctNSBzaHJpbmstMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8SWNvbkNoZWNrIHYtaWY9XCJpdGVtLmFjdGl2ZVwiIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmQtMlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9NZW51SXRlbT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9NZW51SXRlbXM+XHJcbiAgICA8L1RlbGVwb3J0PlxyXG4gIDwvSGVhZGxlc3NNZW51PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIiBnZW5lcmljPVwiTWVudUlkcyBleHRlbmRzIHN0cmluZyA9IHN0cmluZ1wiPlxyXG5pbXBvcnQgeyBkaXJlY3RpdmUgYXMgdlRpcHB5IH0gZnJvbSAndnVlLXRpcHB5J1xyXG5pbXBvcnQgeyBNZW51IGFzIEhlYWRsZXNzTWVudSwgTWVudUJ1dHRvbiwgTWVudUl0ZW1zLCBNZW51SXRlbSB9IGZyb20gJ0BoZWFkbGVzc3VpL3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiwgd2F0Y2gsIG9uTW91bnRlZCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHtcclxuICBIb3Jpem9udGFsRGlyZWN0aW9uLFxyXG4gIHVzZVJlc3BvbnNpdmVIb3Jpem9udGFsRGlyZWN0aW9uQ2FsY3VsYXRpb25cclxufSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvY29tbW9uL3dpbmRvdydcclxuaW1wb3J0IHR5cGUgeyBMYXlvdXRNZW51SXRlbSB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2xheW91dC9jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyB1c2VFbGVtZW50Qm91bmRpbmcsIHVzZUVsZW1lbnRTaXplLCB1c2VFdmVudExpc3RlbmVyIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyB1c2VCb2R5TW91bnRlZE1lbnVQb3NpdGlvbmluZyB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9sYXlvdXQvbWVudSdcclxuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICcjbG9kYXNoJ1xyXG5pbXBvcnQgSWNvbkNoZWNrIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2dsb2JhbC9pY29uL0NoZWNrLnZ1ZSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICd1cGRhdGU6b3BlbicsIHZhbDogYm9vbGVhbik6IHZvaWRcclxuICAoZTogJ2Nob3NlbicsIHZhbDogeyBldmVudDogTW91c2VFdmVudDsgaXRlbTogTGF5b3V0TWVudUl0ZW08TWVudUlkcz4gfSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgb3Blbj86IGJvb2xlYW5cclxuICAvKipcclxuICAgKiAyRCBhcnJheSBzbyB0aGF0IGl0ZW1zIGNhbiBiZSBncm91cGVkIHdpdGggZGl2aWRlcnMgYmV0d2VlbiB0aGVtXHJcbiAgICovXHJcbiAgaXRlbXM6IExheW91dE1lbnVJdGVtPE1lbnVJZHM+W11bXVxyXG4gIHNpemU/OiAnYmFzZScgfCAnbGcnIHwgbnVtYmVyXHJcbiAgbWVudUlkPzogc3RyaW5nXHJcbiAgLyoqXHJcbiAgICogUHJlZmVyYWJsZSBtZW51IHBvc2l0aW9uL2RpcmVjdGVkLiBUaGlzIGNhbiBjaGFuZ2UgZGVwZW5kaW5nIG9uIGF2YWlsYWJsZSBzcGFjZS5cclxuICAgKi9cclxuICBtZW51UG9zaXRpb24/OiBIb3Jpem9udGFsRGlyZWN0aW9uXHJcbiAgbW91bnRNZW51T25Cb2R5PzogYm9vbGVhblxyXG4gIGN1c3RvbU1lbnVJdGVtc0NsYXNzZXM/OiBzdHJpbmdbXVxyXG4gIHNob3dUaWNrcz86IGJvb2xlYW4gfCAncmlnaHQnXHJcbn0+KClcclxuXHJcbmNvbnN0IG1lbnVJdGVtcyA9IHJlZihudWxsIGFzIE51bGxhYmxlPHsgZWw6IEhUTUxEaXZFbGVtZW50IH0+KVxyXG5jb25zdCBtZW51QnV0dG9uID0gcmVmKG51bGwgYXMgTnVsbGFibGU8eyBlbDogSFRNTEJ1dHRvbkVsZW1lbnQgfT4pXHJcbmNvbnN0IG1lbnVCdXR0b25XcmFwcGVyID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTEVsZW1lbnQ+KVxyXG5jb25zdCBpc09wZW5JbnRlcm5hbGx5ID0gcmVmKGZhbHNlKVxyXG5jb25zdCBpc01vdW50ZWQgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBmaW5hbE9wZW4gPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBwcm9wcy5vcGVuIHx8IGZhbHNlLFxyXG4gIHNldDogKG5ld1ZhbCkgPT4gZW1pdCgndXBkYXRlOm9wZW4nLCBuZXdWYWwpXHJcbn0pXHJcblxyXG5jb25zdCBtZW51QnV0dG9uQm91bmRpbmcgPSB1c2VFbGVtZW50Qm91bmRpbmcobWVudUJ1dHRvbldyYXBwZXIsIHtcclxuICB3aW5kb3dSZXNpemU6IHRydWUsXHJcbiAgd2luZG93U2Nyb2xsOiB0cnVlLFxyXG4gIGltbWVkaWF0ZTogdHJ1ZVxyXG59KVxyXG5cclxuY29uc3QgbWVudUl0ZW1zU2l6ZSA9IHVzZUVsZW1lbnRTaXplKGNvbXB1dGVkKCgpID0+IG1lbnVJdGVtcy52YWx1ZT8uZWwgfHwgbnVsbCkpXHJcblxyXG5jb25zdCB7IGRpcmVjdGlvbjogY2FsY3VsYXRlZERpcmVjdGlvbiB9ID0gdXNlUmVzcG9uc2l2ZUhvcml6b250YWxEaXJlY3Rpb25DYWxjdWxhdGlvbih7XHJcbiAgZWw6IGNvbXB1dGVkKCgpID0+IG1lbnVJdGVtcy52YWx1ZT8uZWwgfHwgbnVsbCksXHJcbiAgZGVmYXVsdERpcmVjdGlvbjogcHJvcHMubWVudVBvc2l0aW9uLFxyXG4gIHN0b3BVcGRhdGVzQmVsb3dXaWR0aDogMzAwXHJcbn0pXHJcblxyXG5jb25zdCBtZW51RGlyZWN0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBwcm9wcy5tZW51UG9zaXRpb24gfHwgY2FsY3VsYXRlZERpcmVjdGlvbi52YWx1ZVxyXG59KVxyXG5cclxuY29uc3QgeyBtZW51U3R5bGUgfSA9IHVzZUJvZHlNb3VudGVkTWVudVBvc2l0aW9uaW5nKHtcclxuICBtZW51T3BlbkRpcmVjdGlvbjogbWVudURpcmVjdGlvbixcclxuICBidXR0b25Cb3VuZGluZ0JveDogbWVudUJ1dHRvbkJvdW5kaW5nLFxyXG4gIG1lbnVXaWR0aDogY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKGlzTnVtYmVyKHByb3BzLnNpemUpKSByZXR1cm4gcHJvcHMuc2l6ZVxyXG5cclxuICAgIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuIDIwOFxyXG4gICAgICBjYXNlICdiYXNlJzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gMTc2XHJcbiAgICB9XHJcbiAgfSksXHJcbiAgbWVudUhlaWdodDogY29tcHV0ZWQoKCkgPT4gbWVudUl0ZW1zU2l6ZS5oZWlnaHQudmFsdWUpXHJcbn0pXHJcblxyXG5jb25zdCBtZW51SXRlbXNTdHlsZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgLy8gT25seSBhZGQgc3R5bGVzIGZvciBib2R5IG1vdW50ZWQgbWVudXNcclxuICBpZiAoIXByb3BzLm1vdW50TWVudU9uQm9keSkgcmV0dXJuIHt9XHJcbiAgaWYgKCFtZW51QnV0dG9uQm91bmRpbmcud2lkdGgudmFsdWUpIHJldHVybiB7fVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcG9zaXRpb246ICdmaXhlZCcsXHJcbiAgICB6SW5kZXg6IDUwLFxyXG4gICAgLi4ubWVudVN0eWxlLnZhbHVlXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgbWVudUl0ZW1zQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ3ctNDQgb3JpZ2luLXRvcC1yaWdodCBkaXZpZGUteSBkaXZpZGUtb3V0bGluZS0zIHJvdW5kZWQtbWQgYmctZm91bmRhdGlvbiBzaGFkb3ctbGcgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTIgei01MCdcclxuICBdXHJcblxyXG4gIGlmIChwcm9wcy5jdXN0b21NZW51SXRlbXNDbGFzc2VzKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goLi4ucHJvcHMuY3VzdG9tTWVudUl0ZW1zQ2xhc3NlcylcclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5tb3VudE1lbnVPbkJvZHkpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnZml4ZWQnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2Fic29sdXRlIG10LTEnKVxyXG5cclxuICAgIGlmIChtZW51RGlyZWN0aW9uLnZhbHVlID09PSBIb3Jpem9udGFsRGlyZWN0aW9uLkxlZnQpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdyaWdodC0wJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5zaXplID09PSAnbGcnKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3ctNTInKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ3ctNDQnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBidWlsZEJ1dHRvbkNsYXNzc2VzID0gKHBhcmFtczoge1xyXG4gIGFjdGl2ZT86IGJvb2xlYW5cclxuICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICBjb2xvcj86ICdkYW5nZXInIHwgJ2luZm8nXHJcbn0pID0+IHtcclxuICBjb25zdCB7IGFjdGl2ZSwgZGlzYWJsZWQsIGNvbG9yIH0gPSBwYXJhbXNcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ2dyb3VwIGZsZXggc3BhY2UteC0yIHctZnVsbCBpdGVtcy1jZW50ZXIgcm91bmRlZC1tZCBweC0yIHB5LTEgdGV4dC1ib2R5LXhzIHRleHQtbGVmdCdcclxuICBdXHJcblxyXG4gIGlmIChhY3RpdmUgJiYgIWNvbG9yKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLXByaW1hcnktbXV0ZWQgdGV4dC1mb3JlZ3JvdW5kJylcclxuICB9IGVsc2UgaWYgKGRpc2FibGVkKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ29wYWNpdHktNDAnKVxyXG4gIH0gZWxzZSBpZiAoY29sb3IgPT09ICdkYW5nZXInICYmIGFjdGl2ZSkge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQtb24tcHJpbWFyeSBiZy1kYW5nZXInKVxyXG4gIH0gZWxzZSBpZiAoY29sb3IgPT09ICdkYW5nZXInICYmICFhY3RpdmUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1kYW5nZXInKVxyXG4gIH0gZWxzZSBpZiAoY29sb3IgPT09ICdpbmZvJyAmJiBhY3RpdmUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1mb3JlZ3JvdW5kLW9uLXByaW1hcnkgYmctaW5mbycpXHJcbiAgfSBlbHNlIGlmIChjb2xvciA9PT0gJ2luZm8nICYmICFhY3RpdmUpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1pbmZvJylcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWZvcmVncm91bmQnKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn1cclxuXHJcbmNvbnN0IGNob29zZUl0ZW0gPSAoaXRlbTogTGF5b3V0TWVudUl0ZW08TWVudUlkcz4sIGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgZW1pdCgnY2hvc2VuJywgeyBpdGVtLCBldmVudCB9KVxyXG4gIHNldE9wZW4oZmFsc2UpXHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZSA9ICgpID0+IHtcclxuICBtZW51QnV0dG9uLnZhbHVlPy5lbC5jbGljaygpXHJcbiAgaWYgKHByb3BzLm1vdW50TWVudU9uQm9keSkge1xyXG4gICAgbWVudUJ1dHRvbkJvdW5kaW5nLnVwZGF0ZSgpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBzZXRPcGVuID0gKG9wZW46IGJvb2xlYW4pID0+IHtcclxuICBpZiAoaXNPcGVuSW50ZXJuYWxseS52YWx1ZSA9PT0gb3BlbikgcmV0dXJuXHJcbiAgdG9nZ2xlKClcclxufVxyXG5cclxuLy8gb2sgdGhpcyBpcyBhIGJpdCBoYWNreSwgYnV0IGl0J3MgZG9uZSBiZWNhdXNlIG9mIGhlYWRsZXNzdWkncyBsaW1pdGVkIEFQSVxyXG4vLyB0aGUgcG9pbnQgb2YgdGhpcyBpcyAxKSBjYXN0IGFueSB0byBib29sIDIpIHN0b3JlICdvcGVuJyBzdGF0ZSBsb2NhbGx5XHJcbi8vIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBvdXRzaWRlIG9mIHRoZSB0ZW1wbGF0ZVxyXG5jb25zdCBwcm9jZXNzT3BlbiA9ICh2YWw6IHVua25vd24pOiB2YWwgaXMgYm9vbGVhbiA9PiB7XHJcbiAgY29uc3QgaXNPcGVuID0gISF2YWxcclxuICBpc09wZW5JbnRlcm5hbGx5LnZhbHVlID0gaXNPcGVuXHJcbiAgcmV0dXJuIGlzT3BlblxyXG59XHJcblxyXG53YXRjaChpc09wZW5JbnRlcm5hbGx5LCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICBpZiAobmV3VmFsID09PSBvbGRWYWwpIHJldHVyblxyXG4gIGZpbmFsT3Blbi52YWx1ZSA9IG5ld1ZhbFxyXG59KVxyXG5cclxud2F0Y2goZmluYWxPcGVuLCAoc2hvdWxkQmVPcGVuKSA9PiB7XHJcbiAgaWYgKHNob3VsZEJlT3BlbiAmJiAhaXNPcGVuSW50ZXJuYWxseS52YWx1ZSkge1xyXG4gICAgdG9nZ2xlKClcclxuICB9IGVsc2UgaWYgKCFzaG91bGRCZU9wZW4gJiYgaXNPcGVuSW50ZXJuYWxseS52YWx1ZSkge1xyXG4gICAgdG9nZ2xlKClcclxuICB9XHJcbn0pXHJcblxyXG5vbk1vdW50ZWQoKCkgPT4ge1xyXG4gIGlzTW91bnRlZC52YWx1ZSA9IHRydWVcclxufSlcclxuXHJcbnVzZUV2ZW50TGlzdGVuZXIod2luZG93LCAncmVzaXplJywgKCkgPT4ge1xyXG4gIG1lbnVCdXR0b25Cb3VuZGluZy51cGRhdGUoKVxyXG59KVxyXG5cclxudXNlRXZlbnRMaXN0ZW5lcih3aW5kb3csICdzY3JvbGwnLCAoKSA9PiB7XHJcbiAgbWVudUJ1dHRvbkJvdW5kaW5nLnVwZGF0ZSgpXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHotMTAgZmxleCBmbGV4LWNvbCAhbXQtMFwiPlxyXG4gICAgPCEtLSBMZWZ0IEFycm93IEJ1dHRvbiAtLT5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LVstMnB4XSB0b3AtWy0ycHhdIHotMjAgcHItOCBiZy1ncmFkaWVudC10by1yIGZyb20tZm91bmRhdGlvbi1wYWdlIHRvLXRyYW5zcGFyZW50XCJcclxuICAgID5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHYtaWY9XCJzaG93TGVmdEFycm93XCJcclxuICAgICAgICBjbGFzcz1cImJnLWZvdW5kYXRpb24gcC0xIHJvdW5kZWQtZnVsbCBib3JkZXIgYm9yZGVyLW91dGxpbmUtNCBzaGFkb3dcIlxyXG4gICAgICAgIEBjbGljaz1cInNjcm9sbExlZnRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEFycm93TG9uZ0xlZnRJY29uIGNsYXNzPVwiaC00IHctNFwiIC8+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgbGVmdC0wIHotMTAgdy1mdWxsIGgtWzFweF0gbXQtcHggYmctb3V0bGluZS0zIHRvcC03XCI+PC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIHJlZj1cInNjcm9sbENvbnRhaW5lclwiXHJcbiAgICAgIGNsYXNzPVwicmVsYXRpdmUgb3ZlcmZsb3cteC1hdXRvIGhpZGUtc2Nyb2xsYmFyIHctZnVsbFwiXHJcbiAgICAgIEBzY3JvbGw9XCJoYW5kbGVTY3JvbGxcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgOnN0eWxlPVwiYm9yZGVyU3R5bGVcIlxyXG4gICAgICAgIGNsYXNzPVwiaC1bMnB4XSBhYnNvbHV0ZSBib3R0b20tMCB6LTIwIHRyYW5zaXRpb24tW2xlZnQsd2lkdGhdIGR1cmF0aW9uLTMwMFwiXHJcbiAgICAgICAgOmNsYXNzPVwiaXNJbml0aWFsU2V0dXAgPyAnYmctdHJhbnNwYXJlbnQnIDogJ2JnLXByaW1hcnknXCJcclxuICAgICAgPjwvZGl2PlxyXG5cclxuICAgICAgPGRpdiByZWY9XCJidXR0b25Db250YWluZXJcIiBjbGFzcz1cImZsZXggdy1mdWxsIHNwYWNlLXgtNFwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHYtZm9yPVwiaXRlbSBpbiBpdGVtc1wiXHJcbiAgICAgICAgICA6a2V5PVwiaXRlbS5pZFwiXHJcbiAgICAgICAgICA6ZGF0YS10YWItaWQ9XCJpdGVtLmlkXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgICAgYnV0dG9uQ2xhc3MoaXRlbSksXHJcbiAgICAgICAgICAgIHsgJyFib3JkZXItcHJpbWFyeSc6IGlzQWN0aXZlSXRlbShpdGVtKSAmJiBpc0luaXRpYWxTZXR1cCB9XHJcbiAgICAgICAgICBdXCJcclxuICAgICAgICAgIGNsYXNzPVwidGFiLWJ1dHRvblwiXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgIEBjbGljaz1cInNldEFjdGl2ZUl0ZW0oaXRlbSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgIDppcz1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgdi1pZj1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaHJpbmstMCBoLTQgdy00IHN0cm9rZS1bMnB4XVwiXHJcbiAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctNlwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5kaXNhYmxlZCAmJiBpdGVtLmRpc2FibGVkTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICB2LXRpcHB5PVwiaXRlbS5kaXNhYmxlZE1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gdi1lbHNlPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgdi1pZj1cIml0ZW0uY291bnRcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1mdWxsIHB4LTIgdGV4dC1ib2R5LTN4cyB0cmFuc2l0aW9uLWFsbCBtaW4tdy02XCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCJcclxuICAgICAgICAgICAgICAgIGFjdGl2ZUl0ZW0/LmlkID09PSBpdGVtLmlkXHJcbiAgICAgICAgICAgICAgICAgID8gJ3RleHQtcHJpbWFyeSBiZy1pbmZvLWxpZ2h0ZXIgZGFyazp0ZXh0LWZvcmVncm91bmQnXHJcbiAgICAgICAgICAgICAgICAgIDogJ3RleHQtZm9yZWdyb3VuZC0yIGJnLWhpZ2hsaWdodC0zJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmNvdW50IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPENvbW1vbkJhZGdlIHYtaWY9XCJpdGVtLnRhZ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGl0ZW0udGFnIH19XHJcbiAgICAgICAgICAgIDwvQ29tbW9uQmFkZ2U+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJpZ2h0IEFycm93IEJ1dHRvbiAtLT5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJhYnNvbHV0ZSByaWdodC1bLTJweF0gdG9wLVstMnB4XSB6LTIwIHBsLTggYmctZ3JhZGllbnQtdG8tbCBmcm9tLWZvdW5kYXRpb24tcGFnZSB0by10cmFuc3BhcmVudFwiXHJcbiAgICA+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB2LWlmPVwic2hvd1JpZ2h0QXJyb3dcIlxyXG4gICAgICAgIGNsYXNzPVwiYmctZm91bmRhdGlvbiBwLTEgcm91bmRlZC1mdWxsIGJvcmRlciBib3JkZXItb3V0bGluZS0zIHNoYWRvd1wiXHJcbiAgICAgICAgQGNsaWNrPVwic2Nyb2xsUmlnaHRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEFycm93TG9uZ1JpZ2h0SWNvbiBjbGFzcz1cImgtNCB3LTRcIiAvPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInB0LTRcIj5cclxuICAgICAgPHNsb3QgOmFjdGl2ZS1pdGVtPVwiYWN0aXZlSXRlbVwiIC8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IGNvbXB1dGVkLCByZWYsIG9uTW91bnRlZCwgd2F0Y2gsIG9uQmVmb3JlVW5tb3VudCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IExheW91dFBhZ2VUYWJJdGVtIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvbGF5b3V0L2NvbXBvbmVudHMnXHJcbmltcG9ydCB7IGlzQ2xpZW50IH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyBBcnJvd0xvbmdSaWdodEljb24sIEFycm93TG9uZ0xlZnRJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgdGhyb3R0bGUgfSBmcm9tICcjbG9kYXNoJ1xyXG5pbXBvcnQgeyB1c2VSZXNpemVPYnNlcnZlciB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IENvbW1vbkJhZGdlIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYWRnZS52dWUnXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBpdGVtczogTGF5b3V0UGFnZVRhYkl0ZW1bXVxyXG59PigpXHJcblxyXG5jb25zdCBhY3RpdmVJdGVtID0gZGVmaW5lTW9kZWw8TGF5b3V0UGFnZVRhYkl0ZW0+KCdhY3RpdmVJdGVtJywgeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG5cclxuY29uc3QgYnV0dG9uQ29udGFpbmVyID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTERpdkVsZW1lbnQ+KVxyXG5jb25zdCBzY3JvbGxDb250YWluZXIgPSByZWY8SFRNTEVsZW1lbnQgfCBudWxsPihudWxsKVxyXG5jb25zdCBzaG93TGVmdEFycm93ID0gcmVmKGZhbHNlKVxyXG5jb25zdCBzaG93UmlnaHRBcnJvdyA9IHJlZihmYWxzZSlcclxuY29uc3QgaXNJbml0aWFsU2V0dXAgPSByZWYodHJ1ZSlcclxuXHJcbmNvbnN0IHVuZGVybGluZUxlZnQgPSByZWYoJzBweCcpXHJcbmNvbnN0IHVuZGVybGluZVdpZHRoID0gcmVmKCcwcHgnKVxyXG5cclxuY29uc3QgYnV0dG9uQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIChpdGVtOiBMYXlvdXRQYWdlVGFiSXRlbSkgPT4ge1xyXG4gICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVJdGVtLnZhbHVlPy5pZCA9PT0gaXRlbS5pZFxyXG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXHJcbiAgICAgICdyZWxhdGl2ZScsXHJcbiAgICAgICd6LTEwJyxcclxuICAgICAgJ2ZsZXgnLFxyXG4gICAgICAnaXRlbXMtY2VudGVyJyxcclxuICAgICAgJ2Rpc2FibGVkOm9wYWNpdHktNjAgZGlzYWJsZWQ6aG92ZXI6Ym9yZGVyLXRyYW5zcGFyZW50IGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpob3ZlcjpiZy10cmFuc3BhcmVudCcsXHJcbiAgICAgICd0ZXh0LWJvZHkteHMnLFxyXG4gICAgICAnaG92ZXI6c206Ym9yZGVyLW91dGxpbmUtMicsXHJcbiAgICAgICdwYi0yJyxcclxuICAgICAgJ2JvcmRlci1iLVsycHhdJyxcclxuICAgICAgJ2JvcmRlci10cmFuc3BhcmVudCcsXHJcbiAgICAgICdtYXgtdy1tYXgnLFxyXG4gICAgICAnbGFzdDptci02JyxcclxuICAgICAgJ3doaXRlc3BhY2Utbm93cmFwJ1xyXG4gICAgXVxyXG5cclxuICAgIGlmIChpc0FjdGl2ZSkgYmFzZUNsYXNzZXMucHVzaCgndGV4dC1wcmltYXJ5JywgJ2hvdmVyOnRleHQtcHJpbWFyeScpXHJcbiAgICBlbHNlIGJhc2VDbGFzc2VzLnB1c2goJ3RleHQtZm9yZWdyb3VuZCcpXHJcblxyXG4gICAgcmV0dXJuIGJhc2VDbGFzc2VzXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgYWN0aXZlSXRlbVJlZiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBpZCA9IGFjdGl2ZUl0ZW0udmFsdWU/LmlkXHJcbiAgaWYgKCFpZCkgcmV0dXJuIG51bGxcclxuXHJcbiAgY29uc3QgcGFyZW50ID0gYnV0dG9uQ29udGFpbmVyLnZhbHVlXHJcbiAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsXHJcblxyXG4gIGNvbnN0IGJ0bnMgPSBbLi4ucGFyZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYi1idXR0b24nKV0gYXMgSFRNTEVsZW1lbnRbXVxyXG4gIHJldHVybiBidG5zLmZpbmQoKGIpID0+IGIuZGF0YXNldFsndGFiSWQnXSA9PT0gaWQpIHx8IG51bGxcclxufSlcclxuXHJcbmNvbnN0IGJvcmRlclN0eWxlID0gY29tcHV0ZWQ8Q1NTUHJvcGVydGllcz4oKCkgPT4gKHtcclxuICBsZWZ0OiB1bmRlcmxpbmVMZWZ0LnZhbHVlLFxyXG4gIHdpZHRoOiB1bmRlcmxpbmVXaWR0aC52YWx1ZVxyXG59KSlcclxuXHJcbmNvbnN0IHVwZGF0ZVVuZGVybGluZSA9ICgpID0+IHtcclxuICBjb25zdCBlbCA9IGFjdGl2ZUl0ZW1SZWYudmFsdWVcclxuICBpZiAoIWVsKSByZXR1cm5cclxuXHJcbiAgdW5kZXJsaW5lTGVmdC52YWx1ZSA9IGAke2VsLm9mZnNldExlZnR9cHhgXHJcbiAgdW5kZXJsaW5lV2lkdGgudmFsdWUgPSBgJHtlbC5jbGllbnRXaWR0aH1weGBcclxufVxyXG5cclxuY29uc3Qgc2V0QWN0aXZlSXRlbSA9IChpdGVtOiBMYXlvdXRQYWdlVGFiSXRlbSkgPT4ge1xyXG4gIGFjdGl2ZUl0ZW0udmFsdWUgPSBpdGVtXHJcbiAgaXNJbml0aWFsU2V0dXAudmFsdWUgPSBmYWxzZVxyXG59XHJcblxyXG5jb25zdCBpc0FjdGl2ZUl0ZW0gPSAoaXRlbTogTGF5b3V0UGFnZVRhYkl0ZW0pID0+IHtcclxuICByZXR1cm4gYWN0aXZlSXRlbS52YWx1ZT8uaWQgPT09IGl0ZW0uaWRcclxufVxyXG5cclxuY29uc3QgY2hlY2tBcnJvd3NWaXNpYmlsaXR5ID0gKCkgPT4ge1xyXG4gIGNvbnN0IGNvbnRhaW5lciA9IHNjcm9sbENvbnRhaW5lci52YWx1ZVxyXG4gIGlmICghY29udGFpbmVyKSByZXR1cm5cclxuXHJcbiAgY29uc3Qgc2Nyb2xsV2lkdGggPSBjb250YWluZXIuc2Nyb2xsV2lkdGhcclxuICBjb25zdCBjbGllbnRXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aFxyXG4gIGNvbnN0IHNjcm9sbExlZnQgPSBjb250YWluZXIuc2Nyb2xsTGVmdFxyXG4gIGNvbnN0IGJ1ZmZlciA9IDFcclxuXHJcbiAgc2hvd0xlZnRBcnJvdy52YWx1ZSA9IHNjcm9sbExlZnQgPiBidWZmZXJcclxuICBzaG93UmlnaHRBcnJvdy52YWx1ZSA9IHNjcm9sbExlZnQgPCBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoIC0gYnVmZmVyXHJcbn1cclxuXHJcbmNvbnN0IHNjcm9sbExlZnQgPSAoKSA9PiB7XHJcbiAgc2Nyb2xsQ29udGFpbmVyLnZhbHVlPy5zY3JvbGxCeSh7IGxlZnQ6IC0xMDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KSAvLyBBZGp1c3QgdGhlIHNjcm9sbCBhbW91bnQgYXMgbmVlZGVkXHJcbiAgY2hlY2tBcnJvd3NWaXNpYmlsaXR5KClcclxufVxyXG5cclxuY29uc3Qgc2Nyb2xsUmlnaHQgPSAoKSA9PiB7XHJcbiAgc2Nyb2xsQ29udGFpbmVyLnZhbHVlPy5zY3JvbGxCeSh7IGxlZnQ6IDEwMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pIC8vIEFkanVzdCB0aGUgc2Nyb2xsIGFtb3VudCBhcyBuZWVkZWRcclxuICBjaGVja0Fycm93c1Zpc2liaWxpdHkoKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVTY3JvbGwgPSB0aHJvdHRsZSgoKSA9PiB7XHJcbiAgY2hlY2tBcnJvd3NWaXNpYmlsaXR5KClcclxufSwgMjUwKVxyXG5cclxuY29uc3QgZW5zdXJlQWN0aXZlSXRlbVZpc2libGUgPSAoKSA9PiB7XHJcbiAgY29uc3QgYWN0aXZlQnV0dG9uID0gYWN0aXZlSXRlbVJlZi52YWx1ZVxyXG4gIGlmIChhY3RpdmVCdXR0b24gJiYgc2Nyb2xsQ29udGFpbmVyLnZhbHVlKSB7XHJcbiAgICBhY3RpdmVCdXR0b24uc2Nyb2xsSW50b1ZpZXcoe1xyXG4gICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXHJcbiAgICAgIGJsb2NrOiAnbmVhcmVzdCcsXHJcbiAgICAgIGlubGluZTogJ2NlbnRlcidcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5vbk1vdW50ZWQoKCkgPT4ge1xyXG4gIGlmIChpc0NsaWVudCkge1xyXG4gICAgaWYgKHByb3BzLml0ZW1zLmxlbmd0aCAmJiAhYWN0aXZlSXRlbS52YWx1ZSkge1xyXG4gICAgICBzZXRBY3RpdmVJdGVtKHByb3BzLml0ZW1zWzBdKVxyXG4gICAgfVxyXG4gICAgY2hlY2tBcnJvd3NWaXNpYmlsaXR5KClcclxuICAgIGVuc3VyZUFjdGl2ZUl0ZW1WaXNpYmxlKClcclxuICB9XHJcbn0pXHJcblxyXG53YXRjaChcclxuICAoKSA9PiBbcHJvcHMuaXRlbXMsIGFjdGl2ZUl0ZW0udmFsdWVdIGFzIGNvbnN0LFxyXG4gIChbbmV3SXRlbXNdKSA9PiB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdJdGVtcykgJiYgbmV3SXRlbXMubGVuZ3RoICYmICFhY3RpdmVJdGVtLnZhbHVlKSB7XHJcbiAgICAgIHNldEFjdGl2ZUl0ZW0obmV3SXRlbXNbMF0pXHJcbiAgICB9XHJcbiAgICBjaGVja0Fycm93c1Zpc2liaWxpdHkoKVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgeyBzdG9wOiBzdG9wUmVzaXplT2JzZXJ2ZXIgfSA9IHVzZVJlc2l6ZU9ic2VydmVyKGFjdGl2ZUl0ZW1SZWYsICgpID0+XHJcbiAgdXBkYXRlVW5kZXJsaW5lKClcclxuKVxyXG5cclxub25CZWZvcmVVbm1vdW50KCgpID0+IHtcclxuICBoYW5kbGVTY3JvbGwuY2FuY2VsKClcclxuICBzdG9wUmVzaXplT2JzZXJ2ZXIoKVxyXG59KVxyXG48L3NjcmlwdD5cclxuPHN0eWxlPlxyXG4vKiBIaWRlIHNjcm9sbGJhciBmb3IgQ2hyb21lLCBTYWZhcmkgYW5kIE9wZXJhICovXHJcbi5oaWRlLXNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi8qIEhpZGUgc2Nyb2xsYmFyIGZvciBJRSwgRWRnZSBhbmQgRmlyZWZveCAqL1xyXG4uaGlkZS1zY3JvbGxiYXIge1xyXG4gIC1tcy1vdmVyZmxvdy1zdHlsZTogbm9uZTsgLyogSUUgYW5kIEVkZ2UgKi9cclxuICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7IC8qIEZpcmVmb3ggKi9cclxufVxyXG48L3N0eWxlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteS04IGxnOnNwYWNlLXktMCBsZzpzcGFjZS14LTggZmxleC1jb2wgbGc6ZmxleC1yb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJsZzp3LTIvMTJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIHNwYWNlLXktMVwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHYtZm9yPVwiaXRlbSBpbiBpdGVtc1wiXHJcbiAgICAgICAgICA6a2V5PVwiaXRlbS5pZFwiXHJcbiAgICAgICAgICA6ZGF0YS10YWItaWQ9XCJpdGVtLmlkXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltidXR0b25DbGFzcyhpdGVtKV1cIlxyXG4gICAgICAgICAgOmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJzZXRBY3RpdmVJdGVtKGl0ZW0pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJcclxuICAgICAgICAgICAgICBpdGVtLmRpc2FibGVkICYmIGl0ZW0uZGlzYWJsZWRNZXNzYWdlID8gaXRlbS5kaXNhYmxlZE1lc3NhZ2UgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCByaWdodC0wIGxlZnQtMCBib3R0b20tMFwiXHJcbiAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzcGFjZS14LTIgaXRlbXMtY2VudGVyIHB4LTJcIj5cclxuICAgICAgICAgICAgPGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgIDppcz1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgdi1pZj1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaHJpbmstMCBoLTQgdy00IHN0cm9rZS1bMnB4XVwiXHJcbiAgICAgICAgICAgID48L2NvbXBvbmVudD5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW4tdy02XCI+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIHYtaWY9XCJpdGVtLmNvdW50XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtZnVsbCBweC0yIHRleHQtYm9keS0zeHMgdHJhbnNpdGlvbi1hbGwgbWluLXctNlwiXHJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiXHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJdGVtPy5pZCA9PT0gaXRlbS5pZFxyXG4gICAgICAgICAgICAgICAgICA/ICd0ZXh0LXByaW1hcnkgYmctaW5mby1saWdodGVyIGRhcms6dGV4dC1mb3JlZ3JvdW5kJ1xyXG4gICAgICAgICAgICAgICAgICA6ICd0ZXh0LWZvcmVncm91bmQtMiBiZy1mb3VuZGF0aW9uLTInXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0uY291bnQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgdi1pZj1cIml0ZW0udGFnXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtYm9keS0zeHMgZm9udC1tZWRpdW0gcHktMC41IHB4LTEuNSB0ZXh0LWZvcmVncm91bmQtMiBiZy1mb3VuZGF0aW9uLTIgdXBwZXJjYXNlIHRleHQtb3V0bGluZS00IHJvdW5kZWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgaXRlbS50YWcgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibGc6dy0xMC8xMlwiPlxyXG4gICAgICA8c2xvdCA6YWN0aXZlLWl0ZW09XCJhY3RpdmVJdGVtXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgY29tcHV0ZWQsIG9uTW91bnRlZCwgd2F0Y2ggfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0UGFnZVRhYkl0ZW0gfSBmcm9tICd+fi9zcmMvaGVscGVycy9sYXlvdXQvY29tcG9uZW50cydcclxuaW1wb3J0IHsgaXNDbGllbnQgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBpdGVtczogTGF5b3V0UGFnZVRhYkl0ZW1bXVxyXG59PigpXHJcblxyXG5jb25zdCBhY3RpdmVJdGVtID0gZGVmaW5lTW9kZWw8TGF5b3V0UGFnZVRhYkl0ZW0+KCdhY3RpdmVJdGVtJywgeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG5cclxuY29uc3QgYnV0dG9uQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIChpdGVtOiBMYXlvdXRQYWdlVGFiSXRlbSkgPT4ge1xyXG4gICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVJdGVtLnZhbHVlPy5pZCA9PT0gaXRlbS5pZFxyXG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXHJcbiAgICAgICdyZWxhdGl2ZScsXHJcbiAgICAgICdmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTEuNScsXHJcbiAgICAgICdob3ZlcjpiZy1oaWdobGlnaHQtMicsXHJcbiAgICAgICdkaXNhYmxlZDpvcGFjaXR5LTYwIGRpc2FibGVkOmhvdmVyOmJvcmRlci10cmFuc3BhcmVudCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6aG92ZXI6YmctdHJhbnNwYXJlbnQgcm91bmRlZC1tZCcsXHJcbiAgICAgICd0ZXh0LWJvZHkteHMgZm9udC1tZWRpdW0nLFxyXG4gICAgICAncHktMSdcclxuICAgIF1cclxuXHJcbiAgICBpZiAoaXNBY3RpdmUpIGJhc2VDbGFzc2VzLnB1c2goJ2JnLXByaW1hcnktbXV0ZWQnKVxyXG4gICAgZWxzZSBiYXNlQ2xhc3Nlcy5wdXNoKCdib3JkZXItdHJhbnNwYXJlbnQgdGV4dC1mb3JlZ3JvdW5kJylcclxuXHJcbiAgICByZXR1cm4gYmFzZUNsYXNzZXNcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBzZXRBY3RpdmVJdGVtID0gKGl0ZW06IExheW91dFBhZ2VUYWJJdGVtKSA9PiB7XHJcbiAgYWN0aXZlSXRlbS52YWx1ZSA9IGl0ZW1cclxufVxyXG5cclxub25Nb3VudGVkKCgpID0+IHtcclxuICBpZiAoaXNDbGllbnQpIHtcclxuICAgIGlmIChwcm9wcy5pdGVtcy5sZW5ndGggJiYgIWFjdGl2ZUl0ZW0udmFsdWUpIHtcclxuICAgICAgc2V0QWN0aXZlSXRlbShwcm9wcy5pdGVtc1swXSlcclxuICAgIH1cclxuICB9XHJcbn0pXHJcblxyXG53YXRjaChcclxuICAoKSA9PiBbcHJvcHMuaXRlbXMsIGFjdGl2ZUl0ZW0udmFsdWVdLFxyXG4gIChbbmV3SXRlbXNdKSA9PiB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdJdGVtcykgJiYgbmV3SXRlbXMubGVuZ3RoICYmICFhY3RpdmVJdGVtLnZhbHVlKSB7XHJcbiAgICAgIHNldEFjdGl2ZUl0ZW0obmV3SXRlbXNbMF0pXHJcbiAgICB9XHJcbiAgfVxyXG4pXHJcbjwvc2NyaXB0PlxyXG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdiA6Y2xhc3M9XCJ0YWJsZUNsYXNzZXNcIj5cclxuICAgIDxkaXYgOmNsYXNzPVwiaGVhZGVyUm93Q2xhc3Nlc1wiIDpzdHlsZT1cInsgcGFkZGluZ1JpZ2h0OiBwYWRkaW5nUmlnaHRTdHlsZSB9XCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICB2LWZvcj1cIihjb2x1bW4sIGNvbEluZGV4KSBpbiBjb2x1bW5zXCJcclxuICAgICAgICA6a2V5PVwiY29sdW1uLmlkXCJcclxuICAgICAgICA6Y2xhc3M9XCJnZXRIZWFkZXJDbGFzc2VzKGNvbHVtbi5pZCwgY29sSW5kZXgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGNvbHVtbi5oZWFkZXIgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgOmNsYXNzPVwicmVzdWx0Q29udGFpbmVyQ2xhc3Nlc1wiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1pZj1cImxvYWRpbmcgfHwgIWl0ZW1zXCJcclxuICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTNcIlxyXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgID5cclxuICAgICAgICA8Q29tbW9uTG9hZGluZ0ljb24gLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJpdGVtcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGl0ZW1zXCJcclxuICAgICAgICAgIDprZXk9XCJpdGVtLmlkXCJcclxuICAgICAgICAgIDpzdHlsZT1cInsgcGFkZGluZ1JpZ2h0OiBwYWRkaW5nUmlnaHRTdHlsZSB9XCJcclxuICAgICAgICAgIDpjbGFzcz1cInJvd3NXcmFwcGVyQ2xhc3Nlc1wiXHJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiaGFuZGxlUm93Q2xpY2soaXRlbSlcIlxyXG4gICAgICAgICAgQGtleXByZXNzPVwiaGFuZGxlUm93Q2xpY2soaXRlbSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihjb2x1bW4sIGNvbEluZGV4KSBpbiBjb2x1bW5zXCIgOmtleT1cImNvbHVtbi5pZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IDpjbGFzcz1cImdldENsYXNzZXMoY29sdW1uLmlkLCBjb2xJbmRleClcIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICA8c2xvdCA6bmFtZT1cImNvbHVtbi5pZFwiIDppdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yIGZvbnQtbWVkaXVtIG9yZGVyLTFcIj5QbGFjZWhvbGRlcjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvc2xvdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB2LWlmPVwiYnV0dG9uc1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMS41IHNwYWNlLXgtMSBmbGV4IGl0ZW1zLWNlbnRlciBwLTAgaC1mdWxsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiB2LWZvcj1cImJ1dHRvbiBpbiBidXR0b25zXCIgOmtleT1cImJ1dHRvbi5sYWJlbFwiPlxyXG4gICAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgICB2LXRpcHB5PVwiYnV0dG9uLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgOmljb24tbGVmdD1cImJ1dHRvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJidXR0b24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiYnV0dG9uLmNsYXNzXCJcclxuICAgICAgICAgICAgICAgIDp0bz1cImlzU3RyaW5nKGJ1dHRvbi5hY3Rpb24pID8gYnV0dG9uLmFjdGlvbiA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cIiFpc1N0cmluZyhidXR0b24uYWN0aW9uKSA/IGJ1dHRvbi5hY3Rpb24oaXRlbSkgOiBub29wXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICA6c3R5bGU9XCJ7IHBhZGRpbmdSaWdodDogcGFkZGluZ1JpZ2h0U3R5bGUgfVwiXHJcbiAgICAgICAgOmNsYXNzPVwicm93c1dyYXBwZXJDbGFzc2VzXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgOmNsYXNzPVwiZ2V0Q2xhc3Nlcyh1bmRlZmluZWQsIDApXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwiZW1wdHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCB0ZXh0LWNlbnRlciBsYWJlbC1saWdodCB0ZXh0LWZvcmVncm91bmQtMiBpdGFsaWNcIj5cclxuICAgICAgICAgICAgICB7eyBlbXB0eU1lc3NhZ2UgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8c2xvdCBuYW1lPVwibG9hZGVyXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiIGdlbmVyaWM9XCJUIGV4dGVuZHMge2lkOiBzdHJpbmd9LCBDIGV4dGVuZHMgc3RyaW5nXCI+XHJcbmltcG9ydCB7IG5vb3AsIGlzU3RyaW5nIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgUHJvcEFueUNvbXBvbmVudCB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2NvbW1vbi9jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyBDb21tb25Mb2FkaW5nSWNvbiwgRm9ybUJ1dHRvbiB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB7IGRpcmVjdGl2ZSBhcyB2VGlwcHkgfSBmcm9tICd2dWUtdGlwcHknXHJcblxyXG5leHBvcnQgdHlwZSBUYWJsZUNvbHVtbjxJPiA9IHtcclxuICBpZDogSVxyXG4gIGhlYWRlcjogc3RyaW5nXHJcbiAgY2xhc3Nlczogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJvd0J1dHRvbjxUID0gdW5rbm93bj4gPSB7XHJcbiAgaWNvbjogUHJvcEFueUNvbXBvbmVudFxyXG4gIGxhYmVsOiBzdHJpbmdcclxuICBhY3Rpb246IChpdGVtOiBUKSA9PiB1bmtub3duXHJcbiAgY2xhc3M/OiBzdHJpbmdcclxuICB0b29sdGlwPzogc3RyaW5nXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuXHJcbn1cclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIGl0ZW1zOiBUW10gfCB1bmRlZmluZWQgfCBudWxsXHJcbiAgICBidXR0b25zPzogUm93QnV0dG9uPFQ+W11cclxuICAgIGNvbHVtbnM6IFRhYmxlQ29sdW1uPEM+W11cclxuICAgIG92ZXJmbG93Q2VsbHM/OiBib29sZWFuXHJcbiAgICBvblJvd0NsaWNrPzogKGl0ZW06IFQpID0+IHZvaWRcclxuICAgIHJvd0l0ZW1zQWxpZ24/OiAnY2VudGVyJyB8ICdzdHJldGNoJ1xyXG4gICAgZW1wdHlNZXNzYWdlPzogc3RyaW5nXHJcbiAgICBsb2FkaW5nPzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAgeyByb3dJdGVtc0FsaWduOiAnY2VudGVyJywgZW1wdHlNZXNzYWdlOiAnTm8gZGF0YSBmb3VuZCcgfVxyXG4pXHJcblxyXG5jb25zdCB0YWJsZUNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFtcclxuICAgICd3LWZ1bGwgdGV4dC1mb3JlZ3JvdW5kIHRleHQtc20gYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMgcm91bmRlZC1sZycsXHJcbiAgICAnb3ZlcmZsb3cteC1hdXRvIHNpbXBsZS1zY3JvbGxiYXInLFxyXG4gICAgJ2gtZnVsbCBmbGV4IGZsZXgtY29sJ1xyXG4gIF1cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IHNoYXJlZENvbnRhaW5lckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0cyA9IFsndy1mdWxsIG1pbi13LVs3NTBweF0nXVxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgcmVzdWx0Q29udGFpbmVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ2RpdmlkZS15IGRpdmlkZS1vdXRsaW5lLTMgb3ZlcmZsb3cteS1hdXRvIG92ZXJmbG93LXgtaGlkZGVuIHNpbXBsZS1zY3JvbGxiYXInLFxyXG4gICAgc2hhcmVkQ29udGFpbmVyQ2xhc3Nlcy52YWx1ZVxyXG4gIF1cclxuXHJcbiAgaWYgKHByb3BzLm92ZXJmbG93Q2VsbHMpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncGItMzInKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBidXR0b25Db3VudCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gKHByb3BzLmJ1dHRvbnMgfHwgW10pLmxlbmd0aFxyXG59KVxyXG5jb25zdCBwYWRkaW5nUmlnaHRTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBsZXQgcGFkZGluZyA9IDE2XHJcbiAgaWYgKGJ1dHRvbkNvdW50LnZhbHVlID4gMCkge1xyXG4gICAgcGFkZGluZyA9IDQ4ICsgKGJ1dHRvbkNvdW50LnZhbHVlIC0gMSkgKiA0MlxyXG4gIH1cclxuICByZXR1cm4gYCR7cGFkZGluZ31weGBcclxufSlcclxuXHJcbmNvbnN0IHJvd3NXcmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ3JlbGF0aXZlIGdyaWQgZ3JpZC1jb2xzLTEyIGl0ZW1zLWNlbnRlciBzcGFjZS14LTYgcHgtNCBweS0wLjUgbWluLXctWzc1MHB4XSB0ZXh0LWJvZHkteHMnXHJcbiAgXVxyXG5cclxuICBpZiAocHJvcHMub25Sb3dDbGljayAmJiBwcm9wcy5pdGVtcz8ubGVuZ3RoKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2N1cnNvci1wb2ludGVyIGhvdmVyOmJnLWhpZ2hsaWdodC0xJylcclxuICB9XHJcblxyXG4gIHN3aXRjaCAocHJvcHMucm93SXRlbXNBbGlnbikge1xyXG4gICAgY2FzZSAnY2VudGVyJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdpdGVtcy1jZW50ZXInKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc3RyZXRjaCc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnaXRlbXMtc3RyZXRjaCcpXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IGdldEhlYWRlckNsYXNzZXMgPSAoXHJcbiAgY29sdW1uOiBDIHwgdW5kZWZpbmVkLFxyXG4gIGNvbEluZGV4OiBudW1iZXIsXHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgbm9QYWRkaW5nOiBib29sZWFuXHJcbiAgfT5cclxuKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBjb2x1bW5DbGFzc2VzID0gY29sdW1uXHJcbiAgICA/IHByb3BzLmNvbHVtbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY29sdW1uKT8uY2xhc3Nlc1xyXG4gICAgOiAnJ1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbY29sdW1uQ2xhc3NlcyB8fCAnJ11cclxuXHJcbiAgaWYgKCFvcHRpb25zPy5ub1BhZGRpbmcpIHtcclxuICAgIGlmIChjb2xJbmRleCA9PT0gMCkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3B4LTEnKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdsZzpwLTAgcHgtMScpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufVxyXG5cclxuY29uc3QgZ2V0Q2xhc3NlcyA9IChcclxuICBjb2x1bW46IEMgfCB1bmRlZmluZWQsXHJcbiAgY29sSW5kZXg6IG51bWJlcixcclxuICBvcHRpb25zPzogUGFydGlhbDx7XHJcbiAgICBub1BhZGRpbmc6IGJvb2xlYW5cclxuICB9PlxyXG4pOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHMgPSBbZ2V0SGVhZGVyQ2xhc3Nlcyhjb2x1bW4sIGNvbEluZGV4LCBvcHRpb25zKV1cclxuXHJcbiAgaWYgKGNvbEluZGV4ID09PSAwKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goYGJnLXRyYW5zcGFyZW50IHB5LTIgJHtjb2x1bW4gPyAncHItNScgOiAnY29sLXNwYW4tZnVsbCd9YClcclxuICB9IGVsc2Uge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKGBteS0yYClcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVSb3dDbGljayA9IChpdGVtOiBUKSA9PiB7XHJcbiAgcHJvcHMub25Sb3dDbGljaz8uKGl0ZW0pXHJcbn1cclxuXHJcbmNvbnN0IGhlYWRlclJvd0NsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiBbXHJcbiAgJ3otMTAgZ3JpZCBncmlkLWNvbHMtMTIgaXRlbXMtY2VudGVyJyxcclxuICAnc3BhY2UteC02JyxcclxuICAncHgtNCBweS0zJyxcclxuICAnYmctZm91bmRhdGlvbi0yIHJvdW5kZWQtdC1sZycsXHJcbiAgJ2ZvbnQtbWVkaXVtIHRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTInLFxyXG4gICdib3JkZXItYiBib3JkZXItb3V0bGluZS0zJyxcclxuICBzaGFyZWRDb250YWluZXJDbGFzc2VzLnZhbHVlXHJcbl0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdiByZWY9XCJ3cmFwcGVyXCI+XHJcbiAgICA8SW50ZXJuYWxJbmZpbml0ZUxvYWRpbmdcclxuICAgICAgdi1pZj1cImluaXRpYWxpemVMb2FkZXJcIlxyXG4gICAgICB2LWJpbmQ9XCIkcHJvcHMuc2V0dGluZ3MgfHwge31cIlxyXG4gICAgICBAaW5maW5pdGU9XCIkZW1pdCgnaW5maW5pdGUnLCAkZXZlbnQpXCJcclxuICAgID5cclxuICAgICAgPHRlbXBsYXRlICNzcGlubmVyPlxyXG4gICAgICAgIDxDb21tb25Mb2FkaW5nQmFyIDpsb2FkaW5nPVwidHJ1ZVwiIGNsYXNzPVwibXktMlwiIC8+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjY29tcGxldGU+XHJcbiAgICAgICAgPCEtLSBObyBcIk5vIG1vcmUgaXRlbXNcIiBtZXNzYWdlLCBpbnN0ZWFkIGEgc21hbGwgYW1vdW50IG9mIHNwYWNpbmcgLS0+XHJcbiAgICAgICAgPGRpdiA6Y2xhc3M9XCJ7ICdoLTgnOiAhaGlkZVdoZW5Db21wbGV0ZSB9XCI+PC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjZXJyb3I9XCJ7IHJldHJ5IH1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIG15LTIgc3BhY2UteS0yIG10LTRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xXCI+XHJcbiAgICAgICAgICAgIDxFeGNsYW1hdGlvblRyaWFuZ2xlSWNvbiBjbGFzcz1cInctNSBoLTUgdGV4dC1kYW5nZXJcIiAvPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yXCI+QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZzwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPEZvcm1CdXR0b24gdi1pZj1cImFsbG93UmV0cnlcIiBAY2xpY2s9XCJyZXRyeVwiPlJldHJ5PC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9JbnRlcm5hbEluZmluaXRlTG9hZGluZz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IEludGVybmFsSW5maW5pdGVMb2FkaW5nIGZyb20gJ3YzLWluZmluaXRlLWxvYWRpbmcnXHJcbmltcG9ydCB7IEV4Y2xhbWF0aW9uVHJpYW5nbGVJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHR5cGUgeyBJbmZpbml0ZUxvYWRlclN0YXRlIH0gZnJvbSAnfn4vc3JjL2hlbHBlcnMvZ2xvYmFsL2NvbXBvbmVudHMnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCBDb21tb25Mb2FkaW5nQmFyIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9sb2FkaW5nL0Jhci52dWUnXHJcbmltcG9ydCB7IG9uTW91bnRlZCwgcmVmIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyBpc0NsaWVudCB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IEZvcm1CdXR0b24gZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9CdXR0b24udnVlJ1xyXG5cclxuZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAnaW5maW5pdGUnLCAkc3RhdGU6IEluZmluaXRlTG9hZGVyU3RhdGUpOiB2b2lkXHJcbn0+KClcclxuXHJcbmRlZmluZVByb3BzPHtcclxuICAvKipcclxuICAgKiB2My1pbmZpbml0ZS1sb2FkaW5nIHByb3BzLCBzZWUgZG9jcyBvciB0eXBlIGRlZmluaXRpb25zXHJcbiAgICovXHJcbiAgc2V0dGluZ3M/OiB7XHJcbiAgICB0YXJnZXQ/OiBzdHJpbmdcclxuICAgIGRpc3RhbmNlPzogbnVtYmVyXHJcbiAgICB0b3A/OiBib29sZWFuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgaWRlbnRpZmllcj86IGFueVxyXG4gICAgZmlyc3Rsb2FkPzogYm9vbGVhblxyXG4gIH1cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGFsbG93IHJldHJ5IGFuZCBzaG93IGEgcmV0cnkgYnV0dG9uIHdoZW4gbG9hZGluZyBmYWlsc1xyXG4gICAqL1xyXG4gIGFsbG93UmV0cnk/OiBib29sZWFuXHJcbiAgLyoqXHJcbiAgICogSGlkZSBjb21wbGV0ZWx5IGFuZCBwcmV2ZW50IHRha2luZyBhbnkgc3BhY2Ugd2hlbiBub3QgbG9hZGluZ1xyXG4gICAqL1xyXG4gIGhpZGVXaGVuQ29tcGxldGU/OiBib29sZWFuXHJcbn0+KClcclxuXHJcbmNvbnN0IHdyYXBwZXIgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcbmNvbnN0IGluaXRpYWxpemVMb2FkZXIgPSByZWYoZmFsc2UpXHJcblxyXG4vLyBUaGlzIGhhY2sgaXMgbmVjZXNzYXJ5IGNhdXNlIHNvbWV0aW1lcyB2My1pbmZpbml0ZS1sb2FkaW5nIGluaXRpYWxpemVzIHRvbyBlYXJseSBhbmQgZG9lc250IHRyaWdnZXJcclxuaWYgKGlzQ2xpZW50KSB7XHJcbiAgb25Nb3VudGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGludCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgaWYgKHdyYXBwZXIudmFsdWU/LmlzQ29ubmVjdGVkKSB7XHJcbiAgICAgICAgaW5pdGlhbGl6ZUxvYWRlci52YWx1ZSA9IHRydWVcclxuICAgICAgICBjbGVhckludGVydmFsKGludClcclxuICAgICAgfVxyXG4gICAgfSwgMjAwKVxyXG4gIH0pXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZ3JvdXBcIj5cclxuICAgIDxkaXZcclxuICAgICAgdi1pZj1cImZhbmN5R2xvd1wiXHJcbiAgICAgIGNsYXNzPVwiYWJzb2x1dGUgLXRvcC0xIC1sZWZ0LTEgLXJpZ2h0LTEgLWJvdHRvbS0xIGJnLWJsdWUtMzAwIGRhcms6YmctYmx1ZS01MDAgb3BhY2l0eS01IGRhcms6b3BhY2l0eS0wIHJvdW5kZWQtbWQgYmx1ci1zbSBncm91cC1ob3ZlcjpvcGFjaXR5LTYwIGRhcms6Z3JvdXAtaG92ZXI6b3BhY2l0eS0zMCB0cmFuc2l0aW9uIGR1cmF0aW9uLTUwMFwiXHJcbiAgICA+PC9kaXY+XHJcbiAgICA8Q29tcG9uZW50XHJcbiAgICAgIDppcz1cImZvcm0gPyAnZm9ybScgOiAnZGl2J1wiXHJcbiAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAncmVsYXRpdmUgZGl2aWRlLW91dGxpbmUtMyBiZy1mb3VuZGF0aW9uIHRleHQtZm9yZWdyb3VuZCBmbGV4IGZsZXgtY29sIGRpdmlkZS15IG92ZXJmbG93LWhpZGRlbicsXHJcbiAgICAgICAgY29tcHV0ZWRDbGFzc2VzXHJcbiAgICAgIF1cIlxyXG4gICAgICBAc3VibWl0PVwiZW1pdCgnc3VibWl0JywgJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgdi1pZj1cIiRzbG90cy5oZWFkZXJcIiA6Y2xhc3M9XCJzZWNvbmRhcnlTbG90UGFkZGluZ0NsYXNzZXNcIj5cclxuICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgOmNsYXNzPVwiWydncm93JywgZGVmYXVsdFNsb3RQYWRkaW5nQ2xhc3Nlc11cIj5cclxuICAgICAgICA8c2xvdCAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiB2LWlmPVwiJHNsb3RzLmZvb3RlclwiIDpjbGFzcz1cInNlY29uZGFyeVNsb3RQYWRkaW5nQ2xhc3Nlc1wiPlxyXG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXJcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvQ29tcG9uZW50PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7IChlOiAnc3VibWl0JywgdmFsOiBTdWJtaXRFdmVudCk6IHZvaWQgfT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XHJcbiAgLyoqXHJcbiAgICogVXNlIGEgYDxmb3JtLz5gIGVsZW1lbnQgYXMgYSB3cmFwcGVyIHRoYXQgd2lsbCBlbWl0ICdzdWJtaXQnIGV2ZW50cyBvdXQgZnJvbSB0aGUgY29tcG9uZW50IHdoZW4gdGhleSBvY2N1clxyXG4gICAqL1xyXG4gIGZvcm06IHtcclxuICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICBkZWZhdWx0OiBmYWxzZVxyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQWRkIGEgcmluZyBvdXRsaW5lIG9uIGhvdmVyXHJcbiAgICovXHJcbiAgcmluZzoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICAvKipcclxuICAgKiBBZGQgYSBwcmltYXJ5LWNvbG9yZWQgZ2xvdyBvbiBob3ZlclxyXG4gICAqL1xyXG4gIGZhbmN5R2xvdzoge1xyXG4gICAgdHlwZTogQm9vbGVhbixcclxuICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgfSxcclxuICBjdXN0b21QYWRkaW5nOiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIG5vU2hhZG93OiB7XHJcbiAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgZGVmYXVsdDogZmFsc2VcclxuICB9LFxyXG4gIHBhbmVsQ2xhc3Nlczoge1xyXG4gICAgdHlwZTogU3RyaW5nXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3Qgc2Vjb25kYXJ5U2xvdFBhZGRpbmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT5cclxuICBwcm9wcy5jdXN0b21QYWRkaW5nID8gJycgOiAncHgtNCBweS00IHNtOnB4LTYnXHJcbilcclxuY29uc3QgZGVmYXVsdFNsb3RQYWRkaW5nQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+XHJcbiAgcHJvcHMuY3VzdG9tUGFkZGluZyA/ICcnIDogJ3B4LTQgcHktNCBzbTpwLTYnXHJcbilcclxuXHJcbmNvbnN0IGNvbXB1dGVkQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsncm91bmRlZC1sZyddXHJcblxyXG4gIGlmICghcHJvcHMubm9TaGFkb3cpIGNsYXNzUGFydHMucHVzaCgnc2hhZG93JylcclxuICBpZiAocHJvcHMucmluZykge1xyXG4gICAgY2xhc3NQYXJ0cy5wdXNoKCdyaW5nLW91dGxpbmUtMSBob3ZlcjpyaW5nLTEnKVxyXG4gIH1cclxuICBpZiAocHJvcHMucGFuZWxDbGFzc2VzKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2gocHJvcHMucGFuZWxDbGFzc2VzKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPCEtLSBJZiBwcm9tbyBjb250ZW50IGlzIGRlZmluZWQsIHNjcm9sbCB0aGUgbWVudSBpdGVtcy4gSWYgbm90LCBzY3JvbGwgdGhlIHdob2xlIGFzaWRlICAtLT5cclxuICA8YXNpZGVcclxuICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gaC1mdWxsIHctZnVsbFwiXHJcbiAgICA6Y2xhc3M9XCIkc2xvdHMucHJvbW8gPyAnJyA6ICdvdmVyZmxvdy15LWF1dG8gb3ZlcmZsb3cteC1oaWRkZW4gc2ltcGxlLXNjcm9sbGJhcidcIlxyXG4gID5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGgtZnVsbCB3LWZ1bGxcIlxyXG4gICAgICA6Y2xhc3M9XCIkc2xvdHMucHJvbW8gPyAnb3ZlcmZsb3cteS1hdXRvIG92ZXJmbG93LXgtaGlkZGVuIHNpbXBsZS1zY3JvbGxiYXInIDogJydcIlxyXG4gICAgPlxyXG4gICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgdi1pZj1cIiRzbG90cy5wcm9tb1wiIGNsYXNzPVwic2hyaW5rLTAgcHQtMlwiPlxyXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbW9cIj48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICA8L2FzaWRlPlxyXG48L3RlbXBsYXRlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC15LTEgc206Z2FwLXktMiBib3JkZXIgYm9yZGVyLW91dGxpbmUtMyByb3VuZGVkLWxnIHB5LTIgcHgtMyBzbTpwLTQgc2VsZWN0LW5vbmVcIlxyXG4gID5cclxuICAgIDxoNlxyXG4gICAgICB2LWlmPVwidGl0bGVcIlxyXG4gICAgICBjbGFzcz1cInRleHQtYm9keS14cyBzbTp0ZXh0LWhlYWRpbmctc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kXCJcclxuICAgID5cclxuICAgICAge3sgdGl0bGUgfX1cclxuICAgIDwvaDY+XHJcbiAgICA8cCB2LWlmPVwidGV4dFwiIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyBzbTp0ZXh0LWJvZHkteHMgdGV4dC1mb3JlZ3JvdW5kLTIgIWxlYWRpbmctNVwiPlxyXG4gICAgICB7eyB0ZXh0IH19XHJcbiAgICA8L3A+XHJcbiAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICB2LWlmPVwiYnV0dG9uVGV4dFwiXHJcbiAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgIGNsYXNzPVwibXQtMVwiXHJcbiAgICAgIDp0bz1cInRvXCJcclxuICAgICAgOnRhcmdldD1cInRvID8gJ19ibGFuaycgOiB1bmRlZmluZWRcIlxyXG4gICAgICBAY2xpY2s9XCIkZW1pdCgnb25DbGljaycpXCJcclxuICAgID5cclxuICAgICAge3sgYnV0dG9uVGV4dCB9fVxyXG4gICAgPC9Gb3JtQnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IEZvcm1CdXR0b24gZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9CdXR0b24udnVlJ1xyXG5cclxuZGVmaW5lRW1pdHMoWydvbkNsaWNrJ10pXHJcblxyXG5kZWZpbmVQcm9wczx7XHJcbiAgdGl0bGU/OiBzdHJpbmdcclxuICB0ZXh0Pzogc3RyaW5nXHJcbiAgdG8/OiBzdHJpbmdcclxuICBidXR0b25UZXh0Pzogc3RyaW5nXHJcbn0+KClcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8bmF2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgPHNsb3Q+PC9zbG90PlxyXG4gIDwvbmF2PlxyXG48L3RlbXBsYXRlPlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPHN2Z1xyXG4gICAgd2lkdGg9XCIxNlwiXHJcbiAgICBoZWlnaHQ9XCIxNlwiXHJcbiAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgIGZpbGw9XCJub25lXCJcclxuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gID5cclxuICAgIDxwYXRoIGQ9XCJNOCAzVjEzTTMgOEgxM1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnXHJcbiAgICB3aWR0aD1cIjE0XCJcclxuICAgIGhlaWdodD1cIjE0XCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMTQgMTRcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk0zLjY2NzQ4IDMuNjY2ODdIMy4wMDA4MUMyLjY0NzE5IDMuNjY2ODcgMi4zMDgwNSAzLjgwNzM1IDIuMDU4IDQuMDU3MzlDMS44MDc5NiA0LjMwNzQ0IDEuNjY3NDggNC42NDY1OCAxLjY2NzQ4IDUuMDAwMlYxMS4wMDAyQzEuNjY3NDggMTEuMzUzOCAxLjgwNzk2IDExLjY5MyAyLjA1OCAxMS45NDNDMi4zMDgwNSAxMi4xOTMxIDIuNjQ3MTkgMTIuMzMzNSAzLjAwMDgxIDEyLjMzMzVIOS4wMDA4MUM5LjM1NDQzIDEyLjMzMzUgOS42OTM1NyAxMi4xOTMxIDkuOTQzNjIgMTEuOTQzQzEwLjE5MzcgMTEuNjkzIDEwLjMzNDEgMTEuMzUzOCAxMC4zMzQxIDExLjAwMDJWMTAuMzMzNVwiXHJcbiAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAvPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk0xMi41OSAzLjM5MDA3QzEyLjg1MjYgMy4xMjc1MSAxMy4wMDAxIDIuNzcxMzkgMTMuMDAwMSAyLjQwMDA3QzEzLjAwMDEgMi4wMjg3NSAxMi44NTI2IDEuNjcyNjQgMTIuNTkgMS40MTAwN0MxMi4zMjc0IDEuMTQ3NTEgMTEuOTcxMyAxIDExLjYgMUMxMS4yMjg3IDEgMTAuODcyNiAxLjE0NzUxIDEwLjYxIDEuNDEwMDdMNSA3LjAwMDA3VjkuMDAwMDdIN0wxMi41OSAzLjM5MDA3WlwiXHJcbiAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAvPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk05LjY2NzQ4IDIuMzMzMTNMMTEuNjY3NSA0LjMzMzEzXCJcclxuICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8c3ZnXHJcbiAgICB3aWR0aD1cIjE2XCJcclxuICAgIGhlaWdodD1cIjMyXCJcclxuICAgIHZpZXdCb3g9XCIwIDAgMTYgMzJcIlxyXG4gICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPHBhdGhcclxuICAgICAgZD1cIk03LjY0NjQ1IDE3Ljc0OThDNy44NDE3MSAxNy45NDUxIDguMTU4MjkgMTcuOTQ1MSA4LjM1MzU1IDE3Ljc0OThMMTEuMTQ2NCAxNC45NTY5QzExLjQ2MTQgMTQuNjQyIDExLjIzODMgMTQuMTAzNCAxMC43OTI5IDE0LjEwMzRINS4yMDcxMUM0Ljc2MTY1IDE0LjEwMzQgNC41Mzg1NyAxNC42NDIgNC44NTM1NSAxNC45NTY5TDcuNjQ2NDUgMTcuNzQ5OFpcIlxyXG4gICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcclxuICAgIC8+XHJcbiAgPC9zdmc+XHJcbjwvdGVtcGxhdGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBncm91cFwiPlxyXG4gICAgPGRpdlxyXG4gICAgICB2LWlmPVwidGl0bGVcIlxyXG4gICAgICBjbGFzcz1cImgtOCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gc2VsZWN0LW5vbmUgcm91bmRlZC1tZFwiXHJcbiAgICAgIDpjbGFzcz1cIltjb2xsYXBzaWJsZSAmJiAhbm9Ib3ZlciAmJiAnaG92ZXI6YmctaGlnaGxpZ2h0LTEnXVwiXHJcbiAgICA+XHJcbiAgICAgIDxjb21wb25lbnRcclxuICAgICAgICA6aXM9XCJjb2xsYXBzaWJsZSA/ICdidXR0b24nIDogJ2RpdidcIlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdy1mdWxsXCJcclxuICAgICAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICAgICBjb2xsYXBzaWJsZSA/ICdncm91cCByb3VuZGVkLW1kIGdhcC14LTEnIDogJ3NwYWNlLXgtMSBwLTEgdGV4dC1mb3JlZ3JvdW5kLTInLFxyXG4gICAgICAgICAgY29sbGFwc2libGUgJiYgIW5vSG92ZXIgPyAncHktMC41IHB4LTInIDogJ3BsLTInXHJcbiAgICAgICAgXVwiXHJcbiAgICAgICAgQGNsaWNrPVwiY29sbGFwc2libGUgPyAoaXNDb2xsYXBzZWQgPSAhaXNDb2xsYXBzZWQpIDogdW5kZWZpbmVkXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxBcnJvd0ZpbGxlZFxyXG4gICAgICAgICAgdi1pZj1cImNvbGxhcHNpYmxlXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltpc0NvbGxhcHNlZCA/ICctcm90YXRlLTkwJyA6ICcnLCBub0hvdmVyID8gJy1tbC0xJyA6ICcnXVwiXHJcbiAgICAgICAgICBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yIHNocmluay0wXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCIkc2xvdHNbJ3RpdGxlLWljb24nXVwiXHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltjb2xsYXBzaWJsZSA/ICdtbC0xIG1yLTInIDogJyddXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c2xvdCBuYW1lPVwidGl0bGUtaWNvblwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LTEgaXRlbXMtY2VudGVyIHRydW5jYXRlIGp1c3RpZnktYmV0d2VlblwiPlxyXG4gICAgICAgICAgPGg2XHJcbiAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGUgdGV4dC1ib2R5LTJ4cyBwci0yXCJcclxuICAgICAgICAgICAgOmNsYXNzPVwiW25lc3RlZCA/ICd0ZXh0LWZvcmVncm91bmQnIDogJ2ZvbnQtc2VtaWJvbGQgdGV4dC1mb3JlZ3JvdW5kLTInXVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IHRpdGxlIH19XHJcbiAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgPENvbW1vbkJhZGdlIHYtaWY9XCJ0YWdcIiByb3VuZGVkPlxyXG4gICAgICAgICAgICB7eyB0YWcgfX1cclxuICAgICAgICAgIDwvQ29tbW9uQmFkZ2U+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvY29tcG9uZW50PlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdi1pZj1cImljb25DbGlja1wiXHJcbiAgICAgICAgdi10aXBweT1cImljb25UZXh0ID8gaWNvblRleHQgOiB1bmRlZmluZWRcIlxyXG4gICAgICAgIDpkaXNhYmxlZD1cImljb25EaXNhYmxlZFwiXHJcbiAgICAgICAgY2xhc3M9XCJncm91cC1ob3ZlcjpmbGV4IHAtMSBzaHJpbmstMCBob3ZlcjpiZy1wcmltYXJ5LW11dGVkIHJvdW5kZWQgdGV4dC1mb3JlZ3JvdW5kLTJcIlxyXG4gICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgIG5vSG92ZXIgPyAnJyA6ICdtci0yJyxcclxuICAgICAgICAgIGFsd2F5c1Nob3dJY29uID8gJ2ZsZXgnIDogJ2hpZGRlbicsXHJcbiAgICAgICAgICBpY29uRGlzYWJsZWQgPyAnb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQnIDogJydcclxuICAgICAgICBdXCJcclxuICAgICAgICBAY2xpY2s9XCJpY29uQ2xpY2tcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEVkaXQgdi1pZj1cImljb24gPT09ICdlZGl0J1wiIGNsYXNzPVwiaC00IHctNFwiIC8+XHJcbiAgICAgICAgPENoZXZyb25SaWdodEljb24gdi1lbHNlLWlmPVwiaWNvbiA9PT0gJ3ZpZXcnXCIgY2xhc3M9XCJoLTQgdy00XCIgLz5cclxuICAgICAgICA8UGx1cyB2LWVsc2UgY2xhc3M9XCJoLTQgdy00XCIgLz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IHYtc2hvdz1cIiFpc0NvbGxhcHNlZFwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCBQbHVzIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2dsb2JhbC9pY29uL1BsdXMudnVlJ1xyXG5pbXBvcnQgRWRpdCBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9nbG9iYWwvaWNvbi9FZGl0LnZ1ZSdcclxuaW1wb3J0IEFycm93RmlsbGVkIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2dsb2JhbC9pY29uL0Fycm93RmlsbGVkLnZ1ZSdcclxuaW1wb3J0IENvbW1vbkJhZGdlIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYWRnZS52dWUnXHJcbmltcG9ydCB7IENoZXZyb25SaWdodEljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9vdXRsaW5lJ1xyXG5cclxuZGVmaW5lUHJvcHM8e1xyXG4gIHRhZz86IHN0cmluZ1xyXG4gIHRpdGxlPzogc3RyaW5nXHJcbiAgY29sbGFwc2libGU/OiBib29sZWFuXHJcbiAgY29sbGFwc2VkPzogYm9vbGVhblxyXG4gIGljb24/OiAnYWRkJyB8ICdlZGl0JyB8ICd2aWV3J1xyXG4gIGljb25UZXh0Pzogc3RyaW5nXHJcbiAgaWNvbkNsaWNrPzogKCkgPT4gdm9pZFxyXG4gIGljb25EaXNhYmxlZD86IGJvb2xlYW5cclxuICBub0hvdmVyPzogYm9vbGVhblxyXG4gIG5lc3RlZD86IGJvb2xlYW5cclxuICBhbHdheXNTaG93SWNvbj86IGJvb2xlYW5cclxufT4oKVxyXG5cclxuY29uc3QgaXNDb2xsYXBzZWQgPSBkZWZpbmVNb2RlbDxib29sZWFuPignY29sbGFwc2VkJylcclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICB2LWlmPVwiIWhhc0NoaWxkcmVuXCJcclxuICAgIHYtdGlwcHk9XCJ0b29sdGlwVGV4dFwiXHJcbiAgICA6dG89XCJ0b1wiXHJcbiAgICBjbGFzcz1cImdyb3VwL2l0ZW0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHNwYWNlLXgtMiBzaHJpbmstMCB0ZXh0LWJvZHkteHMgdGV4dC1mb3JlZ3JvdW5kIHNlbGVjdC1ub25lIHJvdW5kZWQtbWQgdy1mdWxsIHB5LTFcIlxyXG4gICAgOmNsYXNzPVwiW1xyXG4gICAgICAhZGlzYWJsZWQgJiYgJ2N1cnNvci1wb2ludGVyIGhvdmVyOmJnLWhpZ2hsaWdodC0xJyxcclxuICAgICAgZGlzYWJsZWQgJiYgJ2N1cnNvci1ub3QtYWxsb3dlZCcsXHJcbiAgICAgIGFjdGl2ZSAmJiAnYmctaGlnaGxpZ2h0LTMgaG92ZXI6IWJnLWhpZ2hsaWdodC0zJyxcclxuICAgICAgJHNsb3RzLmljb24gPyAncGwtMSBwci0yJyA6ICdwci0yIHBsLTcnLFxyXG4gICAgICBleHRyYVBhZGRpbmcgJiYgJyFwbC0xNCdcclxuICAgIF1cIlxyXG4gID5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgdHJ1bmNhdGVcIlxyXG4gICAgICA6Y2xhc3M9XCJbZGlzYWJsZWQgJiYgJ29wYWNpdHktNjAnXVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgdi1pZj1cIiRzbG90cy5pY29uXCIgY2xhc3M9XCJoLTYgdy02IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XHJcbiAgICAgICAgPHNsb3QgbmFtZT1cImljb25cIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZVwiPlxyXG4gICAgICAgIHt7IGxhYmVsIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPEFycm93VXBSaWdodEljb25cclxuICAgICAgICB2LWlmPVwiZXh0ZXJuYWxcIlxyXG4gICAgICAgIGNsYXNzPVwiaC0yLjUgdy0yLjUgIXN0cm9rZS1bM3B4XSAtbWwtMSAtbXQtMS41IG9wYWNpdHktMCBncm91cC1ob3Zlci9pdGVtOm9wYWNpdHktMTAwIHNocmluay0wXCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPENvbW1vbkJhZGdlXHJcbiAgICAgIHYtaWY9XCJ0YWdcIlxyXG4gICAgICByb3VuZGVkXHJcbiAgICAgIDpjb2xvci1jbGFzc2VzPVwiXHJcbiAgICAgICAgY29sb3JDbGFzc2VzID8/IChkaXNhYmxlZCA/ICd0ZXh0LWZvcmVncm91bmQtMiBiZy1wcmltYXJ5LW11dGVkJyA6IHVuZGVmaW5lZClcclxuICAgICAgXCJcclxuICAgID5cclxuICAgICAge3sgdGFnIH19XHJcbiAgICA8L0NvbW1vbkJhZGdlPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgdi1lbHNlIGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB2LXRpcHB5PVwidG9vbHRpcFRleHRcIlxyXG4gICAgICBjbGFzcz1cImZsZXggc3BhY2UteC0xLjUgaXRlbXMtY2VudGVyIHctZnVsbCByb3VuZGVkLW1kIHAtMC41XCJcclxuICAgICAgOmNsYXNzPVwiW1xyXG4gICAgICAgICFkaXNhYmxlZCAmJiAnY3Vyc29yLXBvaW50ZXIgdGV4dC1mb3JlZ3JvdW5kLTIgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kJyxcclxuICAgICAgICBkaXNhYmxlZCAmJiAnb3BhY2l0eS02MCdcclxuICAgICAgXVwiXHJcbiAgICAgIEBjbGljaz1cInRvZ2dsZU9wZW5cIlxyXG4gICAgPlxyXG4gICAgICA8QXJyb3dGaWxsZWQgY2xhc3M9XCJoLTEgdy0yIHNocmluay0wXCIgOmNsYXNzPVwiW2lzT3BlbiA/ICcnIDogJy1yb3RhdGUtOTAnXVwiIC8+XHJcblxyXG4gICAgICA8aDYgY2xhc3M9XCJ0ZXh0LWhlYWRpbmctc20gZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xLjVcIj5cclxuICAgICAgICB7eyBsYWJlbCB9fVxyXG4gICAgICA8L2g2PlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8ZGl2IHYtc2hvdz1cImlzT3BlblwiIGNsYXNzPVwicGwtNFwiPlxyXG4gICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHJlZiwgdXNlU2xvdHMsIHR5cGUgU2V0dXBDb250ZXh0IH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgQXJyb3dGaWxsZWQgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZ2xvYmFsL2ljb24vQXJyb3dGaWxsZWQudnVlJ1xyXG5pbXBvcnQgeyBBcnJvd1VwUmlnaHRJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IENvbW1vbkJhZGdlIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYWRnZS52dWUnXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBsYWJlbDogc3RyaW5nXHJcbiAgdG8/OiBzdHJpbmdcclxuICB0YWc/OiBzdHJpbmdcclxuICBleHRlcm5hbD86IGJvb2xlYW5cclxuICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICBhY3RpdmU/OiBib29sZWFuXHJcbiAgdG9vbHRpcFRleHQ/OiBzdHJpbmdcclxuICBleHRyYVBhZGRpbmc/OiBib29sZWFuXHJcbiAgY29sb3JDbGFzc2VzPzogc3RyaW5nXHJcbn0+KClcclxuXHJcbmNvbnN0IGlzT3BlbiA9IHJlZih0cnVlKVxyXG5cclxuY29uc3Qgc2xvdHM6IFNldHVwQ29udGV4dFsnc2xvdHMnXSA9IHVzZVNsb3RzKClcclxuXHJcbmNvbnN0IGhhc0NoaWxkcmVuID0gISFzbG90cy5kZWZhdWx0XHJcblxyXG5jb25zdCB0b2dnbGVPcGVuID0gKCkgPT4ge1xyXG4gIGlmICghcHJvcHMuZGlzYWJsZWQpIHtcclxuICAgIGlzT3Blbi52YWx1ZSA9ICFpc09wZW4udmFsdWVcclxuICB9XHJcbn1cclxuPC9zY3JpcHQ+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IDpjbGFzcz1cImNvbnRhaW5lckNsYXNzZXNcIj5cclxuICAgIDxkaXYgOmNsYXNzPVwic3ViY29udGFpbmVyQ2xhc3Nlc1wiPlxyXG4gICAgICA8ZGl2IHYtaWY9XCIhaGlkZUljb25cIj5cclxuICAgICAgICA8Q29tcG9uZW50IDppcz1cImljb25cIiA6Y2xhc3M9XCJpY29uQ2xhc3Nlc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XHJcbiAgICAgICAgPGgzIHYtaWY9XCJoYXNUaXRsZVwiIDpjbGFzcz1cInRpdGxlQ2xhc3Nlc1wiPlxyXG4gICAgICAgICAgPHNsb3QgbmFtZT1cInRpdGxlXCI+VGl0bGU8L3Nsb3Q+XHJcbiAgICAgICAgPC9oMz5cclxuICAgICAgICA8ZGl2IHYtaWY9XCJoYXNEZXNjcmlwdGlvblwiIDpjbGFzcz1cImRlc2NyaXB0aW9uQ2xhc3Nlc1wiPlxyXG4gICAgICAgICAgPHNsb3QgbmFtZT1cImRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0IGNvbnNlY3RldHVyIGFkaXBpc2ljaW5nIGVsaXQuIEFsaXF1aWQgcGFyaWF0dXIsXHJcbiAgICAgICAgICAgIGlwc3VtIHNpbWlsaXF1ZSB2ZW5pYW0uXHJcbiAgICAgICAgICA8L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAteC0yXCI+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIHYtZm9yPVwiKGFjdGlvbiwgaSkgaW4gYWN0aW9ucyB8fCBbXVwiXHJcbiAgICAgICAgICA6a2V5PVwiaVwiXHJcbiAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgIDp0bz1cImFjdGlvbi51cmxcIlxyXG4gICAgICAgICAgOmV4dGVybmFsPVwiYWN0aW9uLmV4dGVybmFsVXJsIHx8IGZhbHNlXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImFjdGlvbi5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJoYW5kbGVBY3Rpb25DbGljayhhY3Rpb24pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBhY3Rpb24udGl0bGUgfX1cclxuICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1pZj1cIndpdGhEaXNtaXNzXCJcclxuICAgICAgICBjbGFzcz1cImZsZXhcIlxyXG4gICAgICAgIDpjbGFzcz1cIltoYXNEZXNjcmlwdGlvbiA/ICdpdGVtcy1zdGFydCcgOiAnaXRlbXMtY2VudGVyJ11cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEZvcm1CdXR0b24gdHlwZT1cImJ1dHRvblwiIGNvbG9yPVwic3VidGxlXCIgc2l6ZT1cInNtXCIgQGNsaWNrPVwiJGVtaXQoJ2Rpc21pc3MnKVwiPlxyXG4gICAgICAgICAgRGlzbWlzc1xyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHtcclxuICBDaGVja0NpcmNsZUljb24sXHJcbiAgWENpcmNsZUljb24sXHJcbiAgSW5mb3JtYXRpb25DaXJjbGVJY29uLFxyXG4gIEV4Y2xhbWF0aW9uQ2lyY2xlSWNvblxyXG59IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L291dGxpbmUnXHJcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcjbG9kYXNoJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgdXNlU2xvdHMsIHR5cGUgU2V0dXBDb250ZXh0IH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgRm9ybUJ1dHRvbiBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9mb3JtL0J1dHRvbi52dWUnXHJcbmltcG9ydCB0eXBlIHtcclxuICBQcm9wQW55Q29tcG9uZW50LFxyXG4gIEFsZXJ0QWN0aW9uLFxyXG4gIEFsZXJ0Q29sb3JcclxufSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vY29tcG9uZW50cydcclxuXHJcbnR5cGUgU2l6ZSA9ICdkZWZhdWx0JyB8ICd4cycgfCAnMnhzJ1xyXG5cclxuZGVmaW5lRW1pdHM8eyAoZTogJ2Rpc21pc3MnKTogdm9pZCB9PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhcclxuICBkZWZpbmVQcm9wczx7XHJcbiAgICBjb2xvcj86IEFsZXJ0Q29sb3JcclxuICAgIHdpdGhEaXNtaXNzPzogYm9vbGVhblxyXG4gICAgYWN0aW9ucz86IEFycmF5PEFsZXJ0QWN0aW9uPlxyXG4gICAgY3VzdG9tSWNvbj86IFByb3BBbnlDb21wb25lbnRcclxuICAgIGhpZGVJY29uPzogYm9vbGVhblxyXG4gICAgc2l6ZT86IFNpemVcclxuICB9PigpLFxyXG4gIHtcclxuICAgIGNvbG9yOiAnc3VjY2VzcycsXHJcbiAgICBzaXplOiAnZGVmYXVsdCdcclxuICB9XHJcbilcclxuXHJcbmNvbnN0IHNsb3RzOiBTZXR1cENvbnRleHRbJ3Nsb3RzJ10gPSB1c2VTbG90cygpXHJcbmNvbnN0IGhhc0Rlc2NyaXB0aW9uID0gY29tcHV0ZWQoKCkgPT4gISFzbG90c1snZGVzY3JpcHRpb24nXSlcclxuY29uc3QgaGFzVGl0bGUgPSBjb21wdXRlZCgoKSA9PiAhIXNsb3RzWyd0aXRsZSddKVxyXG5cclxuY29uc3QgaWNvbiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvcHMuY3VzdG9tSWNvbikgcmV0dXJuIHByb3BzLmN1c3RvbUljb25cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5jb2xvcikge1xyXG4gICAgY2FzZSAnaW5mbyc6XHJcbiAgICAgIHJldHVybiBJbmZvcm1hdGlvbkNpcmNsZUljb25cclxuICAgIGNhc2UgJ3dhcm5pbmcnOlxyXG4gICAgICByZXR1cm4gRXhjbGFtYXRpb25DaXJjbGVJY29uXHJcbiAgICBjYXNlICdkYW5nZXInOlxyXG4gICAgICByZXR1cm4gWENpcmNsZUljb25cclxuICAgIGNhc2UgJ3N1Y2Nlc3MnOlxyXG4gICAgICByZXR1cm4gQ2hlY2tDaXJjbGVJY29uXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gSW5mb3JtYXRpb25DaXJjbGVJY29uXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgY29udGFpbmVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsncm91bmRlZC1sZyB0ZXh0LWZvcmVncm91bmQgYm9yZGVyJ11cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICcyeHMnOlxyXG4gICAgY2FzZSAneHMnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3AtMicpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdkZWZhdWx0JzpcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaChoYXNEZXNjcmlwdGlvbi52YWx1ZSA/ICdwLTMgc206cC00JyA6ICdwLTInKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5jb2xvcikge1xyXG4gICAgY2FzZSAnc3VjY2Vzcyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctc3VjY2Vzcy1saWdodGVzdCBib3JkZXItb3V0bGluZS0yJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2luZm8nOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLWZvdW5kYXRpb24tMiBib3JkZXItb3V0bGluZS0zJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2Rhbmdlcic6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctZGFuZ2VyLWxpZ2h0ZXN0IGJvcmRlci1vdXRsaW5lLTInKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnd2FybmluZyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgnYmctd2FybmluZy1saWdodGVzdCBib3JkZXItb3V0bGluZS0yJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ25ldXRyYWwnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2JnLWZvdW5kYXRpb24gYm9yZGVyLW91dGxpbmUtMicpXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxufSlcclxuXHJcbmNvbnN0IHN1YmNvbnRhaW5lckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ2ZsZXggaXRlbXMtY2VudGVyIHctZnVsbCddXHJcblxyXG4gIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgY2FzZSAnMnhzJzpcclxuICAgIGNhc2UgJ3hzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdnYXAteC0xLjUnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnZGVmYXVsdCc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2dhcC14LTMnKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBpY29uQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFtdXHJcblxyXG4gIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgY2FzZSAnMnhzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTQgdy00JylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3hzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTUgdy01JylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2RlZmF1bHQnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdoLTYgdy02JylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHN3aXRjaCAocHJvcHMuY29sb3IpIHtcclxuICAgIGNhc2UgJ3N1Y2Nlc3MnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtc3VjY2Vzcy1kYXJrZXInKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnaW5mbyc6XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgndGV4dC1pbmZvLWRhcmtlciBkYXJrOnRleHQtcHJpbWFyeScpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdkYW5nZXInOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZGFuZ2VyLWRhcmtlcicpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICd3YXJuaW5nJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LXdhcm5pbmctZGFya2VyJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ25ldXRyYWwnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtZm9yZWdyb3VuZC0yJylcclxuICAgICAgYnJlYWtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgdGl0bGVDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWydmb250LW1lZGl1bSddXHJcblxyXG4gIHN3aXRjaCAocHJvcHMuc2l6ZSkge1xyXG4gICAgY2FzZSAnMnhzJzpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWJvZHktMnhzJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2RlZmF1bHQnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWJvZHkteHMnKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5jb25zdCBkZXNjcmlwdGlvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbJ3doaXRlc3BhY2Utbm9ybWFsJ11cclxuXHJcbiAgc3dpdGNoIChwcm9wcy5zaXplKSB7XHJcbiAgICBjYXNlICcyeHMnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3RleHQtYm9keS0yeHMgcHQtMC41JylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ2RlZmF1bHQnOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCd0ZXh0LWJvZHkteHMnKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcblxyXG5mdW5jdGlvbiBoYW5kbGVBY3Rpb25DbGljayhhY3Rpb246IEFsZXJ0QWN0aW9uKSB7XHJcbiAgaWYgKGFjdGlvbi5vbkNsaWNrKSB7XHJcbiAgICBhY3Rpb24ub25DbGljaygpXHJcbiAgfSBlbHNlIHtcclxuICAgIG5vb3AoKVxyXG4gIH1cclxufVxyXG48L3NjcmlwdD5cclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG5pbXBvcnQgeyB0eXBlIE1heWJlQXN5bmMsIGJ1aWxkTWFudWFsUHJvbWlzZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgY29tcHV0ZWRBc3luYyB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHR5cGUgeyBBc3luY0NvbXB1dGVkT3B0aW9ucyB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgQ29tcHV0ZWRSZWYgfSBmcm9tICd2dWUnXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jV3JpdGFibGVDb21wdXRlZE9wdGlvbnM8VD4ge1xyXG4gIGdldDogKC4uLmFyZ3M6IGFueVtdKSA9PiBNYXliZUFzeW5jPFQ+XHJcbiAgc2V0OiAodmFsdWU6IFQpID0+IE1heWJlQXN5bmM8dm9pZD5cclxuICBpbml0aWFsU3RhdGU6IFRcclxuICByZWFkT3B0aW9ucz86IEFzeW5jQ29tcHV0ZWRPcHRpb25zXHJcbiAgYXN5bmNSZWFkPzogYm9vbGVhblxyXG4gIGRlYnVnZ2luZz86IFBhcnRpYWw8e1xyXG4gICAgbG9nOiB7XHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgICB3cml0ZXNPbmx5PzogYm9vbGVhblxyXG4gICAgICByZWFkc09ubHk/OiBib29sZWFuXHJcbiAgICAgIGxvZ2dlcj86IChtc2c6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHZvaWRcclxuICAgIH1cclxuICB9PlxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBc3luY1dyaXRhYmxlQ29tcHV0ZWRSZWY8VD4gPSBDb21wdXRlZFJlZjxUPiAmIHtcclxuICB1cGRhdGU6IEFzeW5jV3JpdGFibGVDb21wdXRlZE9wdGlvbnM8VD5bJ3NldCddXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBbGxvd3MgYXN5bmMgcmVhZC93cml0ZSBmcm9tL3RvIGNvbXB1dGVkLiBVc2UgYHJlcy52YWx1ZWAgdG8gcmVhZCBhbmQgYHJlcy51cGRhdGVgIHRvIHdyaXRlLiBJZiB5b3Ugb25seSBuZWVkXHJcbiAqIHRoZSBjb21wdXRlZCB0byBiZSByZWFkLW9ubHkgdGhlbiB1c2UgdnVldXNlJ3MgYGNvbXB1dGVkQXN5bmNgLiBJZiB5b3Ugb25seSBuZWVkIGFzeW5jIHdyaXRlcyB5b3UgY2FuXHJcbiAqIGRpc2FibGUgYXN5bmMgcmVhZHMgdGhyb3VnaCB0aGUgYGFzeW5jUmVhZGAgcGFyYW0uXHJcbiAqIEBwYXJhbSBwYXJhbXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB3cml0YWJsZUFzeW5jQ29tcHV0ZWQ8VD4oXHJcbiAgcGFyYW1zOiBBc3luY1dyaXRhYmxlQ29tcHV0ZWRPcHRpb25zPFQ+XHJcbik6IEFzeW5jV3JpdGFibGVDb21wdXRlZFJlZjxUPiB7XHJcbiAgY29uc3QgeyBnZXQsIGluaXRpYWxTdGF0ZSwgcmVhZE9wdGlvbnMsIHNldCwgYXN5bmNSZWFkID0gdHJ1ZSwgZGVidWdnaW5nIH0gPSBwYXJhbXNcclxuICBjb25zdCBsb2dTZXR0aW5ncyA9IGRlYnVnZ2luZz8ubG9nXHJcbiAgY29uc3QgZ2V0VHJhY2UgPSAoKSA9PiAobmV3IEVycm9yKCdUcmFjZTonKS5zdGFjayB8fCAnJykuc3Vic3RyaW5nKDcpXHJcbiAgY29uc3QgbG9nZ2VyID0gcGFyYW1zLmRlYnVnZ2luZz8ubG9nPy5sb2dnZXIgfHwgY29uc29sZS5kZWJ1Z1xyXG5cclxuICBjb25zdCBmaW5hbEdldDogdHlwZW9mIGdldCA9XHJcbiAgICBsb2dTZXR0aW5ncyAmJiAhbG9nU2V0dGluZ3Mud3JpdGVzT25seVxyXG4gICAgICA/ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJlcyA9IGdldCgpXHJcbiAgICAgICAgICBsb2dnZXIoYGRlYnVnZ2luZzogJyR7bG9nU2V0dGluZ3MubmFtZX0nIHJlYWRgLCByZXMsIGdldFRyYWNlKCkpXHJcbiAgICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgICAgfVxyXG4gICAgICA6IGdldFxyXG5cclxuICBjb25zdCBmaW5hbFNldDogdHlwZW9mIHNldCA9XHJcbiAgICBsb2dTZXR0aW5ncyAmJiAhbG9nU2V0dGluZ3MucmVhZHNPbmx5XHJcbiAgICAgID8gKG5ld1ZhbCkgPT4ge1xyXG4gICAgICAgICAgbG9nZ2VyKGBkZWJ1Z2dpbmc6ICcke2xvZ1NldHRpbmdzLm5hbWV9JyB3cml0dGVuIHRvYCwgbmV3VmFsLCBnZXRUcmFjZSgpKVxyXG4gICAgICAgICAgcmV0dXJuIHNldChuZXdWYWwpXHJcbiAgICAgICAgfVxyXG4gICAgICA6IHNldFxyXG5cclxuICBjb25zdCByZWFkVmFsdWUgPSBhc3luY1JlYWRcclxuICAgID8gY29tcHV0ZWRBc3luYyhmaW5hbEdldCwgaW5pdGlhbFN0YXRlLCByZWFkT3B0aW9ucylcclxuICAgIDogY29tcHV0ZWQoZmluYWxHZXQpXHJcblxyXG4gIGNvbnN0IGdldHRlciA9IGNvbXB1dGVkKCgpID0+IHJlYWRWYWx1ZS52YWx1ZSkgYXMgQXN5bmNXcml0YWJsZUNvbXB1dGVkUmVmPFQ+XHJcbiAgZ2V0dGVyLnVwZGF0ZSA9IGZpbmFsU2V0XHJcblxyXG4gIHJldHVybiBnZXR0ZXJcclxufVxyXG5cclxuZXhwb3J0IHsgYnVpbGRNYW51YWxQcm9taXNlIH1cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxzbG90IC8+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBnZXRDdXJyZW50SW5zdGFuY2UsIGluamVjdCB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHR5cGUgeyBDb21wb25lbnRJbnRlcm5hbEluc3RhbmNlLCBSZWYgfSBmcm9tICd2dWUnXHJcblxyXG4vKipcclxuICogU29ydCBvZiBoYWNreSAtIHdlIG5lZWQgdG8gbWFuaXB1bGF0ZSB0aGUgQGhlYWRsZXNzdWkgY29tYm9ib3ggc3RhdGUsIGJ1dCBpdCBjYW4ndCBiZSBpbmplY3RlZFxyXG4gKiBmcm9tIGl0cyBwYXJlbnQgY29tcG9uZW50IChUYWdzLnZ1ZSkuIFRoaXMgYmVpbmcgaW5pdGlhbGl6ZWQgaW5zaWRlIG9mIGEgc2xvdCBvZiB0aGUgY29tYm9ib3gsXHJcbiAqIGl0IGhhcyBhY2Nlc3MgdG8gdGhlIGNvbnRleHRcclxuICpcclxuICogQWxzbyB0aGUgY29udGV4dCBpcyBpbmFjY2Vzc2libGUgZHVlIHRvIGl0IGJlaW5nIHRpZWQgdG8gYSBwcml2YXRlIHN5bWJvbCwgc28gd2UgbmVlZFxyXG4gKiB0byByZXRyaWV2ZSB0aGF0IGEgYml0IGhhY2tpbHkgdG9vLlxyXG4gKi9cclxuXHJcbi8vIENvcGllZCBmcm9tIGhlYWRsZXNzdWlcclxuZW51bSBGb2N1cyB7XHJcbiAgLyoqIEZvY3VzIHRoZSBmaXJzdCBub24tZGlzYWJsZWQgaXRlbS4gKi9cclxuICBGaXJzdCxcclxuXHJcbiAgLyoqIEZvY3VzIHRoZSBwcmV2aW91cyBub24tZGlzYWJsZWQgaXRlbS4gKi9cclxuICBQcmV2aW91cyxcclxuXHJcbiAgLyoqIEZvY3VzIHRoZSBuZXh0IG5vbi1kaXNhYmxlZCBpdGVtLiAqL1xyXG4gIE5leHQsXHJcblxyXG4gIC8qKiBGb2N1cyB0aGUgbGFzdCBub24tZGlzYWJsZWQgaXRlbS4gKi9cclxuICBMYXN0LFxyXG5cclxuICAvKiogRm9jdXMgYSBzcGVjaWZpYyBpdGVtIGJhc2VkIG9uIHRoZSBgaWRgIG9mIHRoZSBpdGVtLiAqL1xyXG4gIFNwZWNpZmljLFxyXG5cclxuICAvKiogRm9jdXMgbm8gaXRlbXMgYXQgYWxsLiAqL1xyXG4gIE5vdGhpbmdcclxufVxyXG5cclxuZW51bSBDb21ib2JveFN0YXRlcyB7XHJcbiAgT3BlbixcclxuICBDbG9zZWRcclxufVxyXG5cclxuY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKSBhcyBDb21wb25lbnRJbnRlcm5hbEluc3RhbmNlICYge1xyXG4gIHByb3ZpZGVzOiBSZWNvcmQ8c3ltYm9sIHwgc3RyaW5nLCB1bmtub3duPlxyXG59XHJcbmNvbnN0IHByb3ZpZGVzID0gaW5zdGFuY2VbJ3Byb3ZpZGVzJ11cclxuY29uc3QgY3R4S2V5ID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcm92aWRlcykuZmluZChcclxuICAocykgPT4gcy5kZXNjcmlwdGlvbiA9PT0gJ0NvbWJvYm94Q29udGV4dCdcclxuKVxyXG5pZiAoIWN0eEtleSkge1xyXG4gIGNvbnNvbGUuZXJyb3IoJ0Zvcm1UYWdzQ29udGV4dE1hbmFnZXIgY3R4IGtleSBub3QgZm91bmQhJylcclxufVxyXG5cclxuY29uc3Qgc3RhdGUgPSBpbmplY3QoY3R4S2V5IHx8ICdfX3VuZGVmaW5lZCcpIGFzIE9wdGlvbmFsPHtcclxuICBnb1RvT3B0aW9uOiAoZm9jdXM6IEZvY3VzKSA9PiB2b2lkXHJcbiAgb3BlbkNvbWJvYm94OiAoKSA9PiB2b2lkXHJcbiAgY2xvc2VDb21ib2JveDogKCkgPT4gdm9pZFxyXG4gIGFjdGl2ZU9wdGlvbkluZGV4OiBSZWY8TnVsbGFibGU8bnVtYmVyPj5cclxuICBzZWxlY3RBY3RpdmVPcHRpb246ICgpID0+IHZvaWRcclxuICBjb21ib2JveFN0YXRlOiBSZWY8Q29tYm9ib3hTdGF0ZXM+XHJcbn0+XHJcblxyXG5pZiAoIXN0YXRlKSB7XHJcbiAgY29uc29sZS5lcnJvcignRm9ybVRhZ3NDb250ZXh0TWFuYWdlciBjdHggbm90IGZvdW5kIScpXHJcbn1cclxuXHJcbmNvbnN0IGdvVXAgPSAoKSA9PiB7XHJcbiAgc3RhdGU/LmdvVG9PcHRpb24oRm9jdXMuUHJldmlvdXMpXHJcbn1cclxuY29uc3QgZ29Eb3duID0gKCkgPT4ge1xyXG4gIHN0YXRlPy5nb1RvT3B0aW9uKEZvY3VzLk5leHQpXHJcbn1cclxuY29uc3Qgb3BlbiA9ICgpID0+IHtcclxuICBpZiAoIXN0YXRlKSByZXR1cm5cclxuICBzdGF0ZS5vcGVuQ29tYm9ib3goKVxyXG59XHJcbmNvbnN0IGNsb3NlID0gKCkgPT4ge1xyXG4gIHN0YXRlPy5jbG9zZUNvbWJvYm94KClcclxufVxyXG5jb25zdCBzZWxlY3RBY3RpdmUgPSAoKSA9PiB7XHJcbiAgc3RhdGU/LnNlbGVjdEFjdGl2ZU9wdGlvbigpXHJcbn1cclxuY29uc3QgaXNPcGVuID0gKCkgPT4gc3RhdGU/LmNvbWJvYm94U3RhdGUudmFsdWUgPT09IENvbWJvYm94U3RhdGVzLk9wZW5cclxuXHJcbmRlZmluZUV4cG9zZSh7IGdvVXAsIGdvRG93biwgb3BlbiwgY2xvc2UsIHNlbGVjdEFjdGl2ZSwgaXNPcGVuIH0pXHJcbjwvc2NyaXB0PlxyXG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPENvbWJvYm94XHJcbiAgICB2LW1vZGVsPVwic2VsZWN0ZWRJdGVtc1wiXHJcbiAgICBhcz1cImRpdlwiXHJcbiAgICBtdWx0aXBsZVxyXG4gICAgY2xlYXJhYmxlXHJcbiAgICA6Y2xhc3M9XCJbd3JhcHBlckNsYXNzZXNdXCJcclxuICA+XHJcbiAgICA8Rm9ybVRhZ3NDb250ZXh0TWFuYWdlciByZWY9XCJjdHhNYW5hZ2VyXCI+XHJcbiAgICAgIDxsYWJlbCA6Zm9yPVwibmFtZVwiIDpjbGFzcz1cImxhYmVsQ2xhc3Nlc1wiPlxyXG4gICAgICAgIDxzcGFuPnt7IHRpdGxlIH19PC9zcGFuPlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xIHB4LTIgcHktMVwiXHJcbiAgICAgICAgOmNsYXNzPVwiaW5wdXRXcmFwcGVyQ2xhc3Nlc1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Q29tbW9uQmFkZ2VcclxuICAgICAgICAgIHYtZm9yPVwidGFnIGluIHNlbGVjdGVkSXRlbXNcIlxyXG4gICAgICAgICAgOmtleT1cInRhZ1wiXHJcbiAgICAgICAgICA6aWNvbi1sZWZ0PVwiIWRpc2FibGVkID8gWE1hcmtJY29uIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgIGNsaWNrYWJsZS1pY29uXHJcbiAgICAgICAgICBzaXplPVwibGdcIlxyXG4gICAgICAgICAgQGNsaWNrLWljb249XCIoKSA9PiByZW1vdmVUYWcodGFnKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgdGFnIH19XHJcbiAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIHJlZj1cImlucHV0RWxcIlxyXG4gICAgICAgICAgdi1tb2RlbD1cInF1ZXJ5XCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIGNsYXNzPVwiYmctdHJhbnNwYXJlbnQgZ3JvdyBzaHJpbmsgYm9yZGVyLTAgZm9jdXM6cmluZy0wIHAtMFwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJbY29yZUlucHV0Q2xhc3Nlcywgc2l6ZUNsYXNzZXNdXCJcclxuICAgICAgICAgIHN0eWxlPVwiZmxleC1iYXNpczogNzBweDsgbWluLXdpZHRoOiA3MHB4XCJcclxuICAgICAgICAgIDpwbGFjZWhvbGRlcj1cIiFzZWxlY3RlZEl0ZW1zLmxlbmd0aCA/IHBsYWNlaG9sZGVyIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgIEBpbnB1dD1cIm9uUXVlcnlJbnB1dFwiXHJcbiAgICAgICAgICBAa2V5ZG93bi5lc2NhcGU9XCJvblF1ZXJ5RXNjYXBlXCJcclxuICAgICAgICAgIEBrZXlkb3duLmVudGVyLnN0b3AucHJldmVudD1cIm9uUXVlcnlJbnB1dCgkZXZlbnQsIHRydWUpXCJcclxuICAgICAgICAgIEBrZXlkb3duLnRhYj1cIm9uUXVlcnlJbnB1dFwiXHJcbiAgICAgICAgICBAa2V5ZG93bi5iYWNrc3BhY2U9XCJvblF1ZXJ5QmFja3NwYWNlXCJcclxuICAgICAgICAgIEBrZXlkb3duLmFycm93LXVwPVwib25RdWVyeUFycm93VXBcIlxyXG4gICAgICAgICAgQGtleWRvd24uYXJyb3ctZG93bj1cIm9uUXVlcnlBcnJvd0Rvd25cIlxyXG4gICAgICAgICAgQGJsdXI9XCJpc0F1dG9jb21wbGV0ZU9wZW4gPSBmYWxzZVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgdi1pZj1cInNob3VsZFNob3dDbGVhclwiXHJcbiAgICAgICAgICB0aXRsZT1cIkNsZWFyIGlucHV0XCJcclxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTIgcmlnaHQtMCBmbGV4IGl0ZW1zLWNlbnRlciBwci0yIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgIEBjbGljaz1cImNsZWFyXCJcclxuICAgICAgICAgIEBrZXlkb3duPVwiY2xlYXJcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14cyBzci1vbmx5XCI+Q2xlYXIgaW5wdXQ8L3NwYW4+XHJcbiAgICAgICAgICA8WE1hcmtJY29uIGNsYXNzPVwiaC01IHctNSB0ZXh0LWZvcmVncm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICB2LWlmPVwiZXJyb3JNZXNzYWdlXCJcclxuICAgICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLVsxMHB4XSByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyJyxcclxuICAgICAgICAgICAgc2hvdWxkU2hvd0NsZWFyID8gJ3ByLTgnIDogJ3ByLTInXHJcbiAgICAgICAgICBdXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8RXhjbGFtYXRpb25DaXJjbGVJY29uIGNsYXNzPVwiaC00IHctNCB0ZXh0LWRhbmdlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1lbHNlLWlmPVwic2hvd1JlcXVpcmVkXCJcclxuICAgICAgICAgIGNsYXNzPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSB0b3AtWzJweF0gdGV4dC00eGwgcmlnaHQtMCBmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LWRhbmdlciBvcGFjaXR5LTUwXCJcclxuICAgICAgICAgIDpjbGFzcz1cInNob3VsZFNob3dDbGVhciA/ICdwci04JyA6ICdwci0yJ1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgKlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgdi1lbHNlLWlmPVwic2hvd09wdGlvbmFsXCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGZvbnQtbm9ybWFsXCI+KG9wdGlvbmFsKTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPFRyYW5zaXRpb25Sb290XHJcbiAgICAgICAgbGVhdmU9XCJ0cmFuc2l0aW9uIGVhc2UtaW4gZHVyYXRpb24tMTAwXCJcclxuICAgICAgICBsZWF2ZS1mcm9tPVwib3BhY2l0eS0xMDBcIlxyXG4gICAgICAgIGxlYXZlLXRvPVwib3BhY2l0eS0wXCJcclxuICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHB4LTAuNVwiXHJcbiAgICAgID5cclxuICAgICAgICA8Q29tYm9ib3hPcHRpb25zXHJcbiAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0xIG1heC1oLTYwIHctZnVsbCBvdmVyZmxvdy1hdXRvIHNpbXBsZS1zY3JvbGxiYXIgcm91bmRlZC1tZCBiZy1mb3VuZGF0aW9uIHB5LTEgc2hhZG93IGxhYmVsIGxhYmVsLS1saWdodCBvdXRsaW5lIG91dGxpbmUtMiBvdXRsaW5lLXByaW1hcnktbXV0ZWQgZm9jdXM6b3V0bGluZS1ub25lXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHYtaWY9XCJpc0F1dG9jb21wbGV0ZUxvYWRpbmdcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInB4LTFcIlxyXG4gICAgICAgICAgICA6Y2xhc3M9XCJhdXRvY29tcGxldGVJdGVtcy5sZW5ndGggPyAnbWItMScgOiAnJ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxDb21tb25Mb2FkaW5nQmFyIDpsb2FkaW5nPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1pZj1cIiFhdXRvY29tcGxldGVJdGVtcy5sZW5ndGggJiYgIWlzQXV0b2NvbXBsZXRlTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTIgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICBQcmVzc1xyXG4gICAgICAgICAgICAgIDxzdHJvbmc+RW50ZXI8L3N0cm9uZz5cclxuICAgICAgICAgICAgICB0byBjcmVhdGUgdGFnIOKaoVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJhdXRvY29tcGxldGVJdGVtcy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgPENvbWJvYm94T3B0aW9uXHJcbiAgICAgICAgICAgICAgdi1mb3I9XCJ0YWcgaW4gYXV0b2NvbXBsZXRlSXRlbXNcIlxyXG4gICAgICAgICAgICAgIDprZXk9XCJ0YWdcIlxyXG4gICAgICAgICAgICAgIHYtc2xvdD1cInsgc2VsZWN0ZWQsIGFjdGl2ZSB9XCJcclxuICAgICAgICAgICAgICBhcz1cInRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICA6dmFsdWU9XCJ0YWdcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGN1cnNvci1wb2ludGVyIHNlbGVjdC1ub25lIHB5LTEuNSBwbC0zXCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cIntcclxuICAgICAgICAgICAgICAgICAgJ3RleHQtcHJpbWFyeSc6IGFjdGl2ZSxcclxuICAgICAgICAgICAgICAgICAgJ3RleHQtZm9yZWdyb3VuZCc6ICFhY3RpdmVcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7ICdmb250LW1lZGl1bSc6IHNlbGVjdGVkLCAnZm9udC1ub3JtYWwnOiAhc2VsZWN0ZWQgfVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHRhZyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgdi1pZj1cInNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyIHByLTRcIlxyXG4gICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7ICd0ZXh0LXByaW1hcnknOiBhY3RpdmUsICd0ZXh0LWZvcmVncm91bmQnOiAhYWN0aXZlIH1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8Q2hlY2tJY29uIGNsYXNzPVwiaC01IHctNVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPC9Db21ib2JveE9wdGlvbj5cclxuICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPC9Db21ib2JveE9wdGlvbnM+XHJcbiAgICAgIDwvVHJhbnNpdGlvblJvb3Q+XHJcbiAgICAgIDxwXHJcbiAgICAgICAgdi1pZj1cImhlbHBUaXBJZCAmJiAhaGlkZUhlbHBUaXBcIlxyXG4gICAgICAgIDppZD1cImhlbHBUaXBJZFwiXHJcbiAgICAgICAgY2xhc3M9XCJtdC0yXCJcclxuICAgICAgICA6Y2xhc3M9XCJoZWxwVGlwQ2xhc3Nlc1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBoZWxwVGlwIH19XHJcbiAgICAgIDwvcD5cclxuICAgIDwvRm9ybVRhZ3NDb250ZXh0TWFuYWdlcj5cclxuICA8L0NvbWJvYm94PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgcmVmLCBjb21wdXRlZCwgdG9SZWZzLCB3YXRjaCwgb25Nb3VudGVkIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQge1xyXG4gIENvbWJvYm94LFxyXG4gIENvbWJvYm94T3B0aW9ucyxcclxuICBDb21ib2JveE9wdGlvbixcclxuICBUcmFuc2l0aW9uUm9vdFxyXG59IGZyb20gJ0BoZWFkbGVzc3VpL3Z1ZSdcclxuaW1wb3J0IHsgQ2hlY2tJY29uLCBYTWFya0ljb24sIEV4Y2xhbWF0aW9uQ2lyY2xlSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzIwL3NvbGlkJ1xyXG5pbXBvcnQgeyBkZWJvdW5jZSwgdW5pcSB9IGZyb20gJyNsb2Rhc2gnXHJcbmltcG9ydCB7IHVzZVRleHRJbnB1dENvcmUgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS90ZXh0SW5wdXQnXHJcbmltcG9ydCB0eXBlIHsgSW5wdXRDb2xvciB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy9mb3JtL3RleHRJbnB1dCdcclxuaW1wb3J0IHR5cGUgeyBSdWxlRXhwcmVzc2lvbiB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZUFzeW5jLCBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IENvbW1vbkJhZGdlIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYWRnZS52dWUnXHJcbmltcG9ydCBGb3JtVGFnc0NvbnRleHRNYW5hZ2VyIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2Zvcm0vdGFncy9Db250ZXh0TWFuYWdlci52dWUnXHJcbmltcG9ydCB7IHVzZUZvY3VzIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgQ29tbW9uTG9hZGluZ0JhciBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9CYXIudnVlJ1xyXG5cclxudHlwZSBJbnB1dFNpemUgPSAnc20nIHwgJ2Jhc2UnIHwgJ2xnJyB8ICd4bCdcclxudHlwZSBUYWcgPSBzdHJpbmdcclxuY29uc3QgaXNJbnB1dEV2ZW50ID0gKGU6IEV2ZW50KTogZSBpcyBJbnB1dEV2ZW50ID0+IGUudHlwZSA9PT0gJ2lucHV0J1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsOiBUYWdbXSk6IHZvaWRcclxuICAoZTogJ2NoYW5nZScsIHZhbDogeyBldmVudD86IEV2ZW50OyB2YWx1ZTogVGFnW10gfSk6IHZvaWRcclxuICAoZTogJ2NsZWFyJyk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgbmFtZTogc3RyaW5nXHJcbiAgICBoZWxwPzogc3RyaW5nXHJcbiAgICBsYWJlbD86IHN0cmluZ1xyXG4gICAgc2hvd0xhYmVsPzogYm9vbGVhblxyXG4gICAgcnVsZXM/OiBSdWxlRXhwcmVzc2lvbjxUYWdbXT5cclxuICAgIHZhbGlkYXRlT25Nb3VudD86IGJvb2xlYW5cclxuICAgIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZT86IGJvb2xlYW5cclxuICAgIGF1dG9Gb2N1cz86IGJvb2xlYW5cclxuICAgIHNob3dDbGVhcj86IGJvb2xlYW5cclxuICAgIHNob3dSZXF1aXJlZD86IGJvb2xlYW5cclxuICAgIHNob3dPcHRpb25hbD86IGJvb2xlYW5cclxuICAgIGNvbG9yPzogSW5wdXRDb2xvclxyXG4gICAgd3JhcHBlckNsYXNzZXM/OiBzdHJpbmdcclxuICAgIHNpemU/OiBJbnB1dFNpemVcclxuICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nXHJcbiAgICBkaXNhYmxlZD86IGJvb2xlYW5cclxuICAgIHVzZUxhYmVsSW5FcnJvcnM/OiBib29sZWFuXHJcbiAgICBnZXRBdXRvY29tcGxldGVJdGVtcz86IChxdWVyeTogc3RyaW5nKSA9PiBNYXliZUFzeW5jPFRhZ1tdPlxyXG4gICAgbW9kZWxWYWx1ZT86IFRhZ1tdXHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBzaXplOiAnYmFzZScsXHJcbiAgICBjb2xvcjogJ3BhZ2UnLFxyXG4gICAgdXNlTGFiZWxJbkVycm9yczogdHJ1ZVxyXG4gIH1cclxuKVxyXG5cclxuLy8gY29uc3QgbG9jYWxWYWx1ZSA9IGRlZmluZU1vZGVsPFRhZ1tdPih7IGxvY2FsOiB0cnVlIH0pXHJcbmNvbnN0IGlucHV0RWwgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MSW5wdXRFbGVtZW50PilcclxuY29uc3QgeyBmb2N1c2VkOiBpc0lucHV0Rm9jdXNlZCB9ID0gdXNlRm9jdXMoaW5wdXRFbClcclxuXHJcbmNvbnN0IGN0eE1hbmFnZXIgPSByZWYoXHJcbiAgbnVsbCBhcyBOdWxsYWJsZTx7XHJcbiAgICBnb1VwOiAoKSA9PiB2b2lkXHJcbiAgICBnb0Rvd246ICgpID0+IHZvaWRcclxuICAgIG9wZW46ICgpID0+IHZvaWRcclxuICAgIGNsb3NlOiAoKSA9PiB2b2lkXHJcbiAgICBzZWxlY3RBY3RpdmU6ICgpID0+IHZvaWRcclxuICAgIGlzT3BlbjogKCkgPT4gYm9vbGVhblxyXG4gIH0+XHJcbilcclxuXHJcbmNvbnN0IHtcclxuICBjb3JlSW5wdXRDbGFzc2VzLFxyXG4gIGNvcmVDbGFzc2VzLFxyXG4gIGxhYmVsQ2xhc3NlcyxcclxuICB0aXRsZSxcclxuICBoZWxwVGlwLFxyXG4gIGhlbHBUaXBJZCxcclxuICBoaWRlSGVscFRpcCxcclxuICBoZWxwVGlwQ2xhc3NlcyxcclxuICBlcnJvck1lc3NhZ2UsXHJcbiAgY2xlYXIsXHJcbiAgdmFsdWVcclxufSA9IHVzZVRleHRJbnB1dENvcmUoe1xyXG4gIHByb3BzOiB0b1JlZnMocHJvcHMpLFxyXG4gIGVtaXQsXHJcbiAgaW5wdXRFbFxyXG4gIC8vIG9wdGlvbnM6IHtcclxuICAvLyAgIGN1c3RvbUNsZWFyOiAoKSA9PiAoc2VsZWN0ZWRJdGVtcy52YWx1ZSA9IFtdKVxyXG4gIC8vIH1cclxufSlcclxuXHJcbmNvbnN0IGF1dG9jb21wbGV0ZUl0ZW1zID0gcmVmKFtdIGFzIHN0cmluZ1tdKVxyXG5jb25zdCBpc0F1dG9jb21wbGV0ZUxvYWRpbmcgPSByZWYoZmFsc2UpXHJcbmNvbnN0IGlzQXV0b2NvbXBsZXRlT3BlbiA9IHJlZihmYWxzZSlcclxuY29uc3QgcXVlcnkgPSByZWYoJycpXHJcblxyXG5jb25zdCBzZWxlY3RlZEl0ZW1zID0gY29tcHV0ZWQoe1xyXG4gIGdldDogKCkgPT4gdmFsdWUudmFsdWUgfHwgW10sXHJcbiAgc2V0OiAobmV3VmFsKSA9PiB7XHJcbiAgICB2YWx1ZS52YWx1ZSA9IHVuaXEobmV3VmFsKS5maWx0ZXIoKHQpID0+ICEhdC5sZW5ndGgpXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3Qgc2l6ZUNsYXNzZXMgPSBjb21wdXRlZCgoKTogc3RyaW5nID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ3NtJzpcclxuICAgICAgcmV0dXJuICdoLTYnXHJcbiAgICBjYXNlICdsZyc6XHJcbiAgICAgIHJldHVybiAnaC0xMCdcclxuICAgIGNhc2UgJ3hsJzpcclxuICAgICAgcmV0dXJuICdoLTE0J1xyXG4gICAgY2FzZSAnYmFzZSc6XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gJ2gtOCdcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBzaG91bGRTaG93Q2xlYXIgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5zaG93Q2xlYXIgJiYgISFzZWxlY3RlZEl0ZW1zLnZhbHVlLmxlbmd0aClcclxuXHJcbmNvbnN0IGlucHV0V3JhcHBlckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgY2xhc3NQYXJ0czogc3RyaW5nW10gPSBbXHJcbiAgICBjb3JlQ2xhc3Nlcy52YWx1ZSxcclxuICAgIHByb3BzLmRpc2FibGVkXHJcbiAgICAgID8gJ2N1cnNvci1ub3QtYWxsb3dlZCAhYmctZm91bmRhdGlvbi1kaXNhYmxlZCAhdGV4dC1kaXNhYmxlZC1tdXRlZCdcclxuICAgICAgOiAnJ1xyXG4gIF1cclxuXHJcbiAgaWYgKHNob3VsZFNob3dDbGVhci52YWx1ZSAmJiAoZXJyb3JNZXNzYWdlLnZhbHVlIHx8IHByb3BzLnNob3dSZXF1aXJlZCkpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncHItMTQnKVxyXG4gIH0gZWxzZSBpZiAoc2hvdWxkU2hvd0NsZWFyLnZhbHVlIHx8IGVycm9yTWVzc2FnZS52YWx1ZSB8fCBwcm9wcy5zaG93UmVxdWlyZWQpIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgncHItOCcpXHJcbiAgfVxyXG5cclxuICBpZiAoZXJyb3JNZXNzYWdlLnZhbHVlKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2JvcmRlci0yIGJvcmRlci1kYW5nZXIgdGV4dC1kYW5nZXItZGFya2VyJylcclxuICAgIGlmIChpc0lucHV0Rm9jdXNlZC52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3JpbmctMSByaW5nLWRhbmdlcicpXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGNsYXNzUGFydHMucHVzaCgnYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMnKVxyXG4gICAgaWYgKGlzSW5wdXRGb2N1c2VkLnZhbHVlKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaCgncmluZy0xIHJpbmctb3V0bGluZS0zJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5cclxuY29uc3QgcmVtb3ZlVGFnID0gKHRhZzogVGFnKSA9PiB7XHJcbiAgaWYgKHByb3BzLmRpc2FibGVkKSByZXR1cm5cclxuXHJcbiAgY29uc3QgaWR4ID0gc2VsZWN0ZWRJdGVtcy52YWx1ZS5pbmRleE9mKHRhZylcclxuICBpZiAoaWR4ICE9PSAtMSkge1xyXG4gICAgY29uc3QgbmV3U2VsZWN0ZWQgPSBzZWxlY3RlZEl0ZW1zLnZhbHVlLnNsaWNlKClcclxuICAgIG5ld1NlbGVjdGVkLnNwbGljZShpZHgsIDEpXHJcblxyXG4gICAgc2VsZWN0ZWRJdGVtcy52YWx1ZSA9IG5ld1NlbGVjdGVkXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBvblF1ZXJ5RXNjYXBlID0gKCkgPT4ge1xyXG4gIGlucHV0RWwudmFsdWU/LmJsdXIoKVxyXG4gIGlzQXV0b2NvbXBsZXRlT3Blbi52YWx1ZSA9IGZhbHNlXHJcbn1cclxuXHJcbmNvbnN0IG9uUXVlcnlCYWNrc3BhY2UgPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gIGlmIChlLmtleSAhPT0gJ0JhY2tzcGFjZScpIHJldHVyblxyXG4gIGlmIChxdWVyeS52YWx1ZS5sZW5ndGgpIHJldHVyblxyXG5cclxuICAvLyBDbGVhciBsYXN0IHRhZ1xyXG4gIGNvbnN0IG5ld1RhZ3MgPSBzZWxlY3RlZEl0ZW1zLnZhbHVlLnNsaWNlKClcclxuICBuZXdUYWdzLnBvcCgpXHJcbiAgc2VsZWN0ZWRJdGVtcy52YWx1ZSA9IG5ld1RhZ3NcclxuICBpc0F1dG9jb21wbGV0ZU9wZW4udmFsdWUgPSBmYWxzZVxyXG59XHJcblxyXG5jb25zdCBvblF1ZXJ5QXJyb3dVcCA9ICgpID0+IHtcclxuICBpZiAoY3R4TWFuYWdlci52YWx1ZT8uaXNPcGVuKCkpIHtcclxuICAgIGN0eE1hbmFnZXIudmFsdWU/LmdvVXAoKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjdHhNYW5hZ2VyLnZhbHVlPy5vcGVuKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG9uUXVlcnlBcnJvd0Rvd24gPSAoKSA9PiB7XHJcbiAgaWYgKGN0eE1hbmFnZXIudmFsdWU/LmlzT3BlbigpKSB7XHJcbiAgICBjdHhNYW5hZ2VyLnZhbHVlPy5nb0Rvd24oKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjdHhNYW5hZ2VyLnZhbHVlPy5vcGVuKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHJlc29sdmVBdXRvY29tcGxldGVJdGVtcyA9IGFzeW5jICgpID0+IHtcclxuICBpZiAoIXByb3BzLmdldEF1dG9jb21wbGV0ZUl0ZW1zKSByZXR1cm5cclxuXHJcbiAgaXNBdXRvY29tcGxldGVMb2FkaW5nLnZhbHVlID0gdHJ1ZVxyXG4gIGF1dG9jb21wbGV0ZUl0ZW1zLnZhbHVlID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxyXG4gICAgcHJvcHMuZ2V0QXV0b2NvbXBsZXRlSXRlbXMocXVlcnkudmFsdWUpXHJcbiAgKVxyXG4gIGlzQXV0b2NvbXBsZXRlTG9hZGluZy52YWx1ZSA9IGZhbHNlXHJcbn1cclxuY29uc3QgZGVib3VuY2VkUmVzb2x2ZSA9IGRlYm91bmNlKHJlc29sdmVBdXRvY29tcGxldGVJdGVtcywgMTAwMClcclxuY29uc3QgZGVib3VuY2VkUmVzb2x2ZUFuZE1hcmtMb2FkaW5nID0gYXN5bmMgKCkgPT4ge1xyXG4gIGlzQXV0b2NvbXBsZXRlTG9hZGluZy52YWx1ZSA9IHRydWVcclxuICBhd2FpdCBkZWJvdW5jZWRSZXNvbHZlKClcclxufVxyXG5cclxuY29uc3Qgb25RdWVyeUlucHV0ID0gKGU6IEV2ZW50LCBmb3JjZUNyZWF0ZUZyb21JbnB1dD86IGJvb2xlYW4pID0+IHtcclxuICBjb25zdCBpc0FkZGluZ1RhZyA9IGlzSW5wdXRFdmVudChlKVxyXG4gICAgPyBlLmRhdGEgPT09ICcgJyB8fCBlLmRhdGEgPT09ICcsJyB8fCBlLmRhdGEgPT09ICc7J1xyXG4gICAgOiB0cnVlXHJcblxyXG4gIGlmIChpc0FkZGluZ1RhZykge1xyXG4gICAgbGV0IHNlbGVjdGVkID0gZmFsc2VcclxuICAgIGlmIChcclxuICAgICAgY3R4TWFuYWdlci52YWx1ZT8uaXNPcGVuKCkgJiZcclxuICAgICAgYXV0b2NvbXBsZXRlSXRlbXMudmFsdWUubGVuZ3RoICYmXHJcbiAgICAgICFmb3JjZUNyZWF0ZUZyb21JbnB1dFxyXG4gICAgKSB7XHJcbiAgICAgIC8vIEFkZCBmcm9tIG9wZW5lZCBhdXRvY29tcGxldGUgcGFuZWxcclxuICAgICAgY3R4TWFuYWdlci52YWx1ZT8uc2VsZWN0QWN0aXZlKClcclxuICAgICAgc2VsZWN0ZWQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBBZGQgZnJvbSBxdWVyeVxyXG4gICAgICBjb25zdCBuZXdUYWcgPSBxdWVyeS52YWx1ZVxyXG4gICAgICAgIC50cmltKClcclxuICAgICAgICAuc3Vic3RyaW5nKDAsIHF1ZXJ5LnZhbHVlLmxlbmd0aCAtIChpc0lucHV0RXZlbnQoZSkgPyAxIDogMCkpXHJcblxyXG4gICAgICBjb25zdCB0YWdFeGlzdHMgPSBzZWxlY3RlZEl0ZW1zLnZhbHVlLmluY2x1ZGVzKG5ld1RhZylcclxuICAgICAgaWYgKG5ld1RhZy5sZW5ndGggPiAwICYmICF0YWdFeGlzdHMpIHtcclxuICAgICAgICBzZWxlY3RlZEl0ZW1zLnZhbHVlID0gWy4uLnNlbGVjdGVkSXRlbXMudmFsdWUsIG5ld1RhZ11cclxuICAgICAgICBzZWxlY3RlZCA9IHRydWVcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICBxdWVyeS52YWx1ZSA9ICcnXHJcbiAgICAgIGlzQXV0b2NvbXBsZXRlT3Blbi52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGlzQXV0b2NvbXBsZXRlT3Blbi52YWx1ZSA9ICEhcXVlcnkudmFsdWUubGVuZ3RoXHJcbiAgfVxyXG59XHJcblxyXG53YXRjaChpc0F1dG9jb21wbGV0ZU9wZW4sIChuZXdJc09wZW4sIG9sZElzT3BlbikgPT4ge1xyXG4gIGlmIChuZXdJc09wZW4gJiYgIW9sZElzT3Blbikge1xyXG4gICAgaWYgKHByb3BzLmdldEF1dG9jb21wbGV0ZUl0ZW1zKSBjdHhNYW5hZ2VyLnZhbHVlPy5vcGVuKClcclxuICB9IGVsc2UgaWYgKCFuZXdJc09wZW4gJiYgb2xkSXNPcGVuKSB7XHJcbiAgICBjdHhNYW5hZ2VyLnZhbHVlPy5jbG9zZSgpXHJcbiAgfVxyXG59KVxyXG5cclxud2F0Y2gocXVlcnksICgpID0+IHtcclxuICB2b2lkIGRlYm91bmNlZFJlc29sdmVBbmRNYXJrTG9hZGluZygpXHJcbn0pXHJcblxyXG4vLyAvLyBzeW5jaW5nIHZhbHVlIHcvIHZlZS12YWxpZGF0ZSBpbnRlcm5hbCBzdGF0ZVxyXG4vLyB3YXRjaChcclxuLy8gICBzZWxlY3RlZEl0ZW1zLFxyXG4vLyAgIChuZXdWYWwpID0+IHtcclxuLy8gICAgIHZhbHVlLnZhbHVlID0gbmV3VmFsLnNsaWNlKClcclxuLy8gICB9LFxyXG4vLyAgIHsgZGVlcDogdHJ1ZSwgaW1tZWRpYXRlOiB0cnVlIH1cclxuLy8gKVxyXG5cclxub25Nb3VudGVkKCgpID0+IHtcclxuICB2b2lkIHJlc29sdmVBdXRvY29tcGxldGVJdGVtcygpXHJcbn0pXHJcblxyXG5kZWZpbmVFeHBvc2UoeyByZXNvbHZlQXV0b2NvbXBsZXRlSXRlbXMgfSlcclxuPC9zY3JpcHQ+XHJcbiIsImltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IFRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuXHJcbmV4cG9ydCB0eXBlIEF2YXRhclVzZXIgPSB7XHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgYXZhdGFyPzogc3RyaW5nIHwgbnVsbFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBdmF0YXJVc2VyV2l0aElkID0gQXZhdGFyVXNlciAmIHsgaWQ6IHN0cmluZyB9XHJcblxyXG5leHBvcnQgdHlwZSBVc2VyQXZhdGFyU2l6ZSA9XHJcbiAgfCAnMnhzJ1xyXG4gIHwgJ3hzJ1xyXG4gIHwgJ3NtJ1xyXG4gIHwgJ2Jhc2UnXHJcbiAgfCAnbGcnXHJcbiAgfCAneGwnXHJcbiAgfCAneHhsJ1xyXG4gIHwgJzN4bCdcclxuICB8ICdlZGl0YWJsZSdcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VBdmF0YXJTaXplQ2xhc3NlcyhwYXJhbXM6IHtcclxuICBwcm9wczogVG9SZWZzPHtcclxuICAgIHNpemU/OiBVc2VyQXZhdGFyU2l6ZVxyXG4gIH0+XHJcbn0pIHtcclxuICBjb25zdCB7IHByb3BzIH0gPSBwYXJhbXNcclxuXHJcbiAgY29uc3QgaGVpZ2h0Q2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHNpemUgPSBwcm9wcy5zaXplPy52YWx1ZVxyXG4gICAgc3dpdGNoIChzaXplKSB7XHJcbiAgICAgIGNhc2UgJzJ4cyc6XHJcbiAgICAgICAgcmV0dXJuICdoLTQnXHJcbiAgICAgIGNhc2UgJ3hzJzpcclxuICAgICAgICByZXR1cm4gJ2gtNSdcclxuICAgICAgY2FzZSAnc20nOlxyXG4gICAgICAgIHJldHVybiAnaC02J1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuICdoLTEwJ1xyXG4gICAgICBjYXNlICd4bCc6XHJcbiAgICAgICAgcmV0dXJuICdoLTE0J1xyXG4gICAgICBjYXNlICd4eGwnOlxyXG4gICAgICAgIHJldHVybiAnaC0yNCdcclxuICAgICAgY2FzZSAnM3hsJzpcclxuICAgICAgICByZXR1cm4gJ2gtMzInXHJcbiAgICAgIGNhc2UgJ2VkaXRhYmxlJzpcclxuICAgICAgICByZXR1cm4gJ2gtNjAnXHJcbiAgICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnaC04J1xyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHdpZHRoQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHNpemUgPSBwcm9wcy5zaXplPy52YWx1ZVxyXG4gICAgc3dpdGNoIChzaXplKSB7XHJcbiAgICAgIGNhc2UgJzJ4cyc6XHJcbiAgICAgICAgcmV0dXJuICd3LTQnXHJcbiAgICAgIGNhc2UgJ3hzJzpcclxuICAgICAgICByZXR1cm4gJ3ctNSdcclxuICAgICAgY2FzZSAnc20nOlxyXG4gICAgICAgIHJldHVybiAndy02J1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuICd3LTEwJ1xyXG4gICAgICBjYXNlICd4bCc6XHJcbiAgICAgICAgcmV0dXJuICd3LTE0J1xyXG4gICAgICBjYXNlICd4eGwnOlxyXG4gICAgICAgIHJldHVybiAndy0yNCdcclxuICAgICAgY2FzZSAnM3hsJzpcclxuICAgICAgICByZXR1cm4gJ3ctMzInXHJcbiAgICAgIGNhc2UgJ2VkaXRhYmxlJzpcclxuICAgICAgICByZXR1cm4gJ3ctNjAnXHJcbiAgICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAndy04J1xyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHRleHRDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3Qgc2l6ZSA9IHByb3BzLnNpemU/LnZhbHVlXHJcbiAgICBzd2l0Y2ggKHNpemUpIHtcclxuICAgICAgY2FzZSAnMnhzJzpcclxuICAgICAgY2FzZSAneHMnOlxyXG4gICAgICAgIHJldHVybiAndGV4dC10aW55J1xyXG4gICAgICBjYXNlICdzbSc6XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0LXhzJ1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0LW1kJ1xyXG4gICAgICBjYXNlICd4bCc6XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0LTJ4bCdcclxuICAgICAgY2FzZSAneHhsJzpcclxuICAgICAgICByZXR1cm4gJ3RleHQtMnhsJ1xyXG4gICAgICBjYXNlICczeGwnOlxyXG4gICAgICAgIHJldHVybiAndGV4dC0zeGwnXHJcbiAgICAgIGNhc2UgJ2VkaXRhYmxlJzpcclxuICAgICAgICByZXR1cm4gJ2gxJ1xyXG4gICAgICBjYXNlICdiYXNlJzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ3RleHQtYm9keS0yeHMnXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgY29uc3QgaWNvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBzaXplID0gcHJvcHMuc2l6ZT8udmFsdWVcclxuICAgIHN3aXRjaCAoc2l6ZSkge1xyXG4gICAgICBjYXNlICcyeHMnOlxyXG4gICAgICBjYXNlICd4cyc6XHJcbiAgICAgICAgcmV0dXJuICd3LTMgaC0zJ1xyXG4gICAgICBjYXNlICdzbSc6XHJcbiAgICAgICAgcmV0dXJuICd3LTMgaC0zJ1xyXG4gICAgICBjYXNlICdsZyc6XHJcbiAgICAgICAgcmV0dXJuICd3LTUgaC01J1xyXG4gICAgICBjYXNlICd4bCc6XHJcbiAgICAgICAgcmV0dXJuICd3LTggaC04J1xyXG4gICAgICBjYXNlICd4eGwnOlxyXG4gICAgICAgIHJldHVybiAndy0xMCBoLTEwJ1xyXG4gICAgICBjYXNlICdlZGl0YWJsZSc6XHJcbiAgICAgICAgcmV0dXJuICd3LTIwIGgtMjAnXHJcbiAgICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAndy00IGgtNCdcclxuICAgIH1cclxuICB9KVxyXG5cclxuICBjb25zdCBzaXplQ2xhc3NlcyA9IGNvbXB1dGVkKFxyXG4gICAgKCkgPT4gYCR7d2lkdGhDbGFzc2VzLnZhbHVlfSAke2hlaWdodENsYXNzZXMudmFsdWV9ICR7dGV4dENsYXNzZXMudmFsdWV9YFxyXG4gIClcclxuXHJcbiAgcmV0dXJuIHsgaGVpZ2h0Q2xhc3Nlcywgd2lkdGhDbGFzc2VzLCBzaXplQ2xhc3NlcywgaWNvbkNsYXNzZXMgfVxyXG59XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICA6Y2xhc3M9XCJbXHJcbiAgICAgICd0ZXh0LWZvcmVncm91bmQtb24tcHJpbWFyeSBmbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBvdmVyZmxvdy1oaWRkZW4gdXBwZXJjYXNlIHRyYW5zaXRpb24nLFxyXG4gICAgICByb3VuZGVkID8gJ3JvdW5kZWQtZnVsbCcgOiAncm91bmRlZC1tZCcsXHJcbiAgICAgIHNpemVDbGFzc2VzLFxyXG4gICAgICBiZ0NsYXNzZXMsXHJcbiAgICAgIGJvcmRlckNsYXNzZXMsXHJcbiAgICAgIGhvdmVyQ2xhc3NlcyxcclxuICAgICAgYWN0aXZlQ2xhc3Nlc1xyXG4gICAgXVwiXHJcbiAgPlxyXG4gICAgPHNsb3Q+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICB2LWlmPVwidXNlcj8uYXZhdGFyXCJcclxuICAgICAgICB2LXRpcHB5PVwiIWhpZGVUb29sdGlwID8gcHJvcHMudXNlcj8ubmFtZSA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIGJnLWNvdmVyIGJnLWNlbnRlciBiZy1uby1yZXBlYXRcIlxyXG4gICAgICAgIDpzdHlsZT1cInsgYmFja2dyb3VuZEltYWdlOiBgdXJsKCcke3VzZXIuYXZhdGFyfScpYCB9XCJcclxuICAgICAgLz5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtZWxzZS1pZj1cImluaXRpYWxzXCJcclxuICAgICAgICB2LXRpcHB5PVwiIWhpZGVUb29sdGlwID8gcHJvcHMudXNlcj8ubmFtZSA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgOmNsYXNzPVwidGV4dENsYXNzZXNcIlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBoLWZ1bGwgdy1mdWxsIHNlbGVjdC1ub25lIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBpbml0aWFscyB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiB2LWVsc2U+PFVzZXJDaXJjbGVJY29uIDpjbGFzcz1cImljb25DbGFzc2VzXCIgLz48L2Rpdj5cclxuICAgIDwvc2xvdD5cclxuICAgIDxzbG90IG5hbWU9XCJhYnNvbHV0ZS1hbmNob3JcIiAvPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBVc2VyQ2lyY2xlSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L3NvbGlkJ1xyXG5pbXBvcnQgdHlwZSB7IE1heWJlTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgdG9SZWZzIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyB1c2VBdmF0YXJTaXplQ2xhc3NlcyB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy91c2VyL2F2YXRhcidcclxuaW1wb3J0IHR5cGUgeyBBdmF0YXJVc2VyLCBVc2VyQXZhdGFyU2l6ZSB9IGZyb20gJ35+L3NyYy9jb21wb3NhYmxlcy91c2VyL2F2YXRhcidcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIHVzZXI/OiBNYXliZU51bGxPclVuZGVmaW5lZDxBdmF0YXJVc2VyPlxyXG4gICAgc2l6ZT86IFVzZXJBdmF0YXJTaXplXHJcbiAgICBob3ZlckVmZmVjdD86IGJvb2xlYW5cclxuICAgIGFjdGl2ZT86IGJvb2xlYW5cclxuICAgIG5vQm9yZGVyPzogYm9vbGVhblxyXG4gICAgbm9CZz86IGJvb2xlYW5cclxuICAgIGhpZGVUb29sdGlwPzogYm9vbGVhblxyXG4gICAgcm91bmRlZD86IGJvb2xlYW5cclxuICAgIGxpZ2h0U3R5bGU/OiBib29sZWFuXHJcbiAgfT4oKSxcclxuICB7XHJcbiAgICBzaXplOiAnYmFzZScsXHJcbiAgICBob3ZlckVmZmVjdDogZmFsc2UsXHJcbiAgICB1c2VyOiBudWxsLFxyXG4gICAgcm91bmRlZDogdHJ1ZSxcclxuICAgIGxpZ2h0U3R5bGU6IGZhbHNlXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCB7IHNpemVDbGFzc2VzLCBpY29uQ2xhc3NlcyB9ID0gdXNlQXZhdGFyU2l6ZUNsYXNzZXMoeyBwcm9wczogdG9SZWZzKHByb3BzKSB9KVxyXG5cclxuY29uc3QgaW5pdGlhbHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFwcm9wcy51c2VyPy5uYW1lPy5sZW5ndGgpIHJldHVyblxyXG4gIGNvbnN0IHBhcnRzID0gcHJvcHMudXNlci5uYW1lLnNwbGl0KCcgJylcclxuICBjb25zdCBmaXJzdExldHRlciA9IHBhcnRzWzBdPy5bMF0gfHwgJydcclxuICBjb25zdCBzZWNvbmRMZXR0ZXIgPSBwYXJ0c1sxXT8uWzBdIHx8ICcnXHJcblxyXG4gIGlmIChwcm9wcy5zaXplID09PSAnc20nIHx8IHByb3BzLnNpemUgPT09ICd4cycpIHJldHVybiBmaXJzdExldHRlclxyXG4gIHJldHVybiBmaXJzdExldHRlciArIHNlY29uZExldHRlclxyXG59KVxyXG5cclxuY29uc3QgYm9yZGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvcHMubm9Cb3JkZXIpIHJldHVybiAnJ1xyXG4gIGlmIChwcm9wcy5saWdodFN0eWxlKSByZXR1cm4gJ2JvcmRlciBib3JkZXItb3V0bGluZS0yJ1xyXG4gIHJldHVybiAnYm9yZGVyIGJvcmRlci1mb3VuZGF0aW9uJ1xyXG59KVxyXG5cclxuY29uc3QgYmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5ub0JnKSByZXR1cm4gJydcclxuICBpZiAocHJvcHMubGlnaHRTdHlsZSkgcmV0dXJuICdiZy1mb3VuZGF0aW9uLTInXHJcbiAgcmV0dXJuICdiZy1pbmZvLWRhcmtlcidcclxufSlcclxuXHJcbmNvbnN0IGhvdmVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvcHMuaG92ZXJFZmZlY3QpXHJcbiAgICByZXR1cm4gJ2hvdmVyOmJvcmRlci1wcmltYXJ5IGZvY3VzOmJvcmRlci1wcmltYXJ5IGFjdGl2ZTpzY2FsZS05NSdcclxuICByZXR1cm4gJydcclxufSlcclxuXHJcbmNvbnN0IGFjdGl2ZUNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLmFjdGl2ZSkgcmV0dXJuICdib3JkZXItcHJpbWFyeSdcclxuICByZXR1cm4gJydcclxufSlcclxuXHJcbmNvbnN0IHRleHRDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5saWdodFN0eWxlKSByZXR1cm4gJ3RleHQtZm9yZWdyb3VuZC0zJ1xyXG4gIHJldHVybiAnJ1xyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgcmVmPVwiZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzXCIgOmNsYXNzPVwiYGZsZXggJHtvdmVybGFwID8gJy1zcGFjZS14LTInIDogJyd9YFwiPlxyXG4gICAgPGRpdlxyXG4gICAgICByZWY9XCJpdGVtQ29udGFpbmVyXCJcclxuICAgICAgOmNsYXNzPVwiYGZsZXggZmxleC13cmFwIG92ZXJmbG93LWhpZGRlbiAke1xyXG4gICAgICAgIG92ZXJsYXAgPyAnLXNwYWNlLXgtMiAnIDogJydcclxuICAgICAgfSAke2hlaWdodENsYXNzZXN9YFwiXHJcbiAgICA+XHJcbiAgICAgIDxVc2VyQXZhdGFyXHJcbiAgICAgICAgdi1mb3I9XCIodXNlciwgaSkgaW4gdmlzaWJsZVVzZXJzXCJcclxuICAgICAgICA6a2V5PVwidXNlci5pZCB8fCBpXCJcclxuICAgICAgICA6dXNlcj1cInVzZXJcIlxyXG4gICAgICAgIDpzaXplPVwic2l6ZVwiXHJcbiAgICAgICAgOmhpZGUtdG9vbHRpcD1cImhpZGVUb29sdGlwc1wiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxVc2VyQXZhdGFyXHJcbiAgICAgIHYtaWY9XCJ0b3RhbEhpZGRlbkNvdW50XCJcclxuICAgICAgOnNpemU9XCJzaXplXCJcclxuICAgICAgY2xhc3M9XCJzZWxlY3Qtbm9uZVwiXHJcbiAgICAgIDpjbGFzcz1cInsgJ2N1cnNvci1wb2ludGVyJzogISFvbkhpZGRlbkNvdW50Q2xpY2sgfVwiXHJcbiAgICAgIEBjbGljaz1cIm9uSGlkZGVuQ291bnRDbGljayAmJiBvbkhpZGRlbkNvdW50Q2xpY2soKVwiXHJcbiAgICA+XHJcbiAgICAgICt7eyB0b3RhbEhpZGRlbkNvdW50IH19XHJcbiAgICA8L1VzZXJBdmF0YXI+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IGNvbXB1dGVkLCByZWYsIHRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IFVzZXJBdmF0YXIgZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvdXNlci9BdmF0YXIudnVlJ1xyXG5pbXBvcnQgeyB1c2VXcmFwcGluZ0NvbnRhaW5lckhpZGRlbkNvdW50IH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2xheW91dC9yZXNpemUnXHJcbmltcG9ydCB7IHVzZUF2YXRhclNpemVDbGFzc2VzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL3VzZXIvYXZhdGFyJ1xyXG5pbXBvcnQgdHlwZSB7IFVzZXJBdmF0YXJTaXplLCBBdmF0YXJVc2VyV2l0aElkIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL3VzZXIvYXZhdGFyJ1xyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgdXNlcnM6IEF2YXRhclVzZXJXaXRoSWRbXVxyXG4gICAgb3ZlcmxhcD86IGJvb2xlYW5cclxuICAgIHNpemU/OiBVc2VyQXZhdGFyU2l6ZVxyXG4gICAgbWF4Q291bnQ/OiBudW1iZXJcclxuICAgIGhpZGVUb29sdGlwcz86IGJvb2xlYW5cclxuICAgIG1heEF2YXRhcnM/OiBudW1iZXJcclxuICAgIG9uSGlkZGVuQ291bnRDbGljaz86ICgpID0+IHZvaWRcclxuICB9PigpLFxyXG4gIHtcclxuICAgIHVzZXJzOiAoKSA9PiBbXSxcclxuICAgIG92ZXJsYXA6IHRydWUsXHJcbiAgICBzaXplOiAnYmFzZScsXHJcbiAgICBtYXhDb3VudDogdW5kZWZpbmVkLFxyXG4gICAgaGlkZVRvb2x0aXBzOiBmYWxzZSxcclxuICAgIG1heEF2YXRhcnM6IHVuZGVmaW5lZCxcclxuICAgIG9uSGlkZGVuQ291bnRDbGljazogdW5kZWZpbmVkXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCBlbGVtZW50VG9XYXRjaEZvckNoYW5nZXMgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcbmNvbnN0IGl0ZW1Db250YWluZXIgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcblxyXG5jb25zdCB7IGhpZGRlbkl0ZW1Db3VudCB9ID0gdXNlV3JhcHBpbmdDb250YWluZXJIaWRkZW5Db3VudCh7XHJcbiAgZWxlbWVudFRvV2F0Y2hGb3JDaGFuZ2VzLFxyXG4gIGl0ZW1Db250YWluZXIsXHJcbiAgdHJhY2tSZXNpemU6IHRydWUsXHJcbiAgdHJhY2tNdXRhdGlvbnM6IHRydWVcclxufSlcclxuXHJcbmNvbnN0IHsgaGVpZ2h0Q2xhc3NlcyB9ID0gdXNlQXZhdGFyU2l6ZUNsYXNzZXMoeyBwcm9wczogdG9SZWZzKHByb3BzKSB9KVxyXG5cclxuY29uc3QgbWF4Q291bnRIaWRkZW5JdGVtQ291bnQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFwcm9wcy5tYXhDb3VudCkgcmV0dXJuIDBcclxuICByZXR1cm4gTWF0aC5tYXgocHJvcHMudXNlcnMubGVuZ3RoIC0gcHJvcHMubWF4Q291bnQsIDApXHJcbn0pXHJcblxyXG5jb25zdCB2aXNpYmxlVXNlcnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgcmVzdWx0ID0gcHJvcHMudXNlcnNcclxuICBjb25zdCBsaW1pdCA9IE1hdGgubWluKHByb3BzLm1heENvdW50ID8/IEluZmluaXR5LCBwcm9wcy5tYXhBdmF0YXJzID8/IEluZmluaXR5KVxyXG4gIHJldHVybiByZXN1bHQuc2xpY2UoMCwgbGltaXQpXHJcbn0pXHJcblxyXG5jb25zdCBtYXhBdmF0YXJzSGlkZGVuQ291bnQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFwcm9wcy5tYXhBdmF0YXJzKSByZXR1cm4gMFxyXG4gIHJldHVybiBNYXRoLm1heChwcm9wcy51c2Vycy5sZW5ndGggLSBwcm9wcy5tYXhBdmF0YXJzLCAwKVxyXG59KVxyXG5cclxuY29uc3QgdG90YWxIaWRkZW5Db3VudCA9IGNvbXB1dGVkKFxyXG4gICgpID0+XHJcbiAgICBoaWRkZW5JdGVtQ291bnQudmFsdWUgKyBtYXhDb3VudEhpZGRlbkl0ZW1Db3VudC52YWx1ZSArIG1heEF2YXRhcnNIaWRkZW5Db3VudC52YWx1ZVxyXG4pXHJcbjwvc2NyaXB0PlxyXG4iLCI8dGVtcGxhdGU+XHJcbiAgPHN2Z1xyXG4gICAgY2xhc3M9XCJzcGlubmVyXCJcclxuICAgIDpjbGFzcz1cImljb25DbGFzc2VzXCJcclxuICAgIHdpZHRoPVwiMzJweFwiXHJcbiAgICBoZWlnaHQ9XCI0MHB4XCJcclxuICAgIHZpZXdCb3g9XCIwIDAgNjYgNjZcIlxyXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgPlxyXG4gICAgPGNpcmNsZVxyXG4gICAgICBjbGFzcz1cInBhdGhcIlxyXG4gICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjZcIlxyXG4gICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgY3g9XCIzM1wiXHJcbiAgICAgIGN5PVwiMzNcIlxyXG4gICAgICByPVwiMzBcIlxyXG4gICAgPjwvY2lyY2xlPlxyXG4gIDwvc3ZnPlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbnR5cGUgU2l6ZSA9ICdiYXNlJyB8ICdzbScgfCAnbGcnXHJcblxyXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhkZWZpbmVQcm9wczx7IGxvYWRpbmc/OiBib29sZWFuOyBzaXplPzogU2l6ZSB9PigpLCB7XHJcbiAgc2l6ZTogJ2Jhc2UnLFxyXG4gIGxvYWRpbmc6IHRydWVcclxufSlcclxuXHJcbmNvbnN0IGljb25DbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWycnXVxyXG4gIGNsYXNzUGFydHMucHVzaChwcm9wcy5sb2FkaW5nID8gJ29wYWNpdHktMTAwJyA6ICdvcGFjaXR5LTAnKVxyXG5cclxuICBzd2l0Y2ggKHByb3BzLnNpemUpIHtcclxuICAgIGNhc2UgJ2Jhc2UnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtNSB3LTUnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc20nOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtNCB3LTQnKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnbGcnOlxyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ2gtOCB3LTgnKVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsYXNzUGFydHMuam9pbignICcpXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIHNjb3BlZD5cclxuQGtleWZyYW1lcyByb3RhdG9yIHtcclxuICAwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcclxuICB9XHJcbiAgMTAwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xyXG4gIH1cclxufVxyXG5cclxuQGtleWZyYW1lcyBkYXNoIHtcclxuICAwJSB7XHJcbiAgICBzdHJva2UtZGFzaG9mZnNldDogMTg3O1xyXG4gIH1cclxuICA1MCUge1xyXG4gICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDQ2Ljc1O1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTtcclxuICB9XHJcbiAgMTAwJSB7XHJcbiAgICBzdHJva2UtZGFzaG9mZnNldDogMTg3O1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNDUwZGVnKTtcclxuICB9XHJcbn1cclxuXHJcbi5zcGlubmVyIHtcclxuICBhbmltYXRpb246IHJvdGF0b3IgMS40cyBsaW5lYXIgaW5maW5pdGU7XHJcbn1cclxuXHJcbi5wYXRoIHtcclxuICBzdHJva2UtZGFzaGFycmF5OiAxODc7XHJcbiAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7XHJcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xyXG4gIGFuaW1hdGlvbjogZGFzaCAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgc3BhY2UteS0yXCI+XHJcbiAgICA8TGF6eVVzZXJBdmF0YXJFZGl0b3JcclxuICAgICAgdi1pZj1cImVkaXRNb2RlXCJcclxuICAgICAgOnVzZXI9XCJtb2RlbEFzVXNlclwiXHJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgOnNpemU9XCJzaXplXCJcclxuICAgICAgOnJvdW5kZWQ9XCJyb3VuZGVkXCJcclxuICAgICAgQGNhbmNlbD1cImVkaXRNb2RlID0gZmFsc2VcIlxyXG4gICAgICBAc2F2ZT1cIm9uU2F2ZVwiXHJcbiAgICAvPlxyXG4gICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJyZWxhdGl2ZSBncm91cFwiPlxyXG4gICAgICA8aW1nXHJcbiAgICAgICAgdi1pZj1cIiFtb2RlbEFzVXNlci5hdmF0YXIgJiYgZGVmYXVsdEltZ1wiXHJcbiAgICAgICAgOnNyYz1cImRlZmF1bHRJbWdcIlxyXG4gICAgICAgIDphbHQ9XCJtb2RlbEFzVXNlci5uYW1lXCJcclxuICAgICAgICA6Y2xhc3M9XCJzaXplQ2xhc3Nlc1wiXHJcbiAgICAgIC8+XHJcbiAgICAgIDxVc2VyQXZhdGFyXHJcbiAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgaGlkZS10b29sdGlwXHJcbiAgICAgICAgOnVzZXI9XCJtb2RlbEFzVXNlclwiXHJcbiAgICAgICAgOnNpemU9XCJzaXplXCJcclxuICAgICAgICA6bGlnaHQtc3R5bGU9XCJsaWdodFN0eWxlXCJcclxuICAgICAgICA6cm91bmRlZD1cInJvdW5kZWRcIlxyXG4gICAgICAvPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJvcGFjaXR5LTAgdHJhbnNpdGlvbi1hbGwgYWJzb2x1dGUgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdG9wLTAgcmlnaHQtMCBsZWZ0LTAgYm90dG9tLTAgZmxleCBpdGVtcy1lbmQganVzdGlmeS1jZW50ZXIgYm90dG9tLTRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiZWRpdE1vZGUgPSB0cnVlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBDaGFuZ2VcclxuICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IHYtaWY9XCJlcnJvck1lc3NhZ2VcIiBjbGFzcz1cInctZnVsbCB0ZXh0LWNlbnRlciB0ZXh0LWRhbmdlciB0ZXh0LXNtXCI+XHJcbiAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTWF5YmVOdWxsT3JVbmRlZmluZWQsIE51bGxhYmxlIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQXN5bmNDb21wb25lbnQsIHRvUmVmcyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IEZvcm1CdXR0b24gZnJvbSAnfn4vc3JjL2NvbXBvbmVudHMvZm9ybS9CdXR0b24udnVlJ1xyXG5pbXBvcnQgVXNlckF2YXRhciBmcm9tICd+fi9zcmMvY29tcG9uZW50cy91c2VyL0F2YXRhci52dWUnXHJcbmltcG9ydCB0eXBlIHsgQXZhdGFyVXNlciwgVXNlckF2YXRhclNpemUgfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvdXNlci9hdmF0YXInXHJcbmltcG9ydCBDb21tb25Mb2FkaW5nSWNvbiBmcm9tICd+fi9zcmMvY29tcG9uZW50cy9jb21tb24vbG9hZGluZy9JY29uLnZ1ZSdcclxuaW1wb3J0IHsgdXNlRmllbGQgfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB0eXBlIHsgUnVsZUV4cHJlc3Npb24gfSBmcm9tICd2ZWUtdmFsaWRhdGUnXHJcbmltcG9ydCB7IHVzZUF2YXRhclNpemVDbGFzc2VzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL3VzZXIvYXZhdGFyJ1xyXG5cclxudHlwZSBNb2RlbFR5cGUgPSBNYXliZU51bGxPclVuZGVmaW5lZDxzdHJpbmc+XHJcblxyXG5jb25zdCBMYXp5VXNlckF2YXRhckVkaXRvciA9IGRlZmluZUFzeW5jQ29tcG9uZW50KHtcclxuICBsb2FkZXI6ICgpID0+IGltcG9ydCgnfn4vc3JjL2NvbXBvbmVudHMvdXNlci9BdmF0YXJFZGl0b3IudnVlJyksXHJcbiAgbG9hZGluZ0NvbXBvbmVudDogQ29tbW9uTG9hZGluZ0ljb24sXHJcbiAgZGVsYXk6IDEwMFxyXG59KVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3NhdmUnLCBuZXdVcmw6IE1vZGVsVHlwZSk6IHZvaWRcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWU6IE1vZGVsVHlwZSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgbW9kZWxWYWx1ZT86IE1vZGVsVHlwZVxyXG4gICAgLyoqXHJcbiAgICAgKiBQbGFjZWhvbGRlciBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGFuZCBzaG93IGluaXRpYWxzIGlmIG5vIGF2YXRhciBpcyBwcmVzZW50XHJcbiAgICAgKi9cclxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmdcclxuICAgIC8qKlxyXG4gICAgICogTmFtZSBvZiB0aGUgZmllbGQuIFVzZWQgZm9yIHZhbGlkYXRpb24gJiBmb3JtIHN1Ym1pdHNcclxuICAgICAqL1xyXG4gICAgbmFtZTogc3RyaW5nXHJcbiAgICBydWxlcz86IFJ1bGVFeHByZXNzaW9uPE1vZGVsVHlwZT5cclxuICAgIHZhbGlkYXRlT25Nb3VudD86IGJvb2xlYW5cclxuICAgIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZT86IGJvb2xlYW5cclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gICAgc2l6ZT86IFVzZXJBdmF0YXJTaXplXHJcbiAgICBkZWZhdWx0SW1nPzogc3RyaW5nXHJcbiAgICByb3VuZGVkPzogYm9vbGVhblxyXG4gICAgbGlnaHRTdHlsZT86IGJvb2xlYW5cclxuICB9PigpLFxyXG4gIHtcclxuICAgIHJvdW5kZWQ6IHRydWUsXHJcbiAgICBsaWdodFN0eWxlOiBmYWxzZVxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgeyB2YWx1ZSwgZXJyb3JNZXNzYWdlIH0gPSB1c2VGaWVsZDxNb2RlbFR5cGU+KHByb3BzLm5hbWUsIHByb3BzLnJ1bGVzLCB7XHJcbiAgdmFsaWRhdGVPbk1vdW50OiBwcm9wcy52YWxpZGF0ZU9uTW91bnQsXHJcbiAgdmFsaWRhdGVPblZhbHVlVXBkYXRlOiBwcm9wcy52YWxpZGF0ZU9uVmFsdWVVcGRhdGUsXHJcbiAgaW5pdGlhbFZhbHVlOiBwcm9wcy5tb2RlbFZhbHVlIHx8IHVuZGVmaW5lZFxyXG59KVxyXG5jb25zdCB7IHNpemVDbGFzc2VzIH0gPSB1c2VBdmF0YXJTaXplQ2xhc3Nlcyh7IHByb3BzOiB0b1JlZnMocHJvcHMpIH0pXHJcblxyXG5jb25zdCBlZGl0TW9kZSA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdlZGl0TW9kZScpXHJcblxyXG5jb25zdCBtb2RlbEFzVXNlciA9IGNvbXB1dGVkKFxyXG4gICgpOiBBdmF0YXJVc2VyID0+ICh7XHJcbiAgICBhdmF0YXI6IHZhbHVlLnZhbHVlLFxyXG4gICAgbmFtZTogcHJvcHMucGxhY2Vob2xkZXJcclxuICB9KVxyXG4pXHJcblxyXG5jb25zdCBvblNhdmUgPSAobmV3VXJsOiBOdWxsYWJsZTxzdHJpbmc+KSA9PiB7XHJcbiAgdmFsdWUudmFsdWUgPSBuZXdVcmxcclxuICBlbWl0KCdzYXZlJywgbmV3VXJsKVxyXG59XHJcblxyXG5jb25zdCBvcGVuID0gKCkgPT4gKGVkaXRNb2RlLnZhbHVlID0gdHJ1ZSlcclxuY29uc3QgY2xvc2UgPSAoKSA9PiAoZWRpdE1vZGUudmFsdWUgPSBmYWxzZSlcclxuXHJcbmRlZmluZUV4cG9zZSh7IG9wZW4sIGNsb3NlIH0pXHJcbjwvc2NyaXB0PlxyXG4iLCIvKipcclxuICogQmFzZSBPYmplY3RMb2FkZXIgZXJyb3JcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBtZXNzYWdlIGlmIG5vbmUgaXMgcGFzc2VkXHJcbiAgICovXHJcbiAgc3RhdGljIGRlZmF1bHRNZXNzYWdlID0gJ1VuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnXHJcblxyXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcclxuICAgIG1lc3NhZ2UgfHw9IG5ldy50YXJnZXQuZGVmYXVsdE1lc3NhZ2VcclxuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogVGhyb3cgdGhlc2UgaW4gZXhlY3V0aW9uIGJyYW5jaGVzIHRoYXQgc2hvdWxkIG5ldmVyIG9jY3VyIHVubGVzcyBpZiB0aGVyZSdzIGEgYnVnXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTG9naWNFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XHJcbiAgc3RhdGljIGRlZmF1bHRNZXNzYWdlID0gJ0FuIHVuZXhwZWN0ZWQgbG9naWMgZXJyb3Igb2NjdXJyZWQhJ1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVW5pbml0aWFsaXplZFJlc291cmNlQWNjZXNzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xyXG4gIHN0YXRpYyBkZWZhdWx0TWVzc2FnZSA9ICdBdHRlbXB0aW5nIHRvIGFjY2VzcyBhbiB1bmluaXRpYWxpemVkIHJlc291cmNlJ1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29tcG9zYWJsZUludm9rZWRPdXRPZlNjb3BlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xyXG4gIHN0YXRpYyBkZWZhdWx0TWVzc2FnZSA9XHJcbiAgICAnZ2V0Q3VycmVudEluc3RhbmNlKCkgcmV0dXJuZWQgbnVsbC4gTWV0aG9kIG11c3QgYmUgY2FsbGVkIGF0IHRoZSB0b3Agb2YgYSBzZXR1cCBmdW5jdGlvbidcclxufVxyXG5cclxuLyoqXHJcbiAqIFRocm93IHRoaXMgd2hlbiBzb21ldGhpbmcgdGhhdCdzIG9ubHkgc3VwcG9ydGVkIGR1cmluZyBDU1IgaXMgaW52b2tlZCBkdXJpbmcgU1NSIG9yIHZpY2UgdmVyc2FcclxuICovXHJcbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEVudmlyb25tZW50RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xyXG4gIHN0YXRpYyBkZWZhdWx0TWVzc2FnZSA9XHJcbiAgICAnT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgaW4gY3VycmVudCAoc2VydmVyIG9yIGNsaWVudCkgZW52aXJvbm1lbnQnXHJcbn1cclxuIiwiaW1wb3J0IHsgZGlmZmVyZW5jZSwgaW50ZXJzZWN0aW9uIH0gZnJvbSAnI2xvZGFzaCdcclxuaW1wb3J0IHsgbWQ1IH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tICd+fi9zcmMvaGVscGVycy9jb21tb24vZXJyb3InXHJcblxyXG5leHBvcnQgdHlwZSBGaWxlVHlwZVNwZWNpZmllciA9IFVuaXF1ZUZpbGVUeXBlU3BlY2lmaWVyIHwgYC4ke3N0cmluZ31gXHJcblxyXG5leHBvcnQgZW51bSBVbmlxdWVGaWxlVHlwZVNwZWNpZmllciB7XHJcbiAgQW55QXVkaW8gPSAnYXVkaW8vKicsXHJcbiAgQW55VmlkZW8gPSAndmlkZW8vKicsXHJcbiAgQW55SW1hZ2UgPSAnaW1hZ2UvKidcclxufVxyXG5cclxuLyoqXHJcbiAqIFZhbGlkYXRlIGlmIGZpbGUgaGFzIHRoZSBhbGxvd2VkIHR5cGUuIFdoaWxlIHdlIGNvdWxkIGFsc28gdGVzdCBmb3IgTUlNRSB0eXBlc1xyXG4gKiBub3QgaW4gVW5pcXVlRmlsZVR5cGVTcGVjaWZpZXIsIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGVcclxuICogJ2FjY2VwdCcgYXR0cmlidXRlLCB3aGljaCBvbmx5IGFsbG93cyBmb3IgZXh0ZW5zaW9ucyBvciBVbmlxdWVGaWxlVHlwZVNwZWNpZmllclxyXG4gKiB2YWx1ZXMuXHJcbiAqIEBwYXJhbSBmaWxlXHJcbiAqIEBwYXJhbSBhbGxvd2VkVHlwZXMgVGhlIGZpbGUgbXVzdCBoYXZlIG9uZSBvZiB0aGVzZSB0eXBlc1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIHZhbGlkLCBFcnJvciBvYmplY3QgaWYgbm90XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGaWxlVHlwZShcclxuICBmaWxlOiBGaWxlLFxyXG4gIGFsbG93ZWRUeXBlczogRmlsZVR5cGVTcGVjaWZpZXJbXVxyXG4pOiB0cnVlIHwgRXJyb3Ige1xyXG4gIC8vIENoZWNrIG9uZSBvZiB0aGUgdW5pcXVlIGZpbGUgdHlwZSBzcGVjaWZpZXJzIGZpcnN0XHJcbiAgY29uc3QgYWxsb3dlZFVuaXF1ZVR5cGVzID0gaW50ZXJzZWN0aW9uKFxyXG4gICAgT2JqZWN0LnZhbHVlcyhVbmlxdWVGaWxlVHlwZVNwZWNpZmllciksXHJcbiAgICBhbGxvd2VkVHlwZXNcclxuICApXHJcbiAgZm9yIChjb25zdCBhbGxvd2VkVW5pcXVlVHlwZSBvZiBhbGxvd2VkVW5pcXVlVHlwZXMpIHtcclxuICAgIHN3aXRjaCAoYWxsb3dlZFVuaXF1ZVR5cGUpIHtcclxuICAgICAgY2FzZSBVbmlxdWVGaWxlVHlwZVNwZWNpZmllci5BbnlBdWRpbzpcclxuICAgICAgICBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2F1ZGlvJykpIHJldHVybiB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSBVbmlxdWVGaWxlVHlwZVNwZWNpZmllci5BbnlJbWFnZTpcclxuICAgICAgICBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlJykpIHJldHVybiB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSBVbmlxdWVGaWxlVHlwZVNwZWNpZmllci5BbnlWaWRlbzpcclxuICAgICAgICBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvJykpIHJldHVybiB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGZpbGUgZXh0ZW5zaW9uc1xyXG4gIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gZGlmZmVyZW5jZShhbGxvd2VkVHlwZXMsIGFsbG93ZWRVbmlxdWVUeXBlcylcclxuICBjb25zdCBmaWxlRXh0ID0gcmVzb2x2ZUZpbGVFeHRlbnNpb24oZmlsZS5uYW1lKVxyXG4gIGlmICghZmlsZUV4dCkgcmV0dXJuIG5ldyBNaXNzaW5nRmlsZUV4dGVuc2lvbkVycm9yKClcclxuXHJcbiAgZm9yIChjb25zdCBhbGxvd2VkRXh0ZW5zaW9uIG9mIGFsbG93ZWRFeHRlbnNpb25zKSB7XHJcbiAgICBpZiAoYWxsb3dlZEV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpID09PSBmaWxlRXh0LnRvTG93ZXJDYXNlKCkpIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICByZXR1cm4gbmV3IEZvcmJpZGRlbkZpbGVUeXBlRXJyb3IoKVxyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBmaWxlIGV4dGVuc2lvbiAod2l0aCBsZWFkaW5nIGRvdClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRmlsZUV4dGVuc2lvbihmaWxlTmFtZTogc3RyaW5nKTogTnVsbGFibGU8RmlsZVR5cGVTcGVjaWZpZXI+IHtcclxuICBjb25zdCBmaWxlTmFtZVBhcnRzID0gZmlsZU5hbWUuc3BsaXQoJy4nKVxyXG4gIGlmIChmaWxlTmFtZVBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiBudWxsXHJcblxyXG4gIGNvbnN0IGV4dCA9IGZpbGVOYW1lUGFydHMucG9wKCkgfHwgbnVsbFxyXG4gIHJldHVybiBleHQgPyBgLiR7ZXh0fWAgOiBudWxsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBzdHJpbmcgaXMgYSBGaWxlVHlwZVNwZWNpZmllclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRmlsZVR5cGVTcGVjaWZpZXIodHlwZTogc3RyaW5nKTogdHlwZSBpcyBGaWxlVHlwZVNwZWNpZmllciB7XHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGUuc3RhcnRzV2l0aCgnLicpIHx8XHJcbiAgICBPYmplY3QudmFsdWVzKFVuaXF1ZUZpbGVUeXBlU3BlY2lmaWVyIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pLmluY2x1ZGVzKHR5cGUpXHJcbiAgKVxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgaHVtYW4gcmVhZGFibGUgZmlsZSBzaXplIHN0cmluZyBmcm9tIHRoZSBudW1lcmljIHNpemUgaW4gYnl0ZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcmV0dHlGaWxlU2l6ZShzaXplSW5CeXRlczogbnVtYmVyKTogc3RyaW5nIHtcclxuICBjb25zdCByZW1vdmVUcmFpbGluZ1plcm9lcyA9IChmaWxlU2l6ZTogbnVtYmVyKSA9PlxyXG4gICAgcGFyc2VGbG9hdChmaWxlU2l6ZS50b0ZpeGVkKDIpKS50b1N0cmluZygpXHJcblxyXG4gIGlmIChzaXplSW5CeXRlcyA8IDEwMjQpIHtcclxuICAgIHJldHVybiBgJHtzaXplSW5CeXRlc31ieXRlc2BcclxuICB9XHJcblxyXG4gIGNvbnN0IGtiU2l6ZSA9IHNpemVJbkJ5dGVzIC8gMTAyNFxyXG4gIGlmIChrYlNpemUgPCAxMDI0KSB7XHJcbiAgICByZXR1cm4gYCR7cmVtb3ZlVHJhaWxpbmdaZXJvZXMoa2JTaXplKX1LQmBcclxuICB9XHJcblxyXG4gIGNvbnN0IG1iU2l6ZSA9IGtiU2l6ZSAvIDEwMjRcclxuICBpZiAobWJTaXplIDwgMTAyNCkge1xyXG4gICAgcmV0dXJuIGAke3JlbW92ZVRyYWlsaW5nWmVyb2VzKG1iU2l6ZSl9TUJgXHJcbiAgfVxyXG5cclxuICBjb25zdCBnYlNpemUgPSBtYlNpemUgLyAxMDI0XHJcbiAgcmV0dXJuIGAke3JlbW92ZVRyYWlsaW5nWmVyb2VzKGdiU2l6ZSl9R0JgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBhbiBJRCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBmaWxlLiBUaGUgc2FtZSBmaWxlXHJcbiAqIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgSUQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGaWxlSWQoZmlsZTogRmlsZSk6IHN0cmluZyB7XHJcbiAgY29uc3QgaW1wb3J0YW50RGF0YSA9IHtcclxuICAgIG5hbWU6IGZpbGUubmFtZSxcclxuICAgIGxhc3RNb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQsXHJcbiAgICBzaXplOiBmaWxlLnNpemUsXHJcbiAgICB0eXBlOiBmaWxlLnR5cGVcclxuICB9XHJcblxyXG4gIHJldHVybiBtZDUoSlNPTi5zdHJpbmdpZnkoaW1wb3J0YW50RGF0YSkpXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNaXNzaW5nRmlsZUV4dGVuc2lvbkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcclxuICBzdGF0aWMgZGVmYXVsdE1lc3NhZ2UgPSAnVGhlIHNlbGVjdGVkIGZpbGUgaGFzIGEgbWlzc2luZyBleHRlbnNpb24nXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGb3JiaWRkZW5GaWxlVHlwZUVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcclxuICBzdGF0aWMgZGVmYXVsdE1lc3NhZ2UgPSAnVGhlIHNlbGVjdGVkIGZpbGUgdHlwZSBpcyBmb3JiaWRkZW4nXHJcbn1cclxuIiwiaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHR5cGUgeyBNYXliZU51bGxPclVuZGVmaW5lZCwgTnVsbGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQge1xyXG4gIGdlbmVyYXRlRmlsZUlkLFxyXG4gIGlzRmlsZVR5cGVTcGVjaWZpZXIsXHJcbiAgcHJldHR5RmlsZVNpemUsXHJcbiAgdmFsaWRhdGVGaWxlVHlwZVxyXG59IGZyb20gJ35+L3NyYy9oZWxwZXJzL2Zvcm0vZmlsZSdcclxuaW1wb3J0IHR5cGUgeyBGaWxlVHlwZVNwZWNpZmllciB9IGZyb20gJ35+L3NyYy9oZWxwZXJzL2Zvcm0vZmlsZSdcclxuaW1wb3J0IHsgY29tcHV0ZWQsIHVucmVmIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gJ35+L3NyYy9saWInXHJcbmltcG9ydCB0eXBlIHsgQmxvYlVwbG9hZFN0YXR1cyB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZC9ibG9icydcclxuXHJcbi8qKlxyXG4gKiBBIGZpbGUsIGFzIGVtaXR0ZWQgb3V0IGZyb20gRmlsZVVwbG9hZFpvbmVcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkYWJsZUZpbGVJdGVtIHtcclxuICBmaWxlOiBGaWxlXHJcbiAgZXJyb3I6IE51bGxhYmxlPEVycm9yPlxyXG4gIC8qKlxyXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgSUQgdG8gY2hlY2sgZm9yIEZpbGUgZXF1YWxpdHlcclxuICAgKi9cclxuICBpZDogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEJsb2JQb3N0UmVzdWx0SXRlbSA9IHtcclxuICBibG9iSWQ/OiBzdHJpbmdcclxuICBmaWxlTmFtZT86IHN0cmluZ1xyXG4gIGZpbGVTaXplPzogbnVtYmVyXHJcbiAgZm9ybUtleTogc3RyaW5nXHJcbiAgLyoqXHJcbiAgICogU3VjY2VzcyA9IDEsIEZhaWx1cmUgPSAyXHJcbiAgICovXHJcbiAgdXBsb2FkU3RhdHVzOiBCbG9iVXBsb2FkU3RhdHVzXHJcbiAgdXBsb2FkRXJyb3I6IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZEZpbGVJdGVtIGV4dGVuZHMgVXBsb2FkYWJsZUZpbGVJdGVtIHtcclxuICAvKipcclxuICAgKiBQcm9ncmVzcyBiZXR3ZWVuIDAgYW5kIDEwMFxyXG4gICAqL1xyXG4gIHByb2dyZXNzOiBudW1iZXJcclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiB1cGxvYWQgaGFzIGZpbmlzaGVkIHRoaXMgY29udGFpbnMgYSBCbG9iUG9zdFJlc3VsdEl0ZW1cclxuICAgKi9cclxuICByZXN1bHQ6IE9wdGlvbmFsPEJsb2JQb3N0UmVzdWx0SXRlbT5cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBhIGJsb2IgZ2V0cyBhc3NpZ25lZCB0byBhIHJlc291cmNlLCBpdCBzaG91bGQgY291bnQgYXMgaW4gdXNlLCBhbmQgdGhpcyB3aWxsXHJcbiAgICogcHJldmVudCBpdCBmcm9tIGJlaW5nIGRlbGV0ZWQgYXMganVua1xyXG4gICAqL1xyXG4gIGluVXNlPzogYm9vbGVhblxyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZEZpbGVUeXBlU3BlY2lmaWVycyhcclxuICBhY2NlcHQ6IE9wdGlvbmFsPHN0cmluZz5cclxuKTogT3B0aW9uYWw8RmlsZVR5cGVTcGVjaWZpZXJbXT4ge1xyXG4gIGlmICghYWNjZXB0KSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgY29uc3Qgc3BlY2lmaWVycyA9IGFjY2VwdFxyXG4gICAgLnNwbGl0KCcsJylcclxuICAgIC5tYXAoKHMpID0+IChpc0ZpbGVUeXBlU3BlY2lmaWVyKHMpID8gcyA6IG51bGwpKVxyXG4gICAgLmZpbHRlcigocyk6IHMgaXMgRmlsZVR5cGVTcGVjaWZpZXIgPT4gcyAhPT0gbnVsbClcclxuXHJcbiAgcmV0dXJuIHNwZWNpZmllcnMubGVuZ3RoID8gc3BlY2lmaWVycyA6IHVuZGVmaW5lZFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlUHJlcGFyZVVwbG9hZGFibGVGaWxlcyhwYXJhbXM6IHtcclxuICBkaXNhYmxlZD86IE1heWJlUmVmPE9wdGlvbmFsPGJvb2xlYW4+PlxyXG4gIGFjY2VwdD86IE1heWJlUmVmPE9wdGlvbmFsPHN0cmluZz4+XHJcbiAgbXVsdGlwbGU/OiBNYXliZVJlZjxPcHRpb25hbDxib29sZWFuPj5cclxuICBjb3VudExpbWl0PzogTWF5YmVSZWY8T3B0aW9uYWw8bnVtYmVyPj5cclxuICBzaXplTGltaXQ6IE1heWJlUmVmPG51bWJlcj5cclxufSkge1xyXG4gIGNvbnN0IHsgZGlzYWJsZWQsIGFjY2VwdCwgbXVsdGlwbGUsIHNpemVMaW1pdCwgY291bnRMaW1pdCB9ID0gcGFyYW1zXHJcblxyXG4gIGNvbnN0IGZpbGVUeXBlU3BlY2lmaWVycyA9IGNvbXB1dGVkKCgpID0+IGJ1aWxkRmlsZVR5cGVTcGVjaWZpZXJzKHVucmVmKGFjY2VwdCkpKVxyXG5cclxuICBjb25zdCBoYW5kbGVGaWxlcyA9IChmaWxlczogRmlsZVtdKTogVXBsb2FkYWJsZUZpbGVJdGVtW10gPT4ge1xyXG4gICAgY29uc3QgcmVzdWx0czogVXBsb2FkYWJsZUZpbGVJdGVtW10gPSBbXVxyXG4gICAgY29uc3QgYWxsb3dlZFR5cGVzID0gZmlsZVR5cGVTcGVjaWZpZXJzLnZhbHVlXHJcblxyXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVGaWxlSWQoZmlsZSlcclxuICAgICAgY29uc3QgZmluYWxDb3VudExpbWl0ID0gIXVucmVmKG11bHRpcGxlKSA/IDEgOiB1bnJlZihjb3VudExpbWl0KVxyXG5cclxuICAgICAgLy8gc2tpcCBmaWxlLCBpZiBpdCdzIHNlbGVjdGVkIHR3aWNlIHNvbWVob3dcclxuICAgICAgaWYgKHJlc3VsdHMuZmluZCgocikgPT4gci5pZCA9PT0gaWQpKSBjb250aW51ZVxyXG5cclxuICAgICAgLy8gT25seSBhbGxvdyBhIHNpbmdsZSBmaWxlIGlmICFtdWx0aXBsZVxyXG4gICAgICBpZiAoZmluYWxDb3VudExpbWl0ICYmIHJlc3VsdHMubGVuZ3RoID49IGZpbmFsQ291bnRMaW1pdCkge1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChhbGxvd2VkVHlwZXMpIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVGaWxlVHlwZShmaWxlLCBhbGxvd2VkVHlwZXMpXHJcbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHtcclxuICAgICAgICAgICAgZmlsZSxcclxuICAgICAgICAgICAgaWQsXHJcbiAgICAgICAgICAgIGVycm9yOiB2YWxpZGF0aW9uUmVzdWx0XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY29udGludWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmaWxlLnNpemUgPiB1bnJlZihzaXplTGltaXQpKSB7XHJcbiAgICAgICAgcmVzdWx0cy5wdXNoKHtcclxuICAgICAgICAgIGZpbGUsXHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICAgIGVycm9yOiBuZXcgRmlsZVRvb0xhcmdlRXJyb3IoXHJcbiAgICAgICAgICAgIGBUaGUgc2VsZWN0ZWQgZmlsZSdzIHNpemUgKCR7cHJldHR5RmlsZVNpemUoXHJcbiAgICAgICAgICAgICAgZmlsZS5zaXplXHJcbiAgICAgICAgICAgICl9KSBpcyB0b28gYmlnIChvdmVyICR7cHJldHR5RmlsZVNpemUodW5yZWYoc2l6ZUxpbWl0KSl9KWBcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnRpbnVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlc3VsdHMucHVzaCh7IGZpbGUsIGlkLCBlcnJvcjogbnVsbCB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHRzXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBmaWxlcyBhbmQgYnVpbGQgVXBsb2FkYWJsZUZpbGVJdGVtIHN0cnVjdHMgb3V0IG9mIHRoZW1cclxuICAgICAqL1xyXG4gICAgYnVpbGRVcGxvYWRhYmxlRmlsZXM6IChmaWxlczogRmlsZVtdKSA9PiB7XHJcbiAgICAgIGlmICh1bnJlZihkaXNhYmxlZCB8fCBmYWxzZSkpIHJldHVyblxyXG4gICAgICByZXR1cm4gaGFuZGxlRmlsZXMoZmlsZXMpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZVRvb0xhcmdlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xyXG4gIHN0YXRpYyBkZWZhdWx0TWVzc2FnZSA9IFwiVGhlIHNlbGVjdGVkIGZpbGUncyBzaXplIGlzIHRvbyBsYXJnZVwiXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VGaWxlVXBsb2FkUHJvZ3Jlc3NDb3JlKHBhcmFtczoge1xyXG4gIGl0ZW06IE1heWJlUmVmPE1heWJlTnVsbE9yVW5kZWZpbmVkPFVwbG9hZEZpbGVJdGVtPj5cclxufSkge1xyXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB1bnJlZihwYXJhbXMuaXRlbSlcclxuICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGxcclxuXHJcbiAgICBjb25zdCBpdGVtRXJyb3IgPSBpdGVtLmVycm9yXHJcbiAgICBpZiAoaXRlbUVycm9yKSByZXR1cm4gaXRlbUVycm9yLm1lc3NhZ2VcclxuXHJcbiAgICBjb25zdCB1cGxvYWRFcnJvciA9IGl0ZW0ucmVzdWx0Py51cGxvYWRFcnJvclxyXG4gICAgaWYgKHVwbG9hZEVycm9yKSByZXR1cm4gdXBsb2FkRXJyb3JcclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHByb2dyZXNzQmFyQ29sb3JDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB1bnJlZihwYXJhbXMuaXRlbSlcclxuICAgIGlmIChlcnJvck1lc3NhZ2UudmFsdWUpIHJldHVybiAnYmctZGFuZ2VyJ1xyXG4gICAgaWYgKGl0ZW0gJiYgaXRlbS5wcm9ncmVzcyA+PSAxMDApIHJldHVybiAnYmctc3VjY2VzcydcclxuICAgIHJldHVybiAnYmctcHJpbWFyeSdcclxuICB9KVxyXG5cclxuICBjb25zdCBwcm9ncmVzc0JhckNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICByZXR1cm4gWydoLTEnLCBwcm9ncmVzc0JhckNvbG9yQ2xhc3MudmFsdWVdLmpvaW4oJyAnKVxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHByb2dyZXNzQmFyU3R5bGUgPSBjb21wdXRlZCgoKTogQ1NTUHJvcGVydGllcyA9PiB7XHJcbiAgICBjb25zdCBpdGVtID0gdW5yZWYocGFyYW1zLml0ZW0pXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogYCR7aXRlbSA/IGl0ZW0ucHJvZ3Jlc3MgOiAwfSVgXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIHsgZXJyb3JNZXNzYWdlLCBwcm9ncmVzc0JhckNsYXNzZXMsIHByb2dyZXNzQmFyU3R5bGUgfVxyXG59XHJcbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9mb3JtLWNvbnRyb2wtaGFzLWxhYmVsIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdiByZWY9XCJmaWxlVXBsb2FkWm9uZVwiIGNsYXNzPVwiZmlsZS11cGxvYWQtem9uZVwiPlxyXG4gICAgPHNsb3RcclxuICAgICAgOmlzLWRyYWdnaW5nLWZpbGVzPVwiaXNPdmVyRHJvcFpvbmVcIlxyXG4gICAgICA6b3Blbi1maWxlLXBpY2tlcj1cInRyaWdnZXJQaWNrZXJcIlxyXG4gICAgICA6YWN0aXZhdG9yLW9uPVwieyBjbGljazogdHJpZ2dlclBpY2tlciB9XCJcclxuICAgIC8+XHJcbiAgICA8aW5wdXRcclxuICAgICAgcmVmPVwiZmlsZUlucHV0XCJcclxuICAgICAgdHlwZT1cImZpbGVcIlxyXG4gICAgICBjbGFzcz1cImhpZGRlblwiXHJcbiAgICAgIDphY2NlcHQ9XCJhY2NlcHRcIlxyXG4gICAgICA6bXVsdGlwbGU9XCJtdWx0aXBsZVwiXHJcbiAgICAgIEBjbGljay5zdG9wXHJcbiAgICAgIEBjaGFuZ2U9XCJvbklucHV0Q2hhbmdlXCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZURyb3Bab25lIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyBjb21wdXRlZCwgcmVmIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyB1c2VQcmVwYXJlVXBsb2FkYWJsZUZpbGVzIH0gZnJvbSAnfn4vc3JjL2NvbXBvc2FibGVzL2Zvcm0vZmlsZVVwbG9hZCdcclxuaW1wb3J0IHR5cGUgeyBVcGxvYWRhYmxlRmlsZUl0ZW0gfSBmcm9tICd+fi9zcmMvY29tcG9zYWJsZXMvZm9ybS9maWxlVXBsb2FkJ1xyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ2ZpbGVzLXNlbGVjdGVkJywgdjogeyBmaWxlczogVXBsb2FkYWJsZUZpbGVJdGVtW10gfSk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoXHJcbiAgZGVmaW5lUHJvcHM8e1xyXG4gICAgLyoqXHJcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0F0dHJpYnV0ZXMvYWNjZXB0XHJcbiAgICAgKi9cclxuICAgIGFjY2VwdD86IHN0cmluZ1xyXG4gICAgLyoqXHJcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0F0dHJpYnV0ZXMvbXVsdGlwbGVcclxuICAgICAqL1xyXG4gICAgbXVsdGlwbGU/OiBib29sZWFuXHJcbiAgICAvKipcclxuICAgICAqIE1heCBmaWxlIHNpemUgaW4gYnl0ZXNcclxuICAgICAqL1xyXG4gICAgc2l6ZUxpbWl0PzogbnVtYmVyXHJcbiAgICAvKipcclxuICAgICAqIE1heCBmaWxlIGNvdW50IGlmICdtdWx0aXBsZScgaXMgc2V0XHJcbiAgICAgKi9cclxuICAgIGNvdW50TGltaXQ/OiBudW1iZXJcclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgc2l6ZUxpbWl0OiAxMDI0ICogMTAyNCAqIDEwMCAvLyAxMDBtYlxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgZmlsZVVwbG9hZFpvbmUgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRGl2RWxlbWVudD4pXHJcbmNvbnN0IGZpbGVJbnB1dCA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxJbnB1dEVsZW1lbnQ+KVxyXG5cclxuY29uc3QgeyBidWlsZFVwbG9hZGFibGVGaWxlcyB9ID0gdXNlUHJlcGFyZVVwbG9hZGFibGVGaWxlcyh7XHJcbiAgc2l6ZUxpbWl0OiBjb21wdXRlZCgoKSA9PiBwcm9wcy5zaXplTGltaXQpLFxyXG4gIGNvdW50TGltaXQ6IGNvbXB1dGVkKCgpID0+IHByb3BzLmNvdW50TGltaXQpLFxyXG4gIGFjY2VwdDogY29tcHV0ZWQoKCkgPT4gcHJvcHMuYWNjZXB0KSxcclxuICBtdWx0aXBsZTogY29tcHV0ZWQoKCkgPT4gcHJvcHMubXVsdGlwbGUpLFxyXG4gIGRpc2FibGVkOiBjb21wdXRlZCgoKSA9PiBwcm9wcy5kaXNhYmxlZClcclxufSlcclxuY29uc3QgaGFuZGxlSW5jb21pbmdGaWxlcyA9IChmaWxlczogRmlsZVtdKSA9PiB7XHJcbiAgY29uc3QgZmlsZUl0ZW1zID0gYnVpbGRVcGxvYWRhYmxlRmlsZXMoZmlsZXMpXHJcbiAgaWYgKCFmaWxlSXRlbXM/Lmxlbmd0aCkgcmV0dXJuXHJcbiAgZW1pdCgnZmlsZXMtc2VsZWN0ZWQnLCB7IGZpbGVzOiBmaWxlSXRlbXMgfSlcclxufVxyXG5cclxuY29uc3QgeyBpc092ZXJEcm9wWm9uZSB9ID0gdXNlRHJvcFpvbmUoZmlsZVVwbG9hZFpvbmUsIChmaWxlcykgPT4ge1xyXG4gIGlmICghZmlsZXM/Lmxlbmd0aCkgcmV0dXJuXHJcbiAgaGFuZGxlSW5jb21pbmdGaWxlcyhmaWxlcylcclxufSlcclxuXHJcbmNvbnN0IG9uSW5wdXRDaGFuZ2UgPSAoKSA9PiB7XHJcbiAgY29uc3QgaW5wdXQgPSBmaWxlSW5wdXQudmFsdWVcclxuICBpZiAoIWlucHV0KSByZXR1cm5cclxuXHJcbiAgY29uc3QgZmlsZXMgPSBbLi4uKGlucHV0LmZpbGVzIHx8IFtdKV1cclxuICBpbnB1dC52YWx1ZSA9ICcnIC8vIFJlc2V0dGluZyB2YWx1ZVxyXG5cclxuICBpZiAoIWZpbGVzLmxlbmd0aCkgcmV0dXJuXHJcbiAgaGFuZGxlSW5jb21pbmdGaWxlcyhmaWxlcylcclxufVxyXG5cclxuY29uc3QgdHJpZ2dlclBpY2tlciA9ICgpID0+IHtcclxuICBmaWxlSW5wdXQudmFsdWU/LmNsaWNrKClcclxufVxyXG5cclxuZGVmaW5lRXhwb3NlKHtcclxuICB0cmlnZ2VyUGlja2VyXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iLCJpbXBvcnQgdHlwZSB7IE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IERpcmVjdGl2ZSB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IGtleWJvYXJkQ2xpY2thYmxlS2V5cHJlc3NIYW5kbGVyID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICBpZiAoZS5jb2RlICE9PSAnRW50ZXInKSByZXR1cm5cclxuICA7KGUudGFyZ2V0IGFzIE9wdGlvbmFsPEhUTUxFbGVtZW50Pik/LmNsaWNrKClcclxufVxyXG5cclxuLyoqXHJcbiAqIE1ha2VzIGl0IHBvc3NpYmxlIHRvIG5hdmlnYXRlIHRvIGFuZCBjbGljayBvbiB0aGUgZWxlbWVudCB1c2luZyB0aGUga2V5Ym9hcmRcclxuICovXHJcbmV4cG9ydCBjb25zdCB2S2V5Ym9hcmRDbGlja2FibGU6IERpcmVjdGl2ZTxIVE1MRWxlbWVudD4gPSB7XHJcbiAgY3JlYXRlZChlbCkge1xyXG4gICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJylcclxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywga2V5Ym9hcmRDbGlja2FibGVLZXlwcmVzc0hhbmRsZXIpXHJcbiAgfSxcclxuICB1bm1vdW50ZWQoZWwpIHtcclxuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywga2V5Ym9hcmRDbGlja2FibGVLZXlwcmVzc0hhbmRsZXIpXHJcbiAgfVxyXG59XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsIGJnLW91dGxpbmUtMyByb3VuZGVkIGgtMS41IG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImFib3NsdXRlIGxlZnQtMCB0b3AtMCByb3VuZGVkIGgtMS41XCJcclxuICAgICAgOmNsYXNzPVwiY29sb3JDbGFzc1wiXHJcbiAgICAgIDpzdHlsZT1cInsgd2lkdGg6IGAke3BlcmNlbnRhZ2UgPD0gMTAwID8gcGVyY2VudGFnZSA6IDEwMH0lYCB9XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxyXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIGN1cnJlbnRWYWx1ZTogbnVtYmVyXHJcbiAgbWF4VmFsdWU6IG51bWJlclxyXG59PigpXHJcblxyXG5jb25zdCBwZXJjZW50YWdlID0gY29tcHV0ZWQoKCkgPT4gKHByb3BzLmN1cnJlbnRWYWx1ZSAvIHByb3BzLm1heFZhbHVlKSAqIDEwMClcclxuY29uc3QgY29sb3JDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocGVyY2VudGFnZS52YWx1ZSA+PSAxMDApIHtcclxuICAgIHJldHVybiAnYmctZGFuZ2VyJ1xyXG4gIH1cclxuICBpZiAocGVyY2VudGFnZS52YWx1ZSA+PSA4MCkge1xyXG4gICAgcmV0dXJuICdiZy13YXJuaW5nJ1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICdiZy1zdWNjZXNzJ1xyXG59KVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiYmctZm91bmRhdGlvbi1wYWdlIHNoYWRvdy1zbSBmbGV4IGZsZXgtY29sIGdhcC15LTEgc206Z2FwLXktMiBib3JkZXIgYm9yZGVyLW91dGxpbmUtMyByb3VuZGVkLWxnIHB5LTIgcHgtMyBzbTpwLTQgc2VsZWN0LW5vbmVcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgPGg2XHJcbiAgICAgICAgdi1pZj1cInRpdGxlXCJcclxuICAgICAgICBjbGFzcz1cInRleHQtYm9keS14cyBzbTp0ZXh0LWhlYWRpbmctc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IHRpdGxlIH19XHJcbiAgICAgIDwvaDY+XHJcbiAgICAgIDxYXHJcbiAgICAgICAgdi1pZj1cInNob3dDbG9zZXJcIlxyXG4gICAgICAgIHYta2V5Ym9hcmQtY2xpY2thYmxlXHJcbiAgICAgICAgY2xhc3M9XCJoLTQgdy00IGN1cnNvci1wb2ludGVyIGZvY3VzOm91dGxpbmUtbm9uZVwiXHJcbiAgICAgICAgQGNsaWNrPVwiJGVtaXQoJ2Nsb3NlJywgJGV2ZW50KVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwIHYtaWY9XCJ0ZXh0XCIgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIHNtOnRleHQtYm9keS14cyB0ZXh0LWZvcmVncm91bmQtMiAhbGVhZGluZy01XCI+XHJcbiAgICAgIHt7IHRleHQgfX1cclxuICAgIDwvcD5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kXCI+XHJcbiAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgdi1pZj1cImJ1dHRvblwiXHJcbiAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICBjbGFzcz1cIm10LTFcIlxyXG4gICAgICAgIDp0bz1cImJ1dHRvbi50b1wiXHJcbiAgICAgICAgOnRhcmdldD1cImJ1dHRvbi50byA/ICdfYmxhbmsnIDogdW5kZWZpbmVkXCJcclxuICAgICAgICBAY2xpY2s9XCIkZW1pdCgnY2xpY2snLCAkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGJ1dHRvbi50aXRsZSB9fVxyXG4gICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCBGb3JtQnV0dG9uIGZyb20gJ35+L3NyYy9jb21wb25lbnRzL2Zvcm0vQnV0dG9uLnZ1ZSdcclxuaW1wb3J0IHsgWCB9IGZyb20gJ2x1Y2lkZS12dWUtbmV4dCdcclxuaW1wb3J0IHsgdktleWJvYXJkQ2xpY2thYmxlIH0gZnJvbSAnfn4vc3JjL2RpcmVjdGl2ZXMvYWNjZXNzaWJpbGl0eSdcclxuXHJcbmRlZmluZUVtaXRzPHtcclxuICBjbGljazogW2U6IE1vdXNlRXZlbnRdXHJcbiAgY2xvc2U6IFtlOiBNb3VzZUV2ZW50XVxyXG59PigpXHJcblxyXG5kZWZpbmVQcm9wczx7XHJcbiAgdGl0bGU/OiBzdHJpbmdcclxuICB0ZXh0Pzogc3RyaW5nXHJcbiAgYnV0dG9uPzogeyB0bz86IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9XHJcbiAgc2hvd0Nsb3Nlcj86IGJvb2xlYW5cclxufT4oKVxyXG48L3NjcmlwdD5cclxuIiwiPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBmbGV4LWNvbCBnYXAtMS41XCIgOnN0eWxlPVwicHJvcHMuc3R5bGVcIj5cclxuICAgIDxkaXYgdi1pZj1cIiFoaWRlSGVhZGVyXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cclxuICAgICAgPGxhYmVsXHJcbiAgICAgICAgOmZvcj1cIm5hbWVcIlxyXG4gICAgICAgIGNsYXNzPVwiYmxvY2sgdGV4dC1ib2R5LTJ4c1wiXHJcbiAgICAgICAgOmNsYXNzPVwiZGlzYWJsZWQgPyAndGV4dC1mb3JlZ3JvdW5kLTInIDogJ3RleHQtZm9yZWdyb3VuZCdcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgbGFiZWwgfHwgbmFtZSB9fVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICA6bWluPVwibWluXCJcclxuICAgICAgICA6bWF4PVwibWF4XCJcclxuICAgICAgICA6c3RlcD1cInN0ZXBcIlxyXG4gICAgICAgIDp2YWx1ZT1cImN1cnJlbnRWYWx1ZVwiXHJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIDphcmlhLWxhYmVsPVwiYCR7bGFiZWx9IGN1cnJlbnQgdmFsdWVgXCJcclxuICAgICAgICBjbGFzcz1cInctOCB0ZXh0LWJvZHktMnhzIHRleHQtZm9yZWdyb3VuZC0yIGJnLXRyYW5zcGFyZW50IGJvcmRlci0wIGZvY3VzOm91dGxpbmUtbm9uZSBob3ZlcjpyaW5nLTEgaG92ZXI6cmluZy1vdXRsaW5lLTIgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctb3V0bGluZS00IGRpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOmhvdmVyOnJpbmctMCByb3VuZGVkICFwLTAuNSB0ZXh0LXJpZ2h0XCJcclxuICAgICAgICBAaW5wdXQ9XCJoYW5kbGVOdW1iZXJJbnB1dFwiXHJcbiAgICAgICAgQGJsdXI9XCJ2YWxpZGF0ZUFuZENsYW1wXCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxpbnB1dFxyXG4gICAgICA6aWQ9XCJuYW1lXCJcclxuICAgICAgOm5hbWU9XCJuYW1lXCJcclxuICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgOm1pbj1cIm1pblwiXHJcbiAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICA6c3RlcD1cInN0ZXBcIlxyXG4gICAgICA6dmFsdWU9XCJjdXJyZW50VmFsdWVcIlxyXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgIGNsYXNzPVwibXQtMS41IHctZnVsbCBoLTQgb3V0bGluZS1ub25lIHNsaWRlciBzbGlkZXItZ3JhZGllbnRcIlxyXG4gICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkJzogZGlzYWJsZWQsXHJcbiAgICAgICAgJyFtdC0wJzogaW5wdXRCZWxvd1NsaWRlclxyXG4gICAgICB9XCJcclxuICAgICAgOmFyaWEtbGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgIDphcmlhLXZhbHVlbWluPVwibWluXCJcclxuICAgICAgOmFyaWEtdmFsdWVtYXg9XCJtYXhcIlxyXG4gICAgICA6YXJpYS12YWx1ZW5vdz1cImN1cnJlbnRWYWx1ZVwiXHJcbiAgICAgIEBpbnB1dD1cImhhbmRsZUlucHV0XCJcclxuICAgIC8+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdi1pZj1cImlucHV0QmVsb3dTbGlkZXJcIlxyXG4gICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgOm1pbj1cIm1pblwiXHJcbiAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICA6c3RlcD1cInN0ZXBcIlxyXG4gICAgICA6dmFsdWU9XCJjdXJyZW50VmFsdWVcIlxyXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXHJcbiAgICAgIDphcmlhLWxhYmVsPVwiYCR7bGFiZWx9IGN1cnJlbnQgdmFsdWVgXCJcclxuICAgICAgY2xhc3M9XCJ3LTE2IHRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTIgYmctdHJhbnNwYXJlbnQgYm9yZGVyLTAgZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOnJpbmctMSBob3ZlcjpyaW5nLW91dGxpbmUtMiBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1vdXRsaW5lLTQgZGlzYWJsZWQ6b3BhY2l0eS01MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6aG92ZXI6cmluZy0wIHJvdW5kZWQgIXAtMVwiXHJcbiAgICAgIEBpbnB1dD1cImhhbmRsZU51bWJlcklucHV0XCJcclxuICAgICAgQGJsdXI9XCJ2YWxpZGF0ZUFuZENsYW1wXCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBtaW46IG51bWJlclxyXG4gIG1heDogbnVtYmVyXHJcbiAgc3RlcDogbnVtYmVyXHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgbGFiZWw6IHN0cmluZ1xyXG4gIGRpc2FibGVkPzogYm9vbGVhblxyXG4gIGhpZGVIZWFkZXI/OiBib29sZWFuXHJcbiAgaW5wdXRCZWxvd1NsaWRlcj86IGJvb2xlYW5cclxuICBzdHlsZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cclxufT4oKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFsndXBkYXRlOm1vZGVsVmFsdWUnXSlcclxuXHJcbmNvbnN0IGN1cnJlbnRWYWx1ZSA9IGRlZmluZU1vZGVsKHtcclxuICB0eXBlOiBOdW1iZXIsXHJcbiAgZGVmYXVsdDogMFxyXG59KVxyXG5cclxuY29uc3QgY2xhbXBWYWx1ZSA9ICh2YWx1ZTogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuICByZXR1cm4gTWF0aC5tYXgocHJvcHMubWluLCBNYXRoLm1pbihwcm9wcy5tYXgsIHZhbHVlKSlcclxufVxyXG5cclxuY29uc3QgaGFuZGxlSW5wdXQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcclxuICBjb25zdCB2YWx1ZSA9IE51bWJlcih0YXJnZXQudmFsdWUpXHJcbiAgY29uc3QgY2xhbXBlZFZhbHVlID0gY2xhbXBWYWx1ZSh2YWx1ZSlcclxuICBjdXJyZW50VmFsdWUudmFsdWUgPSBjbGFtcGVkVmFsdWVcclxuICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGNsYW1wZWRWYWx1ZSlcclxufVxyXG5cclxuY29uc3QgaGFuZGxlTnVtYmVySW5wdXQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcclxuICBjb25zdCB2YWx1ZSA9IE51bWJlcih0YXJnZXQudmFsdWUpXHJcbiAgLy8gRG9uJ3QgY2xhbXAgZHVyaW5nIHR5cGluZywgb25seSBzZXQgdGhlIHZhbHVlXHJcbiAgY3VycmVudFZhbHVlLnZhbHVlID0gdmFsdWVcclxuICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlKVxyXG59XHJcblxyXG5jb25zdCB2YWxpZGF0ZUFuZENsYW1wID0gKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XHJcbiAgY29uc3QgdmFsdWUgPSBOdW1iZXIodGFyZ2V0LnZhbHVlKVxyXG4gIGNvbnN0IGNsYW1wZWRWYWx1ZSA9IGNsYW1wVmFsdWUodmFsdWUpXHJcblxyXG4gIGlmICh2YWx1ZSAhPT0gY2xhbXBlZFZhbHVlKSB7XHJcbiAgICB0YXJnZXQudmFsdWUgPSBjbGFtcGVkVmFsdWUudG9TdHJpbmcoKVxyXG4gIH1cclxuXHJcbiAgY3VycmVudFZhbHVlLnZhbHVlID0gY2xhbXBlZFZhbHVlXHJcbiAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjbGFtcGVkVmFsdWUpXHJcbn1cclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cInBvc3Rjc3NcIiBzY29wZWQ+XHJcbmlucHV0W3R5cGU9J251bWJlciddOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLFxyXG5pbnB1dFt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gIG1hcmdpbjogMDtcclxufVxyXG5cclxuaW5wdXRbdHlwZT0nbnVtYmVyJ10ge1xyXG4gIC1tb3otYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xyXG4gIGFwcGVhcmFuY2U6IHRleHRmaWVsZDtcclxufVxyXG5cclxuLnNsaWRlcjo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2sge1xyXG4gIEBhcHBseSBoLTQgcm91bmRlZC1mdWxsIG91dGxpbmUtb3V0bGluZS0yIGJnLWhpZ2hsaWdodC0xIHB4LTAuNTtcclxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMDQpO1xyXG4gIG91dGxpbmUtd2lkdGg6IDFweDtcclxuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcclxufVxyXG5cclxuLnNsaWRlcjo6LW1vei1yYW5nZS10cmFjayB7XHJcbiAgQGFwcGx5IGgtNCByb3VuZGVkLWZ1bGwgb3V0bGluZS1vdXRsaW5lLTIgYmctaGlnaGxpZ2h0LTEgcHgtMC41O1xyXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4wNCk7XHJcbiAgb3V0bGluZS13aWR0aDogMXB4O1xyXG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xyXG59XHJcblxyXG4uc2xpZGVyOjotd2Via2l0LXNsaWRlci10aHVtYiB7XHJcbiAgQGFwcGx5IGFwcGVhcmFuY2Utbm9uZSBoLTMgdy0zIG10LTAuNSByb3VuZGVkLWZ1bGwgYmctZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGN1cnNvci1wb2ludGVyIG91dGxpbmUtb3V0bGluZS01O1xyXG4gIG91dGxpbmUtd2lkdGg6IDFweDtcclxuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcclxufVxyXG5cclxuLnNsaWRlcjo6LW1vei1yYW5nZS10aHVtYiB7XHJcbiAgQGFwcGx5IGFwcGVhcmFuY2Utbm9uZSBoLTMgdy0zIG10LTAuNSByb3VuZGVkLWZ1bGwgYmctZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGN1cnNvci1wb2ludGVyIG91dGxpbmUtb3V0bGluZS01O1xyXG4gIG91dGxpbmUtd2lkdGg6IDFweDtcclxuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcclxufVxyXG5cclxuLyogR3JhZGllbnQgc3R5bGluZyBmb3Igc2xpZGVyIGlucHV0cyB3aGVuIGdyYWRpZW50IGN1c3RvbSBwcm9wZXJ0aWVzIGFyZSBzZXQgKi9cclxuLnNsaWRlci1ncmFkaWVudDo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2sge1xyXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcclxuICAgIHRvIHJpZ2h0LFxyXG4gICAgdmFyKC0tZ3JhZGllbnQtZnJvbSwgdmFyKC0taGlnaGxpZ2h0LTEpKSxcclxuICAgIHZhcigtLWdyYWRpZW50LXRvLCB2YXIoLS1oaWdobGlnaHQtMSkpXHJcbiAgKSAhaW1wb3J0YW50O1xyXG59XHJcbjwvc3R5bGU+XHJcbiIsIjx0ZW1wbGF0ZT5cclxuICA8ZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBoLTUgbWF4LXctOTZcIiA6c3R5bGU9XCJwcm9wcy5zdHlsZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmVcIj5cclxuICAgICAgICA8IS0tIE1pbiByYW5nZSBpbnB1dCAtLT5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIDppZD1cImAke25hbWV9LW1pbmBcIlxyXG4gICAgICAgICAgOm5hbWU9XCJgJHtuYW1lfS1taW5gXCJcclxuICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICA6bWluPVwibWluXCJcclxuICAgICAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICAgICAgOnN0ZXA9XCJzdGVwXCJcclxuICAgICAgICAgIDp2YWx1ZT1cIm1vZGVsVmFsdWUubWluXCJcclxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcclxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdy1mdWxsIGgtNCBvdXRsaW5lLW5vbmUgc2xpZGVyIHNsaWRlci1taW5cIlxyXG4gICAgICAgICAgc3R5bGU9XCItd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IGFwcGVhcmFuY2U6IG5vbmU7IHBvaW50ZXItZXZlbnRzOiBub25lXCJcclxuICAgICAgICAgIDpjbGFzcz1cInsgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkJzogZGlzYWJsZWQgfVwiXHJcbiAgICAgICAgICA6YXJpYS1sYWJlbD1cImAke25hbWV9IG1pbmltdW1gXCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbWluPVwibWluXCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbWF4PVwibWF4XCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbm93PVwibW9kZWxWYWx1ZS5taW5cIlxyXG4gICAgICAgICAgQGlucHV0PVwiaGFuZGxlTWluSW5wdXRcIlxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDwhLS0gTWF4IHJhbmdlIGlucHV0IC0tPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgOmlkPVwiYCR7bmFtZX0tbWF4YFwiXHJcbiAgICAgICAgICA6bmFtZT1cImAke25hbWV9LW1heGBcIlxyXG4gICAgICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgICAgIDptaW49XCJtaW5cIlxyXG4gICAgICAgICAgOm1heD1cIm1heFwiXHJcbiAgICAgICAgICA6c3RlcD1cInN0ZXBcIlxyXG4gICAgICAgICAgOnZhbHVlPVwibW9kZWxWYWx1ZS5tYXhcIlxyXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB3LWZ1bGwgaC00IG91dGxpbmUtbm9uZSBzbGlkZXIgc2xpZGVyLW1heCBweC0wLjVcIlxyXG4gICAgICAgICAgc3R5bGU9XCItd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IGFwcGVhcmFuY2U6IG5vbmU7IHBvaW50ZXItZXZlbnRzOiBub25lXCJcclxuICAgICAgICAgIDpjbGFzcz1cInsgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkJzogZGlzYWJsZWQgfVwiXHJcbiAgICAgICAgICA6YXJpYS1sYWJlbD1cImAke25hbWV9IG1heGltdW1gXCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbWluPVwibWluXCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbWF4PVwibWF4XCJcclxuICAgICAgICAgIDphcmlhLXZhbHVlbm93PVwibW9kZWxWYWx1ZS5tYXhcIlxyXG4gICAgICAgICAgQGlucHV0PVwiaGFuZGxlTWF4SW5wdXRcIlxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDwhLS0gVmlzdWFsIHRyYWNrIGhpZ2hsaWdodCBiZXR3ZWVuIGhhbmRsZXMgLS0+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMC41IGgtMyB3LWZ1bGwgcG9pbnRlci1ldmVudHMtbm9uZSB6LTAgb3ZlcmZsb3ctaGlkZGVuXCJcclxuICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogdHJhbnNwYXJlbnRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC0wIGJnLWdyYXktMzAwLzYwIGRhcms6YmctZ3JheS0yMDAvNDBcIlxyXG4gICAgICAgICAgICA6c3R5bGU9XCJ7XHJcbiAgICAgICAgICAgICAgbGVmdDogdHJhY2tMZWZ0LFxyXG4gICAgICAgICAgICAgIHJpZ2h0OiB0cmFja1JpZ2h0XHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgdi1pZj1cInNob3dGaWVsZHNcIiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGdhcC0yIG10LTAuNVwiPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB2LW1vZGVsPVwibWluVmFsdWVTdHJpbmdcIlxyXG4gICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgIDptaW49XCJtaW5cIlxyXG4gICAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICAgIDpzdGVwPVwic3RlcFwiXHJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIDphcmlhLWxhYmVsPVwiYCR7bmFtZX0tbWluYFwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJNaW5cIlxyXG4gICAgICAgIGNsYXNzPVwibXQtMCB3LTE2IHRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTIgYmctdHJhbnNwYXJlbnQgYm9yZGVyLTAgZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOnJpbmctMSBob3ZlcjpyaW5nLW91dGxpbmUtMiBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1vdXRsaW5lLTQgZGlzYWJsZWQ6b3BhY2l0eS01MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6aG92ZXI6cmluZy0wIHJvdW5kZWQgIXAtMVwiXHJcbiAgICAgIC8+XHJcblxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB2LW1vZGVsPVwibWF4VmFsdWVTdHJpbmdcIlxyXG4gICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgIDptaW49XCJtaW5cIlxyXG4gICAgICAgIDptYXg9XCJtYXhcIlxyXG4gICAgICAgIDpzdGVwPVwic3RlcFwiXHJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIDphcmlhLWxhYmVsPVwiYCR7bmFtZX0tbWF4YFwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJNYXhcIlxyXG4gICAgICAgIGNsYXNzPVwibXQtMCB3LTE2IHRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTIgYmctdHJhbnNwYXJlbnQgYm9yZGVyLTAgZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOnJpbmctMSBob3ZlcjpyaW5nLW91dGxpbmUtMiBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1vdXRsaW5lLTQgZGlzYWJsZWQ6b3BhY2l0eS01MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6aG92ZXI6cmluZy0wIHJvdW5kZWQgIXAtMSB0ZXh0LXJpZ2h0XCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBtaW46IG51bWJlclxyXG4gIG1heDogbnVtYmVyXHJcbiAgc3RlcDogbnVtYmVyXHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuXHJcbiAgc2hvd0ZpZWxkcz86IGJvb2xlYW5cclxuICBzdHlsZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cclxufT4oKVxyXG5cclxuY29uc3QgbW9kZWxWYWx1ZSA9IGRlZmluZU1vZGVsPHsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0+KHtcclxuICBkZWZhdWx0OiAoKSA9PiAoeyBtaW46IDAsIG1heDogMTAwIH0pXHJcbn0pXHJcblxyXG5jb25zdCBjbGFtcFZhbHVlID0gKHZhbHVlOiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gIHJldHVybiBNYXRoLm1heChwcm9wcy5taW4sIE1hdGgubWluKHByb3BzLm1heCwgdmFsdWUpKVxyXG59XHJcblxyXG4vLyBTdHJpbmcgdmVyc2lvbnMgZm9yIEZvcm1UZXh0SW5wdXQgY29tcGF0aWJpbGl0eVxyXG5jb25zdCBtaW5WYWx1ZVN0cmluZyA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IG1vZGVsVmFsdWUudmFsdWUubWluLnRvU3RyaW5nKCksXHJcbiAgc2V0OiAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgbnVtVmFsdWUgPSBOdW1iZXIodmFsdWUpXHJcbiAgICBpZiAoIWlzTmFOKG51bVZhbHVlKSkge1xyXG4gICAgICBjb25zdCBjbGFtcGVkVmFsdWUgPSBjbGFtcFZhbHVlKG51bVZhbHVlKVxyXG4gICAgICBjb25zdCBmaW5hbFZhbHVlID0gTWF0aC5taW4oY2xhbXBlZFZhbHVlLCBtb2RlbFZhbHVlLnZhbHVlLm1heClcclxuICAgICAgbW9kZWxWYWx1ZS52YWx1ZSA9IHsgLi4ubW9kZWxWYWx1ZS52YWx1ZSwgbWluOiBmaW5hbFZhbHVlIH1cclxuICAgIH1cclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBtYXhWYWx1ZVN0cmluZyA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IG1vZGVsVmFsdWUudmFsdWUubWF4LnRvU3RyaW5nKCksXHJcbiAgc2V0OiAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgbnVtVmFsdWUgPSBOdW1iZXIodmFsdWUpXHJcbiAgICBpZiAoIWlzTmFOKG51bVZhbHVlKSkge1xyXG4gICAgICBjb25zdCBjbGFtcGVkVmFsdWUgPSBjbGFtcFZhbHVlKG51bVZhbHVlKVxyXG4gICAgICBjb25zdCBmaW5hbFZhbHVlID0gTWF0aC5tYXgoY2xhbXBlZFZhbHVlLCBtb2RlbFZhbHVlLnZhbHVlLm1pbilcclxuICAgICAgbW9kZWxWYWx1ZS52YWx1ZSA9IHsgLi4ubW9kZWxWYWx1ZS52YWx1ZSwgbWF4OiBmaW5hbFZhbHVlIH1cclxuICAgIH1cclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBtaW5QZXJjZW50YWdlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGJhc2VQZXJjZW50YWdlID1cclxuICAgICgobW9kZWxWYWx1ZS52YWx1ZS5taW4gLSBwcm9wcy5taW4pIC8gKHByb3BzLm1heCAtIHByb3BzLm1pbikpICogMTAwXHJcbiAgY29uc3QgdGh1bWJPZmZzZXQgPSAwLjVcclxuICByZXR1cm4gTWF0aC5tYXgoMCwgYmFzZVBlcmNlbnRhZ2UgLSB0aHVtYk9mZnNldClcclxufSlcclxuXHJcbmNvbnN0IG1heFBlcmNlbnRhZ2UgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgYmFzZVBlcmNlbnRhZ2UgPVxyXG4gICAgKChtb2RlbFZhbHVlLnZhbHVlLm1heCAtIHByb3BzLm1pbikgLyAocHJvcHMubWF4IC0gcHJvcHMubWluKSkgKiAxMDBcclxuICBjb25zdCB0aHVtYk9mZnNldCA9IDAuNVxyXG4gIHJldHVybiBNYXRoLm1pbigxMDAsIGJhc2VQZXJjZW50YWdlICsgdGh1bWJPZmZzZXQpXHJcbn0pXHJcblxyXG5jb25zdCB0cmFja0xlZnQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgcGVyY2VudGFnZSA9IG1pblBlcmNlbnRhZ2UudmFsdWVcclxuICBpZiAocGVyY2VudGFnZSA8IDI1KSByZXR1cm4gYCR7cGVyY2VudGFnZSArIDIuNX0lYFxyXG4gIGlmIChwZXJjZW50YWdlID4gNzUpIHJldHVybiBgJHtwZXJjZW50YWdlIC0gMi41fSVgXHJcbiAgcmV0dXJuIGAke3BlcmNlbnRhZ2V9JWBcclxufSlcclxuXHJcbmNvbnN0IHRyYWNrUmlnaHQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgcGVyY2VudGFnZSA9IDEwMCAtIG1heFBlcmNlbnRhZ2UudmFsdWVcclxuICBpZiAocGVyY2VudGFnZSA8IDI1KSByZXR1cm4gYCR7cGVyY2VudGFnZSArIDIuNX0lYFxyXG4gIGlmIChwZXJjZW50YWdlID4gNzUpIHJldHVybiBgJHtwZXJjZW50YWdlIC0gMi41fSVgXHJcbiAgcmV0dXJuIGAke3BlcmNlbnRhZ2V9JWBcclxufSlcclxuXHJcbmNvbnN0IGhhbmRsZU1pbklucHV0ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XHJcbiAgY29uc3QgdmFsdWUgPSBjbGFtcFZhbHVlKE51bWJlcih0YXJnZXQudmFsdWUpKVxyXG5cclxuICBtb2RlbFZhbHVlLnZhbHVlID0ge1xyXG4gICAgLi4ubW9kZWxWYWx1ZS52YWx1ZSxcclxuICAgIG1pbjogTWF0aC5taW4odmFsdWUsIG1vZGVsVmFsdWUudmFsdWUubWF4KVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlTWF4SW5wdXQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcclxuICBjb25zdCB2YWx1ZSA9IGNsYW1wVmFsdWUoTnVtYmVyKHRhcmdldC52YWx1ZSkpXHJcblxyXG4gIG1vZGVsVmFsdWUudmFsdWUgPSB7XHJcbiAgICAuLi5tb2RlbFZhbHVlLnZhbHVlLFxyXG4gICAgbWF4OiBNYXRoLm1heCh2YWx1ZSwgbW9kZWxWYWx1ZS52YWx1ZS5taW4pXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJwb3N0Y3NzXCIgc2NvcGVkPlxyXG5pbnB1dFt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbixcclxuaW5wdXRbdHlwZT0nbnVtYmVyJ106Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xyXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcclxuICBtYXJnaW46IDA7XHJcbn1cclxuXHJcbmlucHV0W3R5cGU9J251bWJlciddIHtcclxuICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcclxuICBhcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XHJcbn1cclxuXHJcbi8qIFNob3cgdHJhY2sgZm9yIG1pbiBzbGlkZXIgKi9cclxuLnNsaWRlci1taW46Oi13ZWJraXQtc2xpZGVyLXJ1bm5hYmxlLXRyYWNrIHtcclxuICBAYXBwbHkgaC00IHJvdW5kZWQtZnVsbCBvdXRsaW5lLW91dGxpbmUtMiBiZy1oaWdobGlnaHQtMSBweC0wLjU7XHJcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA0KTtcclxuICBvdXRsaW5lLXdpZHRoOiAxcHg7XHJcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XHJcbn1cclxuXHJcbi5zbGlkZXItbWluOjotbW96LXJhbmdlLXRyYWNrIHtcclxuICBAYXBwbHkgaC00IHJvdW5kZWQtZnVsbCBvdXRsaW5lLW91dGxpbmUtMiBiZy1oaWdobGlnaHQtMSBweC0wLjU7XHJcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjA0KTtcclxuICBvdXRsaW5lLXdpZHRoOiAxcHg7XHJcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XHJcbn1cclxuXHJcbi8qIEhpZGUgdHJhY2sgZm9yIG1heCBzbGlkZXIgKi9cclxuLnNsaWRlci1tYXg6Oi13ZWJraXQtc2xpZGVyLXJ1bm5hYmxlLXRyYWNrIHtcclxuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxuICBoZWlnaHQ6IDE2cHg7XHJcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xyXG59XHJcblxyXG4uc2xpZGVyLW1heDo6LW1vei1yYW5nZS10cmFjayB7XHJcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgaGVpZ2h0OiAxNnB4O1xyXG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcclxufVxyXG5cclxuLyogRmlyZWZveCBzcGVjaWZpYyB0cmFjayBoaWRpbmcgKi9cclxuLnNsaWRlcjo6LW1vei1yYW5nZS1wcm9ncmVzcyB7XHJcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbn1cclxuXHJcbi5zbGlkZXI6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHtcclxuICBAYXBwbHkgYXBwZWFyYW5jZS1ub25lIGgtMyB3LTMgbXQtMC41IHJvdW5kZWQtZnVsbCBiZy1mb3JlZ3JvdW5kLW9uLXByaW1hcnkgY3Vyc29yLXBvaW50ZXIgb3V0bGluZS1vdXRsaW5lLTU7XHJcbiAgb3V0bGluZS13aWR0aDogMXB4O1xyXG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xyXG4gIHotaW5kZXg6IDIwO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBwb2ludGVyLWV2ZW50czogYXV0bztcclxufVxyXG5cclxuLnNsaWRlcjo6LW1vei1yYW5nZS10aHVtYiB7XHJcbiAgQGFwcGx5IGFwcGVhcmFuY2Utbm9uZSBoLTMgdy0zIG10LTAuNSByb3VuZGVkLWZ1bGwgYmctZm9yZWdyb3VuZC1vbi1wcmltYXJ5IGN1cnNvci1wb2ludGVyIG91dGxpbmUtb3V0bGluZS01O1xyXG4gIG91dGxpbmUtd2lkdGg6IDFweDtcclxuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcclxuICB6LWluZGV4OiAyMDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XHJcbn1cclxuXHJcbi8qIEdyYWRpZW50IHN0eWxpbmcgZm9yIHNsaWRlciBpbnB1dHMgd2hlbiBncmFkaWVudCBjdXN0b20gcHJvcGVydGllcyBhcmUgc2V0ICovXHJcbi5zbGlkZXItbWluOjotd2Via2l0LXNsaWRlci1ydW5uYWJsZS10cmFjayB7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxyXG4gICAgdG8gcmlnaHQsXHJcbiAgICB2YXIoLS1ncmFkaWVudC1mcm9tLCB2YXIoLS1oaWdobGlnaHQtMSkpLFxyXG4gICAgdmFyKC0tZ3JhZGllbnQtdG8sIHZhcigtLWhpZ2hsaWdodC0xKSlcclxuICApICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5zbGlkZXItbWluOjotbW96LXJhbmdlLXRyYWNrIHtcclxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoXHJcbiAgICB0byByaWdodCxcclxuICAgIHZhcigtLWdyYWRpZW50LWZyb20sIHZhcigtLWhpZ2hsaWdodC0xKSksXHJcbiAgICB2YXIoLS1ncmFkaWVudC10bywgdmFyKC0taGlnaGxpZ2h0LTEpKVxyXG4gICkgIWltcG9ydGFudDtcclxufVxyXG48L3N0eWxlPlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL3VpLWNvbXBvbmVudHMvZGlzdC9saWIuanMiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwXX0=