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

1844 lines
186 KiB
Plaintext

/**
* @vue/runtime-dom v3.5.19
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/
import { warn, BaseTransitionPropsValidators, h, BaseTransition, assertNumber, getCurrentInstance, onBeforeUpdate, queuePostFlushCb, onMounted, watch, onUnmounted, Fragment, Static, camelize, callWithAsyncErrorHandling, defineComponent, nextTick, unref, createVNode, useTransitionState, onUpdated, toRaw, getTransitionRawChildren, setTransitionHooks, resolveTransitionHooks, Text, createRenderer, createHydrationRenderer, isRuntimeOnly } from "/_nuxt/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js?v=e4f18c29";
export * from "/_nuxt/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js?v=e4f18c29";
import { extend, isObject, toNumber, isArray, NOOP, normalizeCssVarValue, isString, hyphenate, capitalize, isSpecialBooleanAttr, includeBooleanAttr, isSymbol, isFunction, isOn, isModelListener, camelize as camelize$1, isPlainObject, hasOwn, EMPTY_OBJ, looseToNumber, looseIndexOf, isSet, looseEqual, invokeArrayFns, isHTMLTag, isSVGTag, isMathMLTag } from "/_nuxt/node_modules/@vue/shared/dist/shared.esm-bundler.js?v=e4f18c29";
let policy = void 0;
const tt = typeof window !== "undefined" && window.trustedTypes;
if (tt) {
try {
policy = /* @__PURE__ */ tt.createPolicy("vue", {
createHTML: (val) => val
});
} catch (e) {
warn(`Error creating trusted types policy: ${e}`);
}
}
const unsafeToTrustedHTML = policy ? (val) => policy.createHTML(val) : (val) => val;
const svgNS = "http://www.w3.org/2000/svg";
const mathmlNS = "http://www.w3.org/1998/Math/MathML";
const doc = typeof document !== "undefined" ? document : null;
const templateContainer = doc && /* @__PURE__ */ doc.createElement("template");
const nodeOps = {
insert: (child, parent, anchor) => {
parent.insertBefore(child, anchor || null);
},
remove: (child) => {
const parent = child.parentNode;
if (parent) {
parent.removeChild(child);
}
},
createElement: (tag, namespace, is, props) => {
const el = namespace === "svg" ? doc.createElementNS(svgNS, tag) : namespace === "mathml" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag);
if (tag === "select" && props && props.multiple != null) {
el.setAttribute("multiple", props.multiple);
}
return el;
},
createText: (text) => doc.createTextNode(text),
createComment: (text) => doc.createComment(text),
setText: (node, text) => {
node.nodeValue = text;
},
setElementText: (el, text) => {
el.textContent = text;
},
parentNode: (node) => node.parentNode,
nextSibling: (node) => node.nextSibling,
querySelector: (selector) => doc.querySelector(selector),
setScopeId(el, id) {
el.setAttribute(id, "");
},
// __UNSAFE__
// Reason: innerHTML.
// Static content here can only come from compiled templates.
// As long as the user only uses trusted templates, this is safe.
insertStaticContent(content, parent, anchor, namespace, start, end) {
const before = anchor ? anchor.previousSibling : parent.lastChild;
if (start && (start === end || start.nextSibling)) {
while (true) {
parent.insertBefore(start.cloneNode(true), anchor);
if (start === end || !(start = start.nextSibling)) break;
}
} else {
templateContainer.innerHTML = unsafeToTrustedHTML(
namespace === "svg" ? `<svg>${content}</svg>` : namespace === "mathml" ? `<math>${content}</math>` : content
);
const template = templateContainer.content;
if (namespace === "svg" || namespace === "mathml") {
const wrapper = template.firstChild;
while (wrapper.firstChild) {
template.appendChild(wrapper.firstChild);
}
template.removeChild(wrapper);
}
parent.insertBefore(template, anchor);
}
return [
// first
before ? before.nextSibling : parent.firstChild,
// last
anchor ? anchor.previousSibling : parent.lastChild
];
}
};
const TRANSITION = "transition";
const ANIMATION = "animation";
const vtcKey = Symbol("_vtc");
const DOMTransitionPropsValidators = {
name: String,
type: String,
css: {
type: Boolean,
default: true
},
duration: [String, Number, Object],
enterFromClass: String,
enterActiveClass: String,
enterToClass: String,
appearFromClass: String,
appearActiveClass: String,
appearToClass: String,
leaveFromClass: String,
leaveActiveClass: String,
leaveToClass: String
};
const TransitionPropsValidators = /* @__PURE__ */ extend(
{},
BaseTransitionPropsValidators,
DOMTransitionPropsValidators
);
const decorate$1 = (t) => {
t.displayName = "Transition";
t.props = TransitionPropsValidators;
return t;
};
const Transition = /* @__PURE__ */ decorate$1(
(props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots)
);
const callHook = (hook, args = []) => {
if (isArray(hook)) {
hook.forEach((h2) => h2(...args));
} else if (hook) {
hook(...args);
}
};
const hasExplicitCallback = (hook) => {
return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;
};
function resolveTransitionProps(rawProps) {
const baseProps = {};
for (const key in rawProps) {
if (!(key in DOMTransitionPropsValidators)) {
baseProps[key] = rawProps[key];
}
}
if (rawProps.css === false) {
return baseProps;
}
const {
name = "v",
type,
duration,
enterFromClass = `${name}-enter-from`,
enterActiveClass = `${name}-enter-active`,
enterToClass = `${name}-enter-to`,
appearFromClass = enterFromClass,
appearActiveClass = enterActiveClass,
appearToClass = enterToClass,
leaveFromClass = `${name}-leave-from`,
leaveActiveClass = `${name}-leave-active`,
leaveToClass = `${name}-leave-to`
} = rawProps;
const durations = normalizeDuration(duration);
const enterDuration = durations && durations[0];
const leaveDuration = durations && durations[1];
const {
onBeforeEnter,
onEnter,
onEnterCancelled,
onLeave,
onLeaveCancelled,
onBeforeAppear = onBeforeEnter,
onAppear = onEnter,
onAppearCancelled = onEnterCancelled
} = baseProps;
const finishEnter = (el, isAppear, done, isCancelled) => {
el._enterCancelled = isCancelled;
removeTransitionClass(el, isAppear ? appearToClass : enterToClass);
removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);
done && done();
};
const finishLeave = (el, done) => {
el._isLeaving = false;
removeTransitionClass(el, leaveFromClass);
removeTransitionClass(el, leaveToClass);
removeTransitionClass(el, leaveActiveClass);
done && done();
};
const makeEnterHook = (isAppear) => {
return (el, done) => {
const hook = isAppear ? onAppear : onEnter;
const resolve = () => finishEnter(el, isAppear, done);
callHook(hook, [el, resolve]);
nextFrame(() => {
removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);
addTransitionClass(el, isAppear ? appearToClass : enterToClass);
if (!hasExplicitCallback(hook)) {
whenTransitionEnds(el, type, enterDuration, resolve);
}
});
};
};
return extend(baseProps, {
onBeforeEnter(el) {
callHook(onBeforeEnter, [el]);
addTransitionClass(el, enterFromClass);
addTransitionClass(el, enterActiveClass);
},
onBeforeAppear(el) {
callHook(onBeforeAppear, [el]);
addTransitionClass(el, appearFromClass);
addTransitionClass(el, appearActiveClass);
},
onEnter: makeEnterHook(false),
onAppear: makeEnterHook(true),
onLeave(el, done) {
el._isLeaving = true;
const resolve = () => finishLeave(el, done);
addTransitionClass(el, leaveFromClass);
if (!el._enterCancelled) {
forceReflow();
addTransitionClass(el, leaveActiveClass);
} else {
addTransitionClass(el, leaveActiveClass);
forceReflow();
}
nextFrame(() => {
if (!el._isLeaving) {
return;
}
removeTransitionClass(el, leaveFromClass);
addTransitionClass(el, leaveToClass);
if (!hasExplicitCallback(onLeave)) {
whenTransitionEnds(el, type, leaveDuration, resolve);
}
});
callHook(onLeave, [el, resolve]);
},
onEnterCancelled(el) {
finishEnter(el, false, void 0, true);
callHook(onEnterCancelled, [el]);
},
onAppearCancelled(el) {
finishEnter(el, true, void 0, true);
callHook(onAppearCancelled, [el]);
},
onLeaveCancelled(el) {
finishLeave(el);
callHook(onLeaveCancelled, [el]);
}
});
}
function normalizeDuration(duration) {
if (duration == null) {
return null;
} else if (isObject(duration)) {
return [NumberOf(duration.enter), NumberOf(duration.leave)];
} else {
const n = NumberOf(duration);
return [n, n];
}
}
function NumberOf(val) {
const res = toNumber(val);
if (true) {
assertNumber(res, "<transition> explicit duration");
}
return res;
}
function addTransitionClass(el, cls) {
cls.split(/\s+/).forEach((c) => c && el.classList.add(c));
(el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);
}
function removeTransitionClass(el, cls) {
cls.split(/\s+/).forEach((c) => c && el.classList.remove(c));
const _vtc = el[vtcKey];
if (_vtc) {
_vtc.delete(cls);
if (!_vtc.size) {
el[vtcKey] = void 0;
}
}
}
function nextFrame(cb) {
requestAnimationFrame(() => {
requestAnimationFrame(cb);
});
}
let endId = 0;
function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {
const id = el._endId = ++endId;
const resolveIfNotStale = () => {
if (id === el._endId) {
resolve();
}
};
if (explicitTimeout != null) {
return setTimeout(resolveIfNotStale, explicitTimeout);
}
const { type, timeout, propCount } = getTransitionInfo(el, expectedType);
if (!type) {
return resolve();
}
const endEvent = type + "end";
let ended = 0;
const end = () => {
el.removeEventListener(endEvent, onEnd);
resolveIfNotStale();
};
const onEnd = (e) => {
if (e.target === el && ++ended >= propCount) {
end();
}
};
setTimeout(() => {
if (ended < propCount) {
end();
}
}, timeout + 1);
el.addEventListener(endEvent, onEnd);
}
function getTransitionInfo(el, expectedType) {
const styles = window.getComputedStyle(el);
const getStyleProperties = (key) => (styles[key] || "").split(", ");
const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);
const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);
const transitionTimeout = getTimeout(transitionDelays, transitionDurations);
const animationDelays = getStyleProperties(`${ANIMATION}Delay`);
const animationDurations = getStyleProperties(`${ANIMATION}Duration`);
const animationTimeout = getTimeout(animationDelays, animationDurations);
let type = null;
let timeout = 0;
let propCount = 0;
if (expectedType === TRANSITION) {
if (transitionTimeout > 0) {
type = TRANSITION;
timeout = transitionTimeout;
propCount = transitionDurations.length;
}
} else if (expectedType === ANIMATION) {
if (animationTimeout > 0) {
type = ANIMATION;
timeout = animationTimeout;
propCount = animationDurations.length;
}
} else {
timeout = Math.max(transitionTimeout, animationTimeout);
type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;
propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;
}
const hasTransform = type === TRANSITION && /\b(transform|all)(,|$)/.test(
getStyleProperties(`${TRANSITION}Property`).toString()
);
return {
type,
timeout,
propCount,
hasTransform
};
}
function getTimeout(delays, durations) {
while (delays.length < durations.length) {
delays = delays.concat(delays);
}
return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));
}
function toMs(s) {
if (s === "auto") return 0;
return Number(s.slice(0, -1).replace(",", ".")) * 1e3;
}
function forceReflow() {
return document.body.offsetHeight;
}
function patchClass(el, value, isSVG) {
const transitionClasses = el[vtcKey];
if (transitionClasses) {
value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" ");
}
if (value == null) {
el.removeAttribute("class");
} else if (isSVG) {
el.setAttribute("class", value);
} else {
el.className = value;
}
}
const vShowOriginalDisplay = Symbol("_vod");
const vShowHidden = Symbol("_vsh");
const vShow = {
beforeMount(el, { value }, { transition }) {
el[vShowOriginalDisplay] = el.style.display === "none" ? "" : el.style.display;
if (transition && value) {
transition.beforeEnter(el);
} else {
setDisplay(el, value);
}
},
mounted(el, { value }, { transition }) {
if (transition && value) {
transition.enter(el);
}
},
updated(el, { value, oldValue }, { transition }) {
if (!value === !oldValue) return;
if (transition) {
if (value) {
transition.beforeEnter(el);
setDisplay(el, true);
transition.enter(el);
} else {
transition.leave(el, () => {
setDisplay(el, false);
});
}
} else {
setDisplay(el, value);
}
},
beforeUnmount(el, { value }) {
setDisplay(el, value);
}
};
if (true) {
vShow.name = "show";
}
function setDisplay(el, value) {
el.style.display = value ? el[vShowOriginalDisplay] : "none";
el[vShowHidden] = !value;
}
function initVShowForSSR() {
vShow.getSSRProps = ({ value }) => {
if (!value) {
return { style: { display: "none" } };
}
};
}
const CSS_VAR_TEXT = Symbol(true ? "CSS_VAR_TEXT" : "");
function useCssVars(getter) {
const instance = getCurrentInstance();
if (!instance) {
warn(`useCssVars is called without current active component instance.`);
return;
}
const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {
Array.from(
document.querySelectorAll(`[data-v-owner="${instance.uid}"]`)
).forEach((node) => setVarsOnNode(node, vars));
};
if (true) {
instance.getCssVars = () => getter(instance.proxy);
}
const setVars = () => {
const vars = getter(instance.proxy);
if (instance.ce) {
setVarsOnNode(instance.ce, vars);
} else {
setVarsOnVNode(instance.subTree, vars);
}
updateTeleports(vars);
};
onBeforeUpdate(() => {
queuePostFlushCb(setVars);
});
onMounted(() => {
watch(setVars, NOOP, { flush: "post" });
const ob = new MutationObserver(setVars);
ob.observe(instance.subTree.el.parentNode, { childList: true });
onUnmounted(() => ob.disconnect());
});
}
function setVarsOnVNode(vnode, vars) {
if (vnode.shapeFlag & 128) {
const suspense = vnode.suspense;
vnode = suspense.activeBranch;
if (suspense.pendingBranch && !suspense.isHydrating) {
suspense.effects.push(() => {
setVarsOnVNode(suspense.activeBranch, vars);
});
}
}
while (vnode.component) {
vnode = vnode.component.subTree;
}
if (vnode.shapeFlag & 1 && vnode.el) {
setVarsOnNode(vnode.el, vars);
} else if (vnode.type === Fragment) {
vnode.children.forEach((c) => setVarsOnVNode(c, vars));
} else if (vnode.type === Static) {
let { el, anchor } = vnode;
while (el) {
setVarsOnNode(el, vars);
if (el === anchor) break;
el = el.nextSibling;
}
}
}
function setVarsOnNode(el, vars) {
if (el.nodeType === 1) {
const style = el.style;
let cssText = "";
for (const key in vars) {
const value = normalizeCssVarValue(vars[key]);
style.setProperty(`--${key}`, value);
cssText += `--${key}: ${value};`;
}
style[CSS_VAR_TEXT] = cssText;
}
}
const displayRE = /(^|;)\s*display\s*:/;
function patchStyle(el, prev, next) {
const style = el.style;
const isCssString = isString(next);
let hasControlledDisplay = false;
if (next && !isCssString) {
if (prev) {
if (!isString(prev)) {
for (const key in prev) {
if (next[key] == null) {
setStyle(style, key, "");
}
}
} else {
for (const prevStyle of prev.split(";")) {
const key = prevStyle.slice(0, prevStyle.indexOf(":")).trim();
if (next[key] == null) {
setStyle(style, key, "");
}
}
}
}
for (const key in next) {
if (key === "display") {
hasControlledDisplay = true;
}
setStyle(style, key, next[key]);
}
} else {
if (isCssString) {
if (prev !== next) {
const cssVarText = style[CSS_VAR_TEXT];
if (cssVarText) {
next += ";" + cssVarText;
}
style.cssText = next;
hasControlledDisplay = displayRE.test(next);
}
} else if (prev) {
el.removeAttribute("style");
}
}
if (vShowOriginalDisplay in el) {
el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : "";
if (el[vShowHidden]) {
style.display = "none";
}
}
}
const semicolonRE = /[^\\];\s*$/;
const importantRE = /\s*!important$/;
function setStyle(style, name, val) {
if (isArray(val)) {
val.forEach((v) => setStyle(style, name, v));
} else {
if (val == null) val = "";
if (true) {
if (semicolonRE.test(val)) {
warn(
`Unexpected semicolon at the end of '${name}' style value: '${val}'`
);
}
}
if (name.startsWith("--")) {
style.setProperty(name, val);
} else {
const prefixed = autoPrefix(style, name);
if (importantRE.test(val)) {
style.setProperty(
hyphenate(prefixed),
val.replace(importantRE, ""),
"important"
);
} else {
style[prefixed] = val;
}
}
}
}
const prefixes = ["Webkit", "Moz", "ms"];
const prefixCache = {};
function autoPrefix(style, rawName) {
const cached = prefixCache[rawName];
if (cached) {
return cached;
}
let name = camelize(rawName);
if (name !== "filter" && name in style) {
return prefixCache[rawName] = name;
}
name = capitalize(name);
for (let i = 0; i < prefixes.length; i++) {
const prefixed = prefixes[i] + name;
if (prefixed in style) {
return prefixCache[rawName] = prefixed;
}
}
return rawName;
}
const xlinkNS = "http://www.w3.org/1999/xlink";
function patchAttr(el, key, value, isSVG, instance, isBoolean = isSpecialBooleanAttr(key)) {
if (isSVG && key.startsWith("xlink:")) {
if (value == null) {
el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
} else {
el.setAttributeNS(xlinkNS, key, value);
}
} else {
if (value == null || isBoolean && !includeBooleanAttr(value)) {
el.removeAttribute(key);
} else {
el.setAttribute(
key,
isBoolean ? "" : isSymbol(value) ? String(value) : value
);
}
}
}
function patchDOMProp(el, key, value, parentComponent, attrName) {
if (key === "innerHTML" || key === "textContent") {
if (value != null) {
el[key] = key === "innerHTML" ? unsafeToTrustedHTML(value) : value;
}
return;
}
const tag = el.tagName;
if (key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally
!tag.includes("-")) {
const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value;
const newValue = value == null ? (
// #11647: value should be set as empty string for null and undefined,
// but <input type="checkbox"> should be set as 'on'.
el.type === "checkbox" ? "on" : ""
) : String(value);
if (oldValue !== newValue || !("_value" in el)) {
el.value = newValue;
}
if (value == null) {
el.removeAttribute(key);
}
el._value = value;
return;
}
let needRemove = false;
if (value === "" || value == null) {
const type = typeof el[key];
if (type === "boolean") {
value = includeBooleanAttr(value);
} else if (value == null && type === "string") {
value = "";
needRemove = true;
} else if (type === "number") {
value = 0;
needRemove = true;
}
}
try {
el[key] = value;
} catch (e) {
if (!needRemove) {
warn(
`Failed setting prop "${key}" on <${tag.toLowerCase()}>: value ${value} is invalid.`,
e
);
}
}
needRemove && el.removeAttribute(attrName || key);
}
function addEventListener(el, event, handler, options) {
el.addEventListener(event, handler, options);
}
function removeEventListener(el, event, handler, options) {
el.removeEventListener(event, handler, options);
}
const veiKey = Symbol("_vei");
function patchEvent(el, rawName, prevValue, nextValue, instance = null) {
const invokers = el[veiKey] || (el[veiKey] = {});
const existingInvoker = invokers[rawName];
if (nextValue && existingInvoker) {
existingInvoker.value = true ? sanitizeEventValue(nextValue, rawName) : nextValue;
} else {
const [name, options] = parseName(rawName);
if (nextValue) {
const invoker = invokers[rawName] = createInvoker(
true ? sanitizeEventValue(nextValue, rawName) : nextValue,
instance
);
addEventListener(el, name, invoker, options);
} else if (existingInvoker) {
removeEventListener(el, name, existingInvoker, options);
invokers[rawName] = void 0;
}
}
}
const optionsModifierRE = /(?:Once|Passive|Capture)$/;
function parseName(name) {
let options;
if (optionsModifierRE.test(name)) {
options = {};
let m;
while (m = name.match(optionsModifierRE)) {
name = name.slice(0, name.length - m[0].length);
options[m[0].toLowerCase()] = true;
}
}
const event = name[2] === ":" ? name.slice(3) : hyphenate(name.slice(2));
return [event, options];
}
let cachedNow = 0;
const p = /* @__PURE__ */ Promise.resolve();
const getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());
function createInvoker(initialValue, instance) {
const invoker = (e) => {
if (!e._vts) {
e._vts = Date.now();
} else if (e._vts <= invoker.attached) {
return;
}
callWithAsyncErrorHandling(
patchStopImmediatePropagation(e, invoker.value),
instance,
5,
[e]
);
};
invoker.value = initialValue;
invoker.attached = getNow();
return invoker;
}
function sanitizeEventValue(value, propName) {
if (isFunction(value) || isArray(value)) {
return value;
}
warn(
`Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop?
Expected function or array of functions, received type ${typeof value}.`
);
return NOOP;
}
function patchStopImmediatePropagation(e, value) {
if (isArray(value)) {
const originalStop = e.stopImmediatePropagation;
e.stopImmediatePropagation = () => {
originalStop.call(e);
e._stopped = true;
};
return value.map(
(fn) => (e2) => !e2._stopped && fn && fn(e2)
);
} else {
return value;
}
}
const isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter
key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;
const patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => {
const isSVG = namespace === "svg";
if (key === "class") {
patchClass(el, nextValue, isSVG);
} else if (key === "style") {
patchStyle(el, prevValue, nextValue);
} else if (isOn(key)) {
if (!isModelListener(key)) {
patchEvent(el, key, prevValue, nextValue, parentComponent);
}
} else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {
patchDOMProp(el, key, nextValue);
if (!el.tagName.includes("-") && (key === "value" || key === "checked" || key === "selected")) {
patchAttr(el, key, nextValue, isSVG, parentComponent, key !== "value");
}
} else if (
// #11081 force set props for possible async custom element
el._isVueCE && (/[A-Z]/.test(key) || !isString(nextValue))
) {
patchDOMProp(el, camelize$1(key), nextValue, parentComponent, key);
} else {
if (key === "true-value") {
el._trueValue = nextValue;
} else if (key === "false-value") {
el._falseValue = nextValue;
}
patchAttr(el, key, nextValue, isSVG);
}
};
function shouldSetAsProp(el, key, value, isSVG) {
if (isSVG) {
if (key === "innerHTML" || key === "textContent") {
return true;
}
if (key in el && isNativeOn(key) && isFunction(value)) {
return true;
}
return false;
}
if (key === "spellcheck" || key === "draggable" || key === "translate" || key === "autocorrect") {
return false;
}
if (key === "form") {
return false;
}
if (key === "list" && el.tagName === "INPUT") {
return false;
}
if (key === "type" && el.tagName === "TEXTAREA") {
return false;
}
if (key === "width" || key === "height") {
const tag = el.tagName;
if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") {
return false;
}
}
if (isNativeOn(key) && isString(value)) {
return false;
}
return key in el;
}
const REMOVAL = {};
/*! #__NO_SIDE_EFFECTS__ */
// @__NO_SIDE_EFFECTS__
function defineCustomElement(options, extraOptions, _createApp) {
const Comp = defineComponent(options, extraOptions);
if (isPlainObject(Comp)) extend(Comp, extraOptions);
class VueCustomElement extends VueElement {
constructor(initialProps) {
super(Comp, initialProps, _createApp);
}
}
VueCustomElement.def = Comp;
return VueCustomElement;
}
const defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options, extraOptions) => {
return /* @__PURE__ */ defineCustomElement(options, extraOptions, createSSRApp);
};
const BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class {
};
class VueElement extends BaseClass {
constructor(_def, _props = {}, _createApp = createApp) {
super();
this._def = _def;
this._props = _props;
this._createApp = _createApp;
this._isVueCE = true;
this._instance = null;
this._app = null;
this._nonce = this._def.nonce;
this._connected = false;
this._resolved = false;
this._numberProps = null;
this._styleChildren = /* @__PURE__ */ new WeakSet();
this._ob = null;
if (this.shadowRoot && _createApp !== createApp) {
this._root = this.shadowRoot;
} else {
if (this.shadowRoot) {
warn(
`Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \`defineSSRCustomElement\`.`
);
}
if (_def.shadowRoot !== false) {
this.attachShadow({ mode: "open" });
this._root = this.shadowRoot;
} else {
this._root = this;
}
}
}
connectedCallback() {
if (!this.isConnected) return;
if (!this.shadowRoot && !this._resolved) {
this._parseSlots();
}
this._connected = true;
let parent = this;
while (parent = parent && (parent.parentNode || parent.host)) {
if (parent instanceof VueElement) {
this._parent = parent;
break;
}
}
if (!this._instance) {
if (this._resolved) {
this._mount(this._def);
} else {
if (parent && parent._pendingResolve) {
this._pendingResolve = parent._pendingResolve.then(() => {
this._pendingResolve = void 0;
this._resolveDef();
});
} else {
this._resolveDef();
}
}
}
}
_setParent(parent = this._parent) {
if (parent) {
this._instance.parent = parent._instance;
this._inheritParentContext(parent);
}
}
_inheritParentContext(parent = this._parent) {
if (parent && this._app) {
Object.setPrototypeOf(
this._app._context.provides,
parent._instance.provides
);
}
}
disconnectedCallback() {
this._connected = false;
nextTick(() => {
if (!this._connected) {
if (this._ob) {
this._ob.disconnect();
this._ob = null;
}
this._app && this._app.unmount();
if (this._instance) this._instance.ce = void 0;
this._app = this._instance = null;
}
});
}
/**
* resolve inner component definition (handle possible async component)
*/
_resolveDef() {
if (this._pendingResolve) {
return;
}
for (let i = 0; i < this.attributes.length; i++) {
this._setAttr(this.attributes[i].name);
}
this._ob = new MutationObserver((mutations) => {
for (const m of mutations) {
this._setAttr(m.attributeName);
}
});
this._ob.observe(this, { attributes: true });
const resolve = (def, isAsync = false) => {
this._resolved = true;
this._pendingResolve = void 0;
const { props, styles } = def;
let numberProps;
if (props && !isArray(props)) {
for (const key in props) {
const opt = props[key];
if (opt === Number || opt && opt.type === Number) {
if (key in this._props) {
this._props[key] = toNumber(this._props[key]);
}
(numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize$1(key)] = true;
}
}
}
this._numberProps = numberProps;
this._resolveProps(def);
if (this.shadowRoot) {
this._applyStyles(styles);
} else if (styles) {
warn(
"Custom element style injection is not supported when using shadowRoot: false"
);
}
this._mount(def);
};
const asyncDef = this._def.__asyncLoader;
if (asyncDef) {
this._pendingResolve = asyncDef().then((def) => {
def.configureApp = this._def.configureApp;
resolve(this._def = def, true);
});
} else {
resolve(this._def);
}
}
_mount(def) {
if (!def.name) {
def.name = "VueElement";
}
this._app = this._createApp(def);
this._inheritParentContext();
if (def.configureApp) {
def.configureApp(this._app);
}
this._app._ceVNode = this._createVNode();
this._app.mount(this._root);
const exposed = this._instance && this._instance.exposed;
if (!exposed) return;
for (const key in exposed) {
if (!hasOwn(this, key)) {
Object.defineProperty(this, key, {
// unwrap ref to be consistent with public instance behavior
get: () => unref(exposed[key])
});
} else if (true) {
warn(`Exposed property "${key}" already exists on custom element.`);
}
}
}
_resolveProps(def) {
const { props } = def;
const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});
for (const key of Object.keys(this)) {
if (key[0] !== "_" && declaredPropKeys.includes(key)) {
this._setProp(key, this[key]);
}
}
for (const key of declaredPropKeys.map(camelize$1)) {
Object.defineProperty(this, key, {
get() {
return this._getProp(key);
},
set(val) {
this._setProp(key, val, true, true);
}
});
}
}
_setAttr(key) {
if (key.startsWith("data-v-")) return;
const has = this.hasAttribute(key);
let value = has ? this.getAttribute(key) : REMOVAL;
const camelKey = camelize$1(key);
if (has && this._numberProps && this._numberProps[camelKey]) {
value = toNumber(value);
}
this._setProp(camelKey, value, false, true);
}
/**
* @internal
*/
_getProp(key) {
return this._props[key];
}
/**
* @internal
*/
_setProp(key, val, shouldReflect = true, shouldUpdate = false) {
if (val !== this._props[key]) {
if (val === REMOVAL) {
delete this._props[key];
} else {
this._props[key] = val;
if (key === "key" && this._app) {
this._app._ceVNode.key = val;
}
}
if (shouldUpdate && this._instance) {
this._update();
}
if (shouldReflect) {
const ob = this._ob;
ob && ob.disconnect();
if (val === true) {
this.setAttribute(hyphenate(key), "");
} else if (typeof val === "string" || typeof val === "number") {
this.setAttribute(hyphenate(key), val + "");
} else if (!val) {
this.removeAttribute(hyphenate(key));
}
ob && ob.observe(this, { attributes: true });
}
}
}
_update() {
const vnode = this._createVNode();
if (this._app) vnode.appContext = this._app._context;
render(vnode, this._root);
}
_createVNode() {
const baseProps = {};
if (!this.shadowRoot) {
baseProps.onVnodeMounted = baseProps.onVnodeUpdated = this._renderSlots.bind(this);
}
const vnode = createVNode(this._def, extend(baseProps, this._props));
if (!this._instance) {
vnode.ce = (instance) => {
this._instance = instance;
instance.ce = this;
instance.isCE = true;
if (true) {
instance.ceReload = (newStyles) => {
if (this._styles) {
this._styles.forEach((s) => this._root.removeChild(s));
this._styles.length = 0;
}
this._applyStyles(newStyles);
this._instance = null;
this._update();
};
}
const dispatch = (event, args) => {
this.dispatchEvent(
new CustomEvent(
event,
isPlainObject(args[0]) ? extend({ detail: args }, args[0]) : { detail: args }
)
);
};
instance.emit = (event, ...args) => {
dispatch(event, args);
if (hyphenate(event) !== event) {
dispatch(hyphenate(event), args);
}
};
this._setParent();
};
}
return vnode;
}
_applyStyles(styles, owner) {
if (!styles) return;
if (owner) {
if (owner === this._def || this._styleChildren.has(owner)) {
return;
}
this._styleChildren.add(owner);
}
const nonce = this._nonce;
for (let i = styles.length - 1; i >= 0; i--) {
const s = document.createElement("style");
if (nonce) s.setAttribute("nonce", nonce);
s.textContent = styles[i];
this.shadowRoot.prepend(s);
if (true) {
if (owner) {
if (owner.__hmrId) {
if (!this._childStyles) this._childStyles = /* @__PURE__ */ new Map();
let entry = this._childStyles.get(owner.__hmrId);
if (!entry) {
this._childStyles.set(owner.__hmrId, entry = []);
}
entry.push(s);
}
} else {
(this._styles || (this._styles = [])).push(s);
}
}
}
}
/**
* Only called when shadowRoot is false
*/
_parseSlots() {
const slots = this._slots = {};
let n;
while (n = this.firstChild) {
const slotName = n.nodeType === 1 && n.getAttribute("slot") || "default";
(slots[slotName] || (slots[slotName] = [])).push(n);
this.removeChild(n);
}
}
/**
* Only called when shadowRoot is false
*/
_renderSlots() {
const outlets = (this._teleportTarget || this).querySelectorAll("slot");
const scopeId = this._instance.type.__scopeId;
for (let i = 0; i < outlets.length; i++) {
const o = outlets[i];
const slotName = o.getAttribute("name") || "default";
const content = this._slots[slotName];
const parent = o.parentNode;
if (content) {
for (const n of content) {
if (scopeId && n.nodeType === 1) {
const id = scopeId + "-s";
const walker = document.createTreeWalker(n, 1);
n.setAttribute(id, "");
let child;
while (child = walker.nextNode()) {
child.setAttribute(id, "");
}
}
parent.insertBefore(n, o);
}
} else {
while (o.firstChild) parent.insertBefore(o.firstChild, o);
}
parent.removeChild(o);
}
}
/**
* @internal
*/
_injectChildStyle(comp) {
this._applyStyles(comp.styles, comp);
}
/**
* @internal
*/
_removeChildStyle(comp) {
if (true) {
this._styleChildren.delete(comp);
if (this._childStyles && comp.__hmrId) {
const oldStyles = this._childStyles.get(comp.__hmrId);
if (oldStyles) {
oldStyles.forEach((s) => this._root.removeChild(s));
oldStyles.length = 0;
}
}
}
}
}
function useHost(caller) {
const instance = getCurrentInstance();
const el = instance && instance.ce;
if (el) {
return el;
} else if (true) {
if (!instance) {
warn(
`${caller || "useHost"} called without an active component instance.`
);
} else {
warn(
`${caller || "useHost"} can only be used in components defined via defineCustomElement.`
);
}
}
return null;
}
function useShadowRoot() {
const el = true ? useHost("useShadowRoot") : useHost();
return el && el.shadowRoot;
}
function useCssModule(name = "$style") {
{
const instance = getCurrentInstance();
if (!instance) {
warn(`useCssModule must be called inside setup()`);
return EMPTY_OBJ;
}
const modules = instance.type.__cssModules;
if (!modules) {
warn(`Current instance does not have CSS modules injected.`);
return EMPTY_OBJ;
}
const mod = modules[name];
if (!mod) {
warn(`Current instance does not have CSS module named "${name}".`);
return EMPTY_OBJ;
}
return mod;
}
}
const positionMap = /* @__PURE__ */ new WeakMap();
const newPositionMap = /* @__PURE__ */ new WeakMap();
const moveCbKey = Symbol("_moveCb");
const enterCbKey = Symbol("_enterCb");
const decorate = (t) => {
delete t.props.mode;
return t;
};
const TransitionGroupImpl = /* @__PURE__ */ decorate({
name: "TransitionGroup",
props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {
tag: String,
moveClass: String
}),
setup(props, { slots }) {
const instance = getCurrentInstance();
const state = useTransitionState();
let prevChildren;
let children;
onUpdated(() => {
if (!prevChildren.length) {
return;
}
const moveClass = props.moveClass || `${props.name || "v"}-move`;
if (!hasCSSTransform(
prevChildren[0].el,
instance.vnode.el,
moveClass
)) {
prevChildren = [];
return;
}
prevChildren.forEach(callPendingCbs);
prevChildren.forEach(recordPosition);
const movedChildren = prevChildren.filter(applyTranslation);
forceReflow();
movedChildren.forEach((c) => {
const el = c.el;
const style = el.style;
addTransitionClass(el, moveClass);
style.transform = style.webkitTransform = style.transitionDuration = "";
const cb = el[moveCbKey] = (e) => {
if (e && e.target !== el) {
return;
}
if (!e || /transform$/.test(e.propertyName)) {
el.removeEventListener("transitionend", cb);
el[moveCbKey] = null;
removeTransitionClass(el, moveClass);
}
};
el.addEventListener("transitionend", cb);
});
prevChildren = [];
});
return () => {
const rawProps = toRaw(props);
const cssTransitionProps = resolveTransitionProps(rawProps);
let tag = rawProps.tag || Fragment;
prevChildren = [];
if (children) {
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.el && child.el instanceof Element) {
prevChildren.push(child);
setTransitionHooks(
child,
resolveTransitionHooks(
child,
cssTransitionProps,
state,
instance
)
);
positionMap.set(
child,
child.el.getBoundingClientRect()
);
}
}
}
children = slots.default ? getTransitionRawChildren(slots.default()) : [];
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.key != null) {
setTransitionHooks(
child,
resolveTransitionHooks(child, cssTransitionProps, state, instance)
);
} else if (child.type !== Text) {
warn(`<TransitionGroup> children must be keyed.`);
}
}
return createVNode(tag, null, children);
};
}
});
const TransitionGroup = TransitionGroupImpl;
function callPendingCbs(c) {
const el = c.el;
if (el[moveCbKey]) {
el[moveCbKey]();
}
if (el[enterCbKey]) {
el[enterCbKey]();
}
}
function recordPosition(c) {
newPositionMap.set(c, c.el.getBoundingClientRect());
}
function applyTranslation(c) {
const oldPos = positionMap.get(c);
const newPos = newPositionMap.get(c);
const dx = oldPos.left - newPos.left;
const dy = oldPos.top - newPos.top;
if (dx || dy) {
const s = c.el.style;
s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
s.transitionDuration = "0s";
return c;
}
}
function hasCSSTransform(el, root, moveClass) {
const clone = el.cloneNode();
const _vtc = el[vtcKey];
if (_vtc) {
_vtc.forEach((cls) => {
cls.split(/\s+/).forEach((c) => c && clone.classList.remove(c));
});
}
moveClass.split(/\s+/).forEach((c) => c && clone.classList.add(c));
clone.style.display = "none";
const container = root.nodeType === 1 ? root : root.parentNode;
container.appendChild(clone);
const { hasTransform } = getTransitionInfo(clone);
container.removeChild(clone);
return hasTransform;
}
const getModelAssigner = (vnode) => {
const fn = vnode.props["onUpdate:modelValue"] || false;
return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;
};
function onCompositionStart(e) {
e.target.composing = true;
}
function onCompositionEnd(e) {
const target = e.target;
if (target.composing) {
target.composing = false;
target.dispatchEvent(new Event("input"));
}
}
const assignKey = Symbol("_assign");
const vModelText = {
created(el, { modifiers: { lazy, trim, number } }, vnode) {
el[assignKey] = getModelAssigner(vnode);
const castToNumber = number || vnode.props && vnode.props.type === "number";
addEventListener(el, lazy ? "change" : "input", (e) => {
if (e.target.composing) return;
let domValue = el.value;
if (trim) {
domValue = domValue.trim();
}
if (castToNumber) {
domValue = looseToNumber(domValue);
}
el[assignKey](domValue);
});
if (trim) {
addEventListener(el, "change", () => {
el.value = el.value.trim();
});
}
if (!lazy) {
addEventListener(el, "compositionstart", onCompositionStart);
addEventListener(el, "compositionend", onCompositionEnd);
addEventListener(el, "change", onCompositionEnd);
}
},
// set value on mounted so it's after min/max for type="range"
mounted(el, { value }) {
el.value = value == null ? "" : value;
},
beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) {
el[assignKey] = getModelAssigner(vnode);
if (el.composing) return;
const elValue = (number || el.type === "number") && !/^0\d/.test(el.value) ? looseToNumber(el.value) : el.value;
const newValue = value == null ? "" : value;
if (elValue === newValue) {
return;
}
if (document.activeElement === el && el.type !== "range") {
if (lazy && value === oldValue) {
return;
}
if (trim && el.value.trim() === newValue) {
return;
}
}
el.value = newValue;
}
};
const vModelCheckbox = {
// #4096 array checkboxes need to be deep traversed
deep: true,
created(el, _, vnode) {
el[assignKey] = getModelAssigner(vnode);
addEventListener(el, "change", () => {
const modelValue = el._modelValue;
const elementValue = getValue(el);
const checked = el.checked;
const assign = el[assignKey];
if (isArray(modelValue)) {
const index = looseIndexOf(modelValue, elementValue);
const found = index !== -1;
if (checked && !found) {
assign(modelValue.concat(elementValue));
} else if (!checked && found) {
const filtered = [...modelValue];
filtered.splice(index, 1);
assign(filtered);
}
} else if (isSet(modelValue)) {
const cloned = new Set(modelValue);
if (checked) {
cloned.add(elementValue);
} else {
cloned.delete(elementValue);
}
assign(cloned);
} else {
assign(getCheckboxValue(el, checked));
}
});
},
// set initial checked on mount to wait for true-value/false-value
mounted: setChecked,
beforeUpdate(el, binding, vnode) {
el[assignKey] = getModelAssigner(vnode);
setChecked(el, binding, vnode);
}
};
function setChecked(el, { value, oldValue }, vnode) {
el._modelValue = value;
let checked;
if (isArray(value)) {
checked = looseIndexOf(value, vnode.props.value) > -1;
} else if (isSet(value)) {
checked = value.has(vnode.props.value);
} else {
if (value === oldValue) return;
checked = looseEqual(value, getCheckboxValue(el, true));
}
if (el.checked !== checked) {
el.checked = checked;
}
}
const vModelRadio = {
created(el, { value }, vnode) {
el.checked = looseEqual(value, vnode.props.value);
el[assignKey] = getModelAssigner(vnode);
addEventListener(el, "change", () => {
el[assignKey](getValue(el));
});
},
beforeUpdate(el, { value, oldValue }, vnode) {
el[assignKey] = getModelAssigner(vnode);
if (value !== oldValue) {
el.checked = looseEqual(value, vnode.props.value);
}
}
};
const vModelSelect = {
// <select multiple> value need to be deep traversed
deep: true,
created(el, { value, modifiers: { number } }, vnode) {
const isSetModel = isSet(value);
addEventListener(el, "change", () => {
const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(
(o) => number ? looseToNumber(getValue(o)) : getValue(o)
);
el[assignKey](
el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
);
el._assigning = true;
nextTick(() => {
el._assigning = false;
});
});
el[assignKey] = getModelAssigner(vnode);
},
// set value in mounted & updated because <select> relies on its children
// <option>s.
mounted(el, { value }) {
setSelected(el, value);
},
beforeUpdate(el, _binding, vnode) {
el[assignKey] = getModelAssigner(vnode);
},
updated(el, { value }) {
if (!el._assigning) {
setSelected(el, value);
}
}
};
function setSelected(el, value) {
const isMultiple = el.multiple;
const isArrayValue = isArray(value);
if (isMultiple && !isArrayValue && !isSet(value)) {
warn(
`<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`
);
return;
}
for (let i = 0, l = el.options.length; i < l; i++) {
const option = el.options[i];
const optionValue = getValue(option);
if (isMultiple) {
if (isArrayValue) {
const optionType = typeof optionValue;
if (optionType === "string" || optionType === "number") {
option.selected = value.some((v) => String(v) === String(optionValue));
} else {
option.selected = looseIndexOf(value, optionValue) > -1;
}
} else {
option.selected = value.has(optionValue);
}
} else if (looseEqual(getValue(option), value)) {
if (el.selectedIndex !== i) el.selectedIndex = i;
return;
}
}
if (!isMultiple && el.selectedIndex !== -1) {
el.selectedIndex = -1;
}
}
function getValue(el) {
return "_value" in el ? el._value : el.value;
}
function getCheckboxValue(el, checked) {
const key = checked ? "_trueValue" : "_falseValue";
return key in el ? el[key] : checked;
}
const vModelDynamic = {
created(el, binding, vnode) {
callModelHook(el, binding, vnode, null, "created");
},
mounted(el, binding, vnode) {
callModelHook(el, binding, vnode, null, "mounted");
},
beforeUpdate(el, binding, vnode, prevVNode) {
callModelHook(el, binding, vnode, prevVNode, "beforeUpdate");
},
updated(el, binding, vnode, prevVNode) {
callModelHook(el, binding, vnode, prevVNode, "updated");
}
};
function resolveDynamicModel(tagName, type) {
switch (tagName) {
case "SELECT":
return vModelSelect;
case "TEXTAREA":
return vModelText;
default:
switch (type) {
case "checkbox":
return vModelCheckbox;
case "radio":
return vModelRadio;
default:
return vModelText;
}
}
}
function callModelHook(el, binding, vnode, prevVNode, hook) {
const modelToUse = resolveDynamicModel(
el.tagName,
vnode.props && vnode.props.type
);
const fn = modelToUse[hook];
fn && fn(el, binding, vnode, prevVNode);
}
function initVModelForSSR() {
vModelText.getSSRProps = ({ value }) => ({ value });
vModelRadio.getSSRProps = ({ value }, vnode) => {
if (vnode.props && looseEqual(vnode.props.value, value)) {
return { checked: true };
}
};
vModelCheckbox.getSSRProps = ({ value }, vnode) => {
if (isArray(value)) {
if (vnode.props && looseIndexOf(value, vnode.props.value) > -1) {
return { checked: true };
}
} else if (isSet(value)) {
if (vnode.props && value.has(vnode.props.value)) {
return { checked: true };
}
} else if (value) {
return { checked: true };
}
};
vModelDynamic.getSSRProps = (binding, vnode) => {
if (typeof vnode.type !== "string") {
return;
}
const modelToUse = resolveDynamicModel(
// resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase
vnode.type.toUpperCase(),
vnode.props && vnode.props.type
);
if (modelToUse.getSSRProps) {
return modelToUse.getSSRProps(binding, vnode);
}
};
}
const systemModifiers = ["ctrl", "shift", "alt", "meta"];
const modifierGuards = {
stop: (e) => e.stopPropagation(),
prevent: (e) => e.preventDefault(),
self: (e) => e.target !== e.currentTarget,
ctrl: (e) => !e.ctrlKey,
shift: (e) => !e.shiftKey,
alt: (e) => !e.altKey,
meta: (e) => !e.metaKey,
left: (e) => "button" in e && e.button !== 0,
middle: (e) => "button" in e && e.button !== 1,
right: (e) => "button" in e && e.button !== 2,
exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
};
const withModifiers = (fn, modifiers) => {
const cache = fn._withMods || (fn._withMods = {});
const cacheKey = modifiers.join(".");
return cache[cacheKey] || (cache[cacheKey] = (event, ...args) => {
for (let i = 0; i < modifiers.length; i++) {
const guard = modifierGuards[modifiers[i]];
if (guard && guard(event, modifiers)) return;
}
return fn(event, ...args);
});
};
const keyNames = {
esc: "escape",
space: " ",
up: "arrow-up",
left: "arrow-left",
right: "arrow-right",
down: "arrow-down",
delete: "backspace"
};
const withKeys = (fn, modifiers) => {
const cache = fn._withKeys || (fn._withKeys = {});
const cacheKey = modifiers.join(".");
return cache[cacheKey] || (cache[cacheKey] = (event) => {
if (!("key" in event)) {
return;
}
const eventKey = hyphenate(event.key);
if (modifiers.some(
(k) => k === eventKey || keyNames[k] === eventKey
)) {
return fn(event);
}
});
};
const rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);
let renderer;
let enabledHydration = false;
function ensureRenderer() {
return renderer || (renderer = createRenderer(rendererOptions));
}
function ensureHydrationRenderer() {
renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);
enabledHydration = true;
return renderer;
}
const render = (...args) => {
ensureRenderer().render(...args);
};
const hydrate = (...args) => {
ensureHydrationRenderer().hydrate(...args);
};
const createApp = (...args) => {
const app = ensureRenderer().createApp(...args);
if (true) {
injectNativeTagCheck(app);
injectCompilerOptionsCheck(app);
}
const { mount } = app;
app.mount = (containerOrSelector) => {
const container = normalizeContainer(containerOrSelector);
if (!container) return;
const component = app._component;
if (!isFunction(component) && !component.render && !component.template) {
component.template = container.innerHTML;
}
if (container.nodeType === 1) {
container.textContent = "";
}
const proxy = mount(container, false, resolveRootNamespace(container));
if (container instanceof Element) {
container.removeAttribute("v-cloak");
container.setAttribute("data-v-app", "");
}
return proxy;
};
return app;
};
const createSSRApp = (...args) => {
const app = ensureHydrationRenderer().createApp(...args);
if (true) {
injectNativeTagCheck(app);
injectCompilerOptionsCheck(app);
}
const { mount } = app;
app.mount = (containerOrSelector) => {
const container = normalizeContainer(containerOrSelector);
if (container) {
return mount(container, true, resolveRootNamespace(container));
}
};
return app;
};
function resolveRootNamespace(container) {
if (container instanceof SVGElement) {
return "svg";
}
if (typeof MathMLElement === "function" && container instanceof MathMLElement) {
return "mathml";
}
}
function injectNativeTagCheck(app) {
Object.defineProperty(app.config, "isNativeTag", {
value: (tag) => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag),
writable: false
});
}
function injectCompilerOptionsCheck(app) {
if (isRuntimeOnly()) {
const isCustomElement = app.config.isCustomElement;
Object.defineProperty(app.config, "isCustomElement", {
get() {
return isCustomElement;
},
set() {
warn(
`The \`isCustomElement\` config option is deprecated. Use \`compilerOptions.isCustomElement\` instead.`
);
}
});
const compilerOptions = app.config.compilerOptions;
const msg = `The \`compilerOptions\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka "full build"). Since you are using the runtime-only build, \`compilerOptions\` must be passed to \`@vue/compiler-dom\` in the build setup instead.
- For vue-loader: pass it via vue-loader's \`compilerOptions\` loader option.
- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader
- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;
Object.defineProperty(app.config, "compilerOptions", {
get() {
warn(msg);
return compilerOptions;
},
set() {
warn(msg);
}
});
}
}
function normalizeContainer(container) {
if (isString(container)) {
const res = document.querySelector(container);
if (!res) {
warn(
`Failed to mount app: mount target selector "${container}" returned null.`
);
}
return res;
}
if (window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === "closed") {
warn(
`mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs`
);
}
return container;
}
let ssrDirectiveInitialized = false;
const initDirectivesForSSR = () => {
if (!ssrDirectiveInitialized) {
ssrDirectiveInitialized = true;
initVModelForSSR();
initVShowForSSR();
}
};
export { Transition, TransitionGroup, VueElement, createApp, createSSRApp, defineCustomElement, defineSSRCustomElement, hydrate, initDirectivesForSSR, render, useCssModule, useCssVars, useHost, useShadowRoot, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, withKeys, withModifiers };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bnRpbWUtZG9tLmVzbS1idW5kbGVyLmpzP3Y9ZTRmMThjMjkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4qIEB2dWUvcnVudGltZS1kb20gdjMuNS4xOVxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgd2FybiwgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsIGgsIEJhc2VUcmFuc2l0aW9uLCBhc3NlcnROdW1iZXIsIGdldEN1cnJlbnRJbnN0YW5jZSwgb25CZWZvcmVVcGRhdGUsIHF1ZXVlUG9zdEZsdXNoQ2IsIG9uTW91bnRlZCwgd2F0Y2gsIG9uVW5tb3VudGVkLCBGcmFnbWVudCwgU3RhdGljLCBjYW1lbGl6ZSwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIHVucmVmLCBjcmVhdGVWTm9kZSwgdXNlVHJhbnNpdGlvblN0YXRlLCBvblVwZGF0ZWQsIHRvUmF3LCBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4sIHNldFRyYW5zaXRpb25Ib29rcywgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcywgVGV4dCwgY3JlYXRlUmVuZGVyZXIsIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyLCBpc1J1bnRpbWVPbmx5IH0gZnJvbSAnQHZ1ZS9ydW50aW1lLWNvcmUnO1xuZXhwb3J0ICogZnJvbSAnQHZ1ZS9ydW50aW1lLWNvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpc09iamVjdCwgdG9OdW1iZXIsIGlzQXJyYXksIE5PT1AsIG5vcm1hbGl6ZUNzc1ZhclZhbHVlLCBpc1N0cmluZywgaHlwaGVuYXRlLCBjYXBpdGFsaXplLCBpc1NwZWNpYWxCb29sZWFuQXR0ciwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpc1N5bWJvbCwgaXNGdW5jdGlvbiwgaXNPbiwgaXNNb2RlbExpc3RlbmVyLCBjYW1lbGl6ZSBhcyBjYW1lbGl6ZSQxLCBpc1BsYWluT2JqZWN0LCBoYXNPd24sIEVNUFRZX09CSiwgbG9vc2VUb051bWJlciwgbG9vc2VJbmRleE9mLCBpc1NldCwgbG9vc2VFcXVhbCwgaW52b2tlQXJyYXlGbnMsIGlzSFRNTFRhZywgaXNTVkdUYWcsIGlzTWF0aE1MVGFnIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuXG5sZXQgcG9saWN5ID0gdm9pZCAwO1xuY29uc3QgdHQgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy50cnVzdGVkVHlwZXM7XG5pZiAodHQpIHtcbiAgdHJ5IHtcbiAgICBwb2xpY3kgPSAvKiBAX19QVVJFX18gKi8gdHQuY3JlYXRlUG9saWN5KFwidnVlXCIsIHtcbiAgICAgIGNyZWF0ZUhUTUw6ICh2YWwpID0+IHZhbFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBFcnJvciBjcmVhdGluZyB0cnVzdGVkIHR5cGVzIHBvbGljeTogJHtlfWApO1xuICB9XG59XG5jb25zdCB1bnNhZmVUb1RydXN0ZWRIVE1MID0gcG9saWN5ID8gKHZhbCkgPT4gcG9saWN5LmNyZWF0ZUhUTUwodmFsKSA6ICh2YWwpID0+IHZhbDtcbmNvbnN0IHN2Z05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuY29uc3QgbWF0aG1sTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIjtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IGRvY3VtZW50IDogbnVsbDtcbmNvbnN0IHRlbXBsYXRlQ29udGFpbmVyID0gZG9jICYmIC8qIEBfX1BVUkVfXyAqLyBkb2MuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuY29uc3Qgbm9kZU9wcyA9IHtcbiAgaW5zZXJ0OiAoY2hpbGQsIHBhcmVudCwgYW5jaG9yKSA9PiB7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYW5jaG9yIHx8IG51bGwpO1xuICB9LFxuICByZW1vdmU6IChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnQ6ICh0YWcsIG5hbWVzcGFjZSwgaXMsIHByb3BzKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBkb2MuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCB0YWcpIDogbmFtZXNwYWNlID09PSBcIm1hdGhtbFwiID8gZG9jLmNyZWF0ZUVsZW1lbnROUyhtYXRobWxOUywgdGFnKSA6IGlzID8gZG9jLmNyZWF0ZUVsZW1lbnQodGFnLCB7IGlzIH0pIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICBpZiAodGFnID09PSBcInNlbGVjdFwiICYmIHByb3BzICYmIHByb3BzLm11bHRpcGxlICE9IG51bGwpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIsIHByb3BzLm11bHRpcGxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsO1xuICB9LFxuICBjcmVhdGVUZXh0OiAodGV4dCkgPT4gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpLFxuICBjcmVhdGVDb21tZW50OiAodGV4dCkgPT4gZG9jLmNyZWF0ZUNvbW1lbnQodGV4dCksXG4gIHNldFRleHQ6IChub2RlLCB0ZXh0KSA9PiB7XG4gICAgbm9kZS5ub2RlVmFsdWUgPSB0ZXh0O1xuICB9LFxuICBzZXRFbGVtZW50VGV4dDogKGVsLCB0ZXh0KSA9PiB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9LFxuICBwYXJlbnROb2RlOiAobm9kZSkgPT4gbm9kZS5wYXJlbnROb2RlLFxuICBuZXh0U2libGluZzogKG5vZGUpID0+IG5vZGUubmV4dFNpYmxpbmcsXG4gIHF1ZXJ5U2VsZWN0b3I6IChzZWxlY3RvcikgPT4gZG9jLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICBzZXRTY29wZUlkKGVsLCBpZCkge1xuICAgIGVsLnNldEF0dHJpYnV0ZShpZCwgXCJcIik7XG4gIH0sXG4gIC8vIF9fVU5TQUZFX19cbiAgLy8gUmVhc29uOiBpbm5lckhUTUwuXG4gIC8vIFN0YXRpYyBjb250ZW50IGhlcmUgY2FuIG9ubHkgY29tZSBmcm9tIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgLy8gQXMgbG9uZyBhcyB0aGUgdXNlciBvbmx5IHVzZXMgdHJ1c3RlZCB0ZW1wbGF0ZXMsIHRoaXMgaXMgc2FmZS5cbiAgaW5zZXJ0U3RhdGljQ29udGVudChjb250ZW50LCBwYXJlbnQsIGFuY2hvciwgbmFtZXNwYWNlLCBzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgYmVmb3JlID0gYW5jaG9yID8gYW5jaG9yLnByZXZpb3VzU2libGluZyA6IHBhcmVudC5sYXN0Q2hpbGQ7XG4gICAgaWYgKHN0YXJ0ICYmIChzdGFydCA9PT0gZW5kIHx8IHN0YXJ0Lm5leHRTaWJsaW5nKSkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShzdGFydC5jbG9uZU5vZGUodHJ1ZSksIGFuY2hvcik7XG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kIHx8ICEoc3RhcnQgPSBzdGFydC5uZXh0U2libGluZykpIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wbGF0ZUNvbnRhaW5lci5pbm5lckhUTUwgPSB1bnNhZmVUb1RydXN0ZWRIVE1MKFxuICAgICAgICBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBgPHN2Zz4ke2NvbnRlbnR9PC9zdmc+YCA6IG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiA/IGA8bWF0aD4ke2NvbnRlbnR9PC9tYXRoPmAgOiBjb250ZW50XG4gICAgICApO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNvbnRhaW5lci5jb250ZW50O1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlICh3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmRDaGlsZCh3cmFwcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZW1wbGF0ZSwgYW5jaG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGZpcnN0XG4gICAgICBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCxcbiAgICAgIC8vIGxhc3RcbiAgICAgIGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkXG4gICAgXTtcbiAgfVxufTtcblxuY29uc3QgVFJBTlNJVElPTiA9IFwidHJhbnNpdGlvblwiO1xuY29uc3QgQU5JTUFUSU9OID0gXCJhbmltYXRpb25cIjtcbmNvbnN0IHZ0Y0tleSA9IFN5bWJvbChcIl92dGNcIik7XG5jb25zdCBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0ge1xuICBuYW1lOiBTdHJpbmcsXG4gIHR5cGU6IFN0cmluZyxcbiAgY3NzOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiB0cnVlXG4gIH0sXG4gIGR1cmF0aW9uOiBbU3RyaW5nLCBOdW1iZXIsIE9iamVjdF0sXG4gIGVudGVyRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGFwcGVhckZyb21DbGFzczogU3RyaW5nLFxuICBhcHBlYXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVUb0NsYXNzOiBTdHJpbmdcbn07XG5jb25zdCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0gLyogQF9fUFVSRV9fICovIGV4dGVuZChcbiAge30sXG4gIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLFxuICBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzXG4pO1xuY29uc3QgZGVjb3JhdGUkMSA9ICh0KSA9PiB7XG4gIHQuZGlzcGxheU5hbWUgPSBcIlRyYW5zaXRpb25cIjtcbiAgdC5wcm9wcyA9IFRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnM7XG4gIHJldHVybiB0O1xufTtcbmNvbnN0IFRyYW5zaXRpb24gPSAvKiBAX19QVVJFX18gKi8gZGVjb3JhdGUkMShcbiAgKHByb3BzLCB7IHNsb3RzIH0pID0+IGgoQmFzZVRyYW5zaXRpb24sIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocHJvcHMpLCBzbG90cylcbik7XG5jb25zdCBjYWxsSG9vayA9IChob29rLCBhcmdzID0gW10pID0+IHtcbiAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICBob29rLmZvckVhY2goKGgyKSA9PiBoMiguLi5hcmdzKSk7XG4gIH0gZWxzZSBpZiAoaG9vaykge1xuICAgIGhvb2soLi4uYXJncyk7XG4gIH1cbn07XG5jb25zdCBoYXNFeHBsaWNpdENhbGxiYWNrID0gKGhvb2spID0+IHtcbiAgcmV0dXJuIGhvb2sgPyBpc0FycmF5KGhvb2spID8gaG9vay5zb21lKChoMikgPT4gaDIubGVuZ3RoID4gMSkgOiBob29rLmxlbmd0aCA+IDEgOiBmYWxzZTtcbn07XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNpdGlvblByb3BzKHJhd1Byb3BzKSB7XG4gIGNvbnN0IGJhc2VQcm9wcyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiByYXdQcm9wcykge1xuICAgIGlmICghKGtleSBpbiBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzKSkge1xuICAgICAgYmFzZVByb3BzW2tleV0gPSByYXdQcm9wc1trZXldO1xuICAgIH1cbiAgfVxuICBpZiAocmF3UHJvcHMuY3NzID09PSBmYWxzZSkge1xuICAgIHJldHVybiBiYXNlUHJvcHM7XG4gIH1cbiAgY29uc3Qge1xuICAgIG5hbWUgPSBcInZcIixcbiAgICB0eXBlLFxuICAgIGR1cmF0aW9uLFxuICAgIGVudGVyRnJvbUNsYXNzID0gYCR7bmFtZX0tZW50ZXItZnJvbWAsXG4gICAgZW50ZXJBY3RpdmVDbGFzcyA9IGAke25hbWV9LWVudGVyLWFjdGl2ZWAsXG4gICAgZW50ZXJUb0NsYXNzID0gYCR7bmFtZX0tZW50ZXItdG9gLFxuICAgIGFwcGVhckZyb21DbGFzcyA9IGVudGVyRnJvbUNsYXNzLFxuICAgIGFwcGVhckFjdGl2ZUNsYXNzID0gZW50ZXJBY3RpdmVDbGFzcyxcbiAgICBhcHBlYXJUb0NsYXNzID0gZW50ZXJUb0NsYXNzLFxuICAgIGxlYXZlRnJvbUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtZnJvbWAsXG4gICAgbGVhdmVBY3RpdmVDbGFzcyA9IGAke25hbWV9LWxlYXZlLWFjdGl2ZWAsXG4gICAgbGVhdmVUb0NsYXNzID0gYCR7bmFtZX0tbGVhdmUtdG9gXG4gIH0gPSByYXdQcm9wcztcbiAgY29uc3QgZHVyYXRpb25zID0gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pO1xuICBjb25zdCBlbnRlckR1cmF0aW9uID0gZHVyYXRpb25zICYmIGR1cmF0aW9uc1swXTtcbiAgY29uc3QgbGVhdmVEdXJhdGlvbiA9IGR1cmF0aW9ucyAmJiBkdXJhdGlvbnNbMV07XG4gIGNvbnN0IHtcbiAgICBvbkJlZm9yZUVudGVyLFxuICAgIG9uRW50ZXIsXG4gICAgb25FbnRlckNhbmNlbGxlZCxcbiAgICBvbkxlYXZlLFxuICAgIG9uTGVhdmVDYW5jZWxsZWQsXG4gICAgb25CZWZvcmVBcHBlYXIgPSBvbkJlZm9yZUVudGVyLFxuICAgIG9uQXBwZWFyID0gb25FbnRlcixcbiAgICBvbkFwcGVhckNhbmNlbGxlZCA9IG9uRW50ZXJDYW5jZWxsZWRcbiAgfSA9IGJhc2VQcm9wcztcbiAgY29uc3QgZmluaXNoRW50ZXIgPSAoZWwsIGlzQXBwZWFyLCBkb25lLCBpc0NhbmNlbGxlZCkgPT4ge1xuICAgIGVsLl9lbnRlckNhbmNlbGxlZCA9IGlzQ2FuY2VsbGVkO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJUb0NsYXNzIDogZW50ZXJUb0NsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyQWN0aXZlQ2xhc3MgOiBlbnRlckFjdGl2ZUNsYXNzKTtcbiAgICBkb25lICYmIGRvbmUoKTtcbiAgfTtcbiAgY29uc3QgZmluaXNoTGVhdmUgPSAoZWwsIGRvbmUpID0+IHtcbiAgICBlbC5faXNMZWF2aW5nID0gZmFsc2U7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUZyb21DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZVRvQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7XG4gICAgZG9uZSAmJiBkb25lKCk7XG4gIH07XG4gIGNvbnN0IG1ha2VFbnRlckhvb2sgPSAoaXNBcHBlYXIpID0+IHtcbiAgICByZXR1cm4gKGVsLCBkb25lKSA9PiB7XG4gICAgICBjb25zdCBob29rID0gaXNBcHBlYXIgPyBvbkFwcGVhciA6IG9uRW50ZXI7XG4gICAgICBjb25zdCByZXNvbHZlID0gKCkgPT4gZmluaXNoRW50ZXIoZWwsIGlzQXBwZWFyLCBkb25lKTtcbiAgICAgIGNhbGxIb29rKGhvb2ssIFtlbCwgcmVzb2x2ZV0pO1xuICAgICAgbmV4dEZyYW1lKCgpID0+IHtcbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhckZyb21DbGFzcyA6IGVudGVyRnJvbUNsYXNzKTtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhclRvQ2xhc3MgOiBlbnRlclRvQ2xhc3MpO1xuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0Q2FsbGJhY2soaG9vaykpIHtcbiAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGVudGVyRHVyYXRpb24sIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuICByZXR1cm4gZXh0ZW5kKGJhc2VQcm9wcywge1xuICAgIG9uQmVmb3JlRW50ZXIoZWwpIHtcbiAgICAgIGNhbGxIb29rKG9uQmVmb3JlRW50ZXIsIFtlbF0pO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBlbnRlckZyb21DbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGVudGVyQWN0aXZlQ2xhc3MpO1xuICAgIH0sXG4gICAgb25CZWZvcmVBcHBlYXIoZWwpIHtcbiAgICAgIGNhbGxIb29rKG9uQmVmb3JlQXBwZWFyLCBbZWxdKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYXBwZWFyRnJvbUNsYXNzKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYXBwZWFyQWN0aXZlQ2xhc3MpO1xuICAgIH0sXG4gICAgb25FbnRlcjogbWFrZUVudGVySG9vayhmYWxzZSksXG4gICAgb25BcHBlYXI6IG1ha2VFbnRlckhvb2sodHJ1ZSksXG4gICAgb25MZWF2ZShlbCwgZG9uZSkge1xuICAgICAgZWwuX2lzTGVhdmluZyA9IHRydWU7XG4gICAgICBjb25zdCByZXNvbHZlID0gKCkgPT4gZmluaXNoTGVhdmUoZWwsIGRvbmUpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUZyb21DbGFzcyk7XG4gICAgICBpZiAoIWVsLl9lbnRlckNhbmNlbGxlZCkge1xuICAgICAgICBmb3JjZVJlZmxvdygpO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTtcbiAgICAgICAgZm9yY2VSZWZsb3coKTtcbiAgICAgIH1cbiAgICAgIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgICAgIGlmICghZWwuX2lzTGVhdmluZykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlRnJvbUNsYXNzKTtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZVRvQ2xhc3MpO1xuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0Q2FsbGJhY2sob25MZWF2ZSkpIHtcbiAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGxlYXZlRHVyYXRpb24sIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNhbGxIb29rKG9uTGVhdmUsIFtlbCwgcmVzb2x2ZV0pO1xuICAgIH0sXG4gICAgb25FbnRlckNhbmNlbGxlZChlbCkge1xuICAgICAgZmluaXNoRW50ZXIoZWwsIGZhbHNlLCB2b2lkIDAsIHRydWUpO1xuICAgICAgY2FsbEhvb2sob25FbnRlckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkFwcGVhckNhbmNlbGxlZChlbCkge1xuICAgICAgZmluaXNoRW50ZXIoZWwsIHRydWUsIHZvaWQgMCwgdHJ1ZSk7XG4gICAgICBjYWxsSG9vayhvbkFwcGVhckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkxlYXZlQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hMZWF2ZShlbCk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChpc09iamVjdChkdXJhdGlvbikpIHtcbiAgICByZXR1cm4gW051bWJlck9mKGR1cmF0aW9uLmVudGVyKSwgTnVtYmVyT2YoZHVyYXRpb24ubGVhdmUpXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuID0gTnVtYmVyT2YoZHVyYXRpb24pO1xuICAgIHJldHVybiBbbiwgbl07XG4gIH1cbn1cbmZ1bmN0aW9uIE51bWJlck9mKHZhbCkge1xuICBjb25zdCByZXMgPSB0b051bWJlcih2YWwpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcihyZXMsIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IGR1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGNscykge1xuICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGVsLmNsYXNzTGlzdC5hZGQoYykpO1xuICAoZWxbdnRjS2V5XSB8fCAoZWxbdnRjS2V5XSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKS5hZGQoY2xzKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgY2xzKSB7XG4gIGNscy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgZWwuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZGVsZXRlKGNscyk7XG4gICAgaWYgKCFfdnRjLnNpemUpIHtcbiAgICAgIGVsW3Z0Y0tleV0gPSB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBuZXh0RnJhbWUoY2IpIHtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpO1xuICB9KTtcbn1cbmxldCBlbmRJZCA9IDA7XG5mdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIGV4cGVjdGVkVHlwZSwgZXhwbGljaXRUaW1lb3V0LCByZXNvbHZlKSB7XG4gIGNvbnN0IGlkID0gZWwuX2VuZElkID0gKytlbmRJZDtcbiAgY29uc3QgcmVzb2x2ZUlmTm90U3RhbGUgPSAoKSA9PiB7XG4gICAgaWYgKGlkID09PSBlbC5fZW5kSWQpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH07XG4gIGlmIChleHBsaWNpdFRpbWVvdXQgIT0gbnVsbCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KHJlc29sdmVJZk5vdFN0YWxlLCBleHBsaWNpdFRpbWVvdXQpO1xuICB9XG4gIGNvbnN0IHsgdHlwZSwgdGltZW91dCwgcHJvcENvdW50IH0gPSBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKTtcbiAgaWYgKCF0eXBlKSB7XG4gICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgfVxuICBjb25zdCBlbmRFdmVudCA9IHR5cGUgKyBcImVuZFwiO1xuICBsZXQgZW5kZWQgPSAwO1xuICBjb25zdCBlbmQgPSAoKSA9PiB7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihlbmRFdmVudCwgb25FbmQpO1xuICAgIHJlc29sdmVJZk5vdFN0YWxlKCk7XG4gIH07XG4gIGNvbnN0IG9uRW5kID0gKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQgPT09IGVsICYmICsrZW5kZWQgPj0gcHJvcENvdW50KSB7XG4gICAgICBlbmQoKTtcbiAgICB9XG4gIH07XG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmIChlbmRlZCA8IHByb3BDb3VudCkge1xuICAgICAgZW5kKCk7XG4gICAgfVxuICB9LCB0aW1lb3V0ICsgMSk7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoZW5kRXZlbnQsIG9uRW5kKTtcbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpIHtcbiAgY29uc3Qgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICBjb25zdCBnZXRTdHlsZVByb3BlcnRpZXMgPSAoa2V5KSA9PiAoc3R5bGVzW2tleV0gfHwgXCJcIikuc3BsaXQoXCIsIFwiKTtcbiAgY29uc3QgdHJhbnNpdGlvbkRlbGF5cyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtUUkFOU0lUSU9OfURlbGF5YCk7XG4gIGNvbnN0IHRyYW5zaXRpb25EdXJhdGlvbnMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1EdXJhdGlvbmApO1xuICBjb25zdCB0cmFuc2l0aW9uVGltZW91dCA9IGdldFRpbWVvdXQodHJhbnNpdGlvbkRlbGF5cywgdHJhbnNpdGlvbkR1cmF0aW9ucyk7XG4gIGNvbnN0IGFuaW1hdGlvbkRlbGF5cyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtBTklNQVRJT059RGVsYXlgKTtcbiAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb25zID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke0FOSU1BVElPTn1EdXJhdGlvbmApO1xuICBjb25zdCBhbmltYXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dChhbmltYXRpb25EZWxheXMsIGFuaW1hdGlvbkR1cmF0aW9ucyk7XG4gIGxldCB0eXBlID0gbnVsbDtcbiAgbGV0IHRpbWVvdXQgPSAwO1xuICBsZXQgcHJvcENvdW50ID0gMDtcbiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikge1xuICAgIGlmICh0cmFuc2l0aW9uVGltZW91dCA+IDApIHtcbiAgICAgIHR5cGUgPSBUUkFOU0lUSU9OO1xuICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0O1xuICAgICAgcHJvcENvdW50ID0gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7XG4gICAgaWYgKGFuaW1hdGlvblRpbWVvdXQgPiAwKSB7XG4gICAgICB0eXBlID0gQU5JTUFUSU9OO1xuICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7XG4gICAgICBwcm9wQ291bnQgPSBhbmltYXRpb25EdXJhdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aW1lb3V0ID0gTWF0aC5tYXgodHJhbnNpdGlvblRpbWVvdXQsIGFuaW1hdGlvblRpbWVvdXQpO1xuICAgIHR5cGUgPSB0aW1lb3V0ID4gMCA/IHRyYW5zaXRpb25UaW1lb3V0ID4gYW5pbWF0aW9uVGltZW91dCA/IFRSQU5TSVRJT04gOiBBTklNQVRJT04gOiBudWxsO1xuICAgIHByb3BDb3VudCA9IHR5cGUgPyB0eXBlID09PSBUUkFOU0lUSU9OID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGggOiBhbmltYXRpb25EdXJhdGlvbnMubGVuZ3RoIDogMDtcbiAgfVxuICBjb25zdCBoYXNUcmFuc2Zvcm0gPSB0eXBlID09PSBUUkFOU0lUSU9OICYmIC9cXGIodHJhbnNmb3JtfGFsbCkoLHwkKS8udGVzdChcbiAgICBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1Qcm9wZXJ0eWApLnRvU3RyaW5nKClcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlLFxuICAgIHRpbWVvdXQsXG4gICAgcHJvcENvdW50LFxuICAgIGhhc1RyYW5zZm9ybVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0VGltZW91dChkZWxheXMsIGR1cmF0aW9ucykge1xuICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHtcbiAgICBkZWxheXMgPSBkZWxheXMuY29uY2F0KGRlbGF5cyk7XG4gIH1cbiAgcmV0dXJuIE1hdGgubWF4KC4uLmR1cmF0aW9ucy5tYXAoKGQsIGkpID0+IHRvTXMoZCkgKyB0b01zKGRlbGF5c1tpXSkpKTtcbn1cbmZ1bmN0aW9uIHRvTXMocykge1xuICBpZiAocyA9PT0gXCJhdXRvXCIpIHJldHVybiAwO1xuICByZXR1cm4gTnVtYmVyKHMuc2xpY2UoMCwgLTEpLnJlcGxhY2UoXCIsXCIsIFwiLlwiKSkgKiAxZTM7XG59XG5mdW5jdGlvbiBmb3JjZVJlZmxvdygpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBwYXRjaENsYXNzKGVsLCB2YWx1ZSwgaXNTVkcpIHtcbiAgY29uc3QgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbFt2dGNLZXldO1xuICBpZiAodHJhbnNpdGlvbkNsYXNzZXMpIHtcbiAgICB2YWx1ZSA9ICh2YWx1ZSA/IFt2YWx1ZSwgLi4udHJhbnNpdGlvbkNsYXNzZXNdIDogWy4uLnRyYW5zaXRpb25DbGFzc2VzXSkuam9pbihcIiBcIik7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcbiAgfSBlbHNlIGlmIChpc1NWRykge1xuICAgIGVsLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBlbC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgfVxufVxuXG5jb25zdCB2U2hvd09yaWdpbmFsRGlzcGxheSA9IFN5bWJvbChcIl92b2RcIik7XG5jb25zdCB2U2hvd0hpZGRlbiA9IFN5bWJvbChcIl92c2hcIik7XG5jb25zdCB2U2hvdyA9IHtcbiAgYmVmb3JlTW91bnQoZWwsIHsgdmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBlbFt2U2hvd09yaWdpbmFsRGlzcGxheV0gPSBlbC5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBlbC5zdHlsZS5kaXNwbGF5O1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZChlbCwgeyB2YWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICB9XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSByZXR1cm47XG4gICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICAgICAgc2V0RGlzcGxheShlbCwgdHJ1ZSk7XG4gICAgICAgIHRyYW5zaXRpb24uZW50ZXIoZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNpdGlvbi5sZWF2ZShlbCwgKCkgPT4ge1xuICAgICAgICAgIHNldERpc3BsYXkoZWwsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldERpc3BsYXkoZWwsIHZhbHVlKTtcbiAgICB9XG4gIH0sXG4gIGJlZm9yZVVubW91bnQoZWwsIHsgdmFsdWUgfSkge1xuICAgIHNldERpc3BsYXkoZWwsIHZhbHVlKTtcbiAgfVxufTtcbmlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykge1xuICB2U2hvdy5uYW1lID0gXCJzaG93XCI7XG59XG5mdW5jdGlvbiBzZXREaXNwbGF5KGVsLCB2YWx1ZSkge1xuICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbFt2U2hvd09yaWdpbmFsRGlzcGxheV0gOiBcIm5vbmVcIjtcbiAgZWxbdlNob3dIaWRkZW5dID0gIXZhbHVlO1xufVxuZnVuY3Rpb24gaW5pdFZTaG93Rm9yU1NSKCkge1xuICB2U2hvdy5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4geyBzdHlsZTogeyBkaXNwbGF5OiBcIm5vbmVcIiB9IH07XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBDU1NfVkFSX1RFWFQgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiQ1NTX1ZBUl9URVhUXCIgOiBcIlwiKTtcbmZ1bmN0aW9uIHVzZUNzc1ZhcnMoZ2V0dGVyKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc1ZhcnMgaXMgY2FsbGVkIHdpdGhvdXQgY3VycmVudCBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB1cGRhdGVUZWxlcG9ydHMgPSBpbnN0YW5jZS51dCA9ICh2YXJzID0gZ2V0dGVyKGluc3RhbmNlLnByb3h5KSkgPT4ge1xuICAgIEFycmF5LmZyb20oXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS12LW93bmVyPVwiJHtpbnN0YW5jZS51aWR9XCJdYClcbiAgICApLmZvckVhY2goKG5vZGUpID0+IHNldFZhcnNPbk5vZGUobm9kZSwgdmFycykpO1xuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluc3RhbmNlLmdldENzc1ZhcnMgPSAoKSA9PiBnZXR0ZXIoaW5zdGFuY2UucHJveHkpO1xuICB9XG4gIGNvbnN0IHNldFZhcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgdmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSk7XG4gICAgaWYgKGluc3RhbmNlLmNlKSB7XG4gICAgICBzZXRWYXJzT25Ob2RlKGluc3RhbmNlLmNlLCB2YXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VmFyc09uVk5vZGUoaW5zdGFuY2Uuc3ViVHJlZSwgdmFycyk7XG4gICAgfVxuICAgIHVwZGF0ZVRlbGVwb3J0cyh2YXJzKTtcbiAgfTtcbiAgb25CZWZvcmVVcGRhdGUoKCkgPT4ge1xuICAgIHF1ZXVlUG9zdEZsdXNoQ2Ioc2V0VmFycyk7XG4gIH0pO1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHdhdGNoKHNldFZhcnMsIE5PT1AsIHsgZmx1c2g6IFwicG9zdFwiIH0pO1xuICAgIGNvbnN0IG9iID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoc2V0VmFycyk7XG4gICAgb2Iub2JzZXJ2ZShpbnN0YW5jZS5zdWJUcmVlLmVsLnBhcmVudE5vZGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIG9uVW5tb3VudGVkKCgpID0+IG9iLmRpc2Nvbm5lY3QoKSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gc2V0VmFyc09uVk5vZGUodm5vZGUsIHZhcnMpIHtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2U7XG4gICAgdm5vZGUgPSBzdXNwZW5zZS5hY3RpdmVCcmFuY2g7XG4gICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggJiYgIXN1c3BlbnNlLmlzSHlkcmF0aW5nKSB7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goKCkgPT4ge1xuICAgICAgICBzZXRWYXJzT25WTm9kZShzdXNwZW5zZS5hY3RpdmVCcmFuY2gsIHZhcnMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHdoaWxlICh2bm9kZS5jb21wb25lbnQpIHtcbiAgICB2bm9kZSA9IHZub2RlLmNvbXBvbmVudC5zdWJUcmVlO1xuICB9XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxICYmIHZub2RlLmVsKSB7XG4gICAgc2V0VmFyc09uTm9kZSh2bm9kZS5lbCwgdmFycyk7XG4gIH0gZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjKSA9PiBzZXRWYXJzT25WTm9kZShjLCB2YXJzKSk7XG4gIH0gZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gU3RhdGljKSB7XG4gICAgbGV0IHsgZWwsIGFuY2hvciB9ID0gdm5vZGU7XG4gICAgd2hpbGUgKGVsKSB7XG4gICAgICBzZXRWYXJzT25Ob2RlKGVsLCB2YXJzKTtcbiAgICAgIGlmIChlbCA9PT0gYW5jaG9yKSBicmVhaztcbiAgICAgIGVsID0gZWwubmV4dFNpYmxpbmc7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRWYXJzT25Ob2RlKGVsLCB2YXJzKSB7XG4gIGlmIChlbC5ub2RlVHlwZSA9PT0gMSkge1xuICAgIGNvbnN0IHN0eWxlID0gZWwuc3R5bGU7XG4gICAgbGV0IGNzc1RleHQgPSBcIlwiO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbm9ybWFsaXplQ3NzVmFyVmFsdWUodmFyc1trZXldKTtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KGAtLSR7a2V5fWAsIHZhbHVlKTtcbiAgICAgIGNzc1RleHQgKz0gYC0tJHtrZXl9OiAke3ZhbHVlfTtgO1xuICAgIH1cbiAgICBzdHlsZVtDU1NfVkFSX1RFWFRdID0gY3NzVGV4dDtcbiAgfVxufVxuXG5jb25zdCBkaXNwbGF5UkUgPSAvKF58OylcXHMqZGlzcGxheVxccyo6LztcbmZ1bmN0aW9uIHBhdGNoU3R5bGUoZWwsIHByZXYsIG5leHQpIHtcbiAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgY29uc3QgaXNDc3NTdHJpbmcgPSBpc1N0cmluZyhuZXh0KTtcbiAgbGV0IGhhc0NvbnRyb2xsZWREaXNwbGF5ID0gZmFsc2U7XG4gIGlmIChuZXh0ICYmICFpc0Nzc1N0cmluZykge1xuICAgIGlmIChwcmV2KSB7XG4gICAgICBpZiAoIWlzU3RyaW5nKHByZXYpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByZXYpIHtcbiAgICAgICAgICBpZiAobmV4dFtrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIFwiXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBwcmV2U3R5bGUgb2YgcHJldi5zcGxpdChcIjtcIikpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBwcmV2U3R5bGUuc2xpY2UoMCwgcHJldlN0eWxlLmluZGV4T2YoXCI6XCIpKS50cmltKCk7XG4gICAgICAgICAgaWYgKG5leHRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBzZXRTdHlsZShzdHlsZSwga2V5LCBcIlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV4dCkge1xuICAgICAgaWYgKGtleSA9PT0gXCJkaXNwbGF5XCIpIHtcbiAgICAgICAgaGFzQ29udHJvbGxlZERpc3BsYXkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc2V0U3R5bGUoc3R5bGUsIGtleSwgbmV4dFtrZXldKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzQ3NzU3RyaW5nKSB7XG4gICAgICBpZiAocHJldiAhPT0gbmV4dCkge1xuICAgICAgICBjb25zdCBjc3NWYXJUZXh0ID0gc3R5bGVbQ1NTX1ZBUl9URVhUXTtcbiAgICAgICAgaWYgKGNzc1ZhclRleHQpIHtcbiAgICAgICAgICBuZXh0ICs9IFwiO1wiICsgY3NzVmFyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS5jc3NUZXh0ID0gbmV4dDtcbiAgICAgICAgaGFzQ29udHJvbGxlZERpc3BsYXkgPSBkaXNwbGF5UkUudGVzdChuZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZXYpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgIH1cbiAgfVxuICBpZiAodlNob3dPcmlnaW5hbERpc3BsYXkgaW4gZWwpIHtcbiAgICBlbFt2U2hvd09yaWdpbmFsRGlzcGxheV0gPSBoYXNDb250cm9sbGVkRGlzcGxheSA/IHN0eWxlLmRpc3BsYXkgOiBcIlwiO1xuICAgIGlmIChlbFt2U2hvd0hpZGRlbl0pIHtcbiAgICAgIHN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB9XG4gIH1cbn1cbmNvbnN0IHNlbWljb2xvblJFID0gL1teXFxcXF07XFxzKiQvO1xuY29uc3QgaW1wb3J0YW50UkUgPSAvXFxzKiFpbXBvcnRhbnQkLztcbmZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlLCBuYW1lLCB2YWwpIHtcbiAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgIHZhbC5mb3JFYWNoKCh2KSA9PiBzZXRTdHlsZShzdHlsZSwgbmFtZSwgdikpO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWwgPT0gbnVsbCkgdmFsID0gXCJcIjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgaWYgKHNlbWljb2xvblJFLnRlc3QodmFsKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBVbmV4cGVjdGVkIHNlbWljb2xvbiBhdCB0aGUgZW5kIG9mICcke25hbWV9JyBzdHlsZSB2YWx1ZTogJyR7dmFsfSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJlZml4ZWQgPSBhdXRvUHJlZml4KHN0eWxlLCBuYW1lKTtcbiAgICAgIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHtcbiAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgaHlwaGVuYXRlKHByZWZpeGVkKSxcbiAgICAgICAgICB2YWwucmVwbGFjZShpbXBvcnRhbnRSRSwgXCJcIiksXG4gICAgICAgICAgXCJpbXBvcnRhbnRcIlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVbcHJlZml4ZWRdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY29uc3QgcHJlZml4ZXMgPSBbXCJXZWJraXRcIiwgXCJNb3pcIiwgXCJtc1wiXTtcbmNvbnN0IHByZWZpeENhY2hlID0ge307XG5mdW5jdGlvbiBhdXRvUHJlZml4KHN0eWxlLCByYXdOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IHByZWZpeENhY2hlW3Jhd05hbWVdO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBsZXQgbmFtZSA9IGNhbWVsaXplKHJhd05hbWUpO1xuICBpZiAobmFtZSAhPT0gXCJmaWx0ZXJcIiAmJiBuYW1lIGluIHN0eWxlKSB7XG4gICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gbmFtZTtcbiAgfVxuICBuYW1lID0gY2FwaXRhbGl6ZShuYW1lKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByZWZpeGVkID0gcHJlZml4ZXNbaV0gKyBuYW1lO1xuICAgIGlmIChwcmVmaXhlZCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gcHJlZml4ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByYXdOYW1lO1xufVxuXG5jb25zdCB4bGlua05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG5mdW5jdGlvbiBwYXRjaEF0dHIoZWwsIGtleSwgdmFsdWUsIGlzU1ZHLCBpbnN0YW5jZSwgaXNCb29sZWFuID0gaXNTcGVjaWFsQm9vbGVhbkF0dHIoa2V5KSkge1xuICBpZiAoaXNTVkcgJiYga2V5LnN0YXJ0c1dpdGgoXCJ4bGluazpcIikpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywga2V5LnNsaWNlKDYsIGtleS5sZW5ndGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlTlMoeGxpbmtOUywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IGlzQm9vbGVhbiAmJiAhaW5jbHVkZUJvb2xlYW5BdHRyKHZhbHVlKSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcbiAgICAgICAga2V5LFxuICAgICAgICBpc0Jvb2xlYW4gPyBcIlwiIDogaXNTeW1ib2wodmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IHZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaERPTVByb3AoZWwsIGtleSwgdmFsdWUsIHBhcmVudENvbXBvbmVudCwgYXR0ck5hbWUpIHtcbiAgaWYgKGtleSA9PT0gXCJpbm5lckhUTUxcIiB8fCBrZXkgPT09IFwidGV4dENvbnRlbnRcIikge1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBlbFtrZXldID0ga2V5ID09PSBcImlubmVySFRNTFwiID8gdW5zYWZlVG9UcnVzdGVkSFRNTCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIGlmIChrZXkgPT09IFwidmFsdWVcIiAmJiB0YWcgIT09IFwiUFJPR1JFU1NcIiAmJiAvLyBjdXN0b20gZWxlbWVudHMgbWF5IHVzZSBfdmFsdWUgaW50ZXJuYWxseVxuICAhdGFnLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFnID09PSBcIk9QVElPTlwiID8gZWwuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgfHwgXCJcIiA6IGVsLnZhbHVlO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IChcbiAgICAgIC8vICMxMTY0NzogdmFsdWUgc2hvdWxkIGJlIHNldCBhcyBlbXB0eSBzdHJpbmcgZm9yIG51bGwgYW5kIHVuZGVmaW5lZCxcbiAgICAgIC8vIGJ1dCA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCI+IHNob3VsZCBiZSBzZXQgYXMgJ29uJy5cbiAgICAgIGVsLnR5cGUgPT09IFwiY2hlY2tib3hcIiA/IFwib25cIiA6IFwiXCJcbiAgICApIDogU3RyaW5nKHZhbHVlKTtcbiAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlIHx8ICEoXCJfdmFsdWVcIiBpbiBlbCkpIHtcbiAgICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9XG4gICAgZWwuX3ZhbHVlID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBuZWVkUmVtb3ZlID0gZmFsc2U7XG4gIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBlbFtrZXldO1xuICAgIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgdmFsdWUgPSBpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCAmJiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICBuZWVkUmVtb3ZlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIGVsW2tleV0gPSB2YWx1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFuZWVkUmVtb3ZlKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRmFpbGVkIHNldHRpbmcgcHJvcCBcIiR7a2V5fVwiIG9uIDwke3RhZy50b0xvd2VyQ2FzZSgpfT46IHZhbHVlICR7dmFsdWV9IGlzIGludmFsaWQuYCxcbiAgICAgICAgZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbmVlZFJlbW92ZSAmJiBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUgfHwga2V5KTtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbCwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmNvbnN0IHZlaUtleSA9IFN5bWJvbChcIl92ZWlcIik7XG5mdW5jdGlvbiBwYXRjaEV2ZW50KGVsLCByYXdOYW1lLCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaW5zdGFuY2UgPSBudWxsKSB7XG4gIGNvbnN0IGludm9rZXJzID0gZWxbdmVpS2V5XSB8fCAoZWxbdmVpS2V5XSA9IHt9KTtcbiAgY29uc3QgZXhpc3RpbmdJbnZva2VyID0gaW52b2tlcnNbcmF3TmFtZV07XG4gIGlmIChuZXh0VmFsdWUgJiYgZXhpc3RpbmdJbnZva2VyKSB7XG4gICAgZXhpc3RpbmdJbnZva2VyLnZhbHVlID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNhbml0aXplRXZlbnRWYWx1ZShuZXh0VmFsdWUsIHJhd05hbWUpIDogbmV4dFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtuYW1lLCBvcHRpb25zXSA9IHBhcnNlTmFtZShyYXdOYW1lKTtcbiAgICBpZiAobmV4dFZhbHVlKSB7XG4gICAgICBjb25zdCBpbnZva2VyID0gaW52b2tlcnNbcmF3TmFtZV0gPSBjcmVhdGVJbnZva2VyKFxuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2FuaXRpemVFdmVudFZhbHVlKG5leHRWYWx1ZSwgcmF3TmFtZSkgOiBuZXh0VmFsdWUsXG4gICAgICAgIGluc3RhbmNlXG4gICAgICApO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgaW52b2tlciwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChleGlzdGluZ0ludm9rZXIpIHtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIG5hbWUsIGV4aXN0aW5nSW52b2tlciwgb3B0aW9ucyk7XG4gICAgICBpbnZva2Vyc1tyYXdOYW1lXSA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cbmNvbnN0IG9wdGlvbnNNb2RpZmllclJFID0gLyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO1xuZnVuY3Rpb24gcGFyc2VOYW1lKG5hbWUpIHtcbiAgbGV0IG9wdGlvbnM7XG4gIGlmIChvcHRpb25zTW9kaWZpZXJSRS50ZXN0KG5hbWUpKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICAgIGxldCBtO1xuICAgIHdoaWxlIChtID0gbmFtZS5tYXRjaChvcHRpb25zTW9kaWZpZXJSRSkpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGVuZ3RoIC0gbVswXS5sZW5ndGgpO1xuICAgICAgb3B0aW9uc1ttWzBdLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZXZlbnQgPSBuYW1lWzJdID09PSBcIjpcIiA/IG5hbWUuc2xpY2UoMykgOiBoeXBoZW5hdGUobmFtZS5zbGljZSgyKSk7XG4gIHJldHVybiBbZXZlbnQsIG9wdGlvbnNdO1xufVxubGV0IGNhY2hlZE5vdyA9IDA7XG5jb25zdCBwID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xuY29uc3QgZ2V0Tm93ID0gKCkgPT4gY2FjaGVkTm93IHx8IChwLnRoZW4oKCkgPT4gY2FjaGVkTm93ID0gMCksIGNhY2hlZE5vdyA9IERhdGUubm93KCkpO1xuZnVuY3Rpb24gY3JlYXRlSW52b2tlcihpbml0aWFsVmFsdWUsIGluc3RhbmNlKSB7XG4gIGNvbnN0IGludm9rZXIgPSAoZSkgPT4ge1xuICAgIGlmICghZS5fdnRzKSB7XG4gICAgICBlLl92dHMgPSBEYXRlLm5vdygpO1xuICAgIH0gZWxzZSBpZiAoZS5fdnRzIDw9IGludm9rZXIuYXR0YWNoZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBwYXRjaFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbihlLCBpbnZva2VyLnZhbHVlKSxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNSxcbiAgICAgIFtlXVxuICAgICk7XG4gIH07XG4gIGludm9rZXIudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGludm9rZXIuYXR0YWNoZWQgPSBnZXROb3coKTtcbiAgcmV0dXJuIGludm9rZXI7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZUV2ZW50VmFsdWUodmFsdWUsIHByb3BOYW1lKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSB8fCBpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB3YXJuKFxuICAgIGBXcm9uZyB0eXBlIHBhc3NlZCBhcyBldmVudCBoYW5kbGVyIHRvICR7cHJvcE5hbWV9IC0gZGlkIHlvdSBmb3JnZXQgQCBvciA6IGluIGZyb250IG9mIHlvdXIgcHJvcD9cbkV4cGVjdGVkIGZ1bmN0aW9uIG9yIGFycmF5IG9mIGZ1bmN0aW9ucywgcmVjZWl2ZWQgdHlwZSAke3R5cGVvZiB2YWx1ZX0uYFxuICApO1xuICByZXR1cm4gTk9PUDtcbn1cbmZ1bmN0aW9uIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIHZhbHVlKSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG9yaWdpbmFsU3RvcCA9IGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgb3JpZ2luYWxTdG9wLmNhbGwoZSk7XG4gICAgICBlLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiB2YWx1ZS5tYXAoXG4gICAgICAoZm4pID0+IChlMikgPT4gIWUyLl9zdG9wcGVkICYmIGZuICYmIGZuKGUyKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmNvbnN0IGlzTmF0aXZlT24gPSAoa2V5KSA9PiBrZXkuY2hhckNvZGVBdCgwKSA9PT0gMTExICYmIGtleS5jaGFyQ29kZUF0KDEpID09PSAxMTAgJiYgLy8gbG93ZXJjYXNlIGxldHRlclxua2V5LmNoYXJDb2RlQXQoMikgPiA5NiAmJiBrZXkuY2hhckNvZGVBdCgyKSA8IDEyMztcbmNvbnN0IHBhdGNoUHJvcCA9IChlbCwga2V5LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgbmFtZXNwYWNlLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgY29uc3QgaXNTVkcgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCI7XG4gIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgIHBhdGNoQ2xhc3MoZWwsIG5leHRWYWx1ZSwgaXNTVkcpO1xuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgcGF0Y2hTdHlsZShlbCwgcHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkpIHtcbiAgICAgIHBhdGNoRXZlbnQoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIHBhcmVudENvbXBvbmVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGtleVswXSA9PT0gXCIuXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCB0cnVlKSA6IGtleVswXSA9PT0gXCJeXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCBmYWxzZSkgOiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRykpIHtcbiAgICBwYXRjaERPTVByb3AoZWwsIGtleSwgbmV4dFZhbHVlKTtcbiAgICBpZiAoIWVsLnRhZ05hbWUuaW5jbHVkZXMoXCItXCIpICYmIChrZXkgPT09IFwidmFsdWVcIiB8fCBrZXkgPT09IFwiY2hlY2tlZFwiIHx8IGtleSA9PT0gXCJzZWxlY3RlZFwiKSkge1xuICAgICAgcGF0Y2hBdHRyKGVsLCBrZXksIG5leHRWYWx1ZSwgaXNTVkcsIHBhcmVudENvbXBvbmVudCwga2V5ICE9PSBcInZhbHVlXCIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChcbiAgICAvLyAjMTEwODEgZm9yY2Ugc2V0IHByb3BzIGZvciBwb3NzaWJsZSBhc3luYyBjdXN0b20gZWxlbWVudFxuICAgIGVsLl9pc1Z1ZUNFICYmICgvW0EtWl0vLnRlc3Qoa2V5KSB8fCAhaXNTdHJpbmcobmV4dFZhbHVlKSlcbiAgKSB7XG4gICAgcGF0Y2hET01Qcm9wKGVsLCBjYW1lbGl6ZSQxKGtleSksIG5leHRWYWx1ZSwgcGFyZW50Q29tcG9uZW50LCBrZXkpO1xuICB9IGVsc2Uge1xuICAgIGlmIChrZXkgPT09IFwidHJ1ZS12YWx1ZVwiKSB7XG4gICAgICBlbC5fdHJ1ZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImZhbHNlLXZhbHVlXCIpIHtcbiAgICAgIGVsLl9mYWxzZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH1cbiAgICBwYXRjaEF0dHIoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRyk7XG4gIH1cbn07XG5mdW5jdGlvbiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgdmFsdWUsIGlzU1ZHKSB7XG4gIGlmIChpc1NWRykge1xuICAgIGlmIChrZXkgPT09IFwiaW5uZXJIVE1MXCIgfHwga2V5ID09PSBcInRleHRDb250ZW50XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoa2V5IGluIGVsICYmIGlzTmF0aXZlT24oa2V5KSAmJiBpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcInNwZWxsY2hlY2tcIiB8fCBrZXkgPT09IFwiZHJhZ2dhYmxlXCIgfHwga2V5ID09PSBcInRyYW5zbGF0ZVwiIHx8IGtleSA9PT0gXCJhdXRvY29ycmVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwiZm9ybVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwibGlzdFwiICYmIGVsLnRhZ05hbWUgPT09IFwiSU5QVVRcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcInR5cGVcIiAmJiBlbC50YWdOYW1lID09PSBcIlRFWFRBUkVBXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJ3aWR0aFwiIHx8IGtleSA9PT0gXCJoZWlnaHRcIikge1xuICAgIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gICAgaWYgKHRhZyA9PT0gXCJJTUdcIiB8fCB0YWcgPT09IFwiVklERU9cIiB8fCB0YWcgPT09IFwiQ0FOVkFTXCIgfHwgdGFnID09PSBcIlNPVVJDRVwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc05hdGl2ZU9uKGtleSkgJiYgaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBrZXkgaW4gZWw7XG59XG5cbmNvbnN0IFJFTU9WQUwgPSB7fTtcbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUN1c3RvbUVsZW1lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zLCBfY3JlYXRlQXBwKSB7XG4gIGNvbnN0IENvbXAgPSBkZWZpbmVDb21wb25lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zKTtcbiAgaWYgKGlzUGxhaW5PYmplY3QoQ29tcCkpIGV4dGVuZChDb21wLCBleHRyYU9wdGlvbnMpO1xuICBjbGFzcyBWdWVDdXN0b21FbGVtZW50IGV4dGVuZHMgVnVlRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoaW5pdGlhbFByb3BzKSB7XG4gICAgICBzdXBlcihDb21wLCBpbml0aWFsUHJvcHMsIF9jcmVhdGVBcHApO1xuICAgIH1cbiAgfVxuICBWdWVDdXN0b21FbGVtZW50LmRlZiA9IENvbXA7XG4gIHJldHVybiBWdWVDdXN0b21FbGVtZW50O1xufVxuXG5jb25zdCBkZWZpbmVTU1JDdXN0b21FbGVtZW50ID0gKC8qIEBfX05PX1NJREVfRUZGRUNUU19fICovIChvcHRpb25zLCBleHRyYU9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBkZWZpbmVDdXN0b21FbGVtZW50KG9wdGlvbnMsIGV4dHJhT3B0aW9ucywgY3JlYXRlU1NSQXBwKTtcbn0pO1xuY29uc3QgQmFzZUNsYXNzID0gdHlwZW9mIEhUTUxFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gSFRNTEVsZW1lbnQgOiBjbGFzcyB7XG59O1xuY2xhc3MgVnVlRWxlbWVudCBleHRlbmRzIEJhc2VDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKF9kZWYsIF9wcm9wcyA9IHt9LCBfY3JlYXRlQXBwID0gY3JlYXRlQXBwKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9kZWYgPSBfZGVmO1xuICAgIHRoaXMuX3Byb3BzID0gX3Byb3BzO1xuICAgIHRoaXMuX2NyZWF0ZUFwcCA9IF9jcmVhdGVBcHA7XG4gICAgdGhpcy5faXNWdWVDRSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2FwcCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fbm9uY2UgPSB0aGlzLl9kZWYubm9uY2U7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVzb2x2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9udW1iZXJQcm9wcyA9IG51bGw7XG4gICAgdGhpcy5fc3R5bGVDaGlsZHJlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICBpZiAodGhpcy5zaGFkb3dSb290ICYmIF9jcmVhdGVBcHAgIT09IGNyZWF0ZUFwcCkge1xuICAgICAgdGhpcy5fcm9vdCA9IHRoaXMuc2hhZG93Um9vdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYEN1c3RvbSBlbGVtZW50IGhhcyBwcmUtcmVuZGVyZWQgZGVjbGFyYXRpdmUgc2hhZG93IHJvb3QgYnV0IGlzIG5vdCBkZWZpbmVkIGFzIGh5ZHJhdGFibGUuIFVzZSBcXGBkZWZpbmVTU1JDdXN0b21FbGVtZW50XFxgLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChfZGVmLnNoYWRvd1Jvb3QgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogXCJvcGVuXCIgfSk7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSB0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yb290ID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnNoYWRvd1Jvb3QgJiYgIXRoaXMuX3Jlc29sdmVkKSB7XG4gICAgICB0aGlzLl9wYXJzZVNsb3RzKCk7XG4gICAgfVxuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgbGV0IHBhcmVudCA9IHRoaXM7XG4gICAgd2hpbGUgKHBhcmVudCA9IHBhcmVudCAmJiAocGFyZW50LnBhcmVudE5vZGUgfHwgcGFyZW50Lmhvc3QpKSB7XG4gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVnVlRWxlbWVudCkge1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICBpZiAodGhpcy5fcmVzb2x2ZWQpIHtcbiAgICAgICAgdGhpcy5fbW91bnQodGhpcy5fZGVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nUmVzb2x2ZSkge1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZXNvbHZlID0gcGFyZW50Ll9wZW5kaW5nUmVzb2x2ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZXNvbHZlID0gdm9pZCAwO1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZURlZigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3Jlc29sdmVEZWYoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBfc2V0UGFyZW50KHBhcmVudCA9IHRoaXMuX3BhcmVudCkge1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHRoaXMuX2luc3RhbmNlLnBhcmVudCA9IHBhcmVudC5faW5zdGFuY2U7XG4gICAgICB0aGlzLl9pbmhlcml0UGFyZW50Q29udGV4dChwYXJlbnQpO1xuICAgIH1cbiAgfVxuICBfaW5oZXJpdFBhcmVudENvbnRleHQocGFyZW50ID0gdGhpcy5fcGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCAmJiB0aGlzLl9hcHApIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihcbiAgICAgICAgdGhpcy5fYXBwLl9jb250ZXh0LnByb3ZpZGVzLFxuICAgICAgICBwYXJlbnQuX2luc3RhbmNlLnByb3ZpZGVzXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkge1xuICAgICAgICBpZiAodGhpcy5fb2IpIHtcbiAgICAgICAgICB0aGlzLl9vYi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgdGhpcy5fb2IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FwcCAmJiB0aGlzLl9hcHAudW5tb3VudCgpO1xuICAgICAgICBpZiAodGhpcy5faW5zdGFuY2UpIHRoaXMuX2luc3RhbmNlLmNlID0gdm9pZCAwO1xuICAgICAgICB0aGlzLl9hcHAgPSB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIHJlc29sdmUgaW5uZXIgY29tcG9uZW50IGRlZmluaXRpb24gKGhhbmRsZSBwb3NzaWJsZSBhc3luYyBjb21wb25lbnQpXG4gICAqL1xuICBfcmVzb2x2ZURlZigpIHtcbiAgICBpZiAodGhpcy5fcGVuZGluZ1Jlc29sdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX3NldEF0dHIodGhpcy5hdHRyaWJ1dGVzW2ldLm5hbWUpO1xuICAgIH1cbiAgICB0aGlzLl9vYiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbSBvZiBtdXRhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fc2V0QXR0cihtLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX29iLm9ic2VydmUodGhpcywgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IHJlc29sdmUgPSAoZGVmLCBpc0FzeW5jID0gZmFsc2UpID0+IHtcbiAgICAgIHRoaXMuX3Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZXNvbHZlID0gdm9pZCAwO1xuICAgICAgY29uc3QgeyBwcm9wcywgc3R5bGVzIH0gPSBkZWY7XG4gICAgICBsZXQgbnVtYmVyUHJvcHM7XG4gICAgICBpZiAocHJvcHMgJiYgIWlzQXJyYXkocHJvcHMpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgY29uc3Qgb3B0ID0gcHJvcHNba2V5XTtcbiAgICAgICAgICBpZiAob3B0ID09PSBOdW1iZXIgfHwgb3B0ICYmIG9wdC50eXBlID09PSBOdW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkgaW4gdGhpcy5fcHJvcHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJvcHNba2V5XSA9IHRvTnVtYmVyKHRoaXMuX3Byb3BzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKG51bWJlclByb3BzIHx8IChudW1iZXJQcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpKSlbY2FtZWxpemUkMShrZXkpXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9udW1iZXJQcm9wcyA9IG51bWJlclByb3BzO1xuICAgICAgdGhpcy5fcmVzb2x2ZVByb3BzKGRlZik7XG4gICAgICBpZiAodGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIHRoaXMuX2FwcGx5U3R5bGVzKHN0eWxlcyk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc3R5bGVzKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJDdXN0b20gZWxlbWVudCBzdHlsZSBpbmplY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aGVuIHVzaW5nIHNoYWRvd1Jvb3Q6IGZhbHNlXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX21vdW50KGRlZik7XG4gICAgfTtcbiAgICBjb25zdCBhc3luY0RlZiA9IHRoaXMuX2RlZi5fX2FzeW5jTG9hZGVyO1xuICAgIGlmIChhc3luY0RlZikge1xuICAgICAgdGhpcy5fcGVuZGluZ1Jlc29sdmUgPSBhc3luY0RlZigpLnRoZW4oKGRlZikgPT4ge1xuICAgICAgICBkZWYuY29uZmlndXJlQXBwID0gdGhpcy5fZGVmLmNvbmZpZ3VyZUFwcDtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLl9kZWYgPSBkZWYsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodGhpcy5fZGVmKTtcbiAgICB9XG4gIH1cbiAgX21vdW50KGRlZikge1xuICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pICYmICFkZWYubmFtZSkge1xuICAgICAgZGVmLm5hbWUgPSBcIlZ1ZUVsZW1lbnRcIjtcbiAgICB9XG4gICAgdGhpcy5fYXBwID0gdGhpcy5fY3JlYXRlQXBwKGRlZik7XG4gICAgdGhpcy5faW5oZXJpdFBhcmVudENvbnRleHQoKTtcbiAgICBpZiAoZGVmLmNvbmZpZ3VyZUFwcCkge1xuICAgICAgZGVmLmNvbmZpZ3VyZUFwcCh0aGlzLl9hcHApO1xuICAgIH1cbiAgICB0aGlzLl9hcHAuX2NlVk5vZGUgPSB0aGlzLl9jcmVhdGVWTm9kZSgpO1xuICAgIHRoaXMuX2FwcC5tb3VudCh0aGlzLl9yb290KTtcbiAgICBjb25zdCBleHBvc2VkID0gdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5zdGFuY2UuZXhwb3NlZDtcbiAgICBpZiAoIWV4cG9zZWQpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBleHBvc2VkKSB7XG4gICAgICBpZiAoIWhhc093bih0aGlzLCBrZXkpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgICAvLyB1bndyYXAgcmVmIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBwdWJsaWMgaW5zdGFuY2UgYmVoYXZpb3JcbiAgICAgICAgICBnZXQ6ICgpID0+IHVucmVmKGV4cG9zZWRba2V5XSlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgd2FybihgRXhwb3NlZCBwcm9wZXJ0eSBcIiR7a2V5fVwiIGFscmVhZHkgZXhpc3RzIG9uIGN1c3RvbSBlbGVtZW50LmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfcmVzb2x2ZVByb3BzKGRlZikge1xuICAgIGNvbnN0IHsgcHJvcHMgfSA9IGRlZjtcbiAgICBjb25zdCBkZWNsYXJlZFByb3BLZXlzID0gaXNBcnJheShwcm9wcykgPyBwcm9wcyA6IE9iamVjdC5rZXlzKHByb3BzIHx8IHt9KTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzKSkge1xuICAgICAgaWYgKGtleVswXSAhPT0gXCJfXCIgJiYgZGVjbGFyZWRQcm9wS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuX3NldFByb3Aoa2V5LCB0aGlzW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWNsYXJlZFByb3BLZXlzLm1hcChjYW1lbGl6ZSQxKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3Aoa2V5KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbCkge1xuICAgICAgICAgIHRoaXMuX3NldFByb3Aoa2V5LCB2YWwsIHRydWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgX3NldEF0dHIoa2V5KSB7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKFwiZGF0YS12LVwiKSkgcmV0dXJuO1xuICAgIGNvbnN0IGhhcyA9IHRoaXMuaGFzQXR0cmlidXRlKGtleSk7XG4gICAgbGV0IHZhbHVlID0gaGFzID8gdGhpcy5nZXRBdHRyaWJ1dGUoa2V5KSA6IFJFTU9WQUw7XG4gICAgY29uc3QgY2FtZWxLZXkgPSBjYW1lbGl6ZSQxKGtleSk7XG4gICAgaWYgKGhhcyAmJiB0aGlzLl9udW1iZXJQcm9wcyAmJiB0aGlzLl9udW1iZXJQcm9wc1tjYW1lbEtleV0pIHtcbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRQcm9wKGNhbWVsS2V5LCB2YWx1ZSwgZmFsc2UsIHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9nZXRQcm9wKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9wcm9wc1trZXldO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9zZXRQcm9wKGtleSwgdmFsLCBzaG91bGRSZWZsZWN0ID0gdHJ1ZSwgc2hvdWxkVXBkYXRlID0gZmFsc2UpIHtcbiAgICBpZiAodmFsICE9PSB0aGlzLl9wcm9wc1trZXldKSB7XG4gICAgICBpZiAodmFsID09PSBSRU1PVkFMKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9wcm9wc1trZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcHJvcHNba2V5XSA9IHZhbDtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJrZXlcIiAmJiB0aGlzLl9hcHApIHtcbiAgICAgICAgICB0aGlzLl9hcHAuX2NlVk5vZGUua2V5ID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlICYmIHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJlZmxlY3QpIHtcbiAgICAgICAgY29uc3Qgb2IgPSB0aGlzLl9vYjtcbiAgICAgICAgb2IgJiYgb2IuZGlzY29ubmVjdCgpO1xuICAgICAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoaHlwaGVuYXRlKGtleSksIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpLCB2YWwgKyBcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmICghdmFsKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoaHlwaGVuYXRlKGtleSkpO1xuICAgICAgICB9XG4gICAgICAgIG9iICYmIG9iLm9ic2VydmUodGhpcywgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfdXBkYXRlKCkge1xuICAgIGNvbnN0IHZub2RlID0gdGhpcy5fY3JlYXRlVk5vZGUoKTtcbiAgICBpZiAodGhpcy5fYXBwKSB2bm9kZS5hcHBDb250ZXh0ID0gdGhpcy5fYXBwLl9jb250ZXh0O1xuICAgIHJlbmRlcih2bm9kZSwgdGhpcy5fcm9vdCk7XG4gIH1cbiAgX2NyZWF0ZVZOb2RlKCkge1xuICAgIGNvbnN0IGJhc2VQcm9wcyA9IHt9O1xuICAgIGlmICghdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICBiYXNlUHJvcHMub25Wbm9kZU1vdW50ZWQgPSBiYXNlUHJvcHMub25Wbm9kZVVwZGF0ZWQgPSB0aGlzLl9yZW5kZXJTbG90cy5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHRoaXMuX2RlZiwgZXh0ZW5kKGJhc2VQcm9wcywgdGhpcy5fcHJvcHMpKTtcbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICB2bm9kZS5jZSA9IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBpbnN0YW5jZS5jZSA9IHRoaXM7XG4gICAgICAgIGluc3RhbmNlLmlzQ0UgPSB0cnVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGluc3RhbmNlLmNlUmVsb2FkID0gKG5ld1N0eWxlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlcykge1xuICAgICAgICAgICAgICB0aGlzLl9zdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5fcm9vdC5yZW1vdmVDaGlsZChzKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N0eWxlcy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXBwbHlTdHlsZXMobmV3U3R5bGVzKTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzcGF0Y2ggPSAoZXZlbnQsIGFyZ3MpID0+IHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoXG4gICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICBpc1BsYWluT2JqZWN0KGFyZ3NbMF0pID8gZXh0ZW5kKHsgZGV0YWlsOiBhcmdzIH0sIGFyZ3NbMF0pIDogeyBkZXRhaWw6IGFyZ3MgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICAgIGluc3RhbmNlLmVtaXQgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBkaXNwYXRjaChldmVudCwgYXJncyk7XG4gICAgICAgICAgaWYgKGh5cGhlbmF0ZShldmVudCkgIT09IGV2ZW50KSB7XG4gICAgICAgICAgICBkaXNwYXRjaChoeXBoZW5hdGUoZXZlbnQpLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3NldFBhcmVudCgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG4gIF9hcHBseVN0eWxlcyhzdHlsZXMsIG93bmVyKSB7XG4gICAgaWYgKCFzdHlsZXMpIHJldHVybjtcbiAgICBpZiAob3duZXIpIHtcbiAgICAgIGlmIChvd25lciA9PT0gdGhpcy5fZGVmIHx8IHRoaXMuX3N0eWxlQ2hpbGRyZW4uaGFzKG93bmVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9zdHlsZUNoaWxkcmVuLmFkZChvd25lcik7XG4gICAgfVxuICAgIGNvbnN0IG5vbmNlID0gdGhpcy5fbm9uY2U7XG4gICAgZm9yIChsZXQgaSA9IHN0eWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgIGlmIChub25jZSkgcy5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gICAgICBzLnRleHRDb250ZW50ID0gc3R5bGVzW2ldO1xuICAgICAgdGhpcy5zaGFkb3dSb290LnByZXBlbmQocyk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgICBpZiAob3duZXIuX19obXJJZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFN0eWxlcykgdGhpcy5fY2hpbGRTdHlsZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5fY2hpbGRTdHlsZXMuZ2V0KG93bmVyLl9faG1ySWQpO1xuICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICB0aGlzLl9jaGlsZFN0eWxlcy5zZXQob3duZXIuX19obXJJZCwgZW50cnkgPSBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS5wdXNoKHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAodGhpcy5fc3R5bGVzIHx8ICh0aGlzLl9zdHlsZXMgPSBbXSkpLnB1c2gocyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIE9ubHkgY2FsbGVkIHdoZW4gc2hhZG93Um9vdCBpcyBmYWxzZVxuICAgKi9cbiAgX3BhcnNlU2xvdHMoKSB7XG4gICAgY29uc3Qgc2xvdHMgPSB0aGlzLl9zbG90cyA9IHt9O1xuICAgIGxldCBuO1xuICAgIHdoaWxlIChuID0gdGhpcy5maXJzdENoaWxkKSB7XG4gICAgICBjb25zdCBzbG90TmFtZSA9IG4ubm9kZVR5cGUgPT09IDEgJiYgbi5nZXRBdHRyaWJ1dGUoXCJzbG90XCIpIHx8IFwiZGVmYXVsdFwiO1xuICAgICAgKHNsb3RzW3Nsb3ROYW1lXSB8fCAoc2xvdHNbc2xvdE5hbWVdID0gW10pKS5wdXNoKG4pO1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZChuKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIE9ubHkgY2FsbGVkIHdoZW4gc2hhZG93Um9vdCBpcyBmYWxzZVxuICAgKi9cbiAgX3JlbmRlclNsb3RzKCkge1xuICAgIGNvbnN0IG91dGxldHMgPSAodGhpcy5fdGVsZXBvcnRUYXJnZXQgfHwgdGhpcykucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG4gICAgY29uc3Qgc2NvcGVJZCA9IHRoaXMuX2luc3RhbmNlLnR5cGUuX19zY29wZUlkO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0bGV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbyA9IG91dGxldHNbaV07XG4gICAgICBjb25zdCBzbG90TmFtZSA9IG8uZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcImRlZmF1bHRcIjtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9zbG90c1tzbG90TmFtZV07XG4gICAgICBjb25zdCBwYXJlbnQgPSBvLnBhcmVudE5vZGU7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgY29udGVudCkge1xuICAgICAgICAgIGlmIChzY29wZUlkICYmIG4ubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2NvcGVJZCArIFwiLXNcIjtcbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIobiwgMSk7XG4gICAgICAgICAgICBuLnNldEF0dHJpYnV0ZShpZCwgXCJcIik7XG4gICAgICAgICAgICBsZXQgY2hpbGQ7XG4gICAgICAgICAgICB3aGlsZSAoY2hpbGQgPSB3YWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoaWQsIFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG4sIG8pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoby5maXJzdENoaWxkKSBwYXJlbnQuaW5zZXJ0QmVmb3JlKG8uZmlyc3RDaGlsZCwgbyk7XG4gICAgICB9XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9pbmplY3RDaGlsZFN0eWxlKGNvbXApIHtcbiAgICB0aGlzLl9hcHBseVN0eWxlcyhjb21wLnN0eWxlcywgY29tcCk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3JlbW92ZUNoaWxkU3R5bGUoY29tcCkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0aGlzLl9zdHlsZUNoaWxkcmVuLmRlbGV0ZShjb21wKTtcbiAgICAgIGlmICh0aGlzLl9jaGlsZFN0eWxlcyAmJiBjb21wLl9faG1ySWQpIHtcbiAgICAgICAgY29uc3Qgb2xkU3R5bGVzID0gdGhpcy5fY2hpbGRTdHlsZXMuZ2V0KGNvbXAuX19obXJJZCk7XG4gICAgICAgIGlmIChvbGRTdHlsZXMpIHtcbiAgICAgICAgICBvbGRTdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5fcm9vdC5yZW1vdmVDaGlsZChzKSk7XG4gICAgICAgICAgb2xkU3R5bGVzLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZUhvc3QoY2FsbGVyKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGNvbnN0IGVsID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuY2U7XG4gIGlmIChlbCkge1xuICAgIHJldHVybiBlbDtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgd2FybihcbiAgICAgICAgYCR7Y2FsbGVyIHx8IFwidXNlSG9zdFwifSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlLmBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGAke2NhbGxlciB8fCBcInVzZUhvc3RcIn0gY2FuIG9ubHkgYmUgdXNlZCBpbiBjb21wb25lbnRzIGRlZmluZWQgdmlhIGRlZmluZUN1c3RvbUVsZW1lbnQuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1c2VTaGFkb3dSb290KCkge1xuICBjb25zdCBlbCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB1c2VIb3N0KFwidXNlU2hhZG93Um9vdFwiKSA6IHVzZUhvc3QoKTtcbiAgcmV0dXJuIGVsICYmIGVsLnNoYWRvd1Jvb3Q7XG59XG5cbmZ1bmN0aW9uIHVzZUNzc01vZHVsZShuYW1lID0gXCIkc3R5bGVcIikge1xuICB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc01vZHVsZSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgc2V0dXAoKWApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlcyA9IGluc3RhbmNlLnR5cGUuX19jc3NNb2R1bGVzO1xuICAgIGlmICghbW9kdWxlcykge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSBtb2R1bGVzW25hbWVdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYEN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlIG5hbWVkIFwiJHtuYW1lfVwiLmApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgcmV0dXJuIG1vZDtcbiAgfVxufVxuXG5jb25zdCBwb3NpdGlvbk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgbmV3UG9zaXRpb25NYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG1vdmVDYktleSA9IFN5bWJvbChcIl9tb3ZlQ2JcIik7XG5jb25zdCBlbnRlckNiS2V5ID0gU3ltYm9sKFwiX2VudGVyQ2JcIik7XG5jb25zdCBkZWNvcmF0ZSA9ICh0KSA9PiB7XG4gIGRlbGV0ZSB0LnByb3BzLm1vZGU7XG4gIHJldHVybiB0O1xufTtcbmNvbnN0IFRyYW5zaXRpb25Hcm91cEltcGwgPSAvKiBAX19QVVJFX18gKi8gZGVjb3JhdGUoe1xuICBuYW1lOiBcIlRyYW5zaXRpb25Hcm91cFwiLFxuICBwcm9wczogLyogQF9fUFVSRV9fICovIGV4dGVuZCh7fSwgVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywge1xuICAgIHRhZzogU3RyaW5nLFxuICAgIG1vdmVDbGFzczogU3RyaW5nXG4gIH0pLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgIGxldCBwcmV2Q2hpbGRyZW47XG4gICAgbGV0IGNoaWxkcmVuO1xuICAgIG9uVXBkYXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIXByZXZDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUNsYXNzID0gcHJvcHMubW92ZUNsYXNzIHx8IGAke3Byb3BzLm5hbWUgfHwgXCJ2XCJ9LW1vdmVgO1xuICAgICAgaWYgKCFoYXNDU1NUcmFuc2Zvcm0oXG4gICAgICAgIHByZXZDaGlsZHJlblswXS5lbCxcbiAgICAgICAgaW5zdGFuY2Uudm5vZGUuZWwsXG4gICAgICAgIG1vdmVDbGFzc1xuICAgICAgKSkge1xuICAgICAgICBwcmV2Q2hpbGRyZW4gPSBbXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcHJldkNoaWxkcmVuLmZvckVhY2goY2FsbFBlbmRpbmdDYnMpO1xuICAgICAgcHJldkNoaWxkcmVuLmZvckVhY2gocmVjb3JkUG9zaXRpb24pO1xuICAgICAgY29uc3QgbW92ZWRDaGlsZHJlbiA9IHByZXZDaGlsZHJlbi5maWx0ZXIoYXBwbHlUcmFuc2xhdGlvbik7XG4gICAgICBmb3JjZVJlZmxvdygpO1xuICAgICAgbW92ZWRDaGlsZHJlbi5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsID0gYy5lbDtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSBzdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBcIlwiO1xuICAgICAgICBjb25zdCBjYiA9IGVsW21vdmVDYktleV0gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlICYmIGUudGFyZ2V0ICE9PSBlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCBjYik7XG4gICAgICAgICAgICBlbFttb3ZlQ2JLZXldID0gbnVsbDtcbiAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGNiKTtcbiAgICAgIH0pO1xuICAgICAgcHJldkNoaWxkcmVuID0gW107XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgY3NzVHJhbnNpdGlvblByb3BzID0gcmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyhyYXdQcm9wcyk7XG4gICAgICBsZXQgdGFnID0gcmF3UHJvcHMudGFnIHx8IEZyYWdtZW50O1xuICAgICAgcHJldkNoaWxkcmVuID0gW107XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgaWYgKGNoaWxkLmVsICYmIGNoaWxkLmVsIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgcHJldkNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICBjc3NUcmFuc2l0aW9uUHJvcHMsXG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChcbiAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgIGNoaWxkLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ID8gZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSkgOiBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKGNoaWxkLCBjc3NUcmFuc2l0aW9uUHJvcHMsIHN0YXRlLCBpbnN0YW5jZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hpbGQudHlwZSAhPT0gVGV4dCkge1xuICAgICAgICAgIHdhcm4oYDxUcmFuc2l0aW9uR3JvdXA+IGNoaWxkcmVuIG11c3QgYmUga2V5ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0YWcsIG51bGwsIGNoaWxkcmVuKTtcbiAgICB9O1xuICB9XG59KTtcbmNvbnN0IFRyYW5zaXRpb25Hcm91cCA9IFRyYW5zaXRpb25Hcm91cEltcGw7XG5mdW5jdGlvbiBjYWxsUGVuZGluZ0NicyhjKSB7XG4gIGNvbnN0IGVsID0gYy5lbDtcbiAgaWYgKGVsW21vdmVDYktleV0pIHtcbiAgICBlbFttb3ZlQ2JLZXldKCk7XG4gIH1cbiAgaWYgKGVsW2VudGVyQ2JLZXldKSB7XG4gICAgZWxbZW50ZXJDYktleV0oKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVjb3JkUG9zaXRpb24oYykge1xuICBuZXdQb3NpdGlvbk1hcC5zZXQoYywgYy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG59XG5mdW5jdGlvbiBhcHBseVRyYW5zbGF0aW9uKGMpIHtcbiAgY29uc3Qgb2xkUG9zID0gcG9zaXRpb25NYXAuZ2V0KGMpO1xuICBjb25zdCBuZXdQb3MgPSBuZXdQb3NpdGlvbk1hcC5nZXQoYyk7XG4gIGNvbnN0IGR4ID0gb2xkUG9zLmxlZnQgLSBuZXdQb3MubGVmdDtcbiAgY29uc3QgZHkgPSBvbGRQb3MudG9wIC0gbmV3UG9zLnRvcDtcbiAgaWYgKGR4IHx8IGR5KSB7XG4gICAgY29uc3QgcyA9IGMuZWwuc3R5bGU7XG4gICAgcy50cmFuc2Zvcm0gPSBzLndlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkeH1weCwke2R5fXB4KWA7XG4gICAgcy50cmFuc2l0aW9uRHVyYXRpb24gPSBcIjBzXCI7XG4gICAgcmV0dXJuIGM7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0NTU1RyYW5zZm9ybShlbCwgcm9vdCwgbW92ZUNsYXNzKSB7XG4gIGNvbnN0IGNsb25lID0gZWwuY2xvbmVOb2RlKCk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZm9yRWFjaCgoY2xzKSA9PiB7XG4gICAgICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGNsb25lLmNsYXNzTGlzdC5yZW1vdmUoYykpO1xuICAgIH0pO1xuICB9XG4gIG1vdmVDbGFzcy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgY2xvbmUuY2xhc3NMaXN0LmFkZChjKSk7XG4gIGNsb25lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgY29uc3QgY29udGFpbmVyID0gcm9vdC5ub2RlVHlwZSA9PT0gMSA/IHJvb3QgOiByb290LnBhcmVudE5vZGU7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjbG9uZSk7XG4gIGNvbnN0IHsgaGFzVHJhbnNmb3JtIH0gPSBnZXRUcmFuc2l0aW9uSW5mbyhjbG9uZSk7XG4gIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjbG9uZSk7XG4gIHJldHVybiBoYXNUcmFuc2Zvcm07XG59XG5cbmNvbnN0IGdldE1vZGVsQXNzaWduZXIgPSAodm5vZGUpID0+IHtcbiAgY29uc3QgZm4gPSB2bm9kZS5wcm9wc1tcIm9uVXBkYXRlOm1vZGVsVmFsdWVcIl0gfHwgZmFsc2U7XG4gIHJldHVybiBpc0FycmF5KGZuKSA/ICh2YWx1ZSkgPT4gaW52b2tlQXJyYXlGbnMoZm4sIHZhbHVlKSA6IGZuO1xufTtcbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydChlKSB7XG4gIGUudGFyZ2V0LmNvbXBvc2luZyA9IHRydWU7XG59XG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kKGUpIHtcbiAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gIGlmICh0YXJnZXQuY29tcG9zaW5nKSB7XG4gICAgdGFyZ2V0LmNvbXBvc2luZyA9IGZhbHNlO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIpKTtcbiAgfVxufVxuY29uc3QgYXNzaWduS2V5ID0gU3ltYm9sKFwiX2Fzc2lnblwiKTtcbmNvbnN0IHZNb2RlbFRleHQgPSB7XG4gIGNyZWF0ZWQoZWwsIHsgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGNvbnN0IGNhc3RUb051bWJlciA9IG51bWJlciB8fCB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlID09PSBcIm51bWJlclwiO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIGxhenkgPyBcImNoYW5nZVwiIDogXCJpbnB1dFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmNvbXBvc2luZykgcmV0dXJuO1xuICAgICAgbGV0IGRvbVZhbHVlID0gZWwudmFsdWU7XG4gICAgICBpZiAodHJpbSkge1xuICAgICAgICBkb21WYWx1ZSA9IGRvbVZhbHVlLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYXN0VG9OdW1iZXIpIHtcbiAgICAgICAgZG9tVmFsdWUgPSBsb29zZVRvTnVtYmVyKGRvbVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsW2Fzc2lnbktleV0oZG9tVmFsdWUpO1xuICAgIH0pO1xuICAgIGlmICh0cmltKSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgIGVsLnZhbHVlID0gZWwudmFsdWUudHJpbSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghbGF6eSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjb21wb3NpdGlvbnN0YXJ0XCIsIG9uQ29tcG9zaXRpb25TdGFydCk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNvbXBvc2l0aW9uZW5kXCIsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgb25Db21wb3NpdGlvbkVuZCk7XG4gICAgfVxuICB9LFxuICAvLyBzZXQgdmFsdWUgb24gbW91bnRlZCBzbyBpdCdzIGFmdGVyIG1pbi9tYXggZm9yIHR5cGU9XCJyYW5nZVwiXG4gIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSkge1xuICAgIGVsLnZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCB7IHZhbHVlLCBvbGRWYWx1ZSwgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGlmIChlbC5jb21wb3NpbmcpIHJldHVybjtcbiAgICBjb25zdCBlbFZhbHVlID0gKG51bWJlciB8fCBlbC50eXBlID09PSBcIm51bWJlclwiKSAmJiAhL14wXFxkLy50ZXN0KGVsLnZhbHVlKSA/IGxvb3NlVG9OdW1iZXIoZWwudmFsdWUpIDogZWwudmFsdWU7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlO1xuICAgIGlmIChlbFZhbHVlID09PSBuZXdWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWwgJiYgZWwudHlwZSAhPT0gXCJyYW5nZVwiKSB7XG4gICAgICBpZiAobGF6eSAmJiB2YWx1ZSA9PT0gb2xkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRyaW0gJiYgZWwudmFsdWUudHJpbSgpID09PSBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbn07XG5jb25zdCB2TW9kZWxDaGVja2JveCA9IHtcbiAgLy8gIzQwOTYgYXJyYXkgY2hlY2tib3hlcyBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gIGRlZXA6IHRydWUsXG4gIGNyZWF0ZWQoZWwsIF8sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSBlbC5fbW9kZWxWYWx1ZTtcbiAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IGdldFZhbHVlKGVsKTtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSBlbC5jaGVja2VkO1xuICAgICAgY29uc3QgYXNzaWduID0gZWxbYXNzaWduS2V5XTtcbiAgICAgIGlmIChpc0FycmF5KG1vZGVsVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbG9vc2VJbmRleE9mKG1vZGVsVmFsdWUsIGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gaW5kZXggIT09IC0xO1xuICAgICAgICBpZiAoY2hlY2tlZCAmJiAhZm91bmQpIHtcbiAgICAgICAgICBhc3NpZ24obW9kZWxWYWx1ZS5jb25jYXQoZWxlbWVudFZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrZWQgJiYgZm91bmQpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IFsuLi5tb2RlbFZhbHVlXTtcbiAgICAgICAgICBmaWx0ZXJlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIGFzc2lnbihmaWx0ZXJlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNTZXQobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgY2xvbmVkID0gbmV3IFNldChtb2RlbFZhbHVlKTtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjbG9uZWQuYWRkKGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xvbmVkLmRlbGV0ZShlbGVtZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2lnbihjbG9uZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzaWduKGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgLy8gc2V0IGluaXRpYWwgY2hlY2tlZCBvbiBtb3VudCB0byB3YWl0IGZvciB0cnVlLXZhbHVlL2ZhbHNlLXZhbHVlXG4gIG1vdW50ZWQ6IHNldENoZWNrZWQsXG4gIGJlZm9yZVVwZGF0ZShlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgc2V0Q2hlY2tlZChlbCwgYmluZGluZywgdm5vZGUpO1xuICB9XG59O1xuZnVuY3Rpb24gc2V0Q2hlY2tlZChlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgZWwuX21vZGVsVmFsdWUgPSB2YWx1ZTtcbiAgbGV0IGNoZWNrZWQ7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGNoZWNrZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKSA+IC0xO1xuICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIGNoZWNrZWQgPSB2YWx1ZS5oYXModm5vZGUucHJvcHMudmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PT0gb2xkVmFsdWUpIHJldHVybjtcbiAgICBjaGVja2VkID0gbG9vc2VFcXVhbCh2YWx1ZSwgZ2V0Q2hlY2tib3hWYWx1ZShlbCwgdHJ1ZSkpO1xuICB9XG4gIGlmIChlbC5jaGVja2VkICE9PSBjaGVja2VkKSB7XG4gICAgZWwuY2hlY2tlZCA9IGNoZWNrZWQ7XG4gIH1cbn1cbmNvbnN0IHZNb2RlbFJhZGlvID0ge1xuICBjcmVhdGVkKGVsLCB7IHZhbHVlIH0sIHZub2RlKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgZWxbYXNzaWduS2V5XShnZXRWYWx1ZShlbCkpO1xuICAgIH0pO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGlmICh2YWx1ZSAhPT0gb2xkVmFsdWUpIHtcbiAgICAgIGVsLmNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuY29uc3Qgdk1vZGVsU2VsZWN0ID0ge1xuICAvLyA8c2VsZWN0IG11bHRpcGxlPiB2YWx1ZSBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gIGRlZXA6IHRydWUsXG4gIGNyZWF0ZWQoZWwsIHsgdmFsdWUsIG1vZGlmaWVyczogeyBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGNvbnN0IGlzU2V0TW9kZWwgPSBpc1NldCh2YWx1ZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRWYWwgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZWwub3B0aW9ucywgKG8pID0+IG8uc2VsZWN0ZWQpLm1hcChcbiAgICAgICAgKG8pID0+IG51bWJlciA/IGxvb3NlVG9OdW1iZXIoZ2V0VmFsdWUobykpIDogZ2V0VmFsdWUobylcbiAgICAgICk7XG4gICAgICBlbFthc3NpZ25LZXldKFxuICAgICAgICBlbC5tdWx0aXBsZSA/IGlzU2V0TW9kZWwgPyBuZXcgU2V0KHNlbGVjdGVkVmFsKSA6IHNlbGVjdGVkVmFsIDogc2VsZWN0ZWRWYWxbMF1cbiAgICAgICk7XG4gICAgICBlbC5fYXNzaWduaW5nID0gdHJ1ZTtcbiAgICAgIG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgZWwuX2Fzc2lnbmluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICB9LFxuICAvLyBzZXQgdmFsdWUgaW4gbW91bnRlZCAmIHVwZGF0ZWQgYmVjYXVzZSA8c2VsZWN0PiByZWxpZXMgb24gaXRzIGNoaWxkcmVuXG4gIC8vIDxvcHRpb24+cy5cbiAgbW91bnRlZChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCBfYmluZGluZywgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIHsgdmFsdWUgfSkge1xuICAgIGlmICghZWwuX2Fzc2lnbmluZykge1xuICAgICAgc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBzZXRTZWxlY3RlZChlbCwgdmFsdWUpIHtcbiAgY29uc3QgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlO1xuICBjb25zdCBpc0FycmF5VmFsdWUgPSBpc0FycmF5KHZhbHVlKTtcbiAgaWYgKGlzTXVsdGlwbGUgJiYgIWlzQXJyYXlWYWx1ZSAmJiAhaXNTZXQodmFsdWUpKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgYDxzZWxlY3QgbXVsdGlwbGUgdi1tb2RlbD4gZXhwZWN0cyBhbiBBcnJheSBvciBTZXQgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBidXQgZ290ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSl9LmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGxldCBpID0gMCwgbCA9IGVsLm9wdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gZWwub3B0aW9uc1tpXTtcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGdldFZhbHVlKG9wdGlvbik7XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uVHlwZSA9IHR5cGVvZiBvcHRpb25WYWx1ZTtcbiAgICAgICAgaWYgKG9wdGlvblR5cGUgPT09IFwic3RyaW5nXCIgfHwgb3B0aW9uVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHZhbHVlLnNvbWUoKHYpID0+IFN0cmluZyh2KSA9PT0gU3RyaW5nKG9wdGlvblZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbG9vc2VJbmRleE9mKHZhbHVlLCBvcHRpb25WYWx1ZSkgPiAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdmFsdWUuaGFzKG9wdGlvblZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7XG4gICAgICBpZiAoZWwuc2VsZWN0ZWRJbmRleCAhPT0gaSkgZWwuc2VsZWN0ZWRJbmRleCA9IGk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGlmICghaXNNdWx0aXBsZSAmJiBlbC5zZWxlY3RlZEluZGV4ICE9PSAtMSkge1xuICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VmFsdWUoZWwpIHtcbiAgcmV0dXJuIFwiX3ZhbHVlXCIgaW4gZWwgPyBlbC5fdmFsdWUgOiBlbC52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpIHtcbiAgY29uc3Qga2V5ID0gY2hlY2tlZCA/IFwiX3RydWVWYWx1ZVwiIDogXCJfZmFsc2VWYWx1ZVwiO1xuICByZXR1cm4ga2V5IGluIGVsID8gZWxba2V5XSA6IGNoZWNrZWQ7XG59XG5jb25zdCB2TW9kZWxEeW5hbWljID0ge1xuICBjcmVhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBudWxsLCBcImNyZWF0ZWRcIik7XG4gIH0sXG4gIG1vdW50ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIG51bGwsIFwibW91bnRlZFwiKTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgXCJiZWZvcmVVcGRhdGVcIik7XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBcInVwZGF0ZWRcIik7XG4gIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY01vZGVsKHRhZ05hbWUsIHR5cGUpIHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcIlNFTEVDVFwiOlxuICAgICAgcmV0dXJuIHZNb2RlbFNlbGVjdDtcbiAgICBjYXNlIFwiVEVYVEFSRUFcIjpcbiAgICAgIHJldHVybiB2TW9kZWxUZXh0O1xuICAgIGRlZmF1bHQ6XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbENoZWNrYm94O1xuICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsUmFkaW87XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbFRleHQ7XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIGhvb2spIHtcbiAgY29uc3QgbW9kZWxUb1VzZSA9IHJlc29sdmVEeW5hbWljTW9kZWwoXG4gICAgZWwudGFnTmFtZSxcbiAgICB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlXG4gICk7XG4gIGNvbnN0IGZuID0gbW9kZWxUb1VzZVtob29rXTtcbiAgZm4gJiYgZm4oZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpO1xufVxuZnVuY3Rpb24gaW5pdFZNb2RlbEZvclNTUigpIHtcbiAgdk1vZGVsVGV4dC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+ICh7IHZhbHVlIH0pO1xuICB2TW9kZWxSYWRpby5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0sIHZub2RlKSA9PiB7XG4gICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlRXF1YWwodm5vZGUucHJvcHMudmFsdWUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsQ2hlY2tib3guZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9LCB2bm9kZSkgPT4ge1xuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICBpZiAodm5vZGUucHJvcHMgJiYgdmFsdWUuaGFzKHZub2RlLnByb3BzLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsRHluYW1pYy5nZXRTU1JQcm9wcyA9IChiaW5kaW5nLCB2bm9kZSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygdm5vZGUudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RlbFRvVXNlID0gcmVzb2x2ZUR5bmFtaWNNb2RlbChcbiAgICAgIC8vIHJlc29sdmVEeW5hbWljTW9kZWwgZXhwZWN0cyBhbiB1cHBlcmNhc2UgdGFnIG5hbWUsIGJ1dCB2bm9kZS50eXBlIGlzIGxvd2VyY2FzZVxuICAgICAgdm5vZGUudHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZVxuICAgICk7XG4gICAgaWYgKG1vZGVsVG9Vc2UuZ2V0U1NSUHJvcHMpIHtcbiAgICAgIHJldHVybiBtb2RlbFRvVXNlLmdldFNTUlByb3BzKGJpbmRpbmcsIHZub2RlKTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IHN5c3RlbU1vZGlmaWVycyA9IFtcImN0cmxcIiwgXCJzaGlmdFwiLCBcImFsdFwiLCBcIm1ldGFcIl07XG5jb25zdCBtb2RpZmllckd1YXJkcyA9IHtcbiAgc3RvcDogKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCksXG4gIHByZXZlbnQ6IChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCksXG4gIHNlbGY6IChlKSA9PiBlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0LFxuICBjdHJsOiAoZSkgPT4gIWUuY3RybEtleSxcbiAgc2hpZnQ6IChlKSA9PiAhZS5zaGlmdEtleSxcbiAgYWx0OiAoZSkgPT4gIWUuYWx0S2V5LFxuICBtZXRhOiAoZSkgPT4gIWUubWV0YUtleSxcbiAgbGVmdDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMCxcbiAgbWlkZGxlOiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAxLFxuICByaWdodDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMixcbiAgZXhhY3Q6IChlLCBtb2RpZmllcnMpID0+IHN5c3RlbU1vZGlmaWVycy5zb21lKChtKSA9PiBlW2Ake219S2V5YF0gJiYgIW1vZGlmaWVycy5pbmNsdWRlcyhtKSlcbn07XG5jb25zdCB3aXRoTW9kaWZpZXJzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aE1vZHMgfHwgKGZuLl93aXRoTW9kcyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9ICgoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZ3VhcmQgPSBtb2RpZmllckd1YXJkc1ttb2RpZmllcnNbaV1dO1xuICAgICAgaWYgKGd1YXJkICYmIGd1YXJkKGV2ZW50LCBtb2RpZmllcnMpKSByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBmbihldmVudCwgLi4uYXJncyk7XG4gIH0pKTtcbn07XG5jb25zdCBrZXlOYW1lcyA9IHtcbiAgZXNjOiBcImVzY2FwZVwiLFxuICBzcGFjZTogXCIgXCIsXG4gIHVwOiBcImFycm93LXVwXCIsXG4gIGxlZnQ6IFwiYXJyb3ctbGVmdFwiLFxuICByaWdodDogXCJhcnJvdy1yaWdodFwiLFxuICBkb3duOiBcImFycm93LWRvd25cIixcbiAgZGVsZXRlOiBcImJhY2tzcGFjZVwiXG59O1xuY29uc3Qgd2l0aEtleXMgPSAoZm4sIG1vZGlmaWVycykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGZuLl93aXRoS2V5cyB8fCAoZm4uX3dpdGhLZXlzID0ge30pO1xuICBjb25zdCBjYWNoZUtleSA9IG1vZGlmaWVycy5qb2luKFwiLlwiKTtcbiAgcmV0dXJuIGNhY2hlW2NhY2hlS2V5XSB8fCAoY2FjaGVbY2FjaGVLZXldID0gKChldmVudCkgPT4ge1xuICAgIGlmICghKFwia2V5XCIgaW4gZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50S2V5ID0gaHlwaGVuYXRlKGV2ZW50LmtleSk7XG4gICAgaWYgKG1vZGlmaWVycy5zb21lKFxuICAgICAgKGspID0+IGsgPT09IGV2ZW50S2V5IHx8IGtleU5hbWVzW2tdID09PSBldmVudEtleVxuICAgICkpIHtcbiAgICAgIHJldHVybiBmbihldmVudCk7XG4gICAgfVxuICB9KSk7XG59O1xuXG5jb25zdCByZW5kZXJlck9wdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKHsgcGF0Y2hQcm9wIH0sIG5vZGVPcHMpO1xubGV0IHJlbmRlcmVyO1xubGV0IGVuYWJsZWRIeWRyYXRpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGVuc3VyZVJlbmRlcmVyKCkge1xuICByZXR1cm4gcmVuZGVyZXIgfHwgKHJlbmRlcmVyID0gY3JlYXRlUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpIHtcbiAgcmVuZGVyZXIgPSBlbmFibGVkSHlkcmF0aW9uID8gcmVuZGVyZXIgOiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuICBlbmFibGVkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlcmVyO1xufVxuY29uc3QgcmVuZGVyID0gKCguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZVJlbmRlcmVyKCkucmVuZGVyKC4uLmFyZ3MpO1xufSk7XG5jb25zdCBoeWRyYXRlID0gKCguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZUh5ZHJhdGlvblJlbmRlcmVyKCkuaHlkcmF0ZSguLi5hcmdzKTtcbn0pO1xuY29uc3QgY3JlYXRlQXBwID0gKCguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IGFwcCA9IGVuc3VyZVJlbmRlcmVyKCkuY3JlYXRlQXBwKC4uLmFyZ3MpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluamVjdE5hdGl2ZVRhZ0NoZWNrKGFwcCk7XG4gICAgaW5qZWN0Q29tcGlsZXJPcHRpb25zQ2hlY2soYXBwKTtcbiAgfVxuICBjb25zdCB7IG1vdW50IH0gPSBhcHA7XG4gIGFwcC5tb3VudCA9IChjb250YWluZXJPclNlbGVjdG9yKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyID0gbm9ybWFsaXplQ29udGFpbmVyKGNvbnRhaW5lck9yU2VsZWN0b3IpO1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3QgY29tcG9uZW50ID0gYXBwLl9jb21wb25lbnQ7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNvbXBvbmVudCkgJiYgIWNvbXBvbmVudC5yZW5kZXIgJiYgIWNvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgY29tcG9uZW50LnRlbXBsYXRlID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgY29udGFpbmVyLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICB9XG4gICAgY29uc3QgcHJveHkgPSBtb3VudChjb250YWluZXIsIGZhbHNlLCByZXNvbHZlUm9vdE5hbWVzcGFjZShjb250YWluZXIpKTtcbiAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShcInYtY2xvYWtcIik7XG4gICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS12LWFwcFwiLCBcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xuICByZXR1cm4gYXBwO1xufSk7XG5jb25zdCBjcmVhdGVTU1JBcHAgPSAoKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYXBwID0gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICB9XG4gIGNvbnN0IHsgbW91bnQgfSA9IGFwcDtcbiAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyT3JTZWxlY3Rvcik7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIG1vdW50KGNvbnRhaW5lciwgdHJ1ZSwgcmVzb2x2ZVJvb3ROYW1lc3BhY2UoY29udGFpbmVyKSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYXBwO1xufSk7XG5mdW5jdGlvbiByZXNvbHZlUm9vdE5hbWVzcGFjZShjb250YWluZXIpIHtcbiAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICByZXR1cm4gXCJzdmdcIjtcbiAgfVxuICBpZiAodHlwZW9mIE1hdGhNTEVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIiAmJiBjb250YWluZXIgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50KSB7XG4gICAgcmV0dXJuIFwibWF0aG1sXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdE5hdGl2ZVRhZ0NoZWNrKGFwcCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJpc05hdGl2ZVRhZ1wiLCB7XG4gICAgdmFsdWU6ICh0YWcpID0+IGlzSFRNTFRhZyh0YWcpIHx8IGlzU1ZHVGFnKHRhZykgfHwgaXNNYXRoTUxUYWcodGFnKSxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG59XG5mdW5jdGlvbiBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApIHtcbiAgaWYgKGlzUnVudGltZU9ubHkoKSkge1xuICAgIGNvbnN0IGlzQ3VzdG9tRWxlbWVudCA9IGFwcC5jb25maWcuaXNDdXN0b21FbGVtZW50O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCBcImlzQ3VzdG9tRWxlbWVudFwiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpc0N1c3RvbUVsZW1lbnQ7XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBUaGUgXFxgaXNDdXN0b21FbGVtZW50XFxgIGNvbmZpZyBvcHRpb24gaXMgZGVwcmVjYXRlZC4gVXNlIFxcYGNvbXBpbGVyT3B0aW9ucy5pc0N1c3RvbUVsZW1lbnRcXGAgaW5zdGVhZC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gYXBwLmNvbmZpZy5jb21waWxlck9wdGlvbnM7XG4gICAgY29uc3QgbXNnID0gYFRoZSBcXGBjb21waWxlck9wdGlvbnNcXGAgY29uZmlnIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIGEgYnVpbGQgb2YgVnVlLmpzIHRoYXQgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIgKGFrYSBcImZ1bGwgYnVpbGRcIikuIFNpbmNlIHlvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCwgXFxgY29tcGlsZXJPcHRpb25zXFxgIG11c3QgYmUgcGFzc2VkIHRvIFxcYEB2dWUvY29tcGlsZXItZG9tXFxgIGluIHRoZSBidWlsZCBzZXR1cCBpbnN0ZWFkLlxuLSBGb3IgdnVlLWxvYWRlcjogcGFzcyBpdCB2aWEgdnVlLWxvYWRlcidzIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBsb2FkZXIgb3B0aW9uLlxuLSBGb3IgdnVlLWNsaTogc2VlIGh0dHBzOi8vY2xpLnZ1ZWpzLm9yZy9ndWlkZS93ZWJwYWNrLmh0bWwjbW9kaWZ5aW5nLW9wdGlvbnMtb2YtYS1sb2FkZXJcbi0gRm9yIHZpdGU6IHBhc3MgaXQgdmlhIEB2aXRlanMvcGx1Z2luLXZ1ZSBvcHRpb25zLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlLXBsdWdpbi12dWUvdHJlZS9tYWluL3BhY2thZ2VzL3BsdWdpbi12dWUjZXhhbXBsZS1mb3ItcGFzc2luZy1vcHRpb25zLXRvLXZ1ZWNvbXBpbGVyLXNmY2A7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiY29tcGlsZXJPcHRpb25zXCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICByZXR1cm4gY29tcGlsZXJPcHRpb25zO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHtcbiAgICAgICAgd2Fybihtc2cpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmIChpc1N0cmluZyhjb250YWluZXIpKSB7XG4gICAgY29uc3QgcmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFyZXMpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gbW91bnQgYXBwOiBtb3VudCB0YXJnZXQgc2VsZWN0b3IgXCIke2NvbnRhaW5lcn1cIiByZXR1cm5lZCBudWxsLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2luZG93LlNoYWRvd1Jvb3QgJiYgY29udGFpbmVyIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QgJiYgY29udGFpbmVyLm1vZGUgPT09IFwiY2xvc2VkXCIpIHtcbiAgICB3YXJuKFxuICAgICAgYG1vdW50aW5nIG9uIGEgU2hhZG93Um9vdCB3aXRoIFxcYHttb2RlOiBcImNsb3NlZFwifVxcYCBtYXkgbGVhZCB0byB1bnByZWRpY3RhYmxlIGJ1Z3NgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY29udGFpbmVyO1xufVxubGV0IHNzckRpcmVjdGl2ZUluaXRpYWxpemVkID0gZmFsc2U7XG5jb25zdCBpbml0RGlyZWN0aXZlc0ZvclNTUiA9ICgpID0+IHtcbiAgaWYgKCFzc3JEaXJlY3RpdmVJbml0aWFsaXplZCkge1xuICAgIHNzckRpcmVjdGl2ZUluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpbml0Vk1vZGVsRm9yU1NSKCk7XG4gICAgaW5pdFZTaG93Rm9yU1NSKCk7XG4gIH1cbn0gO1xuXG5leHBvcnQgeyBUcmFuc2l0aW9uLCBUcmFuc2l0aW9uR3JvdXAsIFZ1ZUVsZW1lbnQsIGNyZWF0ZUFwcCwgY3JlYXRlU1NSQXBwLCBkZWZpbmVDdXN0b21FbGVtZW50LCBkZWZpbmVTU1JDdXN0b21FbGVtZW50LCBoeWRyYXRlLCBpbml0RGlyZWN0aXZlc0ZvclNTUiwgcmVuZGVyLCB1c2VDc3NNb2R1bGUsIHVzZUNzc1ZhcnMsIHVzZUhvc3QsIHVzZVNoYWRvd1Jvb3QsIHZNb2RlbENoZWNrYm94LCB2TW9kZWxEeW5hbWljLCB2TW9kZWxSYWRpbywgdk1vZGVsU2VsZWN0LCB2TW9kZWxUZXh0LCB2U2hvdywgd2l0aEtleXMsIHdpdGhNb2RpZmllcnMgfTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBLFNBQVMsTUFBTSwrQkFBK0IsR0FBRyxnQkFBZ0IsY0FBYyxvQkFBb0IsZ0JBQWdCLGtCQUFrQixXQUFXLE9BQU8sYUFBYSxVQUFVLFFBQVEsVUFBVSw0QkFBNEIsaUJBQWlCLFVBQVUsT0FBTyxhQUFhLG9CQUFvQixXQUFXLE9BQU8sMEJBQTBCLG9CQUFvQix3QkFBd0IsTUFBTSxnQkFBZ0IseUJBQXlCLHFCQUFxQjtBQUMzYixjQUFjO0FBQ2QsU0FBUyxRQUFRLFVBQVUsVUFBVSxTQUFTLE1BQU0sc0JBQXNCLFVBQVUsV0FBVyxZQUFZLHNCQUFzQixvQkFBb0IsVUFBVSxZQUFZLE1BQU0saUJBQWlCLFlBQVksWUFBWSxlQUFlLFFBQVEsV0FBVyxlQUFlLGNBQWMsT0FBTyxZQUFZLGdCQUFnQixXQUFXLFVBQVUsbUJBQW1CO0FBRXBXLElBQUksU0FBUztBQUNiLE1BQU0sS0FBSyxPQUFPLFdBQVcsZUFBZSxPQUFPO0FBQ25ELElBQUksSUFBSTtBQUNOLE1BQUk7QUFDRixhQUF5QixtQkFBRyxhQUFhLE9BQU87QUFBQSxNQUM5QyxZQUFZLENBQUMsUUFBUTtBQUFBLElBQ3ZCLENBQUM7QUFBQSxFQUNILFNBQVMsR0FBRztBQUNWLElBQTZDLEtBQUssd0NBQXdDLENBQUMsRUFBRTtBQUFBLEVBQy9GO0FBQ0Y7QUFDQSxNQUFNLHNCQUFzQixTQUFTLENBQUMsUUFBUSxPQUFPLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUTtBQUNoRixNQUFNLFFBQVE7QUFDZCxNQUFNLFdBQVc7QUFDakIsTUFBTSxNQUFNLE9BQU8sYUFBYSxjQUFjLFdBQVc7QUFDekQsTUFBTSxvQkFBb0IsT0FBdUIsb0JBQUksY0FBYyxVQUFVO0FBQzdFLE1BQU0s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