请注意:更新本页面后,您可能需要清除浏览器缓存才能看到所作变更的影响。
Google Chrome、Microsoft Edge、Mozilla Firefox、Safari:按住⇧ Shift,同时单击“刷新”。
Google Chrome、Microsoft Edge、Mozilla Firefox、Safari:按住⇧ Shift,同时单击“刷新”。
对本页面内容的变更,应通知技术团队,以免在代码部署时被误覆盖。
本小工具代码采用下列版权许可:
本文件采用知识共享署名-相同方式共享 4.0 国际(CC BY-SA 4.0)许可协议授权。
- 您可以自由地:
- 共享 – 在任何介质以任何形式复制、发行本作品
- 演绎 – 演绎、转换或以本作品为基础进行创作
- 惟须遵守下列条件:
- 署名 – 您必须给出适当的署名,提供指向本许可协议的链接,同时标明是否(对原始作品)作了演绎。您可以用任何合理的方式来署名,但是不得以任何方式暗示许可人为您或您的使用背书。
- 相同方式共享 – 如果您再混合、转换或者基于本作品进行创作,您必须基于与原先许可协议相同或相兼容的许可协议分发您贡献的作品。
/**
* SPDX-License-Identifier: CC-BY-SA-4.0
* _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
*
* @base {@link https://en.wikipedia.org/wiki/MediaWiki:Gadget-popups.js}
* @base {@link https://zh.wikipedia.org/w/index.php?title=User:Lupin/strings-draft&oldid=579996170}
* @base {@link https://zh.wikipedia.org/wiki/MediaWiki:Gadget-navpop.css}
* @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/Navigation_popups}
* @license CC-BY-SA-4.0 {@link https://www.qiuwenbaike.cn/wiki/H:CC-BY-SA-4.0}
*/
/**
* +------------------------------------------------------------+
* | === WARNING: GLOBAL GADGET FILE === |
* +------------------------------------------------------------+
* | All changes should be made in the repository, |
* | otherwise they will be lost. |
* +------------------------------------------------------------+
* | Changes to this page may affect many users. |
* | Please discuss changes by opening an issue before editing. |
* +------------------------------------------------------------+
*/
/* <nowiki> */
(() => {
"use strict";
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/global.js
var require_global = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/global.js"(exports, module2) {
"use strict";
var check = function(it) {
return it && it.Math === Math && it;
};
module2.exports = // eslint-disable-next-line es/no-global-this -- safe
check(typeof globalThis == "object" && globalThis) || check(typeof window == "object" && window) || // eslint-disable-next-line no-restricted-globals -- safe
check(typeof self == "object" && self) || check(typeof global == "object" && global) || check(typeof exports == "object" && exports) || // eslint-disable-next-line no-new-func -- fallback
/* @__PURE__ */ function() {
return this;
}() || Function("return this")();
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/fails.js
var require_fails = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/fails.js"(exports, module2) {
"use strict";
module2.exports = function(exec) {
try {
return !!exec();
} catch (error) {
return true;
}
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/descriptors.js
var require_descriptors = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/descriptors.js"(exports, module2) {
"use strict";
var fails = require_fails();
module2.exports = !fails(function() {
return Object.defineProperty({}, 1, { get: function() {
return 7;
} })[1] !== 7;
});
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-bind-native.js
var require_function_bind_native = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-bind-native.js"(exports, module2) {
"use strict";
var fails = require_fails();
module2.exports = !fails(function() {
var test = function() {
}.bind();
return typeof test != "function" || test.hasOwnProperty("prototype");
});
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-call.js
var require_function_call = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-call.js"(exports, module2) {
"use strict";
var NATIVE_BIND = require_function_bind_native();
var call = Function.prototype.call;
module2.exports = NATIVE_BIND ? call.bind(call) : function() {
return call.apply(call, arguments);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-property-is-enumerable.js
var require_object_property_is_enumerable = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-property-is-enumerable.js"(exports) {
"use strict";
var $propertyIsEnumerable = {}.propertyIsEnumerable;
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);
exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
var descriptor = getOwnPropertyDescriptor(this, V);
return !!descriptor && descriptor.enumerable;
} : $propertyIsEnumerable;
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/create-property-descriptor.js
var require_create_property_descriptor = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/create-property-descriptor.js"(exports, module2) {
"use strict";
module2.exports = function(bitmap, value) {
return {
enumerable: !(bitmap & 1),
configurable: !(bitmap & 2),
writable: !(bitmap & 4),
value
};
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-uncurry-this.js
var require_function_uncurry_this = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-uncurry-this.js"(exports, module2) {
"use strict";
var NATIVE_BIND = require_function_bind_native();
var FunctionPrototype = Function.prototype;
var call = FunctionPrototype.call;
var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);
module2.exports = NATIVE_BIND ? uncurryThisWithBind : function(fn) {
return function() {
return call.apply(fn, arguments);
};
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/classof-raw.js
var require_classof_raw = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/classof-raw.js"(exports, module2) {
"use strict";
var uncurryThis = require_function_uncurry_this();
var toString = uncurryThis({}.toString);
var stringSlice = uncurryThis("".slice);
module2.exports = function(it) {
return stringSlice(toString(it), 8, -1);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/indexed-object.js
var require_indexed_object = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/indexed-object.js"(exports, module2) {
"use strict";
var uncurryThis = require_function_uncurry_this();
var fails = require_fails();
var classof = require_classof_raw();
var $Object = Object;
var split = uncurryThis("".split);
module2.exports = fails(function() {
return !$Object("z").propertyIsEnumerable(0);
}) ? function(it) {
return classof(it) === "String" ? split(it, "") : $Object(it);
} : $Object;
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-null-or-undefined.js
var require_is_null_or_undefined = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-null-or-undefined.js"(exports, module2) {
"use strict";
module2.exports = function(it) {
return it === null || it === void 0;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/require-object-coercible.js
var require_require_object_coercible = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/require-object-coercible.js"(exports, module2) {
"use strict";
var isNullOrUndefined = require_is_null_or_undefined();
var $TypeError = TypeError;
module2.exports = function(it) {
if (isNullOrUndefined(it))
throw new $TypeError("Can't call method on " + it);
return it;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-indexed-object.js
var require_to_indexed_object = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-indexed-object.js"(exports, module2) {
"use strict";
var IndexedObject = require_indexed_object();
var requireObjectCoercible = require_require_object_coercible();
module2.exports = function(it) {
return IndexedObject(requireObjectCoercible(it));
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-callable.js
var require_is_callable = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-callable.js"(exports, module2) {
"use strict";
var documentAll = typeof document == "object" && document.all;
module2.exports = typeof documentAll == "undefined" && documentAll !== void 0 ? function(argument) {
return typeof argument == "function" || argument === documentAll;
} : function(argument) {
return typeof argument == "function";
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-object.js
var require_is_object = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-object.js"(exports, module2) {
"use strict";
var isCallable = require_is_callable();
module2.exports = function(it) {
return typeof it == "object" ? it !== null : isCallable(it);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/get-built-in.js
var require_get_built_in = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/get-built-in.js"(exports, module2) {
"use strict";
var global2 = require_global();
var isCallable = require_is_callable();
var aFunction = function(argument) {
return isCallable(argument) ? argument : void 0;
};
module2.exports = function(namespace, method) {
return arguments.length < 2 ? aFunction(global2[namespace]) : global2[namespace] && global2[namespace][method];
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-is-prototype-of.js
var require_object_is_prototype_of = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-is-prototype-of.js"(exports, module2) {
"use strict";
var uncurryThis = require_function_uncurry_this();
module2.exports = uncurryThis({}.isPrototypeOf);
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/engine-user-agent.js
var require_engine_user_agent = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/engine-user-agent.js"(exports, module2) {
"use strict";
module2.exports = typeof navigator != "undefined" && String(navigator.userAgent) || "";
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/engine-v8-version.js
var require_engine_v8_version = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/engine-v8-version.js"(exports, module2) {
"use strict";
var global2 = require_global();
var userAgent = require_engine_user_agent();
var process = global2.process;
var Deno = global2.Deno;
var versions = process && process.versions || Deno && Deno.version;
var v8 = versions && versions.v8;
var match;
var version;
if (v8) {
match = v8.split(".");
version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);
}
if (!version && userAgent) {
match = userAgent.match(/Edge\/(\d+)/);
if (!match || match[1] >= 74) {
match = userAgent.match(/Chrome\/(\d+)/);
if (match)
version = +match[1];
}
}
module2.exports = version;
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/symbol-constructor-detection.js
var require_symbol_constructor_detection = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/symbol-constructor-detection.js"(exports, module2) {
"use strict";
var V8_VERSION = require_engine_v8_version();
var fails = require_fails();
var global2 = require_global();
var $String = global2.String;
module2.exports = !!Object.getOwnPropertySymbols && !fails(function() {
var symbol = Symbol("symbol detection");
return !$String(symbol) || !(Object(symbol) instanceof Symbol) || // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
!Symbol.sham && V8_VERSION && V8_VERSION < 41;
});
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/use-symbol-as-uid.js
var require_use_symbol_as_uid = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/use-symbol-as-uid.js"(exports, module2) {
"use strict";
var NATIVE_SYMBOL = require_symbol_constructor_detection();
module2.exports = NATIVE_SYMBOL && !Symbol.sham && typeof Symbol.iterator == "symbol";
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-symbol.js
var require_is_symbol = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-symbol.js"(exports, module2) {
"use strict";
var getBuiltIn = require_get_built_in();
var isCallable = require_is_callable();
var isPrototypeOf = require_object_is_prototype_of();
var USE_SYMBOL_AS_UID = require_use_symbol_as_uid();
var $Object = Object;
module2.exports = USE_SYMBOL_AS_UID ? function(it) {
return typeof it == "symbol";
} : function(it) {
var $Symbol = getBuiltIn("Symbol");
return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/try-to-string.js
var require_try_to_string = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/try-to-string.js"(exports, module2) {
"use strict";
var $String = String;
module2.exports = function(argument) {
try {
return $String(argument);
} catch (error) {
return "Object";
}
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/a-callable.js
var require_a_callable = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/a-callable.js"(exports, module2) {
"use strict";
var isCallable = require_is_callable();
var tryToString = require_try_to_string();
var $TypeError = TypeError;
module2.exports = function(argument) {
if (isCallable(argument))
return argument;
throw new $TypeError(tryToString(argument) + " is not a function");
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/get-method.js
var require_get_method = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/get-method.js"(exports, module2) {
"use strict";
var aCallable = require_a_callable();
var isNullOrUndefined = require_is_null_or_undefined();
module2.exports = function(V, P) {
var func = V[P];
return isNullOrUndefined(func) ? void 0 : aCallable(func);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/ordinary-to-primitive.js
var require_ordinary_to_primitive = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/ordinary-to-primitive.js"(exports, module2) {
"use strict";
var call = require_function_call();
var isCallable = require_is_callable();
var isObject = require_is_object();
var $TypeError = TypeError;
module2.exports = function(input, pref) {
var fn, val;
if (pref === "string" && isCallable(fn = input.toString) && !isObject(val = call(fn, input)))
return val;
if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input)))
return val;
if (pref !== "string" && isCallable(fn = input.toString) && !isObject(val = call(fn, input)))
return val;
throw new $TypeError("Can't convert object to primitive value");
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-pure.js
var require_is_pure = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-pure.js"(exports, module2) {
"use strict";
module2.exports = false;
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-global-property.js
var require_define_global_property = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-global-property.js"(exports, module2) {
"use strict";
var global2 = require_global();
var defineProperty = Object.defineProperty;
module2.exports = function(key, value) {
try {
defineProperty(global2, key, { value, configurable: true, writable: true });
} catch (error) {
global2[key] = value;
}
return value;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared-store.js
var require_shared_store = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared-store.js"(exports, module2) {
"use strict";
var IS_PURE = require_is_pure();
var globalThis2 = require_global();
var defineGlobalProperty = require_define_global_property();
var SHARED = "__core-js_shared__";
var store = module2.exports = globalThis2[SHARED] || defineGlobalProperty(SHARED, {});
(store.versions || (store.versions = [])).push({
version: "3.37.0",
mode: IS_PURE ? "pure" : "global",
copyright: "© 2014-2024 Denis Pushkarev (zloirock.ru)",
license: "https://github.com/zloirock/core-js/blob/v3.37.0/LICENSE",
source: "https://github.com/zloirock/core-js"
});
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared.js
var require_shared = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared.js"(exports, module2) {
"use strict";
var store = require_shared_store();
module2.exports = function(key, value) {
return store[key] || (store[key] = value || {});
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-object.js
var require_to_object = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-object.js"(exports, module2) {
"use strict";
var requireObjectCoercible = require_require_object_coercible();
var $Object = Object;
module2.exports = function(argument) {
return $Object(requireObjectCoercible(argument));
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/has-own-property.js
var require_has_own_property = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/has-own-property.js"(exports, module2) {
"use strict";
var uncurryThis = require_function_uncurry_this();
var toObject = require_to_object();
var hasOwnProperty = uncurryThis({}.hasOwnProperty);
module2.exports = Object.hasOwn || function hasOwn(it, key) {
return hasOwnProperty(toObject(it), key);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/uid.js
var require_uid = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/uid.js"(exports, module2) {
"use strict";
var uncurryThis = require_function_uncurry_this();
var id = 0;
var postfix = Math.random();
var toString = uncurryThis(1 .toString);
module2.exports = function(key) {
return "Symbol(" + (key === void 0 ? "" : key) + ")_" + toString(++id + postfix, 36);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/well-known-symbol.js
var require_well_known_symbol = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/well-known-symbol.js"(exports, module2) {
"use strict";
var global2 = require_global();
var shared = require_shared();
var hasOwn = require_has_own_property();
var uid = require_uid();
var NATIVE_SYMBOL = require_symbol_constructor_detection();
var USE_SYMBOL_AS_UID = require_use_symbol_as_uid();
var Symbol2 = global2.Symbol;
var WellKnownSymbolsStore = shared("wks");
var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol2["for"] || Symbol2 : Symbol2 && Symbol2.withoutSetter || uid;
module2.exports = function(name) {
if (!hasOwn(WellKnownSymbolsStore, name)) {
WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol2, name) ? Symbol2[name] : createWellKnownSymbol("Symbol." + name);
}
return WellKnownSymbolsStore[name];
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-primitive.js
var require_to_primitive = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-primitive.js"(exports, module2) {
"use strict";
var call = require_function_call();
var isObject = require_is_object();
var isSymbol = require_is_symbol();
var getMethod = require_get_method();
var ordinaryToPrimitive = require_ordinary_to_primitive();
var wellKnownSymbol = require_well_known_symbol();
var $TypeError = TypeError;
var TO_PRIMITIVE = wellKnownSymbol("toPrimitive");
module2.exports = function(input, pref) {
if (!isObject(input) || isSymbol(input))
return input;
var exoticToPrim = getMethod(input, TO_PRIMITIVE);
var result;
if (exoticToPrim) {
if (pref === void 0)
pref = "default";
result = call(exoticToPrim, input, pref);
if (!isObject(result) || isSymbol(result))
return result;
throw new $TypeError("Can't convert object to primitive value");
}
if (pref === void 0)
pref = "number";
return ordinaryToPrimitive(input, pref);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-property-key.js
var require_to_property_key = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-property-key.js"(exports, module2) {
"use strict";
var toPrimitive = require_to_primitive();
var isSymbol = require_is_symbol();
module2.exports = function(argument) {
var key = toPrimitive(argument, "string");
return isSymbol(key) ? key : key + "";
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/document-create-element.js
var require_document_create_element = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/document-create-element.js"(exports, module2) {
"use strict";
var global2 = require_global();
var isObject = require_is_object();
var document2 = global2.document;
var EXISTS = isObject(document2) && isObject(document2.createElement);
module2.exports = function(it) {
return EXISTS ? document2.createElement(it) : {};
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/ie8-dom-define.js
var require_ie8_dom_define = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/ie8-dom-define.js"(exports, module2) {
"use strict";
var DESCRIPTORS = require_descriptors();
var fails = require_fails();
var createElement = require_document_create_element();
module2.exports = !DESCRIPTORS && !fails(function() {
return Object.defineProperty(createElement("div"), "a", {
get: function() {
return 7;
}
}).a !== 7;
});
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-descriptor.js
var require_object_get_own_property_descriptor = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-descriptor.js"(exports) {
"use strict";
var DESCRIPTORS = require_descriptors();
var call = require_function_call();
var propertyIsEnumerableModule = require_object_property_is_enumerable();
var createPropertyDescriptor = require_create_property_descriptor();
var toIndexedObject = require_to_indexed_object();
var toPropertyKey = require_to_property_key();
var hasOwn = require_has_own_property();
var IE8_DOM_DEFINE = require_ie8_dom_define();
var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
O = toIndexedObject(O);
P = toPropertyKey(P);
if (IE8_DOM_DEFINE)
try {
return $getOwnPropertyDescriptor(O, P);
} catch (error) {
}
if (hasOwn(O, P))
return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/v8-prototype-define-bug.js
var require_v8_prototype_define_bug = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/v8-prototype-define-bug.js"(exports, module2) {
"use strict";
var DESCRIPTORS = require_descriptors();
var fails = require_fails();
module2.exports = DESCRIPTORS && fails(function() {
return Object.defineProperty(function() {
}, "prototype", {
value: 42,
writable: false
}).prototype !== 42;
});
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/an-object.js
var require_an_object = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/an-object.js"(exports, module2) {
"use strict";
var isObject = require_is_object();
var $String = String;
var $TypeError = TypeError;
module2.exports = function(argument) {
if (isObject(argument))
return argument;
throw new $TypeError($String(argument) + " is not an object");
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-define-property.js
var require_object_define_property = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-define-property.js"(exports) {
"use strict";
var DESCRIPTORS = require_descriptors();
var IE8_DOM_DEFINE = require_ie8_dom_define();
var V8_PROTOTYPE_DEFINE_BUG = require_v8_prototype_define_bug();
var anObject = require_an_object();
var toPropertyKey = require_to_property_key();
var $TypeError = TypeError;
var $defineProperty = Object.defineProperty;
var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var ENUMERABLE = "enumerable";
var CONFIGURABLE = "configurable";
var WRITABLE = "writable";
exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {
anObject(O);
P = toPropertyKey(P);
anObject(Attributes);
if (typeof O === "function" && P === "prototype" && "value" in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {
var current = $getOwnPropertyDescriptor(O, P);
if (current && current[WRITABLE]) {
O[P] = Attributes.value;
Attributes = {
configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],
enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],
writable: false
};
}
}
return $defineProperty(O, P, Attributes);
} : $defineProperty : function defineProperty(O, P, Attributes) {
anObject(O);
P = toPropertyKey(P);
anObject(Attributes);
if (IE8_DOM_DEFINE)
try {
return $defineProperty(O, P, Attributes);
} catch (error) {
}
if ("get" in Attributes || "set" in Attributes)
throw new $TypeError("Accessors not supported");
if ("value" in Attributes)
O[P] = Attributes.value;
return O;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/create-non-enumerable-property.js
var require_create_non_enumerable_property = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/create-non-enumerable-property.js"(exports, module2) {
"use strict";
var DESCRIPTORS = require_descriptors();
var definePropertyModule = require_object_define_property();
var createPropertyDescriptor = require_create_property_descriptor();
module2.exports = DESCRIPTORS ? function(object, key, value) {
return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
} : function(object, key, value) {
object[key] = value;
return object;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-name.js
var require_function_name = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-name.js"(exports, module2) {
"use strict";
var DESCRIPTORS = require_descriptors();
var hasOwn = require_has_own_property();
var FunctionPrototype = Function.prototype;
var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;
var EXISTS = hasOwn(FunctionPrototype, "name");
var PROPER = EXISTS && function something() {
}.name === "something";
var CONFIGURABLE = EXISTS && (!DESCRIPTORS || DESCRIPTORS && getDescriptor(FunctionPrototype, "name").configurable);
module2.exports = {
EXISTS,
PROPER,
CONFIGURABLE
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/inspect-source.js
var require_inspect_source = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/inspect-source.js"(exports, module2) {
"use strict";
var uncurryThis = require_function_uncurry_this();
var isCallable = require_is_callable();
var store = require_shared_store();
var functionToString = uncurryThis(Function.toString);
if (!isCallable(store.inspectSource)) {
store.inspectSource = function(it) {
return functionToString(it);
};
}
module2.exports = store.inspectSource;
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/weak-map-basic-detection.js
var require_weak_map_basic_detection = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/weak-map-basic-detection.js"(exports, module2) {
"use strict";
var global2 = require_global();
var isCallable = require_is_callable();
var WeakMap = global2.WeakMap;
module2.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared-key.js
var require_shared_key = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared-key.js"(exports, module2) {
"use strict";
var shared = require_shared();
var uid = require_uid();
var keys = shared("keys");
module2.exports = function(key) {
return keys[key] || (keys[key] = uid(key));
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/hidden-keys.js
var require_hidden_keys = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/hidden-keys.js"(exports, module2) {
"use strict";
module2.exports = {};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/internal-state.js
var require_internal_state = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/internal-state.js"(exports, module2) {
"use strict";
var NATIVE_WEAK_MAP = require_weak_map_basic_detection();
var global2 = require_global();
var isObject = require_is_object();
var createNonEnumerableProperty = require_create_non_enumerable_property();
var hasOwn = require_has_own_property();
var shared = require_shared_store();
var sharedKey = require_shared_key();
var hiddenKeys = require_hidden_keys();
var OBJECT_ALREADY_INITIALIZED = "Object already initialized";
var TypeError2 = global2.TypeError;
var WeakMap = global2.WeakMap;
var set;
var get;
var has;
var enforce = function(it) {
return has(it) ? get(it) : set(it, {});
};
var getterFor = function(TYPE) {
return function(it) {
var state;
if (!isObject(it) || (state = get(it)).type !== TYPE) {
throw new TypeError2("Incompatible receiver, " + TYPE + " required");
}
return state;
};
};
if (NATIVE_WEAK_MAP || shared.state) {
store = shared.state || (shared.state = new WeakMap());
store.get = store.get;
store.has = store.has;
store.set = store.set;
set = function(it, metadata) {
if (store.has(it))
throw new TypeError2(OBJECT_ALREADY_INITIALIZED);
metadata.facade = it;
store.set(it, metadata);
return metadata;
};
get = function(it) {
return store.get(it) || {};
};
has = function(it) {
return store.has(it);
};
} else {
STATE = sharedKey("state");
hiddenKeys[STATE] = true;
set = function(it, metadata) {
if (hasOwn(it, STATE))
throw new TypeError2(OBJECT_ALREADY_INITIALIZED);
metadata.facade = it;
createNonEnumerableProperty(it, STATE, metadata);
return metadata;
};
get = function(it) {
return hasOwn(it, STATE) ? it[STATE] : {};
};
has = function(it) {
return hasOwn(it, STATE);
};
}
var store;
var STATE;
module2.exports = {
set,
get,
has,
enforce,
getterFor
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/make-built-in.js
var require_make_built_in = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/make-built-in.js"(exports, module2) {
"use strict";
var uncurryThis = require_function_uncurry_this();
var fails = require_fails();
var isCallable = require_is_callable();
var hasOwn = require_has_own_property();
var DESCRIPTORS = require_descriptors();
var CONFIGURABLE_FUNCTION_NAME = require_function_name().CONFIGURABLE;
var inspectSource = require_inspect_source();
var InternalStateModule = require_internal_state();
var enforceInternalState = InternalStateModule.enforce;
var getInternalState = InternalStateModule.get;
var $String = String;
var defineProperty = Object.defineProperty;
var stringSlice = uncurryThis("".slice);
var replace = uncurryThis("".replace);
var join = uncurryThis([].join);
var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function() {
return defineProperty(function() {
}, "length", { value: 8 }).length !== 8;
});
var TEMPLATE = String(String).split("String");
var makeBuiltIn = module2.exports = function(value, name, options) {
if (stringSlice($String(name), 0, 7) === "Symbol(") {
name = "[" + replace($String(name), /^Symbol\(([^)]*)\).*$/, "$1") + "]";
}
if (options && options.getter)
name = "get " + name;
if (options && options.setter)
name = "set " + name;
if (!hasOwn(value, "name") || CONFIGURABLE_FUNCTION_NAME && value.name !== name) {
if (DESCRIPTORS)
defineProperty(value, "name", { value: name, configurable: true });
else
value.name = name;
}
if (CONFIGURABLE_LENGTH && options && hasOwn(options, "arity") && value.length !== options.arity) {
defineProperty(value, "length", { value: options.arity });
}
try {
if (options && hasOwn(options, "constructor") && options.constructor) {
if (DESCRIPTORS)
defineProperty(value, "prototype", { writable: false });
} else if (value.prototype)
value.prototype = void 0;
} catch (error) {
}
var state = enforceInternalState(value);
if (!hasOwn(state, "source")) {
state.source = join(TEMPLATE, typeof name == "string" ? name : "");
}
return value;
};
Function.prototype.toString = makeBuiltIn(function toString() {
return isCallable(this) && getInternalState(this).source || inspectSource(this);
}, "toString");
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-built-in.js
var require_define_built_in = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-built-in.js"(exports, module2) {
"use strict";
var isCallable = require_is_callable();
var definePropertyModule = require_object_define_property();
var makeBuiltIn = require_make_built_in();
var defineGlobalProperty = require_define_global_property();
module2.exports = function(O, key, value, options) {
if (!options)
options = {};
var simple = options.enumerable;
var name = options.name !== void 0 ? options.name : key;
if (isCallable(value))
makeBuiltIn(value, name, options);
if (options.global) {
if (simple)
O[key] = value;
else
defineGlobalProperty(key, value);
} else {
try {
if (!options.unsafe)
delete O[key];
else if (O[key])
simple = true;
} catch (error) {
}
if (simple)
O[key] = value;
else
definePropertyModule.f(O, key, {
value,
enumerable: false,
configurable: !options.nonConfigurable,
writable: !options.nonWritable
});
}
return O;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/math-trunc.js
var require_math_trunc = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/math-trunc.js"(exports, module2) {
"use strict";
var ceil = Math.ceil;
var floor = Math.floor;
module2.exports = Math.trunc || function trunc(x) {
var n = +x;
return (n > 0 ? floor : ceil)(n);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-integer-or-infinity.js
var require_to_integer_or_infinity = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-integer-or-infinity.js"(exports, module2) {
"use strict";
var trunc = require_math_trunc();
module2.exports = function(argument) {
var number = +argument;
return number !== number || number === 0 ? 0 : trunc(number);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-absolute-index.js
var require_to_absolute_index = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-absolute-index.js"(exports, module2) {
"use strict";
var toIntegerOrInfinity = require_to_integer_or_infinity();
var max = Math.max;
var min = Math.min;
module2.exports = function(index, length) {
var integer = toIntegerOrInfinity(index);
return integer < 0 ? max(integer + length, 0) : min(integer, length);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-length.js
var require_to_length = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-length.js"(exports, module2) {
"use strict";
var toIntegerOrInfinity = require_to_integer_or_infinity();
var min = Math.min;
module2.exports = function(argument) {
var len = toIntegerOrInfinity(argument);
return len > 0 ? min(len, 9007199254740991) : 0;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/length-of-array-like.js
var require_length_of_array_like = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/length-of-array-like.js"(exports, module2) {
"use strict";
var toLength = require_to_length();
module2.exports = function(obj) {
return toLength(obj.length);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/array-includes.js
var require_array_includes = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/array-includes.js"(exports, module2) {
"use strict";
var toIndexedObject = require_to_indexed_object();
var toAbsoluteIndex = require_to_absolute_index();
var lengthOfArrayLike = require_length_of_array_like();
var createMethod = function(IS_INCLUDES) {
return function($this, el, fromIndex) {
var O = toIndexedObject($this);
var length = lengthOfArrayLike(O);
if (length === 0)
return !IS_INCLUDES && -1;
var index = toAbsoluteIndex(fromIndex, length);
var value;
if (IS_INCLUDES && el !== el)
while (length > index) {
value = O[index++];
if (value !== value)
return true;
}
else
for (; length > index; index++) {
if ((IS_INCLUDES || index in O) && O[index] === el)
return IS_INCLUDES || index || 0;
}
return !IS_INCLUDES && -1;
};
};
module2.exports = {
// `Array.prototype.includes` method
// https://tc39.es/ecma262/#sec-array.prototype.includes
includes: createMethod(true),
// `Array.prototype.indexOf` method
// https://tc39.es/ecma262/#sec-array.prototype.indexof
indexOf: createMethod(false)
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-keys-internal.js
var require_object_keys_internal = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-keys-internal.js"(exports, module2) {
"use strict";
var uncurryThis = require_function_uncurry_this();
var hasOwn = require_has_own_property();
var toIndexedObject = require_to_indexed_object();
var indexOf = require_array_includes().indexOf;
var hiddenKeys = require_hidden_keys();
var push = uncurryThis([].push);
module2.exports = function(object, names) {
var O = toIndexedObject(object);
var i = 0;
var result = [];
var key;
for (key in O)
!hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);
while (names.length > i)
if (hasOwn(O, key = names[i++])) {
~indexOf(result, key) || push(result, key);
}
return result;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/enum-bug-keys.js
var require_enum_bug_keys = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/enum-bug-keys.js"(exports, module2) {
"use strict";
module2.exports = [
"constructor",
"hasOwnProperty",
"isPrototypeOf",
"propertyIsEnumerable",
"toLocaleString",
"toString",
"valueOf"
];
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-names.js
var require_object_get_own_property_names = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-names.js"(exports) {
"use strict";
var internalObjectKeys = require_object_keys_internal();
var enumBugKeys = require_enum_bug_keys();
var hiddenKeys = enumBugKeys.concat("length", "prototype");
exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
return internalObjectKeys(O, hiddenKeys);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-symbols.js
var require_object_get_own_property_symbols = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-symbols.js"(exports) {
"use strict";
exports.f = Object.getOwnPropertySymbols;
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/own-keys.js
var require_own_keys = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/own-keys.js"(exports, module2) {
"use strict";
var getBuiltIn = require_get_built_in();
var uncurryThis = require_function_uncurry_this();
var getOwnPropertyNamesModule = require_object_get_own_property_names();
var getOwnPropertySymbolsModule = require_object_get_own_property_symbols();
var anObject = require_an_object();
var concat = uncurryThis([].concat);
module2.exports = getBuiltIn("Reflect", "ownKeys") || function ownKeys(it) {
var keys = getOwnPropertyNamesModule.f(anObject(it));
var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/copy-constructor-properties.js
var require_copy_constructor_properties = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/copy-constructor-properties.js"(exports, module2) {
"use strict";
var hasOwn = require_has_own_property();
var ownKeys = require_own_keys();
var getOwnPropertyDescriptorModule = require_object_get_own_property_descriptor();
var definePropertyModule = require_object_define_property();
module2.exports = function(target, source, exceptions) {
var keys = ownKeys(source);
var defineProperty = definePropertyModule.f;
var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {
defineProperty(target, key, getOwnPropertyDescriptor(source, key));
}
}
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-forced.js
var require_is_forced = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-forced.js"(exports, module2) {
"use strict";
var fails = require_fails();
var isCallable = require_is_callable();
var replacement = /#|\.prototype\./;
var isForced = function(feature, detection) {
var value = data[normalize(feature)];
return value === POLYFILL ? true : value === NATIVE ? false : isCallable(detection) ? fails(detection) : !!detection;
};
var normalize = isForced.normalize = function(string) {
return String(string).replace(replacement, ".").toLowerCase();
};
var data = isForced.data = {};
var NATIVE = isForced.NATIVE = "N";
var POLYFILL = isForced.POLYFILL = "P";
module2.exports = isForced;
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/export.js
var require_export = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/export.js"(exports, module2) {
"use strict";
var global2 = require_global();
var getOwnPropertyDescriptor = require_object_get_own_property_descriptor().f;
var createNonEnumerableProperty = require_create_non_enumerable_property();
var defineBuiltIn = require_define_built_in();
var defineGlobalProperty = require_define_global_property();
var copyConstructorProperties = require_copy_constructor_properties();
var isForced = require_is_forced();
module2.exports = function(options, source) {
var TARGET = options.target;
var GLOBAL = options.global;
var STATIC = options.stat;
var FORCED, target, key, targetProperty, sourceProperty, descriptor;
if (GLOBAL) {
target = global2;
} else if (STATIC) {
target = global2[TARGET] || defineGlobalProperty(TARGET, {});
} else {
target = global2[TARGET] && global2[TARGET].prototype;
}
if (target)
for (key in source) {
sourceProperty = source[key];
if (options.dontCallGetSet) {
descriptor = getOwnPropertyDescriptor(target, key);
targetProperty = descriptor && descriptor.value;
} else
targetProperty = target[key];
FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? "." : "#") + key, options.forced);
if (!FORCED && targetProperty !== void 0) {
if (typeof sourceProperty == typeof targetProperty)
continue;
copyConstructorProperties(sourceProperty, targetProperty);
}
if (options.sham || targetProperty && targetProperty.sham) {
createNonEnumerableProperty(sourceProperty, "sham", true);
}
defineBuiltIn(target, key, sourceProperty, options);
}
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-array.js
var require_is_array = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-array.js"(exports, module2) {
"use strict";
var classof = require_classof_raw();
module2.exports = Array.isArray || function isArray(argument) {
return classof(argument) === "Array";
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/array-set-length.js
var require_array_set_length = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/array-set-length.js"(exports, module2) {
"use strict";
var DESCRIPTORS = require_descriptors();
var isArray = require_is_array();
var $TypeError = TypeError;
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function() {
if (this !== void 0)
return true;
try {
Object.defineProperty([], "length", { writable: false }).length = 1;
} catch (error) {
return error instanceof TypeError;
}
}();
module2.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function(O, length) {
if (isArray(O) && !getOwnPropertyDescriptor(O, "length").writable) {
throw new $TypeError("Cannot set read only .length");
}
return O.length = length;
} : function(O, length) {
return O.length = length;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/does-not-exceed-safe-integer.js
var require_does_not_exceed_safe_integer = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/does-not-exceed-safe-integer.js"(exports, module2) {
"use strict";
var $TypeError = TypeError;
var MAX_SAFE_INTEGER = 9007199254740991;
module2.exports = function(it) {
if (it > MAX_SAFE_INTEGER)
throw $TypeError("Maximum allowed index exceeded");
return it;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.array.push.js
var require_es_array_push = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.array.push.js"() {
"use strict";
var $2 = require_export();
var toObject = require_to_object();
var lengthOfArrayLike = require_length_of_array_like();
var setArrayLength = require_array_set_length();
var doesNotExceedSafeInteger = require_does_not_exceed_safe_integer();
var fails = require_fails();
var INCORRECT_TO_LENGTH = fails(function() {
return [].push.call({ length: 4294967296 }, 1) !== 4294967297;
});
var properErrorOnNonWritableLength = function() {
try {
Object.defineProperty([], "length", { writable: false }).push();
} catch (error) {
return error instanceof TypeError;
}
};
var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();
$2({ target: "Array", proto: true, arity: 1, forced: FORCED }, {
// eslint-disable-next-line no-unused-vars -- required for `.length`
push: function push(item) {
var O = toObject(this);
var len = lengthOfArrayLike(O);
var argCount = arguments.length;
doesNotExceedSafeInteger(len + argCount);
for (var i = 0; i < argCount; i++) {
O[len] = arguments[i];
len++;
}
setArrayLength(O, len);
return len;
}
});
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/delete-property-or-throw.js
var require_delete_property_or_throw = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/delete-property-or-throw.js"(exports, module2) {
"use strict";
var tryToString = require_try_to_string();
var $TypeError = TypeError;
module2.exports = function(O, P) {
if (!delete O[P])
throw new $TypeError("Cannot delete property " + tryToString(P) + " of " + tryToString(O));
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.array.unshift.js
var require_es_array_unshift = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.array.unshift.js"() {
"use strict";
var $2 = require_export();
var toObject = require_to_object();
var lengthOfArrayLike = require_length_of_array_like();
var setArrayLength = require_array_set_length();
var deletePropertyOrThrow = require_delete_property_or_throw();
var doesNotExceedSafeInteger = require_does_not_exceed_safe_integer();
var INCORRECT_RESULT = [].unshift(0) !== 1;
var properErrorOnNonWritableLength = function() {
try {
Object.defineProperty([], "length", { writable: false }).unshift();
} catch (error) {
return error instanceof TypeError;
}
};
var FORCED = INCORRECT_RESULT || !properErrorOnNonWritableLength();
$2({ target: "Array", proto: true, arity: 1, forced: FORCED }, {
// eslint-disable-next-line no-unused-vars -- required for `.length`
unshift: function unshift(item) {
var O = toObject(this);
var len = lengthOfArrayLike(O);
var argCount = arguments.length;
if (argCount) {
doesNotExceedSafeInteger(len + argCount);
var k = len;
while (k--) {
var to = k + argCount;
if (k in O)
O[to] = O[k];
else
deletePropertyOrThrow(O, to);
}
for (var j = 0; j < argCount; j++) {
O[j] = arguments[j];
}
}
return setArrayLength(O, len + argCount);
}
});
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-built-in-accessor.js
var require_define_built_in_accessor = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-built-in-accessor.js"(exports, module2) {
"use strict";
var makeBuiltIn = require_make_built_in();
var defineProperty = require_object_define_property();
module2.exports = function(target, name, descriptor) {
if (descriptor.get)
makeBuiltIn(descriptor.get, name, { getter: true });
if (descriptor.set)
makeBuiltIn(descriptor.set, name, { setter: true });
return defineProperty.f(target, name, descriptor);
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/regexp-flags.js
var require_regexp_flags = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/regexp-flags.js"(exports, module2) {
"use strict";
var anObject = require_an_object();
module2.exports = function() {
var that = anObject(this);
var result = "";
if (that.hasIndices)
result += "d";
if (that.global)
result += "g";
if (that.ignoreCase)
result += "i";
if (that.multiline)
result += "m";
if (that.dotAll)
result += "s";
if (that.unicode)
result += "u";
if (that.unicodeSets)
result += "v";
if (that.sticky)
result += "y";
return result;
};
}
});
// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.regexp.flags.js
var require_es_regexp_flags = __commonJS({
"node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.regexp.flags.js"() {
"use strict";
var global2 = require_global();
var DESCRIPTORS = require_descriptors();
var defineBuiltInAccessor = require_define_built_in_accessor();
var regExpFlags = require_regexp_flags();
var fails = require_fails();
var RegExp2 = global2.RegExp;
var RegExpPrototype = RegExp2.prototype;
var FORCED = DESCRIPTORS && fails(function() {
var INDICES_SUPPORT = true;
try {
RegExp2(".", "d");
} catch (error) {
INDICES_SUPPORT = false;
}
var O = {};
var calls = "";
var expected = INDICES_SUPPORT ? "dgimsy" : "gimsy";
var addGetter = function(key2, chr) {
Object.defineProperty(O, key2, { get: function() {
calls += chr;
return true;
} });
};
var pairs = {
dotAll: "s",
global: "g",
ignoreCase: "i",
multiline: "m",
sticky: "y"
};
if (INDICES_SUPPORT)
pairs.hasIndices = "d";
for (var key in pairs)
addGetter(key, pairs[key]);
var result = Object.getOwnPropertyDescriptor(RegExpPrototype, "flags").get.call(O);
return result !== expected || calls !== expected;
});
if (FORCED)
defineBuiltInAccessor(RegExpPrototype, "flags", {
configurable: true,
get: regExpFlags
});
}
});
// dist/Navigation_popups/Navigation_popups.js
require_es_array_push();
require_es_array_unshift();
require_es_regexp_flags();
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
function _createForOfIteratorHelper(o, allowArrayLike) {
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
if (!it) {
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
if (it)
o = it;
var i = 0;
var F = function() {
};
return { s: F, n: function() {
if (i >= o.length)
return { done: true };
return { done: false, value: o[i++] };
}, e: function(e) {
throw e;
}, f: F };
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var normalCompletion = true, didErr = false, err;
return { s: function() {
it = it.call(o);
}, n: function() {
var step = it.next();
normalCompletion = step.done;
return step;
}, e: function(e) {
didErr = true;
err = e;
}, f: function() {
try {
if (!normalCompletion && it.return != null)
it.return();
} finally {
if (didErr)
throw err;
}
} };
}
function _unsupportedIterableToArray(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor)
n = o.constructor.name;
if (n === "Map" || n === "Set")
return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++)
arr2[i] = arr[i];
return arr2;
}
//! src/Navigation_popups/modules/api.ts
var import_ext_gadget = require("ext.gadget.Util");
var api = (0, import_ext_gadget.initMwApi)("Navigation popups/1.0");
//! src/Navigation_popups/modules/string.ts
var message = {
// summary data, searching etc.
article: window.wgULS("条目", "條目"),
category: window.wgULS("个分类", "個分類"),
categories: window.wgULS("个分类", "個分類"),
image: window.wgULS("个文件", "個檔案"),
images: window.wgULS("个文件", "個檔案"),
stub: "小作品",
"section stub": window.wgULS("小章节", "小章節"),
"Empty page": window.wgULS("空页面", "空頁面"),
kB: window.wgULS("千字节<sub>(以1000为一进)</sub>", "千位元組<sub>(以1000為一進)</sub>"),
bytes: window.wgULS("字节", "位元組"),
day: "天",
days: "天",
hour: window.wgULS("小时", "小時"),
hours: window.wgULS("小时", "小時"),
minute: "分",
minutes: "分",
second: "秒",
seconds: "秒",
week: "周",
weeks: "周",
month: "月",
months: "月",
year: "年",
years: "年",
search: window.wgULS("搜索", "搜尋"),
SearchHint: window.wgULS("搜索包含 %s 的页面", "搜尋包含 %s 的頁面"),
web: "Bing",
global: "全域",
"more...": "更多……",
// article-related actions and info
// (some actions also apply to user pages)
actions: window.wgULS("操作", "動作"),
// /// view articles and view talk
popupsMenu: "Popups",
"disable previews": window.wgULS("禁用预览", "禁用預覽"),
togglePreviewsHint: window.wgULS("切换本页 Popups 的预览开关", "切換本頁 Popups 的預覽開關"),
"toggle previews": window.wgULS("切换预览开关", "切換預覽開關"),
reset: window.wgULS("复位", "複位"),
disable: "禁用 Popups",
disablePopupsHint: window.wgULS("在本页禁用 Popups,刷新页面以重新启用。", "在本頁禁用 Popups,重新整理頁面以重新啟用。"),
purgePopupsHint: window.wgULS("复位 Popups,清除所有缓存数据。", "複位 Popups,清除所有快取資料。"),
PopupsHint: window.wgULS("复位 Popups,清除所有缓存数据。", "複位 Popups,清除所有快取資料。"),
spacebar: "空格",
view: window.wgULS("查看", "檢視"),
"view article": window.wgULS("查看条目", "檢視條目"),
viewHint: window.wgULS("前往 %s", "前往 %s"),
talk: window.wgULS("讨论", "討論"),
"talk page": window.wgULS("讨论页", "討論頁"),
"this revision": window.wgULS("此修订版本", "此修訂版本"),
"revision %s of %s": window.wgULS("页面 $2 的修订版本 $1", "頁面 $2 的修訂版本 $1"),
"Revision %s of %s": window.wgULS("页面 $2 的修订版本 $1", "頁面 $2 的修訂版本 $1"),
"the revision prior to revision %s of %s": window.wgULS("页面 $2 的修订版本 $1 之前的修订版本", "頁面 $2 的修訂版本 $1 之前的修訂版本"),
"Toggle image size": window.wgULS("点击切换图片大小", "點擊切換圖片大小"),
del: window.wgULS("删除", "删除"),
// /// delete, protect, move
delete: window.wgULS("删除", "删除"),
deleteHint: window.wgULS("删除 %s", "删除 %s"),
undeleteShort: window.wgULS("恢复", "恢復"),
UndeleteHint: window.wgULS("恢复 %s", "恢復 %s"),
protect: window.wgULS("保护", "保護"),
protectHint: window.wgULS("保护 %s", "保護 %s"),
unprotectShort: window.wgULS("解除", "解除"),
unprotectHint: window.wgULS("解除对 %s 的保护", "解除對 %s 的保護"),
move: window.wgULS("移动", "移動"),
"move page": window.wgULS("移动页面", "移動頁面"),
MovepageHint: window.wgULS("修改 %s 的标题", "修改 %s 的標題"),
edit: window.wgULS("编辑", "編輯"),
// /// edit articles and talk
"edit article": window.wgULS("编辑条目", "編輯條目"),
editHint: window.wgULS("修改 %s 的内容", "修改 %s 的內容"),
"edit talk": window.wgULS("编辑讨论页", "編輯對話頁"),
new: window.wgULS("新", "新"),
"new topic": window.wgULS("新话题", "新話題"),
newSectionHint: window.wgULS("在 %s 增加新的讨论话题", "在 %s 增加新的討論話題"),
"null edit": window.wgULS("空编辑", "空編輯"),
nullEditHint: window.wgULS("进行一次对 %s 的空编辑", "製造一次對 %s 的空編輯"),
hist: window.wgULS("历史", "歷史"),
// /// history, diffs, editors, related
history: window.wgULS("历史", "歷史"),
historyHint: window.wgULS("%s 的修订历史", "%s 的修訂歷史"),
last: window.wgULS("之前", "之前"),
// [[MediaWiki:Last]]
lastEdit: window.wgULS("最近更改", "最近更改"),
"show last edit": window.wgULS("最近一次更改", "最新一次修訂"),
"Show the last edit": window.wgULS("显示最近一次更改的差异", "顯示最新一次修訂的差異"),
lastContrib: window.wgULS("最近编辑", "最近編輯"),
"last set of edits": window.wgULS("最近编辑", "最近編輯"),
lastContribHint: window.wgULS("显示由最后一位编辑者造成的差异", "顯示由最後一位編輯者製造的差異"),
cur: window.wgULS("当前", "當前"),
diffCur: window.wgULS("与当前版本的差异", "與目前版本的差異"),
"Show changes since revision %s": window.wgULS("显示自修订版本 %s 的差异", "顯示自修訂版本 %s 的差異"),
"%s old": window.wgULS("%s 前的最后版本", "%s 前的最后版本"),
// as in 4 weeks old
oldEdit: window.wgULS("旧编辑", "舊編輯"),
purge: window.wgULS("清除缓存", "清除快取"),
purgeHint: window.wgULS("清除服务器中 %s 的缓存", "清除伺服器中 %s 的快取"),
raw: window.wgULS("源代码", "原始碼"),
rawHint: window.wgULS("查看 %s 的源代码", "檢視 %s 的原始碼"),
render: window.wgULS("仅正文", "僅正文"),
renderHint: window.wgULS("显示 %s 的纯HTML解析(仅正文内容)", "顯示 %s 的純HTML解析(僅正文內容)"),
"Show the edit made to get revision": window.wgULS("显示编辑以得到修订版本", "顯示編輯以得到修訂版本"),
sinceMe: window.wgULS("自我", "自我"),
"changes since mine": window.wgULS("自我修订的差异", "自我修訂的差異"),
sinceMeHint: window.wgULS("显示自我上次修改以来的差异", "顯示自我上次修改以來的差異"),
"Couldn't find an edit by %s\nin the last %s edits to\n%s": window.wgULS("在 $3 最近 $2 次编辑中找不到 $1 做出的修改", "在 $3 最近 $2 次編輯中找不到 $1 做出的修改"),
eds: window.wgULS("编辑", "編輯"),
editors: window.wgULS("编辑者", "編輯者"),
editorListHint: window.wgULS("列出编辑过 %s 的用户", "列出編輯過 %s 的使用者"),
related: window.wgULS("相关", "相關"),
relatedChanges: window.wgULS("相关更改", "相關更改"),
"related changes": window.wgULS("相关更改", "相關更改"),
RecentchangeslinkedHint: window.wgULS("显示相关 %s 的修改", "顯示相關 %s 的修改"),
editOld: window.wgULS("编辑旧版", "編輯舊版"),
// /// edit old version, or revert
rv: window.wgULS("回退", "恢復"),
revert: window.wgULS("回退", "恢復"),
revertHint: window.wgULS("回退到 %s", "恢復到 %s"),
undo: window.wgULS("撤销", "撤銷"),
undoHint: window.wgULS("撤销这次编辑", "撤銷這次編輯"),
defaultpopupRedlinkSummary: window.wgULS("移除到空页面[[%s]]的链接(Popups)", "移除到空頁面[[%s]]的連結(Popups)"),
defaultpopupFixDabsSummary: window.wgULS("消歧义[[%s]]到[[%s]](Popups)", "消歧義[[%s]]到[[%s]](Popups)"),
defaultpopupFixRedirsSummary: window.wgULS("忽略从[[%s]]到[[%s]]的重定向(Popups)", "忽略從[[%s]]到[[%s]]的重新導向(Popups)"),
defaultpopupExtendedRevertSummary: window.wgULS("回退到$2在$1时编辑的修订版本$3(Popups)", "還原到$2在$1時製作的修訂版本$3(Popups)"),
defaultpopupRevertToPreviousSummary: window.wgULS("回退到修订版本%s的上一个版本(Popups)", "還原到修訂版本%s的上一個版本(Popups)"),
defaultpopupRevertSummary: window.wgULS("回退到修订版本%s(Popups)", "還原到修訂版本%s(Popups)"),
defaultpopupQueriedRevertToPreviousSummary: window.wgULS("回退到修订版本$1的上一个版本,由$3在$2时编辑(Popups)", "還原到修訂版本$1的上一個版本,由$3在$2時製作(Popups)"),
defaultpopupQueriedRevertSummary: window.wgULS("回退到$3在$2时编辑的修订版本$1(Popups)", "還原到$3在$2時製作的修訂版本$1(Popups)"),
defaultpopupRmDabLinkSummary: window.wgULS("移除到消歧义页[[%s]]的链接(Popups)", "移除到消歧義頁[[%s]]的連結(Popups)"),
Redirects: window.wgULS("重定向", "重定向"),
// as in Redirects to ...
// " to ": window.wgULS( "到","到" ),
// as in Redirects to ...
"Bypass redirect": window.wgULS("忽略重定向", "忽略重新導向"),
"Fix this redirect": window.wgULS("修复重定向", "修復重新導向"),
disambig: window.wgULS("消歧义", "消歧義"),
// /// add or remove dab etc.
disambigHint: window.wgULS("消歧义这个链接到 [[%s]]", "消歧義這個連結到 [[%s]]"),
"Click to disambiguate this link to:": window.wgULS("点击以消歧义这个链接到:", "點擊以消歧義這個連結到:"),
"remove this link": window.wgULS("移除链接", "移除連結"),
"remove all links to this page from this article": window.wgULS("移除此条目到这页的所有链接", "移除此條目到這頁的所有連結"),
"remove all links to this disambig page from this article": window.wgULS("移除此条目到这消歧义的所有链接", "移除此條目到這消歧義的所有連結"),
mainlink: window.wgULS("主链接", "主連結"),
// /// links, watch, unwatch
wikiLink: window.wgULS("个内部链接", "个內部連結"),
wikiLinks: window.wgULS("个内部链接", "个內部連結"),
"links here": window.wgULS("链入", "鏈入"),
whatLinksHere: window.wgULS("链入页面", "鏈入頁面"),
"what links here": window.wgULS("链入页面", "鏈入頁面"),
WhatlinkshereHint: window.wgULS("显示链接到 %s 的页面", "顯示連結到 %s 的頁面"),
unwatchShort: window.wgULS("取消", "取消"),
watchThingy: window.wgULS("监视", "監視"),
// called watchThingy because {}.watch is a function
watchHint: window.wgULS("加入 %s 到我的监视列表", "加入 %s 到我的監視列表"),
unwatchHint: window.wgULS("从我的监视列表移除 %s", "從我的監視列表移除 %s"),
"Only found one editor: %s made %s edits": window.wgULS("仅找到一位编者:%s 制造了 %s 次编辑", "僅找到一位編者:%s 製造了 %s 次編輯"),
"%s seems to be the last editor to the page %s": window.wgULS("%s 看上去是 %s 这页的最后一位编者", "%s 看上去是 %s 這頁的最後一位編者"),
rss: window.wgULS("RSS", "RSS"),
// diff previews
"Diff truncated for performance reasons": window.wgULS("出于性能考虑,差异已被截断", "出於效能考慮,差異已被截斷"),
"Old revision": window.wgULS("旧版本", "舊版本"),
"New revision": window.wgULS("新版本", "新版本"),
"Something went wrong :-(": window.wgULS("出问题了 :-(", "出問題了 :-("),
"Empty revision, maybe non-existent": window.wgULS("空的修订,可能并不存在", "空的修訂,可能並不存在"),
"Unknown date": window.wgULS("未知日期", "未知日期"),
// other special previews
"Empty category": window.wgULS("空的分类", "空的分類"),
"Category members (%s shown)": window.wgULS("分类成员(%s 显示)", "分類成員(%s 顯示)"),
"No image links found": window.wgULS("未找到文件链接", "未找到檔案連結"),
"File links": window.wgULS("文件链接", "檔案連結"),
"not commons": window.wgULS("维基共享中无此名称的文件。", "維基共享中無此名稱的檔案。"),
"commons only": window.wgULS("此文件来自维基共享。", "此檔案來自維基共享。"),
"No image found": window.wgULS("找不到文件", "找不到檔案"),
"commons dupe": window.wgULS("维基共享中存在此文件的副本。", "維基共享中存在此檔案的副本。"),
"commons conflict": window.wgULS("维基共享中存在此文件名称不同的副本。", "維基共享中存在此檔名稱不同的副本。"),
// user-related actions and info
user: window.wgULS("用户", "使用者"),
// /// user page, talk, email, space
"user page": window.wgULS("用户页", "使用者頁"),
"user talk": window.wgULS("用户讨论", "使用者對話"),
"edit user talk": window.wgULS("编辑用户讨论", "編輯使用者對話"),
"leave comment": window.wgULS("留言", "留言"),
email: window.wgULS("电邮", "電郵"),
"email user": window.wgULS("电邮用户", "電郵使用者"),
EmailuserHint: window.wgULS("给 %s 发送电子邮件", "給 %s 發送電子郵件"),
space: window.wgULS("子页面", "子頁面"),
// short form for userSpace link
PrefixindexHint: window.wgULS("显示 %s 的用户页子页面", "顯示 %s 的使用者頁子頁面"),
count: window.wgULS("统计", "統計"),
// /// contributions, tree, log
"edit counter": window.wgULS("编辑次数", "編輯次數"),
katelinkHint: window.wgULS("%s 的编辑次数", "%s 的編輯次數"),
contribs: window.wgULS("贡献", "貢獻"),
contributions: window.wgULS("贡献", "貢獻"),
deletedContribs: window.wgULS("已删除的贡献", "已刪除的貢獻"),
ContributionsHint: window.wgULS("%s 的用户贡献", "%s 的使用者貢獻"),
tree: window.wgULS("树", "樹"),
contribsTreeHint: window.wgULS("根据名字空间查看 %s 的贡献", "根據命名空間檢視 %s 的貢獻"),
log: window.wgULS("日志", "日誌"),
"user log": window.wgULS("用户日志", "使用者日誌"),
userLogHint: window.wgULS("显示 %s 的用户日志", "顯示 %s 的使用者日誌"),
unblockShort: window.wgULS("解除", "解除"),
block: window.wgULS("封禁", "封鎖"),
"block user": window.wgULS("封禁用户", "封鎖使用者"),
IpblocklistHint: window.wgULS("解封 %s", "解封 %s"),
BlockipHint: window.wgULS("封禁 %s", "封鎖 %s"),
"block log": window.wgULS("封禁日志", "封鎖日誌"),
blockLogHint: window.wgULS("显示 %s 的封禁日志", "顯示 %s 的封鎖日誌"),
protectLogHint: window.wgULS("显示 %s 的保护日志", "顯示 %s 的保護日誌"),
pageLogHint: window.wgULS("显示 %s 的日志", "顯示 %s 的日誌"),
deleteLogHint: window.wgULS("显示 %s 的删除日志", "顯示 %s 的刪除日誌"),
"Invalid %s %s": window.wgULS("选项 %s 不可用:%s", "選項 %s 不可用:%s"),
m: "小",
// Autoediting
"Enter a non-empty edit summary or press cancel to abort": window.wgULS("输入编辑摘要,或按取消中止操作", "輸入編輯摘要,或按取消中止操作"),
"Failed to get revision information, please edit manually.\n\n": window.wgULS("获取修订版本信息失败,请手动修改。\n\n", "獲取修訂版本資訊失敗,請手動修改。\n\n"),
"The %s button has been automatically clicked. Please wait for the next page to load.": window.wgULS("按钮 %s 已被自动点击,请等待下一个页面加载。", "按鈕 %s 已被自動點擊,請等待下一個頁面載入。"),
"Could not find button %s. Please check the settings in your javascript file.": window.wgULS("找不到按钮 %s,请检查您 JavaScript 文件中的设置。", "找不到按鈕 %s,請檢查您 JavaScript 檔案中的設定。"),
// Popups setup
"Open full-size image": window.wgULS("查看全尺寸图像", "檢視全尺寸影像"),
// 以下内容由 AnnAngela 补正
bingSearchHint: window.wgULS("在 Bing 上搜索“%s”", "在 bing 上搜尋「%s」"),
"enable previews": window.wgULS("启用预览", "啟用預覽"),
"show preview": window.wgULS("禁用预览", "禁用預覽"),
historyfeedHint: window.wgULS("该页面的近期更改 RSS feed", "該頁面的近期更改 RSS feed"),
"send thanks": window.wgULS("发送感谢", "傳送感謝"),
ThanksHint: window.wgULS("向该用户发送一封感谢消息", "向該使用者傳送一封感謝訊息"),
"mark patrolled": window.wgULS("标记为已巡查", "標記為已巡查"),
markpatrolledHint: window.wgULS("标记该编辑为已巡查", "標記該編輯為已巡查"),
"Could not marked this edit as patrolled": window.wgULS("无法标记该编辑为已巡查", "無法標記該編輯為已巡查"),
defaultpopupReviewedSummary: window.wgULS("标记从版本%s到%s间的编辑为已巡查", "標記從版本%s到%s間的編輯為已巡查"),
"Image from Commons": window.wgULS("来自维基共享的图片", "來自維基共用的圖片"),
"Description page": window.wgULS("图片描述页", "圖片描述頁"),
"Alt text:": window.wgULS("替换文本(Alt):", "替換文字(Alt):"),
revdel: window.wgULS("历史版本被隐藏", "歷史版本被隱藏"),
DeletedcontributionsHint: window.wgULS("用户%s的被删除编辑次数", "使用者%s的被刪除編輯次數"),
"No backlinks found": window.wgULS("找不到链入页面", "找不到鏈入頁面"),
" and more": window.wgULS("以及其他页面", "以及其他頁面"),
"Download preview data": window.wgULS("下载预览数据", "下載預覽資料"),
"Not a registered username": window.wgULS("非已注册的用户", "非已註冊的使用者"),
BLOCKED: window.wgULS("被封禁", "被封鎖"),
"Has blocks": window.wgULS("被部分封禁", "被部分封鎖"),
" edits since: ": window.wgULS("次编辑,注册日期为", "次編輯,註冊日期為"),
"last edit on ": window.wgULS("最后一次编辑于", "最後一次編輯於"),
EmailUserHint: window.wgULS("给 %s 发送电子邮件", "給 %s 發送電子郵件"),
RANGEBLOCKED: window.wgULS("IP段被封禁", "IP段被封鎖"),
"IP user": window.wgULS("IP用户", "IP使用者"),
"♀": "♀",
"♂": "♂",
HIDDEN: window.wgULS("全域隐藏", "全域隱藏"),
LOCKED: window.wgULS("全域锁定", "全域鎖定"),
"Invalid user": window.wgULS("非法用户名", "非法使用者名稱"),
diff: window.wgULS("差异", "差異"),
" to ": "至",
autoedit_version: "np20140416",
PrefixIndexHint: window.wgULS("显示用户%s的子页面", "顯示使用者%s的子頁面"),
nullEditSummary: window.wgULS("进行一次零编辑", "進行一次零編輯"),
// 用户组名称从系统消息获取
"group-no-autoconfirmed": window.wgULS("非自动确认用户", "非自動確認使用者"),
separator: "、",
comma: ","
};
//! src/Navigation_popups/modules/core.js
var popups = () => {
const pg = {
api: {},
re: {},
ns: {},
string: {},
wiki: {},
user: {},
misc: {},
option: {},
optionDefault: {},
flag: {},
cache: {},
structures: {},
timer: {},
counter: {},
current: {},
fn: {},
endoflist: null
};
if (window.pg && !(window.pg instanceof HTMLElement)) {
return;
}
window.pg = pg;
const setupTooltips = (container, remove, force, popData) => {
log("setupTooltips, container=".concat(container, ", remove=").concat(remove));
if (!container) {
if (getValueOf("popupOnEditSelection") && document && document.editform && document.editform.wpTextbox1) {
document.editform.wpTextbox1.onmouseup = doSelectionPopup;
}
container = defaultPopupsContainer();
}
if (!remove && !force && container.ranSetupTooltipsAlready) {
return;
}
container.ranSetupTooltipsAlready = !remove;
const anchors = container.querySelectorAll("a");
setupTooltipsLoop(anchors, 0, 250, 100, remove, popData);
};
const defaultPopupsContainer = () => {
if (getValueOf("popupOnlyArticleLinks")) {
return document.querySelector(".skin-vector-2022 .vector-body") || document.querySelector("#mw_content") || document.querySelector("#content") || document.querySelector("#article") || document;
}
return document;
};
const setupTooltipsLoop = function setupTooltipsLoop2(anchors, begin, howmany, sleep, remove, popData, ...args) {
log(simplePrintf("setupTooltipsLoop(%s,%s,%s,%s,%s)", [anchors, begin, howmany, sleep, remove, popData, ...args]));
const finish = begin + howmany;
const loopend = Math.min(finish, anchors.length);
let j = loopend - begin;
log("setupTooltips: anchors.length=".concat(anchors.length, ", begin=").concat(begin, ", howmany=").concat(howmany, ", loopend=").concat(loopend, ", remove=").concat(remove));
const doTooltip = remove ? removeTooltip : addTooltip;
if (j > 0) {
do {
const a = anchors[loopend - j];
if (a === void 0 || !a || !a.href) {
log("got null anchor at index ".concat(loopend) - j);
continue;
}
doTooltip(a, popData);
} while (--j);
}
if (finish < anchors.length) {
setTimeout(() => {
setupTooltipsLoop2(anchors, finish, howmany, sleep, remove, popData);
}, sleep);
} else {
if (!remove && !getValueOf("popupTocLinks")) {
rmTocTooltips();
}
pg.flag.finishedLoading = true;
}
};
const rmTocTooltips = () => {
const toc = document.querySelector("#toc");
if (toc) {
const tocLinks = toc.querySelectorAll("a");
const tocLen = tocLinks.length;
for (let j = 0; j < tocLen; ++j) {
removeTooltip(tocLinks[j], true);
}
}
};
const addTooltip = (a, popData) => {
if (!isPopupLink(a)) {
return;
}
a.onmouseover = mouseOverWikiLink;
a.onmouseout = mouseOutWikiLink;
a.onmousedown = killPopup;
a.hasPopup = true;
a.popData = popData;
};
const removeTooltip = (a) => {
if (!a.hasPopup) {
return;
}
a.onmouseover = null;
a.onmouseout = null;
if (a.originalTitle) {
a.title = a.originalTitle;
}
a.hasPopup = false;
};
const removeTitle = (a) => {
if (!a.originalTitle) {
a.originalTitle = a.title;
}
a.title = "";
};
const restoreTitle = (a) => {
if (a.title || !a.originalTitle) {
return;
}
a.title = a.originalTitle;
};
const registerHooks = (np) => {
const popupMaxWidth = getValueOf("popupMaxWidth");
if (typeof popupMaxWidth === "number") {
const setMaxWidth = () => {
np.mainDiv.style.maxWidth = "".concat(popupMaxWidth, "px");
np.maxWidth = popupMaxWidth;
};
np.addHook(setMaxWidth, "unhide", "before");
}
np.addHook(addPopupShortcuts, "unhide", "after");
np.addHook(rmPopupShortcuts, "hide", "before");
};
const removeModifierKeyListener = (a) => {
document.removeEventListener("keydown", a.modifierKeyListener, false);
document.removeEventListener("keyup", a.modifierKeyListener, false);
};
const mouseOverWikiLink = function mouseOverWikiLink3(evt) {
if (!evt && window.event) {
evt = window.event;
}
if (getValueOf("popupModifier")) {
const action = getValueOf("popupModifierAction");
const key = action === "disable" ? "keyup" : "keydown";
const self2 = this;
self2.modifierKeyListener = (evt2) => {
mouseOverWikiLink2(self2, evt2);
};
document.addEventListener(key, self2.modifierKeyListener, false);
}
return mouseOverWikiLink2(this, evt);
};
const footnoteTarget = (a) => {
const aTitle = Title.fromAnchor(a);
const anch = aTitle.anchor;
if (!/^(cite_note-|_note-|endnote)/.test(anch)) {
return false;
}
const lTitle = Title.fromURL(location.href);
if (lTitle.toString(true) !== aTitle.toString(true)) {
return false;
}
let el = document.querySelector("#".concat(anch));
while (el && typeof el.nodeName === "string") {
const nt = el.nodeName.toLowerCase();
if (nt === "li") {
return el;
} else if (nt === "body") {
return false;
} else if (el.parentNode) {
el = el.parentNode;
} else {
return false;
}
}
return false;
};
const footnotePreview = (x, navpop) => {
setPopupHTML("<hr>".concat(x.innerHTML), "popupPreview", navpop.idNumber);
};
const modifierPressed = (evt) => {
const mod = getValueOf("popupModifier");
if (!mod) {
return false;
}
if (!evt && window.event) {
evt = window.event;
}
return evt && mod && evt["".concat(mod.toLowerCase(), "Key")];
};
const isCorrectModifier = (_a, evt) => {
if (!getValueOf("popupModifier")) {
return true;
}
const action = getValueOf("popupModifierAction");
return action === "enable" && modifierPressed(evt) || action === "disable" && !modifierPressed(evt);
};
const mouseOverWikiLink2 = (a, evt) => {
if (!isCorrectModifier(a, evt)) {
return;
}
if (getValueOf("removeTitles")) {
removeTitle(a);
}
if (a === pg.current.link && a.navpopup && a.navpopup.isVisible()) {
return;
}
pg.current.link = a;
if (getValueOf("simplePopups") && !pg.option.popupStructure) {
setDefault("popupStructure", "original");
}
const article = new Title().fromAnchor(a);
pg.current.article = article;
if (!a.navpopup) {
a.navpopup = newNavpopup(a, article);
pg.current.linksHash[a.href] = a.navpopup;
pg.current.links.push(a);
}
if (a.navpopup.pending === null || a.navpopup.pending !== 0) {
simplePopupContent(a, article);
}
a.navpopup.showSoonIfStable(a.navpopup.delay);
clearInterval(pg.timer.checkPopupPosition);
pg.timer.checkPopupPosition = setInterval(checkPopupPosition, 600);
if (getValueOf("simplePopups") && getValueOf("popupPreviewButton") && !a.simpleNoMore) {
const d = document.createElement("div");
d.className = "popupPreviewButtonDiv";
const s = document.createElement("span");
d.append(s);
s.className = "popupPreviewButton";
s["on".concat(getValueOf("popupPreviewButtonEvent"))] = () => {
a.simpleNoMore = true;
d.style.display = "none";
nonsimplePopupContent(a, article);
};
s.innerHTML = popupString("show preview");
setPopupHTML(d, "popupPreview", a.navpopup.idNumber);
}
if (a.navpopup.pending !== 0) {
nonsimplePopupContent(a, article);
}
};
const simplePopupContent = (a, article) => {
a.navpopup.hasPopupMenu = false;
a.navpopup.setInnerHTML(popupHTML(a));
fillEmptySpans({
navpopup: a.navpopup
});
if (getValueOf("popupDraggable")) {
let dragHandle = getValueOf("popupDragHandle") || null;
if (dragHandle && dragHandle !== "all") {
dragHandle += a.navpopup.idNumber;
}
setTimeout(() => {
a.navpopup.makeDraggable(dragHandle);
}, 150);
}
if (getValueOf("popupRedlinkRemoval") && a.className === "new") {
setPopupHTML("<br>".concat(popupRedlinkHTML(article)), "popupRedlink", a.navpopup.idNumber);
}
};
const debugData = (navpopup) => {
if (getValueOf("popupDebugging") && navpopup.idNumber) {
setPopupHTML("idNumber=".concat(navpopup.idNumber, ", pending=").concat(navpopup.pending), "popupError", navpopup.idNumber);
}
};
const newNavpopup = (a, article) => {
const navpopup = new Navpopup();
navpopup.fuzz = 5;
navpopup.delay = getValueOf("popupDelay") * 1e3;
navpopup.idNumber = ++pg.idNumber;
navpopup.parentAnchor = a;
navpopup.parentPopup = a.popData && a.popData.owner;
navpopup.article = article;
registerHooks(navpopup);
return navpopup;
};
const shouldShowNonSimple = (a) => {
return !getValueOf("simplePopups") || a.simpleNoMore;
};
const shouldShow = (a, option) => {
if (shouldShowNonSimple(a)) {
return getValueOf(option);
}
return window[option] !== void 0 && window[option];
};
const nonsimplePopupContent = (a, article) => {
let diff2;
let history;
const params = parseParams(a.href);
const oldid = params.oldid === void 0 ? null : params.oldid;
if (shouldShow(a, "popupPreviewDiffs")) {
({
diff: diff2
} = params);
}
if (shouldShow(a, "popupPreviewHistory")) {
history = params.action === "history";
}
a.navpopup.pending = 0;
const referenceElement = footnoteTarget(a);
if (referenceElement) {
footnotePreview(referenceElement, a.navpopup);
} else if (diff2 || diff2 === 0) {
loadDiff(article, oldid, diff2, a.navpopup);
} else if (history) {
loadAPIPreview("history", article, a.navpopup);
} else if (shouldShowNonSimple(a) && pg.re.contribs.test(a.href)) {
loadAPIPreview("contribs", article, a.navpopup);
} else if (shouldShowNonSimple(a) && pg.re.backlinks.test(a.href)) {
loadAPIPreview("backlinks", article, a.navpopup);
} else if (
// FIXME should be able to get all preview combinations with options
article.namespaceId() === pg.nsImageId && (shouldShow(a, "imagePopupsForImages") || !anchorContainsImage(a))
) {
loadAPIPreview("imagepagepreview", article, a.navpopup);
loadImage(article, a.navpopup);
} else {
if (article.namespaceId() === pg.nsCategoryId && shouldShow(a, "popupCategoryMembers")) {
loadAPIPreview("category", article, a.navpopup);
} else if ((article.namespaceId() === pg.nsUserId || article.namespaceId() === pg.nsUsertalkId) && shouldShow(a, "popupUserInfo")) {
loadAPIPreview("userinfo", article, a.navpopup);
}
if (shouldShowNonSimple(a)) {
startArticlePreview(article, oldid, a.navpopup);
}
}
};
const pendingNavpopTask = (navpop) => {
if (navpop && navpop.pending === null) {
navpop.pending = 0;
}
++navpop.pending;
debugData(navpop);
};
const completedNavpopTask = (navpop) => {
if (navpop && navpop.pending) {
--navpop.pending;
}
debugData(navpop);
};
const startArticlePreview = (article, oldid, navpop) => {
navpop.redir = 0;
loadPreview(article, oldid, navpop);
};
const loadPreview = (article, oldid, navpop) => {
if (!navpop.redir) {
navpop.originalArticle = article;
}
article.oldid = oldid;
loadAPIPreview("revision", article, navpop);
};
const loadPreviewFromRedir = (redirMatch, navpop) => {
const target = new Title().fromWikiText(redirMatch[2]);
if (navpop.article.anchor) {
target.anchor = navpop.article.anchor;
}
navpop.redir++;
navpop.redirTarget = target;
const warnRedir = redirLink(target, navpop.article);
setPopupHTML(warnRedir, "popupWarnRedir", navpop.idNumber);
navpop.article = target;
fillEmptySpans({
redir: true,
redirTarget: target,
navpopup: navpop
});
return loadPreview(target, null, navpop);
};
const insertPreview = (download) => {
if (!download.owner) {
return;
}
const redirMatch = pg.re.redirect.exec(download.data);
if (download.owner.redir === 0 && redirMatch) {
loadPreviewFromRedir(redirMatch, download.owner);
return;
}
if (download.owner.visible || !getValueOf("popupLazyPreviews")) {
insertPreviewNow(download);
} else {
const id = download.owner.redir ? "PREVIEW_REDIR_HOOK" : "PREVIEW_HOOK";
download.owner.addHook(() => {
insertPreviewNow(download);
return true;
}, "unhide", "after", id);
}
};
const insertPreviewNow = (download) => {
if (!download.owner) {
return;
}
const wikiText = download.data;
const navpop = download.owner;
const art = navpop.redirTarget || navpop.originalArticle;
makeFixDabs(wikiText, navpop);
if (getValueOf("popupSummaryData")) {
getPageInfo(wikiText, download);
setPopupTrailer(getPageInfo(wikiText, download), navpop.idNumber);
}
let imagePage = "";
imagePage = art.namespaceId() === pg.nsImageId ? art.toString() : getValidImageFromWikiText(wikiText);
if (imagePage) {
loadImage(Title.fromWikiText(imagePage), navpop);
}
if (getValueOf("popupPreviews")) {
insertArticlePreview(download, art, navpop);
}
};
const insertArticlePreview = (download, art, navpop) => {
if (download && typeof download.data === "string") {
if (art.namespaceId() === pg.nsTemplateId && getValueOf("popupPreviewRawTemplates")) {
const h = '<hr><span style="font-family: monospace;">'.concat(download.data.entify().split("\\n").join("<br>\\n"), "</span>");
setPopupHTML(h, "popupPreview", navpop.idNumber);
} else {
const p = prepPreviewmaker(download.data, art, navpop);
p.showPreview();
}
}
};
const prepPreviewmaker = (data, article, navpop) => {
const d = anchorize(data, article.anchorString());
const urlBase = joinPath([pg.wiki.articlebase, article.urlString()]);
const p = new Previewmaker(d, urlBase, navpop);
return p;
};
const anchorize = (d, anch) => {
if (!anch) {
return d;
}
const anchRe = new RegExp("(?:=+\\s*".concat(literalizeRegex(anch).replace(/[ _]/g, "[_ ]"), "\\s*=+|\\{\\{\\s*").concat(getValueOf("popupAnchorRegexp"), "\\s*(?:\\|[^|}]*)*?\\s*").concat(literalizeRegex(anch), "\\s*(?:\\|[^}]*)?}})"));
const match = d.match(anchRe);
if (match && match.length > 0 && match[0]) {
return d.slice(Math.max(0, d.indexOf(match[0])));
}
const lines = d.split("\n");
for (let i = 0; i < lines.length; ++i) {
lines[i] = lines[i].replace(/\[{2}([^\]|]*?\|)?(.*?)]{2}/g, "$2").replace(/'''([^'])/g, "$1").replace(/''([^'])/g, "$1");
if (anchRe.test(lines[i])) {
return d.split("\n").slice(i).join("\n").replace(/^[^=]*/, "");
}
}
return d;
};
const killPopup = function killPopup2() {
removeModifierKeyListener(this);
if (getValueOf("popupShortcutKeys")) {
rmPopupShortcuts();
}
if (!pg) {
return;
}
if (pg.current.link && pg.current.link.navpopup) {
pg.current.link.navpopup.banish();
}
pg.current.link = null;
abortAllDownloads();
if (pg.timer.checkPopupPosition) {
clearInterval(pg.timer.checkPopupPosition);
pg.timer.checkPopupPosition = null;
}
return true;
};
class Drag {
constructor() {
this.startCondition = null;
this.endHook = null;
}
/**
* Gets an event in a cross-browser manner.
*
* @param {Event} e
* @private
*/
static fixE(e) {
if (e === void 0) {
e = window.event;
}
if (e.layerX === void 0) {
e.layerX = e.offsetX;
}
if (e.layerY === void 0) {
e.layerY = e.offsetY;
}
return e;
}
/**
* Initialises the Drag instance by telling it which object you want to be draggable, and what
* you want to drag it by.
*
* @param {DOMElement} o The "handle" by which <code>oRoot</code> is dragged.
* @param {DOMElement} oRoot The object which moves when <code>o</code> is dragged, or <code>o</code> if omitted.
*/
init(o, oRoot) {
const self2 = this;
this.obj = o;
o.onmousedown = (e) => {
self2.start(e);
};
o.dragging = false;
o.popups_draggable = true;
o.hmode = true;
o.vmode = true;
o.root = oRoot || o;
if (Number.isNaN(Number.parseInt(o.root.style.left, 10))) {
o.root.style.left = "0px";
}
if (Number.isNaN(Number.parseInt(o.root.style.top, 10))) {
o.root.style.top = "0px";
}
o.root.onthisStart = () => {
};
o.root.onthisEnd = () => {
};
o.root.onthis = () => {
};
}
/**
* Starts the drag.
*
* @private
* @param {Event} e
*/
start(e) {
const o = this.obj;
e = Drag.fixE(e);
if (this.startCondition && !this.startCondition(e)) {
return;
}
const y = Number.parseInt(o.vmode ? o.root.style.top : o.root.style.bottom, 10);
const x = Number.parseInt(o.hmode ? o.root.style.left : o.root.style.right, 10);
o.root.onthisStart(x, y);
o.lastMouseX = e.clientX;
o.lastMouseY = e.clientY;
const self2 = this;
o.onmousemoveDefault = document.onmousemove;
o.dragging = true;
document.onmousemove = (e2) => {
self2.drag(e2);
};
document.onmouseup = (e2) => {
self2.end(e2);
};
return false;
}
/**
* Does the drag.
*
* @param {Event} e
* @private
*/
drag(e) {
e = Drag.fixE(e);
const o = this.obj;
const ey = e.clientY;
const ex = e.clientX;
const y = Number.parseInt(o.vmode ? o.root.style.top : o.root.style.bottom, 10);
const x = Number.parseInt(o.hmode ? o.root.style.left : o.root.style.right, 10);
const nx = x + (ex - o.lastMouseX) * (o.hmode ? 1 : -1);
const ny = y + (ey - o.lastMouseY) * (o.vmode ? 1 : -1);
this.obj.root.style[o.hmode ? "left" : "right"] = "".concat(nx, "px");
this.obj.root.style[o.vmode ? "top" : "bottom"] = "".concat(ny, "px");
this.obj.lastMouseX = ex;
this.obj.lastMouseY = ey;
this.obj.root.onthis(nx, ny);
return false;
}
/**
* Ends the drag.
*
* @private
*/
end() {
document.onmousemove = this.obj.onmousemoveDefault;
document.onmouseup = null;
this.obj.dragging = false;
if (this.endHook) {
this.endHook(Number.parseInt(this.obj.root.style[this.obj.hmode ? "left" : "right"], 10), Number.parseInt(this.obj.root.style[this.obj.vmode ? "top" : "bottom"], 10));
}
}
}
pg.structures.original = {};
pg.structures.original.popupLayout = () => {
return ["popupError", "popupImage", "popupTopLinks", "popupTitle", "popupUserData", "popupData", "popupOtherLinks", "popupRedir", ["popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"], "popupMiscTools", ["popupRedlink"], "popupPrePreviewSep", "popupPreview", "popupSecondPreview", "popupPreviewMore", "popupPostPreview", "popupFixDab"];
};
pg.structures.original.popupRedirSpans = () => {
return ["popupRedir", "popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"];
};
pg.structures.original.popupTitle = (x) => {
log("defaultstructure.popupTitle");
if (!getValueOf("popupNavLinks")) {
return navlinkStringToHTML("<b><<mainlink>></b>", x.article, x.params);
}
return "";
};
pg.structures.original.popupTopLinks = (x) => {
log("defaultstructure.popupTopLinks");
if (getValueOf("popupNavLinks")) {
return navLinksHTML(x.article, x.hint, x.params);
}
return "";
};
pg.structures.original.popupImage = (x) => {
log("original.popupImage, x.article=".concat(x.article, ", x.navpop.idNumber=").concat(x.navpop.idNumber));
return imageHTML(x.article, x.navpop.idNumber);
};
pg.structures.original.popupRedirTitle = pg.structures.original.popupTitle;
pg.structures.original.popupRedirTopLinks = pg.structures.original.popupTopLinks;
const copyStructure = (oldStructure, newStructure) => {
pg.structures[newStructure] = {};
for (const prop in pg.structures[oldStructure]) {
if (!Object.hasOwn(pg.structures[oldStructure], prop)) {
continue;
}
pg.structures[newStructure][prop] = pg.structures[oldStructure][prop];
}
};
copyStructure("original", "nostalgia");
pg.structures.nostalgia.popupTopLinks = (x) => {
let str = "";
str += "<b><<mainlink|shortcut= >></b>";
str += "if(user){<br><<contribs|shortcut=c>>";
str += "if(wikimedia){*<<count|shortcut=#>>}";
str += "if(ipuser){}else{*<<email|shortcut=E>>}if(admin){*<<block|shortcut=b>>}}";
const editstr = "<<edit|shortcut=e>>";
const editOldidStr = "if(oldid){<<editOld|shortcut=e>>|<<revert|shortcut=v|rv>>|<<edit|cur>>}else{".concat(editstr, "}");
const historystr = "<<history|shortcut=h>>";
const watchstr = "<<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>>";
str += "<br>if(talk){".concat(editOldidStr, "|<<new|shortcut=+>>*").concat(historystr, "*").concat(watchstr, "*<b><<article|shortcut=a>></b>|<<editArticle|edit>>}else{").concat(
// not a talk page
editOldidStr,
"*"
).concat(historystr, "*").concat(watchstr, "*<b><<talk|shortcut=t>></b>|<<editTalk|edit>>|<<newTalk|shortcut=+|new>>}");
str += "<br><<whatLinksHere|shortcut=l>>*<<relatedChanges|shortcut=r>>";
str += "if(admin){<br>}else{*}<<move|shortcut=m>>";
str += "if(admin){*<<unprotect|unprotectShort>>|<<protect|shortcut=p>>*<<undelete|undeleteShort>>|<<delete|shortcut=d>>}";
return navlinkStringToHTML(str, x.article, x.params);
};
pg.structures.nostalgia.popupRedirTopLinks = pg.structures.nostalgia.popupTopLinks;
copyStructure("original", "fancy");
pg.structures.fancy.popupTitle = (x) => {
return navlinkStringToHTML("<font size=+0><<mainlink>></font>", x.article, x.params);
};
pg.structures.fancy.popupTopLinks = (x) => {
const hist = "<<history|shortcut=h|hist>>|<<lastEdit|shortcut=/|last>>|<<editors|shortcut=E|eds>>";
const watch = "<<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>>";
const move = "<<move|shortcut=m|move>>";
return navlinkStringToHTML("if(talk){<<edit|shortcut=e>>|<<new|shortcut=+|+>>*".concat(hist, "*<<article|shortcut=a>>|<<editArticle|edit>>*").concat(watch, "*").concat(move, "}else{<<edit|shortcut=e>>*").concat(hist, "*<<talk|shortcut=t|>>|<<editTalk|edit>>|<<newTalk|shortcut=+|new>>*").concat(watch, "*").concat(move, "}<br>"), x.article, x.params);
};
pg.structures.fancy.popupOtherLinks = (x) => {
const admin = "<<unprotect|unprotectShort>>|<<protect|shortcut=p>>*<<undelete|undeleteShort>>|<<delete|shortcut=d|del>>";
let user = "<<contribs|shortcut=c>>if(wikimedia){|<<count|shortcut=#|#>>}";
user += "if(ipuser){|<<arin>>}else{*<<email|shortcut=E|".concat(popupString("email"), ">>}if(admin){*<<block|shortcut=b>>}");
const normal = "<<whatLinksHere|shortcut=l|links here>>*<<relatedChanges|shortcut=r|related>>";
return navlinkStringToHTML("<br>if(user){".concat(user, "*}if(admin){").concat(admin, "if(user){<br>}else{*}}").concat(normal), x.article, x.params);
};
pg.structures.fancy.popupRedirTitle = pg.structures.fancy.popupTitle;
pg.structures.fancy.popupRedirTopLinks = pg.structures.fancy.popupTopLinks;
pg.structures.fancy.popupRedirOtherLinks = pg.structures.fancy.popupOtherLinks;
copyStructure("fancy", "fancy2");
pg.structures.fancy2.popupTopLinks = // hack out the <br> at the end and put one at the beginning
(x) => {
return "<br>".concat(pg.structures.fancy.popupTopLinks(x).replace(/<br>$/i, ""));
};
pg.structures.fancy2.popupLayout = () => {
return ["popupError", "popupImage", "popupTitle", "popupUserData", "popupData", "popupTopLinks", "popupOtherLinks", "popupRedir", ["popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"], "popupMiscTools", ["popupRedlink"], "popupPrePreviewSep", "popupPreview", "popupSecondPreview", "popupPreviewMore", "popupPostPreview", "popupFixDab"];
};
copyStructure("original", "menus");
pg.structures.menus.popupLayout = () => {
return ["popupError", "popupImage", "popupTopLinks", "popupTitle", "popupOtherLinks", "popupRedir", ["popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"], "popupUserData", "popupData", "popupMiscTools", ["popupRedlink"], "popupPrePreviewSep", "popupPreview", "popupSecondPreview", "popupPreviewMore", "popupPostPreview", "popupFixDab"];
};
pg.structures.menus.popupTopLinks = (x, shorter) => {
const s = [];
const dropdiv = '<div class="popup_drop">';
const enddiv = "</div>";
let hist = "<<history|shortcut=h>>";
if (!shorter) {
hist = "<menurow>".concat(hist, "|<<historyfeed|rss>>|<<editors|shortcut=E>></menurow>");
}
const lastedit = "<<lastEdit|shortcut=/|show last edit>>";
const thank = "if(diff){<<thank|send thanks>>}";
const jsHistory = "<<lastContrib|last set of edits>><<sinceMe|changes since mine>>";
const linkshere = "<<whatLinksHere|shortcut=l|what links here>>";
const related = "<<relatedChanges|shortcut=r|related changes>>";
const search = "<menurow><<search|shortcut=s>></menurow>";
const watch = "<menurow><<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>></menurow>";
const protect = "<menurow><<unprotect|unprotectShort>>|<<protect|shortcut=p>>|<<protectlog|log>></menurow>";
const del = "<menurow><<undelete|undeleteShort>>|<<delete|shortcut=d>>|<<deletelog|log>></menurow>";
const move = "<<move|shortcut=m|move page>>";
const nullPurge = "<menurow><<nullEdit|shortcut=n|null edit>>|<<purge|shortcut=P>></menurow>";
const viewOptions = "<menurow><<view|shortcut=v>>|<<render|shortcut=S>>|<<raw>></menurow>";
const editRow = "if(oldid){<menurow><<edit|shortcut=e>>|<<editOld|shortcut=e|this revision>></menurow><menurow><<revert|shortcut=v>>|<<undo>></menurow>}else{<<edit|shortcut=e>>}";
const markPatrolled = "if(rcid){<<markpatrolled|mark patrolled>>}";
const newTopic = "if(talk){<<new|shortcut=+|new topic>>}";
const protectDelete = "if(admin){".concat(protect).concat(del, "}");
if (getValueOf("popupActionsMenu")) {
s.push("<<mainlink>>*".concat(dropdiv).concat(menuTitle("actions")));
} else {
s.push("".concat(dropdiv, "<<mainlink>>"));
}
s.push("<menu>", editRow + markPatrolled + newTopic + hist + lastedit + thank);
if (!shorter) {
s.push(jsHistory);
}
s.push(move + linkshere + related);
if (!shorter) {
s.push(nullPurge + search);
}
if (!shorter) {
s.push(viewOptions);
}
s.push("<hr>".concat(watch).concat(protectDelete), "<hr>if(talk){<<article|shortcut=a|view article>><<editArticle|edit article>>}else{<<talk|shortcut=t|talk page>><<editTalk|edit talk>><<newTalk|shortcut=+|new topic>>}</menu>".concat(enddiv));
const email = "<<email|shortcut=E|email user>>";
const contribs = "if(wikimedia){<menurow>}<<contribs|shortcut=c|contributions>>if(wikimedia){</menurow>}if(admin){<menurow><<deletedContribs>></menurow>}";
s.push("if(user){*".concat(dropdiv).concat(menuTitle("user")), "<menu>", "<menurow><<userPage|shortcut=u|user page>>|<<userSpace|space>></menurow>", "<<userTalk|shortcut=t|user talk>><<editUserTalk|edit user talk>><<newUserTalk|shortcut=+|leave comment>>");
if (shorter) {
s.push("if(ipuser){}else{".concat(email, "}"));
} else {
s.push("if(ipuser){<<arin>>}else{".concat(email, "}"));
}
s.push("<hr>".concat(contribs, "<<userlog|shortcut=L|user log>>"), "if(wikimedia){<<count|shortcut=#|edit counter>>}", "if(admin){<menurow><<unblock|unblockShort>>|<<block|shortcut=b|block user>></menurow>}", "<<blocklog|shortcut=B|block log>>", "</menu>".concat(enddiv, "}"));
if (getValueOf("popupSetupMenu") && !x.navpop.hasPopupMenu) {
x.navpop.hasPopupMenu = true;
s.push("*".concat(dropdiv).concat(menuTitle("popupsMenu"), "<menu>"), "<<togglePreviews|toggle previews>>", "<<purgePopups|reset>>", "<<disablePopups|disable>>", "</menu>".concat(enddiv));
}
return navlinkStringToHTML(s.join(""), x.article, x.params);
};
const menuTitle = (s) => {
return '<a href="#" noPopup=1>'.concat(popupString(s), "</a>");
};
pg.structures.menus.popupRedirTitle = pg.structures.menus.popupTitle;
pg.structures.menus.popupRedirTopLinks = pg.structures.menus.popupTopLinks;
copyStructure("menus", "shortmenus");
pg.structures.shortmenus.popupTopLinks = (x) => {
return pg.structures.menus.popupTopLinks(x, true);
};
pg.structures.shortmenus.popupRedirTopLinks = pg.structures.shortmenus.popupTopLinks;
pg.structures.lite = {};
pg.structures.lite.popupLayout = () => {
return ["popupTitle", "popupPreview"];
};
pg.structures.lite.popupTitle = (x) => {
log("".concat(x.article, ": structures.lite.popupTitle"));
return '<div><span class="popup_mainlink"><b>'.concat(x.article.toString(), "</b></span></div>");
};
const substitute = (data, cmdBody) => {
const fromRe = new RegExp(cmdBody.from, cmdBody.flags);
return data.replace(fromRe, cmdBody.to);
};
const execCmds = (data, cmdList) => {
var _iterator = _createForOfIteratorHelper(cmdList), _step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done; ) {
const element = _step.value;
data = element.action(data, element);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return data;
};
const parseCmd = function parseCmd2(str) {
if (str.length === 0) {
return [];
}
let p = false;
switch (str.charAt(0)) {
case "s":
p = parseSubstitute(str);
break;
default:
return false;
}
if (p) {
return [p, parseCmd2(p.remainder)];
}
return false;
};
const unEscape = (str, sep) => {
return str.split("\\\\").join("\\").split("\\".concat(sep)).join(sep).split("\\n").join("\n");
};
const parseSubstitute = (str) => {
let from;
let to;
let flags;
let tmp;
if (str.length < 4) {
return false;
}
const sep = str.charAt(1);
str = str.slice(2);
tmp = skipOver(str, sep);
if (tmp) {
from = tmp.segment;
str = tmp.remainder;
} else {
return false;
}
tmp = skipOver(str, sep);
if (tmp) {
to = tmp.segment;
str = tmp.remainder;
} else {
return false;
}
flags = "";
if (str.length > 0) {
tmp = skipOver(str, ";") || skipToEnd(str, ";");
if (tmp) {
flags = tmp.segment;
str = tmp.remainder;
}
}
return {
action: substitute,
from,
to,
flags,
remainder: str
};
};
const skipOver = (str, sep) => {
const endSegment = findNext(str, sep);
if (endSegment < 0) {
return false;
}
const segment = unEscape(str.slice(0, Math.max(0, endSegment)), sep);
return {
segment,
remainder: str.slice(Math.max(0, endSegment + 1))
};
};
const skipToEnd = (str, _sep) => {
return {
segment: str,
remainder: ""
};
};
const findNext = (str, ch) => {
for (let i = 0; i < str.length; ++i) {
if (str.charAt(i) === "\\") {
i += 2;
}
if (str.charAt(i) === ch) {
return i;
}
}
return -1;
};
const setCheckbox = (param, box) => {
const val = mw.util.getParamValue(param);
if (val) {
switch (val) {
case "1":
case "yes":
case "true":
box.checked = true;
break;
case "0":
case "no":
case "false":
box.checked = false;
}
}
};
const autoEdit = function autoEdit4() {
setupPopups(() => {
if (mw.util.getParamValue("autoimpl") !== popupString("autoedit_version")) {
return false;
}
if (mw.util.getParamValue("autowatchlist") && mw.util.getParamValue("actoken") === autoClickToken()) {
pg.fn.modifyWatchlist(mw.util.getParamValue("title"), mw.util.getParamValue("action"));
}
if (!document.editform) {
return false;
}
if (autoEdit4.alreadyRan) {
return false;
}
autoEdit4.alreadyRan = true;
const cmdString = mw.util.getParamValue("autoedit");
if (cmdString) {
try {
const editbox = document.editform.wpTextbox1;
const cmdList = parseCmd(cmdString);
const input = editbox.value;
const output = execCmds(input, cmdList);
editbox.value = output;
} catch {
return;
}
}
setCheckbox("autominor", document.editform.wpMinoredit);
setCheckbox("autowatch", document.editform.wpWatchthis);
const rvid = mw.util.getParamValue("autorv");
if (rvid) {
const url = "".concat(pg.wiki.apiwikibase, "?action=query&format=json&formatversion=2&prop=revisions&revids=").concat(rvid);
startDownload(url, null, autoEdit2);
} else {
autoEdit2();
}
});
};
const autoEdit2 = (d) => {
let summary = mw.util.getParamValue("autosummary");
let summaryprompt = mw.util.getParamValue("autosummaryprompt");
let summarynotice = "";
if (d && d.data && mw.util.getParamValue("autorv")) {
const s = getRvSummary(summary, d.data);
if (s === false) {
summaryprompt = true;
summarynotice = popupString("Failed to get revision information, please edit manually.\n\n");
summary = simplePrintf(summary, [mw.util.getParamValue("autorv"), "(unknown)", "(unknown)"]);
} else {
summary = s;
}
}
if (summaryprompt) {
const txt = summarynotice + popupString("Enter a non-empty edit summary or press cancel to abort");
const response = prompt(txt, summary);
if (response) {
summary = response;
} else {
return;
}
}
if (summary) {
document.editform.wpSummary.value = summary;
}
setTimeout(autoEdit3, 100);
};
const autoClickToken = () => {
return mw.user.sessionId();
};
const autoEdit3 = () => {
if (mw.util.getParamValue("actoken") !== autoClickToken()) {
return;
}
const btn = mw.util.getParamValue("autoclick");
if (btn) {
if (document.editform && document.editform[btn]) {
const button = document.editform[btn];
const msg = tprintf("The %s button has been automatically clicked. Please wait for the next page to load.", [button.value]);
bannerMessage(msg);
document.title = "(".concat(document.title, ")");
button.click();
} else {
void mw.notify(tprintf("Could not find button %s. Please check the settings in your javascript file.", [btn]), {
tag: "popups",
type: "error"
});
}
}
};
const bannerMessage = (s) => {
const headings = document.querySelectorAll("h1");
if (headings) {
const div = document.createElement("div");
div.innerHTML = "<font size=+1><b>".concat(pg.escapeQuotesHTML(s), "</b></font>");
headings[0].parentNode.insertBefore(div, headings[0]);
}
};
const getRvSummary = (template, json) => {
try {
const o = getJsObj(json);
const [edit] = anyChild(o.query.pages).revisions;
const timestamp = edit.timestamp.split(/[A-Z]/g).join(" ").replace(/^ *| *$/g, "");
return simplePrintf(template, [edit.revid, timestamp, edit.userhidden ? "(hidden)" : edit.user]);
} catch {
return false;
}
};
class Downloader {
constructor(url) {
if (typeof XMLHttpRequest !== "undefined") {
this.http = new XMLHttpRequest();
}
this.url = url;
this.id = null;
this.lastModified = null;
this.callbackFunction = null;
this.onFailure = null;
this.aborted = false;
this.method = "GET";
this.async = true;
}
/**
* Submits the http request.
*
* @param {*} x
*/
send(x) {
if (!this.http) {
return null;
}
return this.http.send(x);
}
/* Aborts the download, setting the <code>aborted</code> field to true. */
abort() {
if (!this.http) {
return null;
}
this.aborted = true;
return this.http.abort();
}
/** Returns the downloaded data. */
getData() {
if (!this.http) {
return null;
}
return this.http.responseText;
}
/** Prepares the download. */
setTarget() {
if (!this.http) {
return null;
}
this.http.open(this.method, this.url, this.async);
this.http.setRequestHeader("Api-User-Agent", pg.api.userAgent);
}
/** Gets the state of the download. */
getReadyState() {
if (!this.http) {
return null;
}
return this.http.readyState;
}
/**
* Starts the download.
* Note that setTarget {@source Downloader#setTarget} must be run first
*/
start() {
if (!this.http) {
return;
}
const self2 = this;
pg.misc.downloadsInProgress[this.id] = self2;
this.http.send(null);
}
/**
* Gets the 'Last-Modified' date from the download headers.
* Should be run after the download completes.
* Returns <code>null</code> on failure.
*
* @return {Date}
*/
getLastModifiedDate() {
if (!this.http) {
return null;
}
let lastmod;
try {
lastmod = this.http.getResponseHeader("Last-Modified");
} catch {
}
if (lastmod) {
return new Date(lastmod);
}
return null;
}
/**
* Sets the callback function.
*
* @param {Function} f callback function, called as <code>f(this)</code> on success
*/
setCallback(f) {
if (!this.http) {
return;
}
this.http.onreadystatechange = f;
}
getStatus() {
if (!this.http) {
return null;
}
return this.http.status;
}
}
new Downloader();
pg.misc.downloadsInProgress = {};
const newDownload = function newDownload2(url, id, callback, onfailure) {
const d = new Downloader(url);
if (!d.http) {
return "ohdear";
}
d.id = id;
d.setTarget();
if (!onfailure) {
onfailure = 2;
}
const f = function() {
if (d.getReadyState() === 4) {
delete pg.misc.downloadsInProgress[this.id];
try {
if (d.getStatus() === 200) {
d.data = d.getData();
d.lastModified = d.getLastModifiedDate();
callback(d);
} else if (typeof onfailure === "number") {
if (onfailure > 0) {
newDownload2(url, id, callback, onfailure - 1);
}
} else if (typeof onfailure === "function") {
onfailure(d, url, id, callback);
}
} catch {
}
}
};
d.setCallback(f);
return d;
};
const fakeDownload = (url, id, callback, data, lastModified, owner) => {
const d = newDownload(url, callback);
d.owner = owner;
d.id = id;
d.data = data;
d.lastModified = lastModified;
return callback(d);
};
const startDownload = (url, id, callback) => {
const d = newDownload(url, id, callback);
if (typeof d === "string") {
return d;
}
d.start();
return d;
};
const abortAllDownloads = () => {
for (const x in pg.misc.downloadsInProgress) {
if (!Object.hasOwn(pg.misc.downloadsInProgress, x)) {
continue;
}
try {
pg.misc.downloadsInProgress[x].aborted = true;
pg.misc.downloadsInProgress[x].abort();
delete pg.misc.downloadsInProgress[x];
} catch {
}
}
};
const Insta = {};
const setupLivePreview = () => {
let _b;
Insta.conf = {
baseUrl: "",
user: {},
wiki: {
lang: pg.wiki.lang,
interwiki: pg.wiki.interwiki,
default_thumb_width: 180
},
paths: {
articles: "".concat(pg.wiki.articlePath, "/"),
// Only used for Insta previews with images. (not in popups)
math: "/math/",
images: "https://tu.zhongwen.wiki/images/qiuwenbaike/zh/",
images_fallback: "//wm.zhongwen.wiki/commons/"
},
locale: {
user: mw.config.get("wgFormattedNamespaces")[pg.nsUserId],
image: mw.config.get("wgFormattedNamespaces")[pg.nsImageId],
category: mw.config.get("wgFormattedNamespaces")[pg.nsCategoryId],
// shouldn't be used in popup previews, i think
months: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
}
};
(_b = Insta.conf.user).name || (_b.name = "Qiuwen Baike contributors");
Insta.conf.user.signature = "[[".concat(Insta.conf.locale.user, ":").concat(Insta.conf.user.name, "|").concat(Insta.conf.user.name, "]]");
Insta.BLOCK_IMAGE = new RegExp("^\\[\\[(?:File|Image|".concat(Insta.conf.locale.image, "):.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)"), "i");
};
Insta.dump = function(from, to) {
if (typeof from === "string") {
from = document.querySelector("#".concat(from));
}
if (typeof to === "string") {
to = document.querySelector("#".concat(to));
}
to.innerHTML = this.convert(from.value);
};
Insta.convert = (wiki) => {
const ll = typeof wiki === "string" ? wiki.replace(/\r/g, "").split(/\n/) : wiki;
let o = "";
let p = 0;
let r;
const remain = () => {
return ll.length;
};
const sh = () => {
return ll.shift();
};
const ps = (s) => {
o += s;
};
const f = function f2(...args) {
let i = 1;
const a = args;
let [f3] = a;
let o2 = "";
let c;
let p2;
for (; i < a.length; i++) {
if ((p2 = f3.indexOf("?")) + 1) {
c = f3.charAt(p2 + 1) === "?" ? 1 : 0;
i -= c;
o2 += f3.slice(0, Math.max(0, p2)) + (c ? "?" : a[i]);
f3 = f3.slice(p2 + 1 + c);
} else {
break;
}
}
return o2 + f3;
};
const html_entities = (s) => {
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
};
const htmlescape_text = (s) => {
return s.replace(/</g, "<").replace(/>/g, ">").replace(/:/g, ":").replace(/\[/g, "[").replace(/]/g, "]");
};
const htmlescape_attr = (s) => {
return htmlescape_text(s).replace(/'/g, "'").replace(/"/g, """);
};
const str_imatch = (a, b) => {
let i;
let l;
for (i = 0, l = Math.min(a.length, b.length); i < l; i++) {
if (a.charAt(i) !== b.charAt(i)) {
break;
}
}
return i;
};
const compareLineStringOrReg = (c) => {
return typeof c === "string" ? ll[0] && ll[0].slice(0, c.length) === c : r = ll[0] && ll[0].match(c);
};
const compareLineString = (c) => {
return ll[0] === c;
};
const charAtPoint = (p2) => {
return ll[0].charAt(p2);
};
const endl = (s) => {
ps(s);
sh();
};
const parse_list = () => {
let prev = "";
while (remain() && compareLineStringOrReg(/^([#*:;]+)(.*)$/)) {
const l_match = r;
sh();
const ipos = str_imatch(prev, l_match[1]);
for (let prevPos = prev.length - 1; prevPos >= ipos; prevPos--) {
const pi = prev.charAt(prevPos);
if (pi === "*") {
ps("</ul>");
} else if (pi === "#") {
ps("</ol>");
} else if (["", "*", "#"].indexOf(l_match[1].charAt(prevPos))) {
ps("</dl>");
}
}
for (let matchPos = ipos; matchPos < l_match[1].length; matchPos++) {
const li = l_match[1].charAt(matchPos);
if (li === "*") {
ps("<ul>");
} else if (li === "#") {
ps("<ol>");
} else if (["", "*", "#"].indexOf(prev.charAt(matchPos))) {
ps("<dl>");
}
}
switch (l_match[1].at(-1)) {
case "*":
case "#":
ps("<li>".concat(parse_inline_nowiki(l_match[2])));
break;
case ";": {
ps("<dt>");
const dt_match = l_match[2].match(/(.*?)(:.*?)$/);
if (dt_match) {
ps(parse_inline_nowiki(dt_match[1]));
ll.unshift(dt_match[2]);
} else {
ps(parse_inline_nowiki(l_match[2]));
}
break;
}
case ":":
ps("<dd>".concat(parse_inline_nowiki(l_match[2])));
}
[, prev] = l_match;
}
for (let i = prev.length - 1; i >= 0; i--) {
ps(f("</?>", prev.charAt(i) === "*" ? "ul" : prev.charAt(i) === "#" ? "ol" : "dl"));
}
};
const parse_table = () => {
endl(f("<table>", compareLineStringOrReg(/^{\|( .*)$/) ? r[1] : ""));
for (; remain(); ) {
if (compareLineStringOrReg("|")) {
switch (charAtPoint(1)) {
case "}":
endl("</table>");
return;
case "-":
endl(f("<tr>", compareLineStringOrReg(/\|-*(.*)/)[1]));
break;
default:
parse_table_data();
}
} else if (compareLineStringOrReg("!")) {
parse_table_data();
} else {
sh();
}
}
};
const parse_table_data = () => {
let td_line;
let match_i;
const td_match = sh().match(/^(\|\+|\||!)((?:([^[|]*?)\|(?!\|))?(.*))$/);
if (td_match[1] === "|+") {
ps("<caption");
} else {
ps("<t".concat(td_match[1] === "|" ? "d" : "h"));
}
if (td_match[3]) {
match_i = 4;
} else {
match_i = 2;
}
ps(">");
if (td_match[1] === "|+") {
ps(parse_inline_nowiki(td_match[match_i]));
} else {
td_line = td_match[match_i].split(td_match[1] === "|" ? "||" : /\|\||!!/);
ps(parse_inline_nowiki(td_line.shift()));
while (td_line.length > 0) {
ll.unshift(td_match[1] + td_line.pop());
}
}
let tc = 0;
const td = [];
while (remain()) {
td.push(sh());
if (compareLineStringOrReg("|")) {
if (!tc) {
break;
} else if (charAtPoint(1) === "}") {
tc--;
}
} else if (!tc && compareLineStringOrReg("!")) {
break;
} else if (compareLineStringOrReg("{|")) {
tc++;
}
}
if (td.length > 0) {
ps(Insta.convert(td));
}
};
const parse_pre = () => {
ps("<pre>");
do {
endl("".concat(parse_inline_nowiki(ll[0].slice(1)), "\n"));
} while (remain() && compareLineStringOrReg(" "));
ps("</pre>");
};
const parse_block_image = () => {
ps(parse_image(sh()));
};
const parse_image = (str) => {
let tag = str.substring(str.indexOf(":") + 1, str.length - 2);
let width;
let attr = [];
let filename;
let caption = "";
let thumb = 0;
let frame = 0;
let center = 0;
let align = "";
if (/\|/.test(tag)) {
let nesting = 0;
let last_attr;
for (let i = tag.length - 1; i > 0; i--) {
if (tag.charAt(i) === "|" && !nesting) {
last_attr = tag.slice(i + 1);
tag = tag.slice(0, Math.max(0, i));
break;
} else {
switch (tag.slice(i - 1, i - 1 + 2)) {
case "]]":
nesting++;
i--;
break;
case "[[":
nesting--;
i--;
}
}
}
attr = tag.split(/\s*\|\s*/);
attr.push(last_attr);
filename = attr.shift();
let w_match;
for (; attr.length > 0; attr.shift()) {
w_match = attr[0].match(/^(\d*)(?:[px]*\d*)?px$/);
if (w_match) {
[, width] = w_match;
} else {
switch (attr[0]) {
case "thumb":
case "thumbnail":
thumb = true;
frame = true;
break;
case "frame":
frame = true;
break;
case "none":
case "right":
case "left":
center = false;
[align] = attr;
break;
case "center":
center = true;
align = "none";
break;
default:
if (attr.length === 1) {
[caption] = attr;
}
}
}
}
} else {
filename = tag;
}
return "";
};
const parse_inline_nowiki = (str) => {
let start;
let lastend = 0;
let substart = 0;
let nestlev = 0;
let open;
let close;
let subloop;
let html = "";
while ((start = str.indexOf("<no".concat("wiki", ">"), substart)) !== -1) {
html += parse_inline_wiki(str.substring(lastend, start));
start += 8;
substart = start;
subloop = true;
do {
open = str.indexOf("<no".concat("wiki", ">"), substart);
close = str.indexOf("</no".concat("wiki", ">"), substart);
if (close <= open || open === -1) {
if (close === -1) {
return html + html_entities(str.slice(start));
}
substart = close + 9;
if (nestlev) {
nestlev--;
} else {
lastend = substart;
html += html_entities(str.substring(start, lastend - 9));
subloop = false;
}
} else {
substart = open + 8;
nestlev++;
}
} while (subloop);
}
return html + parse_inline_wiki(str.slice(lastend));
};
const parse_inline_images = (str) => {
let start;
let substart = 0;
let nestlev = 0;
let loop;
let close;
let open;
let wiki2;
let html;
while ((start = str.indexOf("[[", substart)) !== -1) {
if (new RegExp("^(Image|File|".concat(Insta.conf.locale.image, "):"), "i").test(str.slice(start + 2))) {
loop = true;
substart = start;
do {
substart += 2;
close = str.indexOf("]]", substart);
open = str.indexOf("[[", substart);
if (close <= open || open === -1) {
if (close === -1) {
return str;
}
substart = close;
if (nestlev) {
nestlev--;
} else {
wiki2 = str.substring(start, close + 2);
html = parse_image(wiki2);
str = str.replace(wiki2, html);
substart = start + html.length;
loop = false;
}
} else {
substart = open;
nestlev++;
}
} while (loop);
} else {
break;
}
}
return str;
};
const parse_inline_formatting = (str) => {
let em;
let st;
let i;
let li;
let o2 = "";
while ((i = str.indexOf("''", li)) + 1) {
o2 += str.substring(li, i);
li = i + 2;
if (str.charAt(i + 2) === "'") {
li++;
st = !st;
o2 += st ? "<strong>" : "</strong>";
} else {
em = !em;
o2 += em ? "<em>" : "</em>";
}
}
return o2 + str.slice(li);
};
const parse_inline_wiki = (str) => {
str = parse_inline_images(str);
str = parse_inline_formatting(str);
str = str.replace(/<math>(.*?)<\/math>/gi, "");
let date = /* @__PURE__ */ new Date();
let minutes = date.getUTCMinutes();
if (minutes < 10) {
minutes = "0".concat(minutes);
}
date = f("?:?, ? ? ? (UTC)", date.getUTCHours(), minutes, date.getUTCDate(), Insta.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear());
return str.replace(/~{5}(?!~)/g, date).replace(/~{4}(?!~)/g, "".concat(Insta.conf.user.name, " ").concat(date)).replace(/~{3}(?!~)/g, Insta.conf.user.name).replace(new RegExp("\\[\\[:((?:".concat(Insta.conf.locale.category, "|Image|File|").concat(Insta.conf.locale.image, "|").concat(Insta.conf.wiki.interwiki, "):[^|]*?)\\]\\](\\w*)"), "gi"), (_$0, $1, $2) => {
return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2));
}).replace(new RegExp("\\[\\[(?:".concat(Insta.conf.locale.category, "|").concat(Insta.conf.wiki.interwiki, "):.*?\\]\\]"), "gi"), "").replace(new RegExp("\\[\\[:((?:".concat(Insta.conf.locale.category, "|Image|File|").concat(Insta.conf.locale.image, "|").concat(Insta.conf.wiki.interwiki, "):.*?)\\|([^\\]]+?)\\]\\](\\w*)"), "gi"), (_$0, $1, $2, $3) => {
return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3));
}).replace(/\[\[(\/[^|]*?)]]/g, (_$0, $1) => {
return f("<a href='?'>?</a>", Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($1));
}).replace(/\[\[(\/.*?)\|(.+?)]]/g, (_$0, $1, $2) => {
return f("<a href='?'>?</a>", Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($2));
}).replace(/\[\[([^[|]*?)]](\w*)/g, (_$0, $1, $2) => {
return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2));
}).replace(/\[\[([^[]*?)\|([^\]]+?)]](\w*)/g, (_$0, $1, $2, $3) => {
return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3));
}).replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|]]/g, (_$0, $1, $2, $3) => {
return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1) + htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($2));
}).replace(/\[(https?|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)]/g, (_$0, $1, $2, $3, $4) => {
return f("<a class='external' href='?:?'>?</a>", htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($4));
}).replace(/\[http:\/\/(.*?)]/g, (_$0, $1) => {
return f("<a class='external' href='http://?'>[#]</a>", htmlescape_attr($1));
}).replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)]/g, (_$0, $1, $2, $3) => {
return f("<a class='external' href='?:?'>?:?</a>", htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($1), htmlescape_text($2) + htmlescape_text($3));
}).replace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\/*)([^ $]*[^ !$,.:;?])/g, (_$0, $1, $2, $3, $4) => {
return f("?<a class='external' href='?:?'>?:?</a>", htmlescape_text($1), htmlescape_attr($2), htmlescape_attr($3) + htmlescape_attr($4), htmlescape_text($2), htmlescape_text($3) + htmlescape_text($4));
}).replace("__NOTOC__", "").replace("__NOINDEX__", "").replace("__INDEX__", "").replace("__NOEDITSECTION__", "");
};
for (; remain(); ) {
if (compareLineStringOrReg(/^(={1,6})(.*)\1(.*)$/)) {
p = 0;
endl(f("<h?>?</h?>?", r[1].length, parse_inline_nowiki(r[2]), r[1].length, r[3]));
} else if (compareLineStringOrReg(/^[#*:;]/)) {
p = 0;
parse_list();
} else if (compareLineStringOrReg(" ")) {
p = 0;
parse_pre();
} else if (compareLineStringOrReg("{|")) {
p = 0;
parse_table();
} else if (compareLineStringOrReg(/^----+$/)) {
p = 0;
endl("<hr>");
} else if (compareLineStringOrReg(Insta.BLOCK_IMAGE)) {
p = 0;
parse_block_image();
} else {
if (compareLineString("")) {
p = remain() > 1 && ll[1] === "";
if (p) {
endl("<p><br>");
}
} else {
if (!p) {
ps("<p>");
p = 1;
}
ps("".concat(parse_inline_nowiki(ll[0]), " "));
}
sh();
}
}
return o;
};
const wiki2html = (txt, baseurl) => {
Insta.conf.baseUrl = baseurl;
return Insta.convert(txt);
};
const popupFilterPageSize = (data) => {
return formatBytes(data.length);
};
const popupFilterCountLinks = (data) => {
const num = countLinks(data);
return "".concat(String(num), " ").concat(num === 1 ? popupString("wikiLink") : popupString("wikiLinks"));
};
const popupFilterCountImages = (data) => {
const num = countImages(data);
return "".concat(String(num), " ").concat(num === 1 ? popupString("image") : popupString("images"));
};
const popupFilterCountCategories = (data) => {
const num = countCategories(data);
return "".concat(String(num), " ").concat(num === 1 ? popupString("category") : popupString("categories"));
};
const popupFilterLastModified = (_data, download) => {
const lastmod = download.lastModified;
const now = /* @__PURE__ */ new Date();
const age = now - lastmod;
if (lastmod && getValueOf("popupLastModified")) {
return tprintf("%s old", [formatAge(age)]).replace(/ /g, " ");
}
return "";
};
const formatAge = (age) => {
let a = 0 + age;
const aa = a;
const seclen = 1e3;
const minlen = 60 * seclen;
const hourlen = 60 * minlen;
const daylen = 24 * hourlen;
const weeklen = 7 * daylen;
const numweeks = (a - a % weeklen) / weeklen;
a -= numweeks * weeklen;
const sweeks = addunit(numweeks, "week");
const numdays = (a - a % daylen) / daylen;
a -= numdays * daylen;
const sdays = addunit(numdays, "day");
const numhours = (a - a % hourlen) / hourlen;
a -= numhours * hourlen;
const shours = addunit(numhours, "hour");
const nummins = (a - a % minlen) / minlen;
a -= nummins * minlen;
const smins = addunit(nummins, "minute");
const numsecs = (a - a % seclen) / seclen;
a -= numsecs * seclen;
const ssecs = addunit(numsecs, "second");
if (aa > 4 * weeklen) {
return sweeks;
}
if (aa > weeklen) {
return "".concat(sweeks, " ").concat(sdays);
}
if (aa > daylen) {
return "".concat(sdays, " ").concat(shours);
}
if (aa > 6 * hourlen) {
return shours;
}
if (aa > hourlen) {
return "".concat(shours, " ").concat(smins);
}
if (aa > 10 * minlen) {
return smins;
}
if (aa > minlen) {
return "".concat(smins, " ").concat(ssecs);
}
return ssecs;
};
const addunit = (num, str) => {
return "".concat(num, " ").concat(num === 1 ? popupString(str) : popupString("".concat(str, "s")));
};
const runPopupFilters = (list, data, download) => {
const ret = [];
var _iterator2 = _createForOfIteratorHelper(list), _step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) {
const element = _step2.value;
if (element && typeof element === "function") {
const s = element(data, download, download.owner.article);
if (s) {
ret.push(s);
}
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
return ret;
};
const getPageInfo = (data, download) => {
if (!data || data.length === 0) {
return popupString("Empty page");
}
const popupFilters = getValueOf("popupFilters") || [];
const extraPopupFilters = getValueOf("extraPopupFilters") || [];
const pageInfoArray = runPopupFilters([...popupFilters, ...extraPopupFilters], data, download);
let pageInfo = pageInfoArray.join(", ");
if (pageInfo !== "") {
pageInfo = upcaseFirst(pageInfo);
}
return pageInfo;
};
const countLinks = (wikiText) => {
return wikiText.split("[[").length - 1;
};
const countImages = (wikiText) => {
return (wikiText.split(pg.re.image).length - 1) / (pg.re.imageBracketCount + 1);
};
const countCategories = (wikiText) => {
return (wikiText.split(pg.re.category).length - 1) / (pg.re.categoryBracketCount + 1);
};
const popupFilterStubDetect = (data, _download, article) => {
const counts = stubCount(data, article);
if (counts.real) {
return popupString("stub");
}
if (counts.sect) {
return popupString("section stub");
}
return "";
};
const popupFilterDisambigDetect = (data, _download, article) => {
if (!getValueOf("popupAllDabsStubs") && article.namespace()) {
return "";
}
return isDisambig(data, article) ? popupString("disambig") : "";
};
const formatBytes = (num) => {
return num > 949 ? Math.round(num / 100) / 10 + popupString("kB") : "".concat(num, " ").concat(popupString("bytes"));
};
const Stringwrapper = function Stringwrapper2() {
this.indexOf = function(x) {
return this.toString().indexOf(x);
};
this.toString = function() {
return this.value;
};
this.split = function(x) {
return this.toString().split(x);
};
this.substring = function(x, y) {
if (y === void 0) {
return this.toString().slice(Math.max(0, x));
}
return this.toString().substring(x, y);
};
this.split = function(x) {
return this.toString().split(x);
};
this.replace = function(x, y) {
return this.toString().replace(x, y);
};
};
class Title extends Stringwrapper {
constructor(val) {
super();
this.value = null;
this.anchor = "";
this.setUtf(val);
}
/**
* Returns the canonical representation of the article title, optionally without anchor.
*
* @param {boolean} omitAnchor
* @fixme Decide specs for anchor
* @return String The article title and the anchor.
*/
toString(omitAnchor) {
return this.value + (!omitAnchor && this.anchor ? "#".concat(this.anchorString()) : "");
}
anchorString() {
if (!this.anchor) {
return "";
}
const split = this.anchor.split(/((?:\.[\dA-F]{2})+)/);
const len = split.length;
let value;
for (let j = 1; j < len; j += 2) {
value = split[j].split(".").join("%");
try {
value = decodeURIComponent(value);
} catch {
}
split[j] = value.split("_").join(" ");
}
return split.join("");
}
urlAnchor() {
const split = this.anchor.split("/((?:[%][0-9A-F]{2})+)/");
const len = split.length;
for (let j = 1; j < len; j += 2) {
split[j] = split[j].split("%").join(".");
}
return split.join("");
}
anchorFromUtf(str) {
this.anchor = encodeURIComponent(str.split(" ").join("_")).split("%3A").join(":").split("'").join("%27").split("%").join(".");
}
fromURL(h) {
if (typeof h !== "string") {
this.value = null;
return this;
}
const splitted = h.split("?");
splitted[0] = splitted[0].split("&").join("%26");
h = splitted.join("?");
const contribs = pg.re.contribs.exec(h);
if (contribs) {
if (contribs[1] === "title=") {
contribs[3] = contribs[3].split("+").join(" ");
}
const u = new Title(contribs[3]);
this.setUtf(Title.decodeNasties("".concat(mw.config.get("wgFormattedNamespaces")[pg.nsUserId], ":").concat(u.stripNamespace())));
return this;
}
const email = pg.re.email.exec(h);
if (email) {
this.setUtf(Title.decodeNasties("".concat(mw.config.get("wgFormattedNamespaces")[pg.nsUserId], ":").concat(new Title(email[3]).stripNamespace())));
return this;
}
const backlinks = pg.re.backlinks.exec(h);
if (backlinks) {
this.setUtf(Title.decodeNasties(new Title(backlinks[3])));
return this;
}
const specialdiff = pg.re.specialdiff.exec(h);
if (specialdiff) {
this.setUtf(Title.decodeNasties(new Title("".concat(mw.config.get("wgFormattedNamespaces")[pg.nsSpecialId], ":Diff"))));
return this;
}
const m = pg.re.main.exec(h);
if (m === null) {
this.value = null;
} else {
const fromBotInterface = /\?(.+&)?title=/.test(h);
if (fromBotInterface) {
m[2] = m[2].split("+").join("_");
}
const extracted = m[2] + (m[3] ? "#".concat(m[3]) : "");
if (pg.flag.isSafari && /%25[\dA-Fa-f]{2}/.test(extracted)) {
this.setUtf(decodeURIComponent(unescape(extracted)));
} else {
this.setUtf(Title.decodeNasties(extracted));
}
}
return this;
}
static decodeNasties(txt) {
try {
let ret = decodeURI(Title.decodeEscapes(txt));
ret = ret.replace(/[ _]*$/, "");
return ret;
} catch {
return txt;
}
}
// Decode valid %-encodings, otherwise escape them
static decodeEscapes(txt) {
const split = txt.split(/((?:%[\dA-Fa-f]{2})+)/);
const len = split.length;
if (len === 1) {
return split[0].replace(/%(?![\dA-Fa-f]{2})/g, "%25");
}
for (let i = 1; i < len; i += 2) {
split[i] = decodeURIComponent(split[i]);
}
return split.join("");
}
fromAnchor(a) {
if (!a) {
this.value = null;
return this;
}
return this.fromURL(a.href);
}
fromWikiText(txt) {
txt = myDecodeURI(txt);
this.setUtf(txt);
return this;
}
hintValue() {
if (!this.value) {
return "";
}
return safeDecodeURI(this.value);
}
toUserName(withNs) {
if (this.namespaceId() !== pg.nsUserId && this.namespaceId() !== pg.nsUsertalkId) {
this.value = null;
return;
}
this.value = (withNs ? "".concat(mw.config.get("wgFormattedNamespaces")[pg.nsUserId], ":") : "") + this.stripNamespace().split("/")[0];
}
userName(withNs) {
const t = new Title(this.value);
t.toUserName(withNs);
if (t.value) {
return t;
}
return null;
}
toTalkPage() {
if (this.value === null) {
return null;
}
const namespaceId = this.namespaceId();
if (namespaceId >= 0 && namespaceId % 2 === 0) {
const localizedNamespace = mw.config.get("wgFormattedNamespaces")[namespaceId + 1];
if (localizedNamespace !== void 0) {
this.value = localizedNamespace === "" ? this.stripNamespace() : "".concat(localizedNamespace.split(" ").join("_"), ":").concat(this.stripNamespace());
return this.value;
}
}
this.value = null;
return null;
}
// Return canonical, localized namespace
namespace() {
return mw.config.get("wgFormattedNamespaces")[this.namespaceId()];
}
namespaceId() {
const n = this.value.indexOf(":");
if (n < 0) {
return 0;
}
const namespaceId = mw.config.get("wgNamespaceIds")[this.value.slice(0, Math.max(0, n)).split(" ").join("_").toLowerCase()];
if (namespaceId === void 0) {
return 0;
}
return namespaceId;
}
talkPage() {
const t = new Title(this.value);
t.toTalkPage();
if (t.value) {
return t;
}
return null;
}
isTalkPage() {
if (this.talkPage() === null) {
return true;
}
return false;
}
toArticleFromTalkPage() {
if (this.value === null) {
return null;
}
const namespaceId = this.namespaceId();
if (namespaceId >= 0 && namespaceId % 2 === 1) {
const localizedNamespace = mw.config.get("wgFormattedNamespaces")[namespaceId - 1];
if (localizedNamespace !== void 0) {
this.value = localizedNamespace === "" ? this.stripNamespace() : "".concat(localizedNamespace.split(" ").join("_"), ":").concat(this.stripNamespace());
return this.value;
}
}
this.value = null;
return null;
}
articleFromTalkPage() {
const t = new Title(this.value);
t.toArticleFromTalkPage();
if (t.value) {
return t;
}
return null;
}
articleFromTalkOrArticle() {
const t = new Title(this.value);
if (t.toArticleFromTalkPage()) {
return t;
}
return this;
}
isIpUser() {
return pg.re.ipUser.test(this.userName());
}
stripNamespace() {
const n = this.value.indexOf(":");
if (n < 0) {
return this.value;
}
const namespaceId = this.namespaceId();
if (namespaceId === pg.nsMainspaceId) {
return this.value;
}
return this.value.slice(Math.max(0, n + 1));
}
setUtf(value) {
if (!value) {
this.value = "";
return;
}
const anch = value.indexOf("#");
if (anch < 0) {
this.value = value.split("_").join(" ");
this.anchor = "";
return;
}
this.value = value.slice(0, Math.max(0, anch)).split("_").join(" ");
this.anchor = value.slice(Math.max(0, anch + 1));
this.ns = null;
}
setUrl(urlfrag) {
const anch = urlfrag.indexOf("#");
this.value = safeDecodeURI(urlfrag.slice(0, Math.max(0, anch)));
this.anchor = this.value.slice(Math.max(0, anch + 1));
}
append(x) {
this.setUtf(this.value + x);
}
urlString(x) {
if (!x) {
x = {};
}
let v = this.toString(true);
if (!x.omitAnchor && this.anchor) {
v += "#".concat(this.urlAnchor());
}
if (!x.keepSpaces) {
v = v.split(" ").join("_");
}
return encodeURI(v).split("&").join("%26").split("?").join("%3F").split("+").join("%2B");
}
removeAnchor() {
return new Title(this.toString(true));
}
toUrl() {
return pg.wiki.titlebase + this.urlString();
}
}
Title.fromURL = (h) => {
return new Title().fromURL(h);
};
Title.fromAnchor = (a) => {
return new Title().fromAnchor(a);
};
Title.fromWikiText = (txt) => {
return new Title().fromWikiText(txt);
};
const parseParams = (url) => {
const specialDiff = pg.re.specialdiff.exec(url);
if (specialDiff) {
const split = specialDiff[1].split("/");
if (split.length === 1) {
return {
oldid: split[0],
diff: "prev"
};
} else if (split.length === 2) {
return {
oldid: split[0],
diff: split[1]
};
}
}
const ret = {};
if (!url.includes("?")) {
return ret;
}
[url] = url.split("#");
const s = url.split("?").slice(1).join(",");
const t = s.split("&");
var _iterator3 = _createForOfIteratorHelper(t), _step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done; ) {
const element = _step3.value;
const z = element.split("=");
z.push(null);
[, ret[z[0]]] = z;
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
if (ret.diff && ret.oldid === void 0) {
ret.oldid = "prev";
}
if (ret.oldid && (ret.oldid === "prev" || ret.oldid === "next" || ret.oldid === "cur")) {
const helper = ret.diff;
ret.diff = ret.oldid;
ret.oldid = helper;
}
return ret;
};
const myDecodeURI = (str) => {
let ret;
try {
ret = decodeURI(str.toString());
} catch {
return str;
}
for (let i = 0; i < pg.misc.decodeExtras.length; ++i) {
const {
from
} = pg.misc.decodeExtras[i];
const {
to
} = pg.misc.decodeExtras[i];
ret = ret.split(from).join(to);
}
return ret;
};
const safeDecodeURI = (str) => {
const ret = myDecodeURI(str);
return ret || str;
};
const isDisambig = (data, article) => {
if (!getValueOf("popupAllDabsStubs") && article.namespace()) {
return false;
}
return !article.isTalkPage() && pg.re.disambig.test(data);
};
const stubCount = (data, article) => {
if (!getValueOf("popupAllDabsStubs") && article.namespace()) {
return false;
}
let sectStub = 0;
let realStub = 0;
if (pg.re.stub.test(data)) {
const s = data.split(pg.re.stub);
for (let i = 1; i < s.length; i += 2) {
if (s[i]) {
++sectStub;
} else {
++realStub;
}
}
}
return {
real: realStub,
sect: sectStub
};
};
const isValidImageName = (str) => {
return !str.includes("{");
};
const isInStrippableNamespace = (article) => {
return article.namespaceId() !== 0;
};
const isInMainNamespace = (article) => {
return article.namespaceId() === 0;
};
const anchorContainsImage = (a) => {
if (a === null) {
return false;
}
const kids = a.childNodes;
var _iterator4 = _createForOfIteratorHelper(kids), _step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) {
const kid = _step4.value;
if (kid.nodeName === "IMG") {
return true;
}
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
return false;
};
const isPopupLink = (a) => {
if (!markNopopupSpanLinks.done) {
markNopopupSpanLinks();
}
if (a.inNopopupSpan) {
return false;
}
if (a.onmousedown || a.getAttribute("nopopup")) {
return false;
}
const h = a.href;
if (h === "".concat(document.location.href, "#")) {
return false;
}
if (!pg.re.basenames.test(h)) {
return false;
}
if (!pg.re.urlNoPopup.test(h)) {
return true;
}
return (pg.re.email.test(h) || pg.re.contribs.test(h) || pg.re.backlinks.test(h) || pg.re.specialdiff.test(h)) && !h.includes("&limit=");
};
const markNopopupSpanLinks = function markNopopupSpanLinks2() {
if (!getValueOf("popupOnlyArticleLinks")) {
fixVectorMenuPopups();
}
const $body = $("body");
const s = $body.find(".nopopups").toArray();
var _iterator5 = _createForOfIteratorHelper(s), _step5;
try {
for (_iterator5.s(); !(_step5 = _iterator5.n()).done; ) {
const element = _step5.value;
const as = element.querySelectorAll("a");
var _iterator6 = _createForOfIteratorHelper(as), _step6;
try {
for (_iterator6.s(); !(_step6 = _iterator6.n()).done; ) {
const a = _step6.value;
a.inNopopupSpan = true;
}
} catch (err) {
_iterator6.e(err);
} finally {
_iterator6.f();
}
}
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
markNopopupSpanLinks2.done = true;
};
const fixVectorMenuPopups = () => {
const $body = $("body");
$body.find("nav.vector-menu h3:first a:first").prop("inNopopupSpan", true);
};
const getPageWithCaching = (url, onComplete, owner) => {
log("getPageWithCaching, url=".concat(url));
const i = findInPageCache(url);
let d;
if (i > -1) {
d = fakeDownload(url, owner.idNumber, onComplete, pg.cache.pages[i].data, pg.cache.pages[i].lastModified, owner);
} else {
d = getPage(url, onComplete, owner);
if (d && owner && owner.addDownload) {
owner.addDownload(d);
d.owner = owner;
}
}
};
const getPage = (url, onComplete, owner) => {
log("getPage");
const callback = (d) => {
if (!d.aborted) {
addPageToCache(d);
onComplete(d);
}
};
return startDownload(url, owner.idNumber, callback);
};
const findInPageCache = (url) => {
for (let i = 0; i < pg.cache.pages.length; ++i) {
if (url === pg.cache.pages[i].url) {
return i;
}
}
return -1;
};
const addPageToCache = (download) => {
log("addPageToCache ".concat(download.url));
const page = {
url: download.url,
data: download.data,
lastModified: download.lastModified
};
return pg.cache.pages.push(page);
};
const getJsObj = (json) => {
try {
const json_ret = JSON.parse(json);
if (json_ret.warnings) {
for (let w = 0; w < json_ret.warnings.length; w++) {
if (json_ret.warnings[w]["*"]) {
log(json_ret.warnings[w]["*"]);
} else {
log(json_ret.warnings[w].warnings);
}
}
} else if (json_ret.error) {
errlog("".concat(json_ret.error.code, ": ").concat(json_ret.error.info));
}
return json_ret;
} catch {
errlog("Something went wrong with getJsObj, json=".concat(json));
return 1;
}
};
const anyChild = (obj) => {
for (const p in obj) {
if (!Object.hasOwn(obj, p)) {
continue;
}
return obj[p];
}
return null;
};
const upcaseFirst = (str) => {
if (typeof str !== "string" || str === "") {
return;
}
return str.charAt(0).toUpperCase() + str.slice(1);
};
const findInArray = (arr, foo) => {
if (!arr || arr.length === 0) {
return -1;
}
const len = arr.length;
for (let i = 0; i < len; ++i) {
if (arr[i] === foo) {
return i;
}
}
return -1;
};
const nextOne = (array, value) => {
const i = findInArray(array, value);
if (i < 0) {
return null;
}
return array[i + 1];
};
const literalizeRegex = (str) => {
return mw.util.escapeRegExp(str);
};
String.prototype.entify = function() {
return this.split("&").join("&").split("<").join("<").split(">").join(
">"
/* +shy */
).split('"').join(""");
};
const removeNulls = (val) => {
return val !== null;
};
const joinPath = (list) => {
return list.filter(removeNulls).join("/");
};
const simplePrintf = (str, subs) => {
if (!str || !subs) {
return str;
}
const ret = [];
const s = str.split(/(%s|\$\d+)/);
let i = 0;
do {
ret.push(s.shift());
if (s.length === 0) {
break;
}
const cmd = s.shift();
if (cmd === "%s") {
if (i < subs.length) {
ret.push(subs[i]);
} else {
ret.push(cmd);
}
++i;
} else {
const j = Number.parseInt(cmd.replace("$", ""), 10) - 1;
if (j > -1 && j < subs.length) {
ret.push(subs[j]);
} else {
ret.push(cmd);
}
}
} while (s.length > 0);
return ret.join("");
};
const isString = (x) => {
return typeof x === "string" || x instanceof String;
};
const isNumber = (x) => {
return typeof x === "number" || x instanceof Number;
};
const isRegExp = (x) => {
return x instanceof RegExp;
};
const isArray = (x) => {
return Array.isArray(x);
};
const isObject = (x) => {
return x instanceof Object;
};
const isFunction = (x) => {
return !isRegExp(x) && (typeof x === "function" || x instanceof Function);
};
const repeatString = (s, mult) => {
let ret = "";
for (let i = 0; i < mult; ++i) {
ret += s;
}
return ret;
};
const zeroFill = (s, min) => {
min || (min = 2);
const t = s.toString();
return repeatString("0", min - t.length) + t;
};
const map = (f, o) => {
if (isArray(o)) {
return map_array(f, o);
}
return map_object(f, o);
};
const map_array = (f, o) => {
const ret = [];
var _iterator7 = _createForOfIteratorHelper(o), _step7;
try {
for (_iterator7.s(); !(_step7 = _iterator7.n()).done; ) {
const element = _step7.value;
ret.push(f(element));
}
} catch (err) {
_iterator7.e(err);
} finally {
_iterator7.f();
}
return ret;
};
const map_object = (f, o) => {
const ret = {};
for (const i in o) {
if (!Object.hasOwn(o, i)) {
continue;
}
ret[o] = f(o[i]);
}
return ret;
};
pg.escapeQuotesHTML = (text) => {
return text.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
};
pg.unescapeQuotesHTML = (html) => {
const txt = document.createElement("textarea");
txt.innerHTML = html;
return txt.value;
};
const retargetDab = (newTarget, oldTarget, friendlyCurrentArticleName, titleToEdit) => {
log("retargetDab: newTarget=".concat(newTarget, " oldTarget=").concat(oldTarget));
return changeLinkTargetLink({
newTarget,
text: newTarget.split(" ").join(" "),
hint: tprintf("disambigHint", [newTarget]),
summary: simplePrintf(getValueOf("popupFixDabsSummary"), [friendlyCurrentArticleName, newTarget]),
clickButton: getValueOf("popupDabsAutoClick"),
minor: true,
oldTarget,
watch: getValueOf("popupWatchDisambiggedPages"),
title: titleToEdit
});
};
const listLinks = (wikitext, oldTarget, titleToEdit) => {
const reg = /\[\[([^|]*?) *(\||]])/gi;
let ret = [];
const splitted = wikitext.split(reg);
const omitRegex = /^[a-z]*:|^[Ss]pecial:|^[Ii]mage|^[Cc]ategory/;
const friendlyCurrentArticleName = oldTarget.toString();
const wikPos = getValueOf("popupDabWiktionary");
for (let i = 1; i < splitted.length; i += 3) {
if (typeof splitted[i] === "string" && splitted[i].length > 0 && !omitRegex.test(splitted[i])) {
ret.push(retargetDab(splitted[i], oldTarget, friendlyCurrentArticleName, titleToEdit));
}
}
ret = rmDupesFromSortedList(ret.sort());
if (wikPos) {
const wikTarget = "wiktionary:".concat(friendlyCurrentArticleName.replace(/^(.+)\s+\([^)]+\)\s*$/, "$1"));
const meth = wikPos.toLowerCase() === "first" ? "unshift" : "push";
ret[meth](retargetDab(wikTarget, oldTarget, friendlyCurrentArticleName, titleToEdit));
}
ret.push(changeLinkTargetLink({
newTarget: null,
text: popupString("remove this link").split(" ").join(" "),
hint: popupString("remove all links to this disambig page from this article"),
clickButton: getValueOf("popupDabsAutoClick"),
oldTarget,
summary: simplePrintf(getValueOf("popupRmDabLinkSummary"), [friendlyCurrentArticleName]),
watch: getValueOf("popupWatchDisambiggedPages"),
title: titleToEdit
}));
return ret;
};
const rmDupesFromSortedList = (list) => {
const ret = [];
var _iterator8 = _createForOfIteratorHelper(list), _step8;
try {
for (_iterator8.s(); !(_step8 = _iterator8.n()).done; ) {
const element = _step8.value;
if (ret.length === 0 || element !== ret.at(-1)) {
ret.push(element);
}
}
} catch (err) {
_iterator8.e(err);
} finally {
_iterator8.f();
}
return ret;
};
const makeFixDab = (data, navpop) => {
const titleToEdit = navpop.parentPopup && navpop.parentPopup.article.toString();
const list = listLinks(data, navpop.originalArticle, titleToEdit);
if (list.length === 0) {
log("listLinks returned empty list");
return null;
}
let html = "<hr>".concat(popupString("Click to disambiguate this link to:"), "<br>");
html += list.join(", ");
return html;
};
const makeFixDabs = (wikiText, navpop) => {
if (getValueOf("popupFixDabs") && isDisambig(wikiText, navpop.article) && Title.fromURL(location.href).namespaceId() !== pg.nsSpecialId && navpop.article.talkPage()) {
setPopupHTML(makeFixDab(wikiText, navpop), "popupFixDab", navpop.idNumber);
}
};
const popupRedlinkHTML = (article) => {
return changeLinkTargetLink({
newTarget: null,
text: popupString("remove this link").split(" ").join(" "),
hint: popupString("remove all links to this page from this article"),
clickButton: getValueOf("popupRedlinkAutoClick"),
oldTarget: article.toString(),
summary: simplePrintf(getValueOf("popupRedlinkSummary"), [article.toString()])
});
};
const setPopupHTML = function setPopupHTML2(str, elementId, popupId, onSuccess, append) {
if (popupId === void 0) {
popupId = pg.idNumber;
}
const popupElement = document.querySelector("#".concat(elementId).concat(popupId));
if (popupElement) {
if (!append) {
popupElement.innerHTML = "";
}
if (isString(str)) {
popupElement.innerHTML += str;
} else {
popupElement.append(str);
}
if (onSuccess) {
onSuccess();
}
setTimeout(checkPopupPosition, 100);
return true;
}
setTimeout(() => {
setPopupHTML2(str, elementId, popupId, onSuccess);
}, 600);
return null;
};
const setPopupTrailer = (str, id) => {
return setPopupHTML(str, "popupData", id);
};
const fillEmptySpans = (args) => {
let redir = true;
let rcid;
if (typeof args !== "object" || args.redir === void 0 || !args.redir) {
redir = false;
}
const a = args.navpopup.parentAnchor;
let article;
let hint;
let oldid;
let params = {};
if (redir && typeof args.redirTarget === typeof {}) {
article = args.redirTarget;
} else {
article = new Title().fromAnchor(a);
hint = a.originalTitle || article.hintValue();
params = parseParams(a.href);
oldid = getValueOf("popupHistoricalLinks") ? params.oldid : null;
({
rcid
} = params);
}
const x = {
article,
hint,
oldid,
rcid,
navpop: args.navpopup,
params
};
const structure = pg.structures[getValueOf("popupStructure")];
if (typeof structure !== "object") {
setPopupHTML("popupError", "Unknown structure (this should never happen): ".concat(pg.option.popupStructure), args.navpopup.idNumber);
return;
}
const spans = flatten(pg.misc.layout);
const numspans = spans.length;
const redirs = pg.misc.redirSpans;
for (let i = 0; i < numspans; ++i) {
const found = redirs && redirs.includes(spans[i]);
if (found && !redir || !found && redir) {
continue;
}
const structurefn = structure[spans[i]];
if (structurefn === void 0) {
continue;
}
let setfn = setPopupHTML;
if (getValueOf("popupActiveNavlinks") && (spans[i].indexOf("popupTopLinks") === 0 || spans[i].indexOf("popupRedirTopLinks") === 0)) {
setfn = setPopupTipsAndHTML;
}
switch (typeof structurefn) {
case "function":
log("running ".concat(spans[i], "({\n article:").concat(x.article, ", hint:").concat(x.hint, ", oldid: ").concat(x.oldid, "})"));
setfn(structurefn(x), spans[i], args.navpopup.idNumber);
break;
case "string":
setfn(structurefn, spans[i], args.navpopup.idNumber);
break;
default:
errlog("unknown thing with label ".concat(spans[i], " (span index was ").concat(i, ")"));
break;
}
}
};
const flatten = function flatten2(list, start) {
const ret = [];
if (start === void 0) {
start = 0;
}
for (let i = start; i < list.length; ++i) {
if (typeof list[i] === typeof []) {
return [...ret, ...flatten2(list[i]), ...flatten2(list, i + 1)];
}
ret.push(list[i]);
}
return ret;
};
const popupHTML = function popupHTML2(a) {
getValueOf("popupStructure");
const structure = pg.structures[pg.option.popupStructure];
if (typeof structure !== "object") {
pg.option.popupStructure = pg.optionDefault.popupStructure;
return popupHTML2(a);
}
if (typeof structure.popupLayout !== "function") {
return "Bad layout";
}
pg.misc.layout = structure.popupLayout();
pg.misc.redirSpans = typeof structure.popupRedirSpans === "function" ? structure.popupRedirSpans() : [];
return makeEmptySpans(pg.misc.layout, a.navpopup);
};
const makeEmptySpans = function makeEmptySpans2(list, navpop) {
let ret = "";
var _iterator9 = _createForOfIteratorHelper(list), _step9;
try {
for (_iterator9.s(); !(_step9 = _iterator9.n()).done; ) {
const element = _step9.value;
if (typeof element === "string") {
ret += emptySpanHTML(element, navpop.idNumber, "div");
} else if (typeof element === typeof [] && element.length > 0) {
ret = ret.split(/(<\/[^>]*?>$)/).join(makeEmptySpans2(element, navpop));
} else if (typeof element === typeof {} && element.nodeType) {
ret += emptySpanHTML(element.name, navpop.idNumber, element.nodeType);
}
}
} catch (err) {
_iterator9.e(err);
} finally {
_iterator9.f();
}
return ret;
};
const emptySpanHTML = function emptySpanHTML2(name, id, tag, classname) {
tag || (tag = "span");
if (!classname) {
classname = emptySpanHTML2.classAliases[name];
}
classname || (classname = name);
if (name === getValueOf("popupDragHandle")) {
classname += " popupDragHandle";
}
return simplePrintf('<%s id="%s" class="%s"></%s>', [tag, name + id, classname, tag]);
};
emptySpanHTML.classAliases = {
popupSecondPreview: "popupPreview"
};
const imageHTML = (_article, idNumber) => {
return simplePrintf('<a id="popupImageLink$1"><img align="right" valign="top" id="popupImg$1" style="display:none"></img></a>', [idNumber]);
};
const popTipsSoonFn = (id, when, popData) => {
if (!when) {
when = 250;
}
const popTips = () => {
setupTooltips(document.querySelector("#".concat(id)), false, true, popData);
};
return () => {
setTimeout(popTips, when, popData);
};
};
const setPopupTipsAndHTML = (html, divname, idnumber, popData) => {
setPopupHTML(html, divname, idnumber, getValueOf("popupSubpopups") ? popTipsSoonFn(divname + idnumber, null, popData) : null);
};
const fuzzyCursorOffMenus = (_x, _y, _fuzz, parent) => {
if (!parent) {
return null;
}
const uls = parent.querySelectorAll("ul");
var _iterator10 = _createForOfIteratorHelper(uls), _step10;
try {
for (_iterator10.s(); !(_step10 = _iterator10.n()).done; ) {
const ul = _step10.value;
if (ul.className === "popup_menu" && ul.offsetWidth > 0) {
return false;
}
}
} catch (err) {
_iterator10.e(err);
} finally {
_iterator10.f();
}
return true;
};
const checkPopupPosition = () => {
if (pg.current.link && pg.current.link.navpopup) {
pg.current.link.navpopup.limitHorizontalPosition();
}
};
const mouseOutWikiLink = function mouseOutWikiLink2() {
const self2 = this;
removeModifierKeyListener(self2);
if (self2.navpopup === null || self2.navpopup === void 0) {
return;
}
if (!self2.navpopup.isVisible()) {
self2.navpopup.banish();
return;
}
restoreTitle(self2);
Navpopup.tracker.addHook(posCheckerHook(self2.navpopup));
};
const posCheckerHook = (navpop) => {
return () => {
if (!navpop.isVisible()) {
return true;
}
if (Navpopup.tracker.dirty) {
return false;
}
const {
x
} = Navpopup.tracker;
const {
y
} = Navpopup.tracker;
const mouseOverNavpop = navpop.isWithin(x, y, navpop.fuzz, navpop.mainDiv) || !fuzzyCursorOffMenus(x, y, navpop.fuzz, navpop.mainDiv);
let t = getValueOf("popupHideDelay");
if (t) {
t *= 1e3;
}
if (!t) {
if (!mouseOverNavpop) {
if (navpop.parentAnchor) {
restoreTitle(navpop.parentAnchor);
}
navpop.banish();
return true;
}
return false;
}
const d = Date.now();
if (!navpop.mouseLeavingTime) {
navpop.mouseLeavingTime = d;
return false;
}
if (mouseOverNavpop) {
navpop.mouseLeavingTime = null;
return false;
}
if (d - navpop.mouseLeavingTime > t) {
navpop.mouseLeavingTime = null;
navpop.banish();
return true;
}
return false;
};
};
const runStopPopupTimer = (navpop) => {
if (!navpop.stopPopupTimer) {
navpop.stopPopupTimer = setInterval(posCheckerHook(navpop), 500);
navpop.addHook(() => {
clearInterval(navpop.stopPopupTimer);
}, "hide", "before");
}
};
class Previewmaker {
constructor(wikiText, baseUrl, owner) {
this.originalData = wikiText;
this.baseUrl = baseUrl;
this.owner = owner;
this.maxCharacters = getValueOf("popupMaxPreviewCharacters");
this.maxSentences = getValueOf("popupMaxPreviewSentences");
this.setData();
}
setData() {
const maxSize = Math.max(1e4, 2 * this.maxCharacters);
this.data = this.originalData.slice(0, Math.max(0, maxSize));
}
/**
* Remove HTML comments
*
* @private
*/
killComments() {
this.data = this.data.replace(/^<!--[^$]*?-->\n|\n<!--[^$]*?-->(?=\n)|<!--[^$]*?-->/g, "");
}
/**
* @private
*/
killDivs() {
this.data = this.data.replace(/< *div[^>]* *>[\S\s]*?< *\/ *div *>/gi, "");
}
/**
* @private
*/
killGalleries() {
this.data = this.data.replace(/< *gallery[^>]* *>[\S\s]*?< *\/ *gallery *>/gi, "");
}
/**
* @param {Object} opening
* @param {Object} closing
* @param {Object} subopening
* @param {Object} subclosing
* @param {Object} repl
* @private
*/
kill(opening, closing, subopening, subclosing, repl) {
let oldk = this.data;
let k = Previewmaker.killStuff(this.data, opening, closing, subopening, subclosing, repl);
while (k.length < oldk.length) {
oldk = k;
k = Previewmaker.killStuff(k, opening, closing, subopening, subclosing, repl);
}
this.data = k;
}
/**
* @param {Object} txt
* @param {Object} opening
* @param {Object} closing
* @param {Object} subopening
* @param {Object} subclosing
* @param {Object} repl
* @private
*/
static killStuff(txt, opening, closing, subopening, subclosing, repl) {
const op = Previewmaker.makeRegexp(opening);
const cl = Previewmaker.makeRegexp(closing, "^");
const sb = subopening ? Previewmaker.makeRegexp(subopening, "^") : null;
const sc = subclosing ? Previewmaker.makeRegexp(subclosing, "^") : cl;
if (!op || !cl) {
void mw.notify("Navigation Popups error: op or cl is null! something is wrong.", {
tag: "popups",
type: "error"
});
return;
}
if (!op.test(txt)) {
return txt;
}
let ret = "";
const opResult = op.exec(txt);
ret = txt.slice(0, Math.max(0, opResult.index));
txt = txt.slice(Math.max(0, opResult.index + opResult[0].length));
let depth = 1;
while (txt.length > 0) {
let removal = 0;
if (depth === 1 && cl.test(txt)) {
depth--;
removal = cl.exec(txt)[0].length;
} else if (depth > 1 && sc.test(txt)) {
depth--;
removal = sc.exec(txt)[0].length;
} else if (sb && sb.test(txt)) {
depth++;
removal = sb.exec(txt)[0].length;
}
if (!removal) {
removal = 1;
}
txt = txt.slice(Math.max(0, removal));
if (depth === 0) {
break;
}
}
return ret + (repl || "") + txt;
}
/**
* @param {string|RegExp} x
* @param {string|RegExp} prefix
* @param {string|RegExp} suffix
* @private
*/
static makeRegexp(x, prefix, suffix) {
prefix || (prefix = "");
suffix || (suffix = "");
let reStr = "";
let flags = "";
if (isString(x)) {
reStr = prefix + literalizeRegex(x) + suffix;
} else if (isRegExp(x)) {
let s = x.toString().slice(1);
const sp = s.split("/");
flags = sp.at(-1);
sp[sp.length - 1] = "";
s = sp.join("/");
s = s.slice(0, Math.max(0, s.length - 1));
reStr = prefix + s + suffix;
} else {
log("makeRegexp failed");
}
log("makeRegexp: got reStr=".concat(reStr, ", flags=").concat(flags));
return new RegExp(reStr, flags);
}
/**
* @private
*/
killBoxTemplates() {
this.kill(/{{[^\s{|}]*?(float|box)[ _](begin|start)/i, /}}\s*/, "{{");
this.kill(/{{[^\s{|}]*?(infobox|elementbox|frame)[ _]/i, /}}\s*/, "{{");
}
/**
* @private
*/
killTemplates() {
this.kill("{{", "}}", "{", "}", " ");
}
/**
* @private
*/
killTables() {
this.kill("{|", /\|}\s*/, "{|");
this.kill(/<table.*?>/i, /<\/table.*?>/i, /<table.*?>/i);
this.data = this.data.replace(/^\|.*$/gm, "");
}
/**
* @private
*/
killImages() {
const forbiddenNamespaceAliases = [];
for (var _i = 0, _Object$entries = Object.entries(mw.config.get("wgNamespaceIds")); _i < _Object$entries.length; _i++) {
const [localizedNamespaceLc, namespaceId] = _Object$entries[_i];
if (namespaceId !== pg.nsImageId && namespaceId !== pg.nsCategoryId) {
return;
}
forbiddenNamespaceAliases.push(localizedNamespaceLc.split(" ").join("[ _]"));
}
this.kill(new RegExp("[[][[]\\s*(".concat(forbiddenNamespaceAliases.join("|"), ")\\s*:"), "i"), /]]\s*/, "[", "]");
}
/**
* @private
*/
killHTML() {
this.kill(/<ref\b[^/>]*?>/i, /<\/ref>/i);
this.data = this.data.replace(/(^|\n) *<.*/g, "\n");
const splitted = this.data.split(/(<[\W\w]*?(?:>|$|(?=<)))/);
const len = splitted.length;
for (let i = 1; i < len; i += 2) {
switch (splitted[i]) {
case "<no".concat("wiki", ">"):
case "</no".concat("wiki", ">"):
case "<block".concat("quote", ">"):
case "</block".concat("quote", ">"):
break;
default:
splitted[i] = "";
}
}
this.data = splitted.join("");
}
/**
* @private
*/
killChunks() {
const italicChunkRegex = /((^|\n)\s*:*\s*''[^']([^']|'''|'[^']){20}(.|\n[^\n])*''[\s!.?]*\n)+/g;
this.data = this.data.replace(italicChunkRegex, "\n");
}
/**
* @private
*/
mopup() {
this.data = this.data.replace(/^-{4,}/gm, "");
this.data = this.data.replace(/(^|\n) *:[^\n]*/g, "");
this.data = this.data.replace(/^__[_a-z]*__ *$/gim, "");
}
/**
* @private
*/
firstBit() {
let d = this.data;
if (getValueOf("popupPreviewCutHeadings")) {
this.data = this.data.replace(/\s*(==+[^=]*==+)\s*/g, "\n\n$1 ");
this.data = this.data.replace(/([:;]) *\n{2,}/g, "$1\n");
this.data = this.data.replace(/^\s*/, "");
const stuff = /^([^\n]|\n\S)*/.exec(this.data);
if (stuff) {
[d] = stuff;
}
if (!getValueOf("popupPreviewFirstParOnly")) {
d = this.data;
}
d = d.replace(/(==+[^=]*==+)\s*/g, "$1\n\n");
}
d = d.split(/([!.?]+["']*\s)/g);
d[0] = d[0].replace(/^\s*/, "");
const notSentenceEnds = /([^.][a-z]\. *[a-z]|etc|sic|dr|mr|mrs|ms|st|no|op|cit|\[[^\]]*|\s[a-z])$/i;
d = this.fixSentenceEnds(d, notSentenceEnds);
this.fullLength = d.join("").length;
let n = this.maxSentences;
let dd = Previewmaker.firstSentences(d, n);
do {
dd = Previewmaker.firstSentences(d, n);
--n;
} while (dd.length > this.maxCharacters && n !== 0);
this.data = dd;
}
/**
* @param {string} strs
* @param {RegExp} reg
* @private
*/
fixSentenceEnds(strs, reg) {
for (let i = 0; i < strs.length - 2; ++i) {
if (reg.test(strs[i])) {
const a = [];
for (let j = 0; j < strs.length; ++j) {
if (j < i) {
a[j] = strs[j];
}
if (j === i) {
a[i] = strs[i] + strs[i + 1] + strs[i + 2];
}
if (j > i + 2) {
a[j - 2] = strs[j];
}
}
return this.fixSentenceEnds(a, reg);
}
}
return strs;
}
/**
* @param {string[]} strs
* @param {number} howmany
* @private
*/
static firstSentences(strs, howmany) {
const t = strs.slice(0, 2 * howmany);
return t.join("");
}
/**
* @private
*/
killBadWhitespace() {
this.data = this.data.replace(/^ *'+ *$/gm, "");
}
/**
* Runs the various methods to generate the preview.
* The preview is stored in the <code>html</html> field.
*
* @private
*/
makePreview() {
if (this.owner.article.namespaceId() !== pg.nsTemplateId && this.owner.article.namespaceId() !== pg.nsImageId) {
this.killComments();
this.killDivs();
this.killGalleries();
this.killBoxTemplates();
if (getValueOf("popupPreviewKillTemplates")) {
this.killTemplates();
} else {
this.killMultilineTemplates();
}
this.killTables();
this.killImages();
this.killHTML();
this.killChunks();
this.mopup();
this.firstBit();
this.killBadWhitespace();
} else {
this.killHTML();
}
this.html = wiki2html(this.data, this.baseUrl);
this.fixHTML();
this.stripLongTemplates();
}
/**
* @param {string} data
* @private
*/
static esWiki2HtmlPart(data) {
const reLinks = /(?:\[\[([^\]|]*)(?:\|([^\]|]*))*]]([a-z]*))/gi;
reLinks.lastIndex = 0;
let match;
let result = "";
let postfixIndex = 0;
while ((match = reLinks.exec(data)) !== null) {
var _match$;
result += "".concat(pg.escapeQuotesHTML(data.substring(postfixIndex, match.index)), '<a href="').concat(Insta.conf.paths.articles).concat(pg.escapeQuotesHTML(match[1]), '">').concat(pg.escapeQuotesHTML(((_match$ = match[2]) !== null && _match$ !== void 0 ? _match$ : match[1]) + match[3]), "</a>");
postfixIndex = reLinks.lastIndex;
}
result += pg.escapeQuotesHTML(data.slice(Math.max(0, postfixIndex)));
return result;
}
editSummaryPreview() {
const reAes = /\/\* *(.*?) *\*\//g;
reAes.lastIndex = 0;
const match = reAes.exec(this.data);
if (match) {
const prefix = this.data.slice(0, Math.max(0, match.index - 1));
const [, section] = match;
const postfix = this.data.slice(Math.max(0, reAes.lastIndex));
let start = "<span class='autocomment'>";
let end = "</span>";
if (prefix.length > 0) {
start = "".concat(Previewmaker.esWiki2HtmlPart(prefix), " ").concat(start, "- ");
}
if (postfix.length > 0) {
end = ": ".concat(end).concat(Previewmaker.esWiki2HtmlPart(postfix));
}
const t = new Title().fromURL(this.baseUrl);
t.anchorFromUtf(section);
const sectionLink = "".concat(Insta.conf.paths.articles + pg.escapeQuotesHTML(t.toString(true)), "#").concat(pg.escapeQuotesHTML(t.anchor));
return "".concat(start, '<a href="').concat(sectionLink, '">→</a> ').concat(pg.escapeQuotesHTML(section)).concat(end);
}
return Previewmaker.esWiki2HtmlPart(this.data);
}
/**
* Works around livepreview bugs.
*
* @private
*/
fixHTML() {
if (!this.html) {
return;
}
let ret = this.html;
ret = ret.replace(new RegExp('(<a href="'.concat(pg.wiki.articlePath, '/[^"]*)[?](.*?")'), "g"), "$1%3F$2");
ret = ret.replace(new RegExp("(<a href='".concat(pg.wiki.articlePath, "/[^']*)[?](.*?')"), "g"), "$1%3F$2");
this.html = ret;
}
/**
* Generates the preview and displays it in the current popup.
* Does nothing if the generated preview is invalid or consists of whitespace only.
* Also activates wikilinks in the preview for subpopups if the popupSubpopups option is true.
*/
showPreview() {
this.makePreview();
if (typeof this.html !== "string") {
return;
}
if (/^\s*$/.test(this.html)) {
return;
}
setPopupHTML("<hr>", "popupPrePreviewSep", this.owner.idNumber);
setPopupTipsAndHTML(this.html, "popupPreview", this.owner.idNumber, {
owner: this.owner
});
const more = this.fullLength > this.data.length ? this.moreLink() : "";
setPopupHTML(more, "popupPreviewMore", this.owner.idNumber);
}
/**
* @private
*/
moreLink() {
const a = document.createElement("a");
a.className = "popupMoreLink";
a.innerHTML = popupString("more...");
const self2 = this;
a.onclick = () => {
self2.maxCharacters += 2e3;
self2.maxSentences += 20;
self2.setData();
self2.showPreview();
};
return a;
}
/**
* @private
*/
stripLongTemplates() {
this.html = this.html.replace(/^.{0,1000}{{[^}]*?(<(p|br)( \/)?>\s*){2,}([^{}]*?}})?/gi, "");
this.html = this.html.split("\n").join(" ");
this.html = this.html.replace(/{{[^}]*<pre>[^}]*}}/gi, "");
}
/**
* @private
*/
killMultilineTemplates() {
this.kill("{{{", "}}}");
this.kill(/\s*{{[^{}]*\n/, "}}", "{{");
}
}
const loadAPIPreview = (queryType, article, navpop) => {
const art = new Title(article).urlString();
let url = "".concat(pg.wiki.apiwikibase, "?format=json&formatversion=2&action=query&");
let htmlGenerator = () => {
void mw.notify("invalid html generator", {
tag: "popups",
type: "error"
});
};
let usernameart = "";
switch (queryType) {
case "history":
url += "titles=".concat(art, "&prop=revisions&rvlimit=").concat(getValueOf("popupHistoryPreviewLimit"));
htmlGenerator = APIhistoryPreviewHTML;
break;
case "category":
url += "list=categorymembers&cmtitle=".concat(art);
htmlGenerator = APIcategoryPreviewHTML;
break;
case "userinfo": {
const username = new Title(article).userName();
usernameart = encodeURIComponent(username);
url += pg.re.ipUser.test(username) ? "list=blocks&bkprop=range|restrictions&bkip=".concat(usernameart) : "list=users|usercontribs&usprop=blockinfo|groups|editcount|registration|gender&ususers=".concat(usernameart, "&meta=globaluserinfo&guiprop=groups|unattached&guiuser=").concat(usernameart, "&uclimit=1&ucprop=timestamp&ucuser=").concat(usernameart);
htmlGenerator = APIuserInfoPreviewHTML;
break;
}
case "contribs":
usernameart = encodeURIComponent(new Title(article).userName());
url += "list=usercontribs&ucuser=".concat(usernameart, "&uclimit=").concat(getValueOf("popupContribsPreviewLimit"));
htmlGenerator = APIcontribsPreviewHTML;
break;
case "imagepagepreview": {
let trail = "";
if (getValueOf("popupImageLinks")) {
trail = "&list=imageusage&iutitle=".concat(art);
}
url += "titles=".concat(art, "&prop=revisions|imageinfo&rvprop=content").concat(trail);
htmlGenerator = APIimagepagePreviewHTML;
break;
}
case "backlinks":
url += "list=backlinks&bltitle=".concat(art);
htmlGenerator = APIbacklinksPreviewHTML;
break;
case "revision":
url += article.oldid ? "revids=".concat(article.oldid) : "titles=".concat(article.removeAnchor().urlString());
url += "&prop=revisions|pageprops|info|images|categories&rvprop=ids|timestamp|flags|comment|user|content&cllimit=max&imlimit=max";
htmlGenerator = APIrevisionPreviewHTML;
break;
}
pendingNavpopTask(navpop);
const callback = (d) => {
log("callback of API functions was hit");
if (queryType === "userinfo") {
fetchUserGroupNames(d.data).then(() => {
showAPIPreview(queryType, htmlGenerator(article, d, navpop), navpop.idNumber, navpop, d);
});
return;
}
showAPIPreview(queryType, htmlGenerator(article, d, navpop), navpop.idNumber, navpop, d);
};
const go = () => {
getPageWithCaching(url, callback, navpop);
return true;
};
if (navpop.visible || !getValueOf("popupLazyDownloads")) {
go();
} else {
navpop.addHook(go, "unhide", "before", "DOWNLOAD_".concat(queryType, "_QUERY_DATA"));
}
};
const linkList = (list) => {
list.sort((x, y) => {
return x === y ? 0 : x < y ? -1 : 1;
});
const buf = [];
var _iterator11 = _createForOfIteratorHelper(list), _step11;
try {
for (_iterator11.s(); !(_step11 = _iterator11.n()).done; ) {
const element = _step11.value;
buf.push(wikiLink({
article: new Title(element),
text: element.split(" ").join(" "),
action: "view"
}));
}
} catch (err) {
_iterator11.e(err);
} finally {
_iterator11.f();
}
return buf.join(", ");
};
const getTimeOffset = () => {
const tz = mw.user.options.get("timecorrection");
if (tz && tz.includes("|")) {
return Number.parseInt(tz.split("|")[1], 10);
}
return 0;
};
const getTimeZone = () => {
if (!pg.user.timeZone) {
const tz = mw.user.options.get("timecorrection");
pg.user.timeZone = "UTC";
if (tz) {
const tzComponents = tz.split("|");
if (tzComponents.length === 3 && tzComponents[0] === "ZoneInfo") {
[, , pg.user.timeZone] = tzComponents;
} else {
errlog("Unexpected timezone information: ".concat(tz));
}
}
}
return pg.user.timeZone;
};
const useTimeOffset = () => {
if (Intl.DateTimeFormat.prototype.formatToParts === void 0) {
return true;
}
const tz = mw.user.options.get("timecorrection");
if (tz && !tz.includes("ZoneInfo|")) {
return true;
}
return false;
};
const getLocales = () => {
if (!pg.user.locales) {
let userLanguage = document.querySelector("html").getAttribute("lang");
if (getValueOf("popupLocale")) {
userLanguage = getValueOf("popupLocale");
} else if (userLanguage === "en") {
userLanguage = getMWDateFormat() === "mdy" ? "en-US" : "en-GB";
}
pg.user.locales = Intl.DateTimeFormat.supportedLocalesOf([userLanguage, navigator.language]);
}
return pg.user.locales;
};
const getMWDateFormat = () => {
return mw.user.options.get("date");
};
const editPreviewTable = (article, h, reallyContribs) => {
let html = ["<table>"];
let day;
let curart = article;
let page;
let makeFirstColumnLinks;
if (reallyContribs) {
makeFirstColumnLinks = (currentRevision) => {
let result = "(";
result += '<a href="'.concat(pg.wiki.titlebase).concat(new Title(currentRevision.title).urlString(), "&diff=prev&oldid=").concat(currentRevision.revid, '">').concat(popupString("diff"), "</a>");
result += " | ";
result += '<a href="'.concat(pg.wiki.titlebase).concat(new Title(currentRevision.title).urlString(), '&action=history">').concat(popupString("hist"), "</a>");
result += ")";
return result;
};
} else {
const firstRevid = h[0].revid;
makeFirstColumnLinks = (currentRevision) => {
let result = "(";
result += '<a href="'.concat(pg.wiki.titlebase).concat(new Title(curart).urlString(), "&diff=").concat(firstRevid, "&oldid=").concat(currentRevision.revid, '">').concat(popupString("cur"), "</a>");
result += " | ";
result += '<a href="'.concat(pg.wiki.titlebase).concat(new Title(curart).urlString(), "&diff=prev&oldid=").concat(currentRevision.revid, '">').concat(popupString("last"), "</a>");
result += ")";
return result;
};
}
var _iterator12 = _createForOfIteratorHelper(h.entries()), _step12;
try {
for (_iterator12.s(); !(_step12 = _iterator12.n()).done; ) {
const [i, element] = _step12.value;
if (reallyContribs) {
page = element.title;
curart = new Title(page);
}
const minor = element.minor ? "<b>m </b>" : "";
const editDate = new Date(element.timestamp);
let thisDay = formattedDate(editDate);
const thisTime = formattedTime(editDate);
if (thisDay === day) {
thisDay = "";
} else {
day = thisDay;
}
if (thisDay) {
html.push('<tr><td colspan=3><span class="popup_history_date">'.concat(thisDay, "</span></td></tr>"));
}
html.push('<tr class="popup_history_row_'.concat(i % 2 ? "odd" : "even", '">'), "<td>".concat(makeFirstColumnLinks(element), "</td>"), '<td><a href="'.concat(pg.wiki.titlebase).concat(new Title(curart).urlString(), "&oldid=").concat(element.revid, '">').concat(thisTime, "</a></td>"));
let col3url = "";
let col3txt = "";
if (reallyContribs) {
col3url = pg.wiki.titlebase + curart.urlString();
col3txt = pg.escapeQuotesHTML(page);
} else {
const {
user
} = element;
if (element.userhidden) {
col3url = getValueOf("popupRevDelUrl");
col3txt = pg.escapeQuotesHTML(popupString("revdel"));
} else {
col3url = pg.re.ipUser.test(user) ? "".concat(pg.wiki.titlebase + mw.config.get("wgFormattedNamespaces")[pg.nsSpecialId], ":Contributions&target=").concat(new Title(user).urlString()) : "".concat(pg.wiki.titlebase + mw.config.get("wgFormattedNamespaces")[pg.nsUserId], ":").concat(new Title(user).urlString());
col3txt = pg.escapeQuotesHTML(user);
}
}
html.push("<td>".concat(reallyContribs ? minor : "", '<a href="').concat(col3url, '">').concat(col3txt, "</a></td>"));
let comment = "";
const c = element.comment || element.content;
if (c) {
comment = new Previewmaker(c, new Title(curart).toUrl()).editSummaryPreview();
} else if (element.commenthidden) {
comment = popupString("revdel");
}
html.push("<td>".concat(reallyContribs ? "" : minor).concat(comment, "</td>"), "</tr>");
html = [html.join("")];
}
} catch (err) {
_iterator12.e(err);
} finally {
_iterator12.f();
}
html.push("</table>");
return html.join("");
};
const adjustDate = (d, offset) => {
const o = offset * 60 * 1e3;
return new Date(+d + o);
};
const convertTimeZone = (date, timeZone) => {
return new Date(date.toLocaleString("en-US", {
timeZone
}));
};
const formattedDateTime = (date) => {
if (useTimeOffset()) {
return "".concat(formattedDate(date), " ").concat(formattedTime(date));
}
if (getMWDateFormat() === "ISO 8601") {
const d2 = convertTimeZone(date, getTimeZone());
return "".concat(map(zeroFill, [d2.getFullYear(), d2.getMonth() + 1, d2.getDate()]).join("-"), "T").concat(map(zeroFill, [d2.getHours(), d2.getMinutes(), d2.getSeconds()]).join(":"));
}
const options = getValueOf("popupDateTimeFormatterOptions");
options.timeZone = getTimeZone();
return date.toLocaleString(getLocales(), options);
};
const formattedDate = (date) => {
let d2;
if (useTimeOffset()) {
d2 = adjustDate(date, getTimeOffset());
return map(zeroFill, [d2.getUTCFullYear(), d2.getUTCMonth() + 1, d2.getUTCDate()]).join("-");
}
if (getMWDateFormat() === "ISO 8601") {
d2 = convertTimeZone(date, getTimeZone());
return map(zeroFill, [d2.getFullYear(), d2.getMonth() + 1, d2.getDate()]).join("-");
}
const options = getValueOf("popupDateFormatterOptions");
options.timeZone = getTimeZone();
return date.toLocaleDateString(getLocales(), options);
};
const formattedTime = (date) => {
let d2;
if (useTimeOffset()) {
d2 = adjustDate(date, getTimeOffset());
return map(zeroFill, [d2.getUTCHours(), d2.getUTCMinutes(), d2.getUTCSeconds()]).join(":");
}
if (getMWDateFormat() === "ISO 8601") {
d2 = convertTimeZone(date, getTimeZone());
return map(zeroFill, [d2.getHours(), d2.getMinutes(), d2.getSeconds()]).join(":");
}
const options = getValueOf("popupTimeFormatterOptions");
options.timeZone = getTimeZone();
return date.toLocaleTimeString(getLocales(), options);
};
const fetchUserGroupNames = (userinfoResponse) => {
const queryObj = getJsObj(userinfoResponse).query;
const user = anyChild(queryObj.users);
const messages = [];
if (user.groups) {
var _iterator13 = _createForOfIteratorHelper(user.groups), _step13;
try {
for (_iterator13.s(); !(_step13 = _iterator13.n()).done; ) {
const groupName = _step13.value;
if (!["*", "user", "autoconfirmed"].includes(groupName)) {
messages.push("group-".concat(groupName, "-member"));
}
}
} catch (err) {
_iterator13.e(err);
} finally {
_iterator13.f();
}
}
if (queryObj.globaluserinfo && queryObj.globaluserinfo.groups) {
var _iterator14 = _createForOfIteratorHelper(queryObj.globaluserinfo.groups), _step14;
try {
for (_iterator14.s(); !(_step14 = _iterator14.n()).done; ) {
const groupName = _step14.value;
messages.push("group-".concat(groupName, "-member"));
}
} catch (err) {
_iterator14.e(err);
} finally {
_iterator14.f();
}
}
return getMwApi().loadMessagesIfMissing(messages);
};
const showAPIPreview = (queryType, html, id, navpop, download) => {
let target = "popupPreview";
completedNavpopTask(navpop);
switch (queryType) {
case "imagelinks":
case "category":
target = "popupPostPreview";
break;
case "userinfo":
target = "popupUserData";
break;
case "revision":
insertPreview(download);
return;
}
setPopupTipsAndHTML(html, target, id);
};
const APIrevisionPreviewHTML = (_article, download) => {
try {
const jsObj = getJsObj(download.data);
const page = anyChild(jsObj.query.pages);
if (page.missing) {
download.owner = null;
return;
}
const content = page && page.revisions && page.revisions[0].contentmodel === "wikitext" ? page.revisions[0].content : null;
if (typeof content === "string") {
download.data = content;
download.lastModified = new Date(page.revisions[0].timestamp);
}
} catch {
return "Revision preview failed :(";
}
};
const APIbacklinksPreviewHTML = (_article, download) => {
try {
const jsObj = getJsObj(download.data);
const list = jsObj.query.backlinks;
let html = [];
if (!list) {
return popupString("No backlinks found");
}
var _iterator15 = _createForOfIteratorHelper(list), _step15;
try {
for (_iterator15.s(); !(_step15 = _iterator15.n()).done; ) {
const element = _step15.value;
const t = new Title(element.title);
html.push('<a href="'.concat(pg.wiki.titlebase).concat(t.urlString(), '">').concat(t.toString().entify(), "</a>"));
}
} catch (err) {
_iterator15.e(err);
} finally {
_iterator15.f();
}
html = html.join(", ");
if (jsObj.continue && jsObj.continue.blcontinue) {
html += popupString(" and more");
}
return html;
} catch {
return "backlinksPreviewHTML went wonky";
}
};
pg.fn.APIsharedImagePagePreviewHTML = (obj) => {
log("APIsharedImagePagePreviewHTML");
const popupid = obj.requestid;
if (obj.query && obj.query.pages) {
const page = anyChild(obj.query.pages);
const content = page && page.revisions && page.revisions[0].contentmodel === "wikitext" ? page.revisions[0].content : null;
if (typeof content === "string" && pg && pg.current && pg.current.link && pg.current.link.navpopup) {
const p = new Previewmaker(content, pg.current.link.navpopup.article, pg.current.link.navpopup);
p.makePreview();
setPopupHTML(p.html, "popupSecondPreview", popupid);
}
}
};
const APIimagepagePreviewHTML = (article, download, navpop) => {
try {
const jsObj = getJsObj(download.data);
const page = anyChild(jsObj.query.pages);
const content = page && page.revisions && page.revisions[0].contentmodel === "wikitext" ? page.revisions[0].content : null;
let ret = "";
let alt = "";
try {
[{
alt
}] = navpop.parentAnchor.childNodes;
} catch {
}
if (alt) {
ret = "".concat(ret, "<hr><b>").concat(popupString("Alt text:"), "</b> ").concat(pg.escapeQuotesHTML(alt));
}
if (typeof content === "string") {
const p = prepPreviewmaker(content, article, navpop);
p.makePreview();
if (p.html) {
ret += "<hr>".concat(p.html);
}
if (getValueOf("popupSummaryData")) {
const info = getPageInfo(content, download);
log(info);
setPopupTrailer(info, navpop.idNumber);
}
}
if (page && page.imagerepository === "shared") {
const art = new Title(article);
const encart = encodeURIComponent("File:".concat(art.stripNamespace()));
const shared_url = "".concat(pg.wiki.apicommonsbase, "?format=json&formatversion=2&callback=pg.fn.APIsharedImagePagePreviewHTML&requestid=").concat(navpop.idNumber, "&action=query&prop=revisions&rvprop=content&titles=").concat(encart);
ret = "".concat(ret, "<hr>").concat(popupString("Image from Commons"), ': <a href="').concat(pg.wiki.commonsbase, "?title=").concat(encart, '">').concat(popupString("Description page"), "</a>");
mw.loader.load(shared_url);
}
showAPIPreview("imagelinks", APIimagelinksPreviewHTML(article, download), navpop.idNumber, download);
return ret;
} catch {
return "API imagepage preview failed :(";
}
};
const APIimagelinksPreviewHTML = (_article, download) => {
try {
const jsobj = getJsObj(download.data);
const list = jsobj.query.imageusage;
if (list) {
const ret = [];
var _iterator16 = _createForOfIteratorHelper(list), _step16;
try {
for (_iterator16.s(); !(_step16 = _iterator16.n()).done; ) {
const element = _step16.value;
ret.push(element.title);
}
} catch (err) {
_iterator16.e(err);
} finally {
_iterator16.f();
}
if (ret.length === 0) {
return popupString("No image links found");
}
return "<h2>".concat(popupString("File links"), "</h2>").concat(linkList(ret));
}
return popupString("No image links found");
} catch {
return "Image links preview generation failed :(";
}
};
const APIcategoryPreviewHTML = (_article, download) => {
try {
const jsobj = getJsObj(download.data);
const list = jsobj.query.categorymembers;
let ret = [];
var _iterator17 = _createForOfIteratorHelper(list), _step17;
try {
for (_iterator17.s(); !(_step17 = _iterator17.n()).done; ) {
const element = _step17.value;
ret.push(element.title);
}
} catch (err) {
_iterator17.e(err);
} finally {
_iterator17.f();
}
if (ret.length === 0) {
return popupString("Empty category");
}
ret = "<h2>".concat(tprintf("Category members (%s shown)", [ret.length]), "</h2>").concat(linkList(ret));
if (jsobj.continue && jsobj.continue.cmcontinue) {
ret += popupString(" and more");
}
return ret;
} catch {
return "Category preview failed :(";
}
};
const APIuserInfoPreviewHTML = (_article, download) => {
let ret = [];
let queryobj = {};
try {
queryobj = getJsObj(download.data).query;
} catch {
return "Userinfo preview failed :(";
}
const user = anyChild(queryobj.users);
if (user) {
const {
globaluserinfo
} = queryobj;
if (user.invalid === "") {
ret.push(popupString("Invalid user"));
} else if (user.missing === "") {
ret.push(popupString("Not a registered username"));
}
if (user.blockedby) {
if (user.blockpartial) {
ret.push("<b>".concat(popupString("Has blocks"), "</b>"));
} else {
ret.push("<b>".concat(popupString("BLOCKED"), "</b>"));
}
}
if (globaluserinfo && ("locked" in globaluserinfo || "hidden" in globaluserinfo)) {
let lockedSulAccountIsAttachedToThis = true;
for (let i = 0; globaluserinfo.unattached && i < globaluserinfo.unattached.length; i++) {
if (globaluserinfo.unattached[i].wiki === mw.config.get("wgDBname")) {
lockedSulAccountIsAttachedToThis = false;
break;
}
}
if (lockedSulAccountIsAttachedToThis) {
if ("locked" in globaluserinfo) {
ret.push("<b><i>".concat(popupString("LOCKED"), "</i></b>"));
}
if ("hidden" in globaluserinfo) {
ret.push("<b><i>".concat(popupString("HIDDEN"), "</i></b>"));
}
}
}
if (getValueOf("popupShowGender") && user.gender) {
switch (user.gender) {
case "male":
ret.push("".concat(popupString("he/him"), " · "));
break;
case "female":
ret.push("".concat(popupString("she/her"), " · "));
break;
}
}
if (user.groups) {
var _iterator18 = _createForOfIteratorHelper(user.groups), _step18;
try {
for (_iterator18.s(); !(_step18 = _iterator18.n()).done; ) {
const groupName = _step18.value;
if (!["*", "user", "autoconfirmed"].includes(groupName)) {
ret.push(pg.escapeQuotesHTML(mw.message("group-".concat(groupName, "-member"), user.gender).text()));
}
}
} catch (err) {
_iterator18.e(err);
} finally {
_iterator18.f();
}
}
if (globaluserinfo && globaluserinfo.groups) {
var _iterator19 = _createForOfIteratorHelper(globaluserinfo.groups), _step19;
try {
for (_iterator19.s(); !(_step19 = _iterator19.n()).done; ) {
const groupName = _step19.value;
ret.push(
// Messages that can be used here:
// * see [[Special:PrefixIndex/MediaWiki:Group-]]
// * for more information
"<i>".concat(pg.escapeQuotesHTML(mw.message("group-".concat(groupName, "-member"), user.gender).text()), "</i>")
);
}
} catch (err) {
_iterator19.e(err);
} finally {
_iterator19.f();
}
}
if (user.registration) {
var _user$editcount;
ret.push(pg.escapeQuotesHTML(((_user$editcount = user.editcount) !== null && _user$editcount !== void 0 ? _user$editcount : "0") + popupString(" edits since: ") + (user.registration ? formattedDate(new Date(user.registration)) : "")));
}
}
if (queryobj.usercontribs && queryobj.usercontribs.length > 0) {
ret.push(popupString("last edit on ") + formattedDate(new Date(queryobj.usercontribs[0].timestamp)));
}
if (queryobj.blocks) {
ret.push(popupString("IP user"));
for (let l = 0; l < queryobj.blocks.length; l++) {
let rbstr = queryobj.blocks[l].rangestart === queryobj.blocks[l].rangeend ? "BLOCK" : "RANGEBLOCK";
rbstr = Array.isArray(queryobj.blocks[l].restrictions) ? "".concat(rbstr, "ED") : "Has ".concat(rbstr.toLowerCase(), "s");
ret.push("<b>".concat(popupString(rbstr), "</b>"));
}
}
for (let m = 0; m < ret.length - 1; m++) {
if (ret[m].length > 3 && ret[m].slice(Math.max(0, ret[m].length - 3)) === " · ") {
ret[m] += ret[m + 1];
ret.splice(m + 1, 1);
m--;
}
}
ret = "<hr>".concat(ret.join(", "));
return ret;
};
const APIcontribsPreviewHTML = (article, download, navpop) => {
return APIhistoryPreviewHTML(article, download, navpop, true);
};
const APIhistoryPreviewHTML = (article, download, _navpop, reallyContribs) => {
try {
const jsobj = getJsObj(download.data);
let edits = [];
edits = reallyContribs ? jsobj.query.usercontribs : anyChild(jsobj.query.pages).revisions;
const ret = editPreviewTable(article, edits, reallyContribs);
return ret;
} catch {
return "History preview failed :-(";
}
};
const setupDebugging = () => {
if (window.popupDebug) {
window.log = (x) => {
console.log(x);
};
window.errlog = (x) => {
console.error("[Popups] ".concat(x));
};
log("Initializing logger");
} else {
window.log = () => {
};
window.errlog = () => {
};
}
};
const loadImage = (image, navpop) => {
if (typeof image.stripNamespace !== "function") {
void mw.notify("loadImages bad", {
tag: "popups",
type: "error"
});
}
if (!getValueOf("popupImages")) {
return;
}
if (!isValidImageName(image.toString())) {
return false;
}
const art = image.urlString();
let url = "".concat(pg.wiki.apiwikibase, "?format=json&formatversion=2&action=query");
url += "&prop=imageinfo&iiprop=url|mime&iiurlwidth=".concat(getValueOf("popupImageSizeLarge"));
url += "&titles=".concat(art);
pendingNavpopTask(navpop);
const callback = (d) => {
popupsInsertImage(navpop.idNumber, navpop, d);
};
const go = () => {
getPageWithCaching(url, callback, navpop);
return true;
};
if (navpop.visible || !getValueOf("popupLazyDownloads")) {
go();
} else {
navpop.addHook(go, "unhide", "after", "DOWNLOAD_IMAGE_QUERY_DATA");
}
};
const popupsInsertImage = (id, _navpop, download) => {
log("popupsInsertImage");
let imageinfo;
try {
const jsObj = getJsObj(download.data);
const imagepage = anyChild(jsObj.query.pages);
if (imagepage.imageinfo === void 0) {
return;
}
[imageinfo] = imagepage.imageinfo;
} catch {
log("popupsInsertImage failed :(");
return;
}
const popupImage = document.querySelector("#popupImg".concat(id));
if (!popupImage) {
log("could not find insertion point for image");
return;
}
popupImage.width = getValueOf("popupImageSize");
popupImage.style.display = "inline";
if (imageinfo.thumburl) {
popupImage.src = imageinfo.thumburl;
} else if (imageinfo.mime.indexOf("image") === 0) {
popupImage.src = imageinfo.url;
log("a thumb could not be found, using original image");
} else {
log("fullsize imagethumb, but not sure if it's an image");
}
const a = document.querySelector("#popupImageLink".concat(id));
if (a === null) {
return null;
}
switch (getValueOf("popupThumbAction")) {
case "imagepage":
if (pg.current.article.namespaceId() !== pg.nsImageId) {
a.href = imageinfo.descriptionurl;
popTipsSoonFn("popupImage".concat(id))();
break;
}
case "sizetoggle":
a.onclick = toggleSize;
a.title = popupString("Toggle image size");
return;
case "linkfull":
a.href = imageinfo.url;
a.title = popupString("Open full-size image");
}
};
const toggleSize = function toggleSize2() {
const self2 = this;
if (!self2) {
void mw.notify("self is null :/", {
tag: "popups",
type: "error"
});
return;
}
const img = self2.firstChild;
if (!img) {
void mw.notify("img is null :/", {
tag: "popups",
type: "error"
});
return;
}
img.style.width = !img.style.width || img.style.width === "" ? "100%" : "";
};
const getValidImageFromWikiText = (wikiText) => {
let matched;
let match;
const t = removeMatchesUnless(wikiText, /(<!--[\S\s]*?-->)/, 1, /^<!--[^[]*popup/i);
while ((match = pg.re.image.exec(t)) !== null) {
const m = match[2] || match[6];
if (isValidImageName(m)) {
matched = m;
break;
}
}
pg.re.image.lastIndex = 0;
if (!matched) {
return null;
}
return "".concat(mw.config.get("wgFormattedNamespaces")[pg.nsImageId], ":").concat(upcaseFirst(matched));
};
const removeMatchesUnless = (str, re1, parencount, re2) => {
const split = str.split(re1);
const c = parencount + 1;
for (let i = 0; i < split.length; ++i) {
if (i % c === 0 || re2.test(split[i])) {
continue;
}
split[i] = "";
}
return split.join("");
};
const setNamespaces = () => {
pg.nsSpecialId = -1;
pg.nsMainspaceId = 0;
pg.nsImageId = 6;
pg.nsUserId = 2;
pg.nsUsertalkId = 3;
pg.nsCategoryId = 14;
pg.nsTemplateId = 10;
};
const setRedirs = () => {
const r = "redirect";
const R = "REDIRECT";
const redirLists = {
ar: [R, "تحويل"],
be: [r, "перанакіраваньне"],
bg: [r, "пренасочване", "виж"],
bs: [r, "Preusmjeri", "preusmjeri", "PREUSMJERI"],
bn: [R, "পুনর্নির্দেশ"],
cs: [R, "PŘESMĚRUJ"],
cy: [r, "ail-cyfeirio"],
de: [R, "WEITERLEITUNG"],
el: [R, "ΑΝΑΚΑΤΕΥΘΥΝΣΗ"],
eo: [R, "ALIDIREKTU", "ALIDIREKTI"],
es: [R, "REDIRECCIÓN"],
et: [r, "suuna"],
ga: [r, "athsheoladh"],
gl: [r, "REDIRECCIÓN", "REDIRECIONAMENTO"],
he: [R, "הפניה"],
hu: [R, "ÁTIRÁNYÍTÁS"],
is: [r, "tilvísun", "TILVÍSUN"],
it: [R, "RINVIA", "Rinvia"],
ja: [R, "転送"],
mk: [r, "пренасочување", "види"],
nds: [r, "wiederleiden"],
"nds-nl": [R, "DEURVERWIEZING", "DUURVERWIEZING"],
nl: [R, "DOORVERWIJZING"],
nn: [r, "omdiriger"],
pl: [R, "PATRZ", "PRZEKIERUJ", "TAM"],
pt: [R, "redir"],
ru: [R, "ПЕРЕНАПРАВЛЕНИЕ", "ПЕРЕНАПР"],
sk: [r, "presmeruj"],
sr: [r, "Преусмери", "преусмери", "ПРЕУСМЕРИ", "Preusmeri", "preusmeri", "PREUSMERI"],
tt: [R, "yünältü", "перенаправление", "перенапр"],
uk: [R, "ПЕРЕНАПРАВЛЕННЯ", "ПЕРЕНАПР"],
vi: [r, "đổi"],
yi: [R, "ווייטערפירן"],
zh: [R, "重定向"]
// no comma
};
const redirList = redirLists[pg.wiki.lang] || [r, R];
pg.re.redirect = new RegExp("^\\s*[#](".concat(redirList.join("|"), ").*?\\[{2}([^\\|\\]]*)(|[^\\]]*)?\\]{2}\\s*(.*)"), "i");
};
const setInterwiki = () => {
if (pg.wiki.wikimedia) {
pg.wiki.interwiki = "aa|ab|ace|af|ak|als|am|an|ang|ar|arc|arz|as|ast|av|ay|az|ba|bar|bat-smg|bcl|be|be-x-old|bg|bh|bi|bjn|bm|bn|bo|bpy|br|bs|bug|bxr|ca|cbk-zam|cdo|ce|ceb|ch|cho|chr|chy|ckb|co|cr|crh|cs|csb|cu|cv|cy|da|de|diq|dsb|dv|dz|ee|el|eml|en|eo|es|et|eu|ext|fa|ff|fi|fiu-vro|fj|fo|fr|frp|frr|fur|fy|ga|gag|gan|gd|gl|glk|gn|got|gu|gv|ha|hak|haw|he|hi|hif|ho|hr|hsb|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|ilo|io|is|it|iu|ja|jbo|jv|ka|kaa|kab|kbd|kg|ki|kj|kk|kl|km|kn|ko|koi|kr|krc|ks|ksh|ku|kv|kw|ky|la|lad|lb|lbe|lg|li|lij|lmo|ln|lo|lt|ltg|lv|map-bms|mdf|mg|mh|mhr|mi|mk|ml|mn|mo|mr|mrj|ms|mt|mus|mwl|my|myv|mzn|na|nah|nap|nds|nds-nl|ne|new|ng|nl|nn|no|nov|nrm|nv|ny|oc|om|or|os|pa|pag|pam|pap|pcd|pdc|pfl|pi|pih|pl|pms|pnb|pnt|ps|pt|qu|rm|rmy|rn|ro|roa-rup|roa-tara|ru|rue|rw|sa|sah|sc|scn|sco|sd|se|sg|sh|si|simple|sk|sl|sm|sn|so|sq|sr|srn|ss|st|stq|su|sv|sw|szl|ta|te|tet|tg|th|ti|tk|tl|tn|to|tpi|tr|ts|tt|tum|tw|ty|udm|ug|uk|ur|uz|ve|vec|vi|vls|vo|wa|war|wo|wuu|xal|xh|yi|yo|za|zea|zh|zh-classical|zh-min-nan|zh-yue|zu";
pg.re.interwiki = new RegExp("^".concat(pg.wiki.interwiki, ":"));
} else {
pg.wiki.interwiki = null;
pg.re.interwiki = /^$/;
}
};
const nsRe = (namespaceId) => {
const imageNamespaceVariants = [];
for (var _i2 = 0, _Object$entries2 = Object.entries(mw.config.get("wgNamespaceIds")); _i2 < _Object$entries2.length; _i2++) {
const [_localizedNamespaceLc, _namespaceId] = _Object$entries2[_i2];
if (_namespaceId !== namespaceId) {
continue;
}
const localizedNamespaceLc = upcaseFirst(_localizedNamespaceLc);
imageNamespaceVariants.push(mw.util.escapeRegExp(localizedNamespaceLc).split(" ").join("[ _]"), mw.util.escapeRegExp(encodeURI(localizedNamespaceLc)));
}
return "(?:".concat(imageNamespaceVariants.join("|"), ")");
};
const nsReImage = () => {
return nsRe(pg.nsImageId);
};
const getEditboxSelection = () => {
let editbox;
try {
editbox = document.editform.wpTextbox1;
} catch {
return;
}
if (document.selection) {
return document.selection.createRange().text;
}
const selStart = editbox.selectionStart;
const selEnd = editbox.selectionEnd;
return editbox.value.substring(selStart, selEnd);
};
const doSelectionPopup = () => {
const sel = getEditboxSelection();
const open = sel.indexOf("[[");
const pipe = sel.indexOf("|");
const close = sel.indexOf("]]");
if (open === -1 || pipe === -1 && close === -1) {
return;
}
if (pipe !== -1 && open > pipe || close !== -1 && open > close) {
return;
}
const article = new Title(sel.substring(open + 2, pipe < 0 ? close : pipe));
if (getValueOf("popupOnEditSelection") === "boxpreview") {
return doSeparateSelectionPopup(sel, article);
}
if (close > 0 && sel.slice(Math.max(0, close + 2)).includes("[[")) {
return;
}
const a = document.createElement("a");
a.href = pg.wiki.titlebase + article.urlString();
mouseOverWikiLink2(a);
if (a.navpopup) {
a.navpopup.addHook(() => {
runStopPopupTimer(a.navpopup);
}, "unhide", "after");
}
};
const doSeparateSelectionPopup = (str, article) => {
let div = document.querySelector("#selectionPreview");
if (!div) {
div = document.createElement("div");
div.id = "selectionPreview";
try {
const box = document.editform.wpTextbox1;
box.parentNode.insertBefore(div, box);
} catch {
return;
}
}
const p = prepPreviewmaker(str, article, newNavpopup(document.createElement("a"), article));
p.makePreview();
if (p.html) {
div.innerHTML = p.html;
}
div.ranSetupTooltipsAlready = false;
popTipsSoonFn("selectionPreview")();
};
class Mousetracker {
constructor() {
this.loopDelay = 400;
this.timer = null;
this.active = false;
this.dirty = true;
this.hooks = [];
}
/**
* Adds a hook, to be called when we get events.
*
* @param {Function} f A function which is called as
* <code>f(x,y)</code>. It should return <code>true</code> when it
* wants to be removed, and <code>false</code> otherwise.
*/
addHook(f) {
this.hooks.push(f);
}
/**
* Runs hooks, passing them the x
* and y coords of the mouse. Hook functions that return true are
* passed to {@source Mousetracker#removeHooks} for removal.
*
* @private
*/
runHooks() {
if (!this.hooks || this.hooks.length === 0) {
return;
}
let remove = false;
const removeObj = {};
const {
x
} = this;
const {
y
} = this;
const len = this.hooks.length;
for (let i = 0; i < len; ++i) {
if (this.hooks[i](x, y) === true) {
remove = true;
removeObj[i] = true;
}
}
if (remove) {
this.removeHooks(removeObj);
}
}
/**
* Removes hooks.
*
* @private
* @param {Object} removeObj An object whose keys are the index
* numbers of functions for removal, with values that evaluate to true
*/
removeHooks(removeObj) {
const newHooks = [];
const len = this.hooks.length;
for (let i = 0; i < len; ++i) {
if (!removeObj[i]) {
newHooks.push(this.hooks[i]);
}
}
this.hooks = newHooks;
}
/**
* Event listener for mouse wiggles.
* We simply grab the event, set x and y and run the hooks.
* This makes the cpu all hot and bothered :-(
*
* @private
* @param {Event} e Mousemove event
*/
track(e) {
e || (e = window.event);
let x;
let y;
if (e) {
if (e.pageX) {
x = e.pageX;
y = e.pageY;
} else if (e.clientX === void 0) {
return;
} else {
let left;
let top;
const docElt = document.documentElement;
if (docElt) {
left = docElt.scrollLeft;
}
left || (left = document.querySelector("body").scrollLeft || document.scrollLeft || 0);
if (docElt) {
top = docElt.scrollTop;
}
top || (top = document.querySelector("body").scrollTop || document.scrollTop || 0);
x = e.clientX + left;
y = e.clientY + top;
}
this.setPosition(x, y);
}
}
/**
* Sets the x and y coordinates stored and takes appropriate action,
* running hooks as appropriate.
*
* @param {Integer} x, y Screen coordinates to set
* @param {number} x
* @param {number} y
*/
setPosition(x, y) {
this.x = x;
this.y = y;
if (this.dirty || this.hooks.length === 0) {
this.dirty = false;
return;
}
if (typeof this.lastHook_x !== "number") {
this.lastHook_x = -100;
this.lastHook_y = -100;
}
let diff2 = (this.lastHook_x - x) * (this.lastHook_y - y);
diff2 = diff2 >= 0 ? diff2 : -diff2;
if (diff2 > 1) {
this.lastHook_x = x;
this.lastHook_y = y;
if (this.dirty) {
this.dirty = false;
} else {
this.runHooks();
}
}
}
/**
* Sets things in motion, unless they are already that is, registering an event listener on
* <code>document.onmousemove</code>. A half-hearted attempt is made to preserve the old event
* listener if there is one.
*/
enable() {
if (this.active) {
return;
}
this.active = true;
this.savedListener = document.onmousemove;
const self2 = this;
document.onmousemove = (e) => {
self2.track(e);
};
if (this.loopDelay) {
this.timer = setInterval(() => {
self2.runHooks();
}, this.loopDelay);
}
}
/**
* Disables the tracker, removing the event listener.
*/
disable() {
if (!this.active) {
return;
}
if (typeof this.savedListener === "function") {
document.onmousemove = this.savedListener;
} else {
delete document.onmousemove;
}
if (this.timer) {
clearInterval(this.timer);
}
this.active = false;
}
}
class Navpopup {
constructor() {
this.uid = Navpopup.uid++;
this.visible = false;
this.noshow = false;
this.hooks = {
create: [],
unhide: [],
hide: []
};
this.hookIds = {};
this.downloads = [];
this.pending = null;
this.fuzz = 5;
this.constrained = true;
this.width = 0;
this.height = 0;
this.mainDiv = null;
this.createMainDiv();
}
/**
* Retrieves the {@source #visible} attribute, indicating whether the popup is currently visible.
*
* @type boolean
*/
isVisible() {
return this.visible;
}
/**
* Repositions popup using CSS style.
*
* @private
* @param {integer} x x-coordinate (px)
* @param {integer} y y-coordinate (px)
* @param {boolean} noLimitHor Don't call {@source #limitHorizontalPosition}
*/
reposition(x, y, noLimitHor) {
log("reposition(".concat(x, ",").concat(y, ",").concat(noLimitHor, ")"));
if (x !== void 0 && x !== null) {
this.left = x;
}
if (y !== void 0 && y !== null) {
this.top = y;
}
if (this.left !== void 0 && this.top !== void 0) {
this.mainDiv.style.left = "".concat(this.left, "px");
this.mainDiv.style.top = "".concat(this.top, "px");
}
if (!noLimitHor) {
this.limitHorizontalPosition();
}
}
/**
* Prevents popups from being in silly locations. Hopefully.
* Should not be run if {@source #constrained} is true.
*
* @private
*/
limitHorizontalPosition() {
if (!this.constrained || this.tooWide) {
return;
}
this.updateDimensions();
const x = this.left;
const w = this.width;
const cWidth = document.querySelector("body").clientWidth;
if (x + w >= cWidth || x > 0 && this.maxWidth && this.width < this.maxWidth && this.height > this.width && x > cWidth - this.maxWidth) {
this.mainDiv.style.left = "-10000px";
this.mainDiv.style.width = "".concat(this.maxWidth, "px");
const naturalWidth = Number.parseInt(this.mainDiv.offsetWidth, 10);
let newLeft = cWidth - naturalWidth - 1;
if (newLeft < 0) {
newLeft = 0;
this.tooWide = true;
}
log("limitHorizontalPosition: moving to (".concat(newLeft, ",").concat(this.top, "); naturalWidth=").concat(naturalWidth, ", clientWidth=").concat(cWidth));
this.reposition(newLeft, null, true);
}
}
/**
* Brings popup to the top of the z-order.
* We increment the {@source #highest} property of the contructor here.
*
* @private
*/
raise() {
this.mainDiv.style.zIndex = Navpopup.highest + 1;
++Navpopup.highest;
}
/**
* Shows the popup provided {@source #noshow} is not true.
* Updates the position, brings the popup to the top of the z-order and unhides it.
*/
show() {
if (this.noshow) {
return;
}
this.reposition();
this.raise();
this.unhide();
}
/**
* Checks to see if the mouse pointer has
* stabilised (checking every <code>time</code>/2 milliseconds) and runs the
* {@source #show} method if it has.
*
* @param {integer} time The minimum time (ms) before the popup may be shown.
*/
showSoonIfStable(time) {
log("showSoonIfStable, time=".concat(time));
if (this.visible) {
return;
}
this.noshow = false;
this.stable_x = -1e4;
this.stable_y = -1e4;
const stableShow = () => {
log("stableShow called");
const new_x = Navpopup.tracker.x;
const new_y = Navpopup.tracker.y;
const dx = self2.stable_x - new_x;
const dy = self2.stable_y - new_y;
const fuzz2 = 0;
if (dx * dx <= fuzz2 && dy * dy <= fuzz2) {
log("mouse is stable");
clearInterval(self2.showSoonStableTimer);
self2.reposition(new_x + 2, new_y + 2);
self2.show();
self2.limitHorizontalPosition();
return;
}
self2.stable_x = new_x;
self2.stable_y = new_y;
};
const self2 = this;
this.showSoonStableTimer = setInterval(stableShow, time / 2);
}
/**
* Sets the {@source #noshow} flag and hides the popup. This should be called
* when the mouse leaves the link before
* (or after) it's actually been displayed.
*/
banish() {
log("banish called");
this.noshow = true;
if (this.showSoonStableTimer) {
log("clearing showSoonStableTimer");
clearInterval(this.showSoonStableTimer);
}
this.hide();
}
/**
* Runs hooks added with {@source #addHook}.
*
* @private
* @param {string} key Key name of the {@source #hooks} array - one of 'create', 'unhide', 'hide'
* @param {string} when Controls exactly when the hook is run: either 'before' or 'after'
*/
runHooks(key, when) {
if (!this.hooks[key]) {
return;
}
const keyHooks = this.hooks[key];
const len = keyHooks.length;
for (let i = 0; i < len; ++i) {
if (keyHooks[i] && keyHooks[i].when === when && Reflect.apply(keyHooks[i].hook, this, [])) {
if (keyHooks[i].hookId) {
delete this.hookIds[keyHooks[i].hookId];
}
keyHooks[i] = null;
}
}
}
/**
* Adds a hook to the popup. Hook functions are run with <code>this</code> set to refer to the
* Navpopup instance, and no arguments.
*
* @param {Function} hook The hook function. Functions that return true are deleted.
* @param {string} key Key name of the {@source #hooks} array - one of 'create', 'unhide', 'hide'
* @param {string} when Controls exactly when the hook is run: either 'before' or 'after'
* @param {string} uid A truthy string identifying the hook function; if it matches another hook
* in this position, it won't be added again.
*/
addHook(hook, key, when, uid) {
when || (when = "after");
if (!this.hooks[key]) {
return;
}
let hookId;
if (uid) {
hookId = [key, when, uid].join("|");
if (this.hookIds[hookId]) {
return;
}
this.hookIds[hookId] = true;
}
this.hooks[key].push({
hook,
when,
hookId
});
}
/**
* Creates the main DIV element, which contains all the actual popup content.
* Runs hooks with key 'create'.
*
* @private
*/
createMainDiv() {
var _this$className;
if (this.mainDiv) {
return;
}
this.runHooks("create", "before");
const mainDiv = document.createElement("div");
const self2 = this;
mainDiv.onclick = (e) => {
self2.onclickListener(e);
};
mainDiv.className = (_this$className = this.className) !== null && _this$className !== void 0 ? _this$className : "navpopup_maindiv";
mainDiv.id = mainDiv.className + this.uid;
mainDiv.style.position = "absolute";
mainDiv.style.minWidth = "350px";
mainDiv.style.display = "none";
mainDiv.className = "navpopup";
mainDiv.navpopup = this;
this.mainDiv = mainDiv;
document.querySelector("body").append(mainDiv);
this.runHooks("create", "after");
}
/**
* Calls the {@source #raise} method.
*
* @private
*/
onclickListener() {
this.raise();
}
/**
* Makes the popup draggable, using a {@source Drag} object.
*
* @param {string} handleName
* @private
*/
makeDraggable(handleName) {
if (!this.mainDiv) {
this.createMainDiv();
}
const drag = new Drag();
if (!handleName) {
drag.startCondition = (e) => {
try {
if (!e.shiftKey) {
return false;
}
} catch {
return false;
}
return true;
};
}
let dragHandle;
if (handleName) {
dragHandle = document.querySelector("#".concat(handleName));
}
if (!dragHandle) {
dragHandle = this.mainDiv;
}
const self2 = this;
drag.endHook = (x, y) => {
Navpopup.tracker.dirty = true;
self2.reposition(x, y);
};
drag.init(dragHandle, this.mainDiv);
}
/**
* Hides the popup using CSS. Runs hooks with key 'hide'.
* Sets {@source #visible} appropriately.
* {@source #banish} should be called externally instead of this method.
*
* @private
*/
hide() {
this.runHooks("hide", "before");
this.abortDownloads();
if (this.visible !== void 0 && this.visible) {
this.mainDiv.style.display = "none";
this.visible = false;
}
this.runHooks("hide", "after");
}
/**
* Shows the popup using CSS. Runs hooks with key 'unhide'.
* Sets {@source #visible} appropriately. {@source #show} should be called externally instead of this method.
*
* @private
*/
unhide() {
this.runHooks("unhide", "before");
if (this.visible !== void 0 && !this.visible) {
this.mainDiv.style.display = "inline";
this.visible = true;
}
this.runHooks("unhide", "after");
}
/**
* Sets the <code>innerHTML</code> attribute of the main div containing the popup content.
*
* @param {string} html The HTML to set.
*/
setInnerHTML(html) {
this.mainDiv.innerHTML = html;
}
/**
* Updates the {@source #width} and {@source #height} attributes with the CSS properties.
*
* @private
*/
updateDimensions() {
this.width = Number.parseInt(this.mainDiv.offsetWidth, 10);
this.height = Number.parseInt(this.mainDiv.offsetHeight, 10);
}
/**
* Checks if the point (x,y) is within {@source #fuzz} of the
* {@source #mainDiv}.
*
* @param {integer} x x-coordinate (px)
* @param {integer} y y-coordinate (px)
* @type boolean
*/
isWithin(x, y) {
if (!this.visible) {
return false;
}
this.updateDimensions();
const fuzz = this.fuzz || 0;
return x + fuzz >= this.left && x - fuzz <= this.left + this.width && y + fuzz >= this.top && y - fuzz <= this.top + this.height;
}
/**
* Adds a download to {@source #downloads}.
*
* @param {Downloader} download
*/
addDownload(download) {
if (!download) {
return;
}
this.downloads.push(download);
}
/**
* Aborts the downloads listed in {@source #downloads}.
*
* @see Downloader#abort
*/
abortDownloads() {
var _iterator20 = _createForOfIteratorHelper(this.downloads), _step20;
try {
for (_iterator20.s(); !(_step20 = _iterator20.n()).done; ) {
const d = _step20.value;
if (d && d.abort) {
d.abort();
}
}
} catch (err) {
_iterator20.e(err);
} finally {
_iterator20.f();
}
this.downloads = [];
}
}
Navpopup.uid = 0;
Navpopup.highest = 1e3;
Navpopup.tracker = new Mousetracker();
const delFmt = (x) => {
if (x.length === 0) {
return "";
}
return "<del class='popupDiff'>".concat(x.join(""), "</del>");
};
const insFmt = (x) => {
if (x.length === 0) {
return "";
}
return "<ins class='popupDiff'>".concat(x.join(""), "</ins>");
};
const countCrossings = (a, b, i, eject) => {
if (!b[i].row && b[i].row !== 0) {
return -1;
}
let count = 0;
var _iterator21 = _createForOfIteratorHelper(a.entries()), _step21;
try {
for (_iterator21.s(); !(_step21 = _iterator21.n()).done; ) {
const [j, element] = _step21.value;
if (!element.row && element.row !== 0) {
continue;
}
if ((j - b[i].row) * (i - element.row) > 0) {
if (eject) {
return true;
}
count++;
}
}
} catch (err) {
_iterator21.e(err);
} finally {
_iterator21.f();
}
return count;
};
const shortenDiffString = function shortenDiffString2(str, context) {
const re = /(<del[\S\s]*?<\/del>|<ins[\S\s]*?<\/ins>)/;
const splitted = str.split(re);
let ret = [""];
for (let i = 0; i < splitted.length; i += 2) {
if (splitted[i].length < 2 * context) {
ret[ret.length - 1] += splitted[i];
if (i + 1 < splitted.length) {
ret[ret.length - 1] += splitted[i + 1];
}
continue;
} else {
if (i > 0) {
ret[ret.length - 1] += splitted[i].slice(0, Math.max(0, context));
}
if (i + 1 < splitted.length) {
ret.push(splitted[i].slice(Math.max(0, splitted[i].length - context)) + splitted[i + 1]);
}
}
}
while (ret.length > 0 && !ret[0]) {
ret = ret.slice(1);
}
return ret;
};
const diffString = (o, n) => {
let i;
const oSplitted = o.split(/\b/);
const nSplitted = n.split(/\b/);
for (i = 0; i < oSplitted.length; ++i) {
oSplitted[i] = oSplitted[i].entify();
}
for (i = 0; i < nSplitted.length; ++i) {
nSplitted[i] = nSplitted[i].entify();
}
const out = diff(oSplitted, nSplitted);
let str = "";
let acc = [];
let maxOutputPair = 0;
for (i = 0; i < out.n.length; ++i) {
if (out.n[i].paired) {
if (maxOutputPair > out.n[i].row) {
out.o[out.n[i].row] = out.o[out.n[i].row].text;
out.n[i] = out.n[i].text;
}
if (maxOutputPair < out.n[i].row) {
maxOutputPair = out.n[i].row;
}
}
}
for (i = 0; i < out.o.length && !out.o[i].paired; ++i) {
acc.push(out.o[i]);
}
str += delFmt(acc);
acc = [];
for (i = 0; i < out.n.length; ++i) {
while (i < out.n.length && !out.n[i].paired) {
acc.push(out.n[i++]);
}
str += insFmt(acc);
acc = [];
if (i < out.n.length) {
str += out.n[i].text;
let m = out.n[i].row + 1;
while (m < out.o.length && !out.o[m].paired) {
acc.push(out.o[m++]);
}
str += delFmt(acc);
acc = [];
}
}
return str;
};
const jsReservedProperties = new RegExp("^(constructor|prototype|__((define|lookup)[GS]etter)__|eval|hasOwnProperty|propertyIsEnumerable|to(Source|String|LocaleString)|(un)?watch|valueOf)$");
const diffBugAlert = function diffBugAlert2(word) {
if (!diffBugAlert2.list[word]) {
diffBugAlert2.list[word] = 1;
void mw.notify("Bad word: ".concat(word, "\n\nPlease report this bug."), {
tag: "popups",
type: "error"
});
}
};
diffBugAlert.list = {};
const makeDiffHashtable = (src) => {
const ret = {};
for (let i = 0; i < src.length; i++) {
if (jsReservedProperties.test(src[i])) {
src[i] += "<!-- -->";
}
if (!ret[src[i]]) {
ret[src[i]] = [];
}
try {
ret[src[i]].push(i);
} catch {
diffBugAlert(src[i]);
}
}
return ret;
};
const diff = (o, n) => {
const ns = makeDiffHashtable(n);
const os = makeDiffHashtable(o);
let i;
for (i in ns) {
if (ns[i].length === 1 && os[i] && os[i].length === 1) {
n[ns[i][0]] = {
text: n[ns[i][0]],
row: os[i][0],
paired: true
};
o[os[i][0]] = {
text: o[os[i][0]],
row: ns[i][0],
paired: true
};
}
}
for (i = 0; i < n.length - 1; i++) {
if (n[i].paired && !n[i + 1].paired && n[i].row + 1 < o.length && !o[n[i].row + 1].paired && n[i + 1] === o[n[i].row + 1]) {
n[i + 1] = {
text: n[i + 1],
row: n[i].row + 1,
paired: true
};
o[n[i].row + 1] = {
text: o[n[i].row + 1],
row: i + 1,
paired: true
};
}
}
for (i = n.length - 1; i > 0; i--) {
if (n[i].paired && !n[i - 1].paired && n[i].row > 0 && !o[n[i].row - 1].paired && n[i - 1] === o[n[i].row - 1]) {
n[i - 1] = {
text: n[i - 1],
row: n[i].row - 1,
paired: true
};
o[n[i].row - 1] = {
text: o[n[i].row - 1],
row: i - 1,
paired: true
};
}
}
return {
o,
n
};
};
const setSiteInfo = () => {
if (window.popupLocalDebug) {
pg.wiki.hostname = "en.wikipedia.org";
} else {
pg.wiki.hostname = location.hostname;
}
pg.wiki.wikimedia = /(wiki([mp]edia|source|books|news|quote|versity|species|voyage|data)|metawiki|wiktionary|mediawiki)\.org/.test(pg.wiki.hostname);
pg.wiki.wikia = /\.wikia\.com$/i.test(pg.wiki.hostname);
pg.wiki.isLocal = pg.wiki.hostname.startsWith("localhost");
pg.wiki.commons = pg.wiki.wikimedia && pg.wiki.hostname !== "commons.wikimedia.org" ? "commons.wikimedia.org" : null;
pg.wiki.lang = mw.config.get("wgContentLanguage");
const port = location.port ? ":".concat(location.port) : "";
pg.wiki.sitebase = pg.wiki.hostname + port;
};
const setUserInfo = () => {
const params = {
action: "query",
list: "users",
ususers: mw.config.get("wgUserName"),
usprop: "rights"
};
pg.user.canReview = false;
if (getValueOf("popupReview")) {
getMwApi().get(params).done((data) => {
const [{
rights
}] = data.query.users;
pg.user.canReview = rights.includes("review");
});
}
};
const fetchSpecialPageNames = () => {
const params = {
action: "query",
format: "json",
formatversion: "2",
maxage: 3600,
meta: "siteinfo",
siprop: "specialpagealiases",
// cache for an hour
uselang: "content"
};
return getMwApi().get(params).then((data) => {
pg.wiki.specialpagealiases = data.query.specialpagealiases;
});
};
const setTitleBase = () => {
const protocol = window.popupLocalDebug ? "http:" : location.protocol;
pg.wiki.articlePath = mw.config.get("wgArticlePath").replace(/\/\$1/, "");
pg.wiki.botInterfacePath = mw.config.get("wgScript");
pg.wiki.APIPath = "".concat(mw.config.get("wgScriptPath"), "/api.php");
const titletail = "".concat(pg.wiki.botInterfacePath, "?title=");
pg.wiki.titlebase = "".concat(protocol, "//").concat(pg.wiki.sitebase).concat(titletail);
pg.wiki.wikibase = "".concat(protocol, "//").concat(pg.wiki.sitebase).concat(pg.wiki.botInterfacePath);
pg.wiki.apiwikibase = "".concat(protocol, "//").concat(pg.wiki.sitebase).concat(pg.wiki.APIPath);
pg.wiki.articlebase = "".concat(protocol, "//").concat(pg.wiki.sitebase).concat(pg.wiki.articlePath);
pg.wiki.commonsbase = "".concat(protocol, "//").concat(pg.wiki.commons).concat(pg.wiki.botInterfacePath);
pg.wiki.apicommonsbase = "".concat(protocol, "//").concat(pg.wiki.commons).concat(pg.wiki.APIPath);
pg.re.basenames = new RegExp("^(".concat(map(literalizeRegex, [pg.wiki.titlebase, pg.wiki.articlebase]).join("|"), ")"));
};
const setMainRegex = () => {
const reStart = "[^:]*://";
let preTitles = "".concat(literalizeRegex(mw.config.get("wgScriptPath")), "/(?:index[.]php|wiki[.]phtml)[?]title=");
preTitles += "|".concat(literalizeRegex("".concat(pg.wiki.articlePath, "/")));
const reEnd = "(".concat(preTitles, ")([^&?#]*)[^#]*(?:#(.+))?");
pg.re.main = new RegExp(reStart + literalizeRegex(pg.wiki.sitebase) + reEnd);
};
const buildSpecialPageGroup = (specialPageObj) => {
const variants = [];
variants.push(mw.util.escapeRegExp(specialPageObj.realname), mw.util.escapeRegExp(encodeURI(specialPageObj.realname)));
var _iterator22 = _createForOfIteratorHelper(specialPageObj.aliases), _step22;
try {
for (_iterator22.s(); !(_step22 = _iterator22.n()).done; ) {
const alias = _step22.value;
variants.push(mw.util.escapeRegExp(alias), mw.util.escapeRegExp(encodeURI(alias)));
}
} catch (err) {
_iterator22.e(err);
} finally {
_iterator22.f();
}
return variants.join("|");
};
const setRegexps = () => {
setMainRegex();
const sp = nsRe(pg.nsSpecialId);
pg.re.urlNoPopup = new RegExp("((title=|/)".concat(sp, "(?:%3A|:)|section=[0-9]|^#$)"));
var _iterator23 = _createForOfIteratorHelper(pg.wiki.specialpagealiases), _step23;
try {
for (_iterator23.s(); !(_step23 = _iterator23.n()).done; ) {
const specialpage = _step23.value;
switch (specialpage.realname) {
case "Contributions":
pg.re.contribs = new RegExp("(title=|/)".concat(sp, "(?:%3A|:)(?:").concat(buildSpecialPageGroup(specialpage), ")(&target=|/|/").concat(nsRe(pg.nsUserId), ":)(.*)"), "i");
break;
case "Diff":
pg.re.specialdiff = new RegExp("/".concat(sp, "(?:%3A|:)(?:").concat(buildSpecialPageGroup(specialpage), ")/([^?#]*)"), "i");
break;
case "Emailuser":
pg.re.email = new RegExp("(title=|/)".concat(sp, "(?:%3A|:)(?:").concat(buildSpecialPageGroup(specialpage), ")(&target=|/|/(?:").concat(nsRe(pg.nsUserId), ":)?)(.*)"), "i");
break;
case "Whatlinkshere":
pg.re.backlinks = new RegExp("(title=|/)".concat(sp, "(?:%3A|:)(?:").concat(buildSpecialPageGroup(specialpage), ")(&target=|/)([^&]*)"), "i");
break;
}
}
} catch (err) {
_iterator23.e(err);
} finally {
_iterator23.f();
}
const im = nsReImage();
pg.re.image = new RegExp("(^|\\[\\[)".concat(im, ": *([^|\\]]*[^|\\] ])([^0-9\\]]*([0-9]+) *px)?|(?:\\n *[|]?|[|]) *(").concat(getValueOf("popupImageVarsRegexp"), ") *= *(?:\\[\\[ *)?(?:").concat(im, ":)?([^|]*?)(?:\\]\\])? *[|]? *\\n"), "img");
pg.re.imageBracketCount = 6;
pg.re.category = new RegExp("\\[\\[".concat(nsRe(pg.nsCategoryId), ": *([^|\\]]*[^|\\] ]) *"), "i");
pg.re.categoryBracketCount = 1;
pg.re.ipUser = /^(?::(?::|(?::[\dA-Fa-f]{1,4}){1,7})|[\dA-Fa-f]{1,4}(?::[\dA-Fa-f]{1,4}){0,6}::|[\dA-Fa-f]{1,4}(?::[\dA-Fa-f]{1,4}){7})|(((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d))$/;
pg.re.stub = new RegExp(getValueOf("popupStubRegexp"), "im");
pg.re.disambig = new RegExp(getValueOf("popupDabRegexp"), "im");
pg.re.oldid = /[&?]oldid=([^&]*)/;
pg.re.diff = /[&?]diff=([^&]*)/;
};
const setupCache = () => {
pg.cache.pages = [];
};
const setMisc = () => {
pg.current.link = null;
pg.current.links = [];
pg.current.linksHash = {};
setupCache();
pg.timer.checkPopupPosition = null;
pg.counter.loop = 0;
pg.idNumber = 0;
pg.misc.decodeExtras = [
{
from: "%2C",
to: ","
},
{
from: "_",
to: " "
},
{
from: "%24",
to: "$"
},
{
from: "%26",
to: "&"
}
// no ,
];
};
const getMwApi = () => {
if (!pg.api.client) {
pg.api.userAgent = "Navigation popups/1.0";
pg.api.client = api;
}
return pg.api.client;
};
const setupPopups = function setupPopups2(callback) {
if (setupPopups2.completed) {
if (typeof callback === "function") {
callback();
}
return;
}
fetchSpecialPageNames().then(() => {
setupDebugging();
setSiteInfo();
setTitleBase();
setOptions();
setUserInfo();
setNamespaces();
setInterwiki();
setRegexps();
setRedirs();
setMisc();
setupLivePreview();
setupTooltips();
log("In setupPopups(), just called setupTooltips()");
Navpopup.tracker.enable();
setupPopups2.completed = true;
if (typeof callback === "function") {
callback();
}
});
};
const defaultNavlinkSpec = () => {
let str = "";
str += "<b><<mainlink|shortcut= >></b>";
if (getValueOf("popupLastEditLink")) {
str += "*<<lastEdit|shortcut=/>>|<<lastContrib>>|<<sinceMe>>if(oldid){|<<oldEdit>>|<<diffCur>>}";
}
str += "if(user){<br><<contribs|shortcut=c>>*<<userlog|shortcut=L|log>>";
str += "if(ipuser){*<<arin>>}if(wikimedia){*<<count|shortcut=#>>}";
str += "if(ipuser){}else{*<<email|shortcut=E>>}if(admin){*<<block|shortcut=b>>|<<blocklog|log>>}}";
const editstr = "<<edit|shortcut=e>>";
const editOldidStr = "if(oldid){<<editOld|shortcut=e>>|<<revert|shortcut=v|rv>>|<<edit|cur>>}else{".concat(editstr, "}");
const historystr = "<<history|shortcut=h>>|<<editors|shortcut=E|>>";
const watchstr = "<<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>>";
str += "<br>if(talk){".concat(editOldidStr, "|<<new|shortcut=+>>*").concat(historystr, "*").concat(watchstr, "*<b><<article|shortcut=a>></b>|<<editArticle|edit>>}else{").concat(
// not a talk page
editOldidStr,
"*"
).concat(historystr, "*").concat(watchstr, "*<b><<talk|shortcut=t>></b>|<<editTalk|edit>>|<<newTalk|shortcut=+|new>>}");
str += "<br><<whatLinksHere|shortcut=l>>*<<relatedChanges|shortcut=r>>*<<move|shortcut=m>>";
str += "if(admin){<br><<unprotect|unprotectShort>>|<<protect|shortcut=p>>|<<protectlog|log>>*<<undelete|undeleteShort>>|<<delete|shortcut=d>>|<<deletelog|log>>}";
return str;
};
const navLinksHTML = (article, _hint, params) => {
const str = '<span class="popupNavLinks">'.concat(defaultNavlinkSpec(), "</span>");
return navlinkStringToHTML(str, article, params);
};
const expandConditionalNavlinkString = function expandConditionalNavlinkString2(s, article, z, recursionCount) {
const {
oldid
} = z;
const {
rcid
} = z;
const {
diff: diff2
} = z;
if (typeof recursionCount !== "number") {
recursionCount = 0;
}
const conditionalSplitRegex = /(;?\s*if\s*\(\s*(\w*)\s*\)\s*{([^{}]*)}(\s*else\s*{([^{}]*?)}|))/i;
const splitted = s.split(conditionalSplitRegex);
const numParens = 5;
let [ret] = splitted;
for (let i = 1; i < splitted.length; i = i + numParens + 1) {
const testString = splitted[i + 2 - 1];
const trueString = splitted[i + 3 - 1];
let falseString = splitted[i + 5 - 1];
if (falseString === void 0 || !falseString) {
falseString = "";
}
let testResult;
switch (testString) {
case "user":
testResult = !!article.userName();
break;
case "talk":
testResult = !article.talkPage();
break;
case "admin":
testResult = !!getValueOf("popupAdminLinks");
break;
case "oldid":
testResult = !!(oldid !== void 0 && oldid);
break;
case "rcid":
testResult = !!(rcid !== void 0 && rcid);
break;
case "ipuser":
testResult = !!article.isIpUser();
break;
case "mainspace_en":
testResult = isInMainNamespace(article) && pg.wiki.hostname === "en.wikipedia.org";
break;
case "wikimedia":
testResult = !!pg.wiki.wikimedia;
break;
case "diff":
testResult = !!(diff2 !== void 0 && diff2);
break;
}
switch (testResult) {
case null:
ret += splitted[i];
break;
case true:
ret += trueString;
break;
case false:
ret += falseString;
break;
}
ret += splitted[i + numParens];
}
if (conditionalSplitRegex.test(ret) && recursionCount < 10) {
return expandConditionalNavlinkString2(ret, article, z, recursionCount + 1);
}
return ret;
};
const navlinkStringToArray = (s, article, params) => {
s = expandConditionalNavlinkString(s, article, params);
const splitted = s.split(/<<(.*?)>>/);
const ret = [];
var _iterator24 = _createForOfIteratorHelper(splitted.entries()), _step24;
try {
for (_iterator24.s(); !(_step24 = _iterator24.n()).done; ) {
const [i, element] = _step24.value;
if (i % 2) {
const t = new navlinkTag();
const ss = element.split("|");
[t.id] = ss;
for (let j = 1; j < ss.length; ++j) {
const sss = ss[j].split("=");
if (sss.length > 1) {
[, t[sss[0]]] = sss;
} else {
t.text = popupString(sss[0]);
}
}
t.article = article;
const {
oldid
} = params;
const {
rcid
} = params;
const {
diff: diff2
} = params;
if (oldid !== void 0 && oldid !== null) {
t.oldid = oldid;
}
if (rcid !== void 0 && rcid !== null) {
t.rcid = rcid;
}
if (diff2 !== void 0 && diff2 !== null) {
t.diff = diff2;
}
if (!t.text && t.id !== "mainlink") {
t.text = popupString(t.id);
}
ret.push(t);
} else {
ret.push(element);
}
}
} catch (err) {
_iterator24.e(err);
} finally {
_iterator24.f();
}
return ret;
};
const navlinkSubstituteHTML = (s) => {
return s.split("*").join(getValueOf("popupNavLinkSeparator")).split("<menurow>").join('<li class="popup_menu_row">').split("</menurow>").join("</li>").split("<menu>").join('<ul class="popup_menu">').split("</menu>").join("</ul>");
};
const navlinkDepth = (magic, s) => {
return s.split("<".concat(magic, ">")).length - s.split("</".concat(magic, ">")).length;
};
const navlinkStringToHTML = (s, article, params) => {
const p = navlinkStringToArray(s, article, params);
let html = "";
let menudepth = 0;
let menurowdepth = 0;
var _iterator25 = _createForOfIteratorHelper(p), _step25;
try {
for (_iterator25.s(); !(_step25 = _iterator25.n()).done; ) {
const element = _step25.value;
if (typeof element === "string") {
html += navlinkSubstituteHTML(element);
menudepth += navlinkDepth("menu", element);
menurowdepth += navlinkDepth("menurow", element);
} else if (element.type !== void 0 && element.type === "navlinkTag") {
html += menudepth > 0 && menurowdepth === 0 ? '<li class="popup_menu_item">'.concat(element.html(), "</li>") : element.html();
}
}
} catch (err) {
_iterator25.e(err);
} finally {
_iterator25.f();
}
return html;
};
class navlinkTag {
constructor() {
this.type = "navlinkTag";
}
html() {
this.getNewWin();
this.getPrintFunction();
let html = "";
let opening;
let closing;
const tagType = "span";
if (tagType) {
opening = "<".concat(tagType, ' class="popup_').concat(this.id, '">');
closing = "</".concat(tagType, ">");
} else {
opening = "";
closing = "";
}
if (typeof this.print === "function") {
html = this.print(this);
if (typeof html !== "string") {
html = "";
} else if (this.shortcut !== void 0) {
html = addPopupShortcut(html, this.shortcut);
}
} else {
errlog("Oh dear - invalid print function for a navlinkTag, id=".concat(this.id));
}
return opening + html + closing;
}
getNewWin() {
getValueOf("popupLinksNewWindow");
if (pg.option.popupLinksNewWindow[this.id] === void 0) {
this.newWin = null;
}
this.newWin = pg.option.popupLinksNewWindow[this.id];
}
getPrintFunction() {
if (typeof this.id !== "string" || typeof this.article !== typeof {}) {
return;
}
this.noPopup = 1;
switch (this.id) {
case "contribs":
case "history":
case "whatLinksHere":
case "userPage":
case "userTalk":
case "talk":
case "article":
case "lastEdit":
this.noPopup = null;
}
switch (this.id) {
case "email":
case "contribs":
case "block":
case "unblock":
case "userlog":
case "userSpace":
case "deletedContribs":
this.article = this.article.userName();
}
switch (this.id) {
case "userTalk":
case "newUserTalk":
case "editUserTalk":
case "userPage":
case "blocklog":
this.article = this.article.userName(true);
case "pagelog":
case "deletelog":
case "protectlog":
delete this.oldid;
}
if (this.id !== "mainlink") {
this.article = this.article.removeAnchor();
}
switch (this.id) {
case "undelete":
this.print = specialLink;
this.specialpage = "Undelete";
this.sep = "/";
break;
case "whatLinksHere":
this.print = specialLink;
this.specialpage = "Whatlinkshere";
break;
case "relatedChanges":
this.print = specialLink;
this.specialpage = "Recentchangeslinked";
break;
case "move":
this.print = specialLink;
this.specialpage = "Movepage";
break;
case "contribs":
this.print = specialLink;
this.specialpage = "Contributions";
break;
case "deletedContribs":
this.print = specialLink;
this.specialpage = "Deletedcontributions";
break;
case "email":
this.print = specialLink;
this.specialpage = "EmailUser";
this.sep = "/";
break;
case "block":
this.print = specialLink;
this.specialpage = "Blockip";
this.sep = "&ip=";
break;
case "unblock":
this.print = specialLink;
this.specialpage = "Ipblocklist";
this.sep = "&action=unblock&ip=";
break;
case "userlog":
this.print = specialLink;
this.specialpage = "Log";
this.sep = "&user=";
break;
case "blocklog":
this.print = specialLink;
this.specialpage = "Log";
this.sep = "&type=block&page=";
break;
case "pagelog":
this.print = specialLink;
this.specialpage = "Log";
this.sep = "&page=";
break;
case "protectlog":
this.print = specialLink;
this.specialpage = "Log";
this.sep = "&type=protect&page=";
break;
case "deletelog":
this.print = specialLink;
this.specialpage = "Log";
this.sep = "&type=delete&page=";
break;
case "userSpace":
this.print = specialLink;
this.specialpage = "PrefixIndex";
this.sep = "&namespace=2&prefix=";
break;
case "search":
this.print = specialLink;
this.specialpage = "Search";
this.sep = "&fulltext=Search&search=";
break;
case "thank":
this.print = specialLink;
this.specialpage = "Thanks";
this.sep = "/";
this.article.value = this.diff === "prev" ? this.oldid : this.diff;
break;
case "unwatch":
case "watch":
this.print = magicWatchLink;
this.action = "".concat(this.id, "&autowatchlist=1&autoimpl=").concat(popupString("autoedit_version"), "&actoken=").concat(autoClickToken());
break;
case "history":
case "historyfeed":
case "unprotect":
case "protect":
this.print = wikiLink;
this.action = this.id;
break;
case "delete":
this.print = wikiLink;
this.action = "delete";
if (this.article.namespaceId() === pg.nsImageId) {
const img = this.article.stripNamespace();
this.action += "&image=".concat(img);
}
break;
case "markpatrolled":
case "edit":
delete this.oldid;
case "view":
case "purge":
case "render":
this.print = wikiLink;
this.action = this.id;
break;
case "raw":
this.print = wikiLink;
this.action = "raw";
break;
case "new":
this.print = wikiLink;
this.action = "edit§ion=new";
break;
case "mainlink":
if (this.text === void 0) {
this.text = this.article.toString().entify();
}
if (getValueOf("popupSimplifyMainLink") && isInStrippableNamespace(this.article)) {
const s = this.text.split("/");
this.text = s.at(-1);
if (this.text === "" && s.length > 1) {
this.text = s.at(-2);
}
}
this.print = titledWikiLink;
if (this.title === void 0 && pg.current.link && pg.current.link.href !== void 0) {
var _pg$current$link$orig;
this.title = safeDecodeURI((_pg$current$link$orig = pg.current.link.originalTitle) !== null && _pg$current$link$orig !== void 0 ? _pg$current$link$orig : this.article);
if (this.oldid !== void 0 && this.oldid) {
this.title = tprintf("Revision %s of %s", [this.oldid, this.title]);
}
}
this.action = "view";
break;
case "userPage":
case "article":
case "editArticle":
delete this.oldid;
this.article = this.article.articleFromTalkOrArticle();
this.print = wikiLink;
this.action = this.id.indexOf("edit") === 0 ? "edit" : "view";
break;
case "userTalk":
case "talk":
this.article = this.article.talkPage();
delete this.oldid;
this.print = wikiLink;
this.action = "view";
break;
case "arin":
this.print = arinLink;
break;
case "count":
this.print = editCounterLink;
break;
case "editors":
this.print = editorListLink;
break;
case "lastEdit":
this.print = titledDiffLink;
this.title = popupString("Show the last edit");
this.from = "prev";
this.to = "cur";
break;
case "oldEdit":
this.print = titledDiffLink;
this.title = "".concat(popupString("Show the edit made to get revision"), " ").concat(this.oldid);
this.from = "prev";
this.to = this.oldid;
break;
case "editOld":
this.print = wikiLink;
this.action = "edit";
break;
case "undo":
this.print = wikiLink;
this.action = "edit&undo=";
break;
case "revert":
this.print = wikiLink;
this.action = "revert";
break;
case "nullEdit":
this.print = wikiLink;
this.action = "nullEdit";
break;
case "diffCur":
this.print = titledDiffLink;
this.title = tprintf("Show changes since revision %s", [this.oldid]);
this.from = this.oldid;
this.to = "cur";
break;
case "editUserTalk":
case "editTalk":
delete this.oldid;
this.article = this.article.talkPage();
this.action = "edit";
this.print = wikiLink;
break;
case "newUserTalk":
case "newTalk":
this.article = this.article.talkPage();
this.action = "edit§ion=new";
this.print = wikiLink;
break;
case "lastContrib":
case "sinceMe":
this.print = magicHistoryLink;
break;
case "togglePreviews":
this.text = popupString(pg.option.simplePopups ? "enable previews" : "disable previews");
case "disablePopups":
case "purgePopups":
this.print = popupMenuLink;
break;
default:
this.print = function() {
return "Unknown navlink type: ".concat(this.id);
};
}
}
}
const popupHandleKeypress = function popupHandleKeypress2(evt) {
var _evt$keyCode;
const keyCode = window.event ? window.event.keyCode : (_evt$keyCode = evt.keyCode) !== null && _evt$keyCode !== void 0 ? _evt$keyCode : evt.which;
if (!keyCode || !pg.current.link || !pg.current.link.navpopup) {
return;
}
if (keyCode === 27) {
killPopup();
return false;
}
const letter = String.fromCodePoint(keyCode);
const links = pg.current.link.navpopup.mainDiv.querySelectorAll("A");
let startLink = 0;
let i;
let j;
if (popupHandleKeypress2.lastPopupLinkSelected) {
for (i = 0; i < links.length; ++i) {
if (links[i] === popupHandleKeypress2.lastPopupLinkSelected) {
startLink = i;
}
}
}
for (j = 0; j < links.length; ++j) {
i = (startLink + j + 1) % links.length;
if (links[i].getAttribute("popupkey") === letter) {
if (evt && evt.preventDefault) {
evt.preventDefault();
}
links[i].focus();
popupHandleKeypress2.lastPopupLinkSelected = links[i];
return false;
}
}
if (document.oldPopupOnkeypress) {
return document.oldPopupOnkeypress(evt);
}
return true;
};
const addPopupShortcuts = () => {
if (document.onkeypress !== popupHandleKeypress) {
document.oldPopupOnkeypress = document.onkeypress;
}
document.onkeypress = popupHandleKeypress;
};
const rmPopupShortcuts = () => {
popupHandleKeypress.lastPopupLinkSelected = null;
try {
if (document.oldPopupOnkeypress && document.oldPopupOnkeypress === popupHandleKeypress) {
document.onkeypress = null;
return;
}
document.onkeypress = document.oldPopupOnkeypress;
} catch {
}
};
const addLinkProperty = (html, property) => {
const i = html.indexOf(">");
if (i < 0) {
return html;
}
return "".concat(html.slice(0, Math.max(0, i)), " ").concat(property).concat(html.slice(Math.max(0, i)));
};
const addPopupShortcut = (html, key) => {
if (!getValueOf("popupShortcutKeys")) {
return html;
}
const ret = addLinkProperty(html, 'popupkey="'.concat(key, '"'));
if (key === " ") {
key = popupString("spacebar");
}
return ret.replace(/^(.*?)(title=")(.*?)(".*)$/i, "$1$2$3 [".concat(key, "]$4"));
};
const loadDiff = (article, oldid, diff2, navpop) => {
navpop.diffData = {
oldRev: {},
newRev: {}
};
const api2 = getMwApi();
const params = {
action: "compare",
prop: ["ids", "title"]
};
if (article.title) {
params.fromtitle = article.title;
}
switch (diff2) {
case "cur":
switch (oldid) {
case null:
case "":
case "prev":
params.torelative = "prev";
break;
default:
params.fromrev = oldid;
params.torelative = "cur";
break;
}
break;
case "prev":
if (oldid) {
params.fromrev = oldid;
} else {
params.fromtitle;
}
params.torelative = "prev";
break;
case "next":
params.fromrev = oldid || 0;
params.torelative = "next";
break;
default:
params.fromrev = oldid || 0;
params.torev = diff2 || 0;
break;
}
api2.get(params).then((data) => {
navpop.diffData.oldRev.revid = data.compare.fromrevid;
navpop.diffData.newRev.revid = data.compare.torevid;
addReviewLink(navpop, "popupMiscTools");
const go = () => {
pendingNavpopTask(navpop);
let url = "".concat(pg.wiki.apiwikibase, "?format=json&formatversion=2&action=query&");
url += "revids=".concat(navpop.diffData.oldRev.revid, "|").concat(navpop.diffData.newRev.revid);
url += "&prop=revisions&rvprop=ids|timestamp|content";
getPageWithCaching(url, doneDiff, navpop);
return true;
};
if (navpop.visible || !getValueOf("popupLazyDownloads")) {
go();
} else {
navpop.addHook(go, "unhide", "before", "DOWNLOAD_DIFFS");
}
});
};
const addReviewLink = (navpop, target) => {
if (!pg.user.canReview) {
return;
}
if (navpop.diffData.newRev.revid <= navpop.diffData.oldRev.revid) {
return;
}
const params = {
action: "query",
format: "json",
formatversion: "2",
prop: ["info", "flagged"],
revids: navpop.diffData.oldRev.revid
};
getMwApi().get(params).then((data) => {
const stable_revid = data.query.pages[0].flagged && data.query.pages[0].flagged.stable_revid || 0;
if (stable_revid === navpop.diffData.oldRev.revid) {
const a = document.createElement("a");
a.innerHTML = popupString("mark patrolled");
a.title = popupString("markpatrolledHint");
a.onclick = () => {
const params2 = {
action: "review",
comment: tprintf("defaultpopupReviewedSummary", [navpop.diffData.oldRev.revid, navpop.diffData.newRev.revid]),
revid: navpop.diffData.newRev.revid
};
getMwApi().postWithToken("csrf", params2).done(() => {
a.style.display = "none";
}).fail(() => {
void mw.notify(popupString("Could not marked this edit as patrolled"), {
tag: "popups",
type: "error"
});
});
};
setPopupHTML(a, target, navpop.idNumber, null, true);
}
});
};
const doneDiff = (download) => {
if (!download.owner || !download.owner.diffData) {
return;
}
const navpop = download.owner;
completedNavpopTask(navpop);
let pages;
let revisions = [];
try {
({
pages
} = getJsObj(download.data).query);
var _iterator26 = _createForOfIteratorHelper(pages), _step26;
try {
for (_iterator26.s(); !(_step26 = _iterator26.n()).done; ) {
const page = _step26.value;
revisions = [...revisions, ...page.revisions];
}
} catch (err) {
_iterator26.e(err);
} finally {
_iterator26.f();
}
for (var _i3 = 0, _revisions = revisions; _i3 < _revisions.length; _i3++) {
const revision = _revisions[_i3];
if (revision.revid === navpop.diffData.oldRev.revid) {
navpop.diffData.oldRev.revision = revision;
} else if (revision.revid === navpop.diffData.newRev.revid) {
navpop.diffData.newRev.revision = revision;
}
}
} catch {
errlog("Could not get diff");
}
insertDiff(navpop);
};
const rmBoringLines = (a, b, context) => {
if (context === void 0) {
context = 2;
}
const aa = [];
const aaa = [];
const bb = [];
const bbb = [];
let i;
let j;
for (i = 0; i < a.length; ++i) {
if (!a[i].paired) {
aa[i] = 1;
} else if (countCrossings(b, a, i, true)) {
aa[i] = 1;
bb[a[i].row] = 1;
}
}
for (i = 0; i < b.length; ++i) {
if (bb[i] === 1) {
continue;
}
if (!b[i].paired) {
bb[i] = 1;
}
}
for (i = 0; i < b.length; ++i) {
if (bb[i] === 1) {
for (j = Math.max(0, i - context); j < Math.min(b.length, i + context); ++j) {
if (!bb[j]) {
bb[j] = 1;
aa[b[j].row] = 0.5;
}
}
}
}
for (i = 0; i < a.length; ++i) {
if (aa[i] === 1) {
for (j = Math.max(0, i - context); j < Math.min(a.length, i + context); ++j) {
if (!aa[j]) {
aa[j] = 1;
bb[a[j].row] = 0.5;
}
}
}
}
for (i = 0; i < bb.length; ++i) {
if (bb[i] > 0) {
if (b[i].paired) {
bbb.push(b[i].text);
} else {
bbb.push(b[i]);
}
}
}
for (i = 0; i < aa.length; ++i) {
if (aa[i] > 0) {
if (a[i].paired) {
aaa.push(a[i].text);
} else {
aaa.push(a[i]);
}
}
}
return {
a: aaa,
b: bbb
};
};
const stripOuterCommonLines = (a, b, context) => {
let i = 0;
while (i < a.length && i < b.length && a[i] === b[i]) {
++i;
}
let j = a.length - 1;
let k = b.length - 1;
while (j >= 0 && k >= 0 && a[j] === b[k]) {
--j;
--k;
}
return {
a: a.slice(Math.max(0, i - 1 - context), Math.min(a.length + 1, j + context + 1)),
b: b.slice(Math.max(0, i - 1 - context), Math.min(b.length + 1, k + context + 1))
};
};
const insertDiff = (navpop) => {
let oldlines = navpop.diffData.oldRev.revision.content.split("\n");
let newlines = navpop.diffData.newRev.revision.content.split("\n");
let inner = stripOuterCommonLines(oldlines, newlines, getValueOf("popupDiffContextLines"));
oldlines = inner.a;
newlines = inner.b;
let truncated = false;
getValueOf("popupDiffMaxLines");
if (oldlines.length > pg.option.popupDiffMaxLines || newlines.length > pg.option.popupDiffMaxLines) {
truncated = true;
inner = stripOuterCommonLines(oldlines.slice(0, pg.option.popupDiffMaxLines), newlines.slice(0, pg.option.popupDiffMaxLines), pg.option.popupDiffContextLines);
oldlines = inner.a;
newlines = inner.b;
}
const lineDiff = diff(oldlines, newlines);
const lines2 = rmBoringLines(lineDiff.o, lineDiff.n);
const oldlines2 = lines2.a;
const newlines2 = lines2.b;
let html = "<hr>";
if (getValueOf("popupDiffDates")) {
html += diffDatesTable(navpop);
html += "<hr>";
}
html += shortenDiffString(diffString(oldlines2.join("\n"), newlines2.join("\n")), getValueOf("popupDiffContextCharacters")).join("<hr>");
setPopupTipsAndHTML(html.split("\n").join("<br>") + (truncated ? "<hr><b>".concat(popupString("Diff truncated for performance reasons"), "</b>") : ""), "popupPreview", navpop.idNumber);
};
const diffDatesTable = (navpop) => {
let html = '<table class="popup_diff_dates">';
html += diffDatesTableRow(navpop.diffData.newRev.revision, tprintf("New revision"));
html += diffDatesTableRow(navpop.diffData.oldRev.revision, tprintf("Old revision"));
html += "</table>";
return html;
};
const diffDatesTableRow = (revision, label) => {
let txt = "";
const lastModifiedDate = new Date(revision.timestamp);
txt = formattedDateTime(lastModifiedDate);
const revlink = generalLink({
url: "".concat(mw.config.get("wgScript"), "?oldid=").concat(revision.revid),
text: label,
title: label
});
return simplePrintf("<tr><td>%s</td><td>%s</td></tr>", [revlink, txt]);
};
const titledDiffLink = (l) => {
return titledWikiLink({
article: l.article,
action: "".concat(l.to, "&oldid=").concat(l.from),
newWin: l.newWin,
noPopup: l.noPopup,
text: l.text,
title: l.title,
/* hack: no oldid here */
actionName: "diff"
});
};
const wikiLink = (l) => {
if (!(typeof l.article === typeof {} && typeof l.action === "string" && typeof l.text === "string")) {
return null;
}
if (l.oldid === void 0) {
l.oldid = null;
}
const savedOldid = l.oldid;
if (!/^(edit|view|revert|render)$|^raw/.test(l.action)) {
l.oldid = null;
}
let hint = popupString("".concat(l.action, "Hint"));
const oldidData = [l.oldid, safeDecodeURI(l.article)];
let revisionString = tprintf("revision %s of %s", oldidData);
log("revisionString=".concat(revisionString));
switch (l.action) {
case "edit§ion=new":
hint = popupString("newSectionHint");
break;
case "edit&undo=":
if (l.diff && l.diff !== "prev" && savedOldid) {
l.action += "".concat(l.diff, "&undoafter=").concat(savedOldid);
} else if (savedOldid) {
l.action += savedOldid;
}
hint = popupString("undoHint");
break;
case "raw&ctype=text/css":
hint = popupString("rawHint");
break;
case "revert": {
const p = parseParams(pg.current.link.href);
l.action = "edit&autoclick=wpSave&actoken=".concat(autoClickToken(), "&autoimpl=").concat(popupString("autoedit_version"), "&autosummary=").concat(revertSummary(l.oldid, p.diff));
if (p.diff === "prev") {
l.action += "&direction=prev";
revisionString = tprintf("the revision prior to revision %s of %s", oldidData);
}
if (getValueOf("popupRevertSummaryPrompt")) {
l.action += "&autosummaryprompt=true";
}
if (getValueOf("popupMinorReverts")) {
l.action += "&autominor=true";
}
log("revisionString is now ".concat(revisionString));
break;
}
case "nullEdit":
l.action = "edit&autoclick=wpSave&actoken=".concat(autoClickToken(), "&autoimpl=").concat(popupString("autoedit_version"), "&autosummary=null");
break;
case "historyfeed":
l.action = "history&feed=rss";
break;
case "markpatrolled":
l.action = "markpatrolled&rcid=".concat(l.rcid);
}
if (hint) {
hint = l.oldid ? simplePrintf(hint, [revisionString]) : simplePrintf(hint, [safeDecodeURI(l.article)]);
} else {
hint = safeDecodeURI("".concat(l.article, "&action=").concat(l.action)) + l.oldid ? "&oldid=".concat(l.oldid) : "";
}
return titledWikiLink({
article: l.article,
action: l.action,
text: l.text,
newWin: l.newWin,
title: hint,
oldid: l.oldid,
noPopup: l.noPopup,
onclick: l.onclick
});
};
const revertSummary = (oldid, diff2) => {
let ret = "";
ret = diff2 === "prev" ? getValueOf("popupQueriedRevertToPreviousSummary") : getValueOf("popupQueriedRevertSummary");
return "".concat(ret, "&autorv=").concat(oldid);
};
const titledWikiLink = (l) => {
if (l.article === void 0 || l.action === void 0) {
errlog("got undefined article or action in titledWikiLink");
return null;
}
const base = pg.wiki.titlebase + l.article.urlString();
let url = base;
if (l.actionName === void 0 || !l.actionName) {
l.actionName = "action";
}
if (l.action !== "view") {
url = "".concat(base, "&").concat(l.actionName, "=").concat(l.action);
}
if (l.oldid !== void 0 && l.oldid) {
url += "&oldid=".concat(l.oldid);
}
let cssClass = pg.misc.defaultNavlinkClassname;
if (l.className !== void 0 && l.className) {
cssClass = l.className;
}
return generalNavLink({
url,
newWin: l.newWin,
title: l.title === void 0 ? null : l.title,
text: l.text === void 0 ? null : l.text,
className: cssClass,
noPopup: l.noPopup,
onclick: l.onclick
});
};
pg.fn.getLastContrib = (wikipage, newWin) => {
getHistoryInfo(wikipage, (x) => {
processLastContribInfo(x, {
page: wikipage,
newWin
});
});
};
const processLastContribInfo = (info, stuff) => {
if (!info.edits || info.edits.length === 0) {
void mw.notify("Popups: an odd thing happened. Please retry.", {
tag: "popups",
type: "error"
});
return;
}
if (!info.firstNewEditor) {
void mw.notify(tprintf("Only found one editor: %s made %s edits", [info.edits[0].editor, info.edits.length]), {
tag: "popups",
type: "error"
});
return;
}
const newUrl = "".concat(pg.wiki.titlebase + new Title(stuff.page).urlString(), "&diff=cur&oldid=").concat(info.firstNewEditor.oldid);
displayUrl(newUrl, stuff.newWin);
};
pg.fn.getDiffSinceMyEdit = (wikipage, newWin) => {
getHistoryInfo(wikipage, (x) => {
processDiffSinceMyEdit(x, {
page: wikipage,
newWin
});
});
};
const processDiffSinceMyEdit = (info, stuff) => {
if (!info.edits || info.edits.length === 0) {
void mw.notify("Popups: something fishy happened. Please try again.", {
tag: "popups",
type: "error"
});
return;
}
const friendlyName = stuff.page.split("_").join(" ");
if (!info.myLastEdit) {
void mw.notify(tprintf("Couldn't find an edit by %s\nin the last %s edits to\n%s", [info.userName, getValueOf("popupHistoryLimit"), friendlyName]), {
tag: "popups",
type: "error"
});
return;
}
if (info.myLastEdit.index === 0) {
void mw.notify(tprintf("%s seems to be the last editor to the page %s", [info.userName, friendlyName]), {
type: "error"
});
return;
}
const newUrl = "".concat(pg.wiki.titlebase + new Title(stuff.page).urlString(), "&diff=cur&oldid=").concat(info.myLastEdit.oldid);
displayUrl(newUrl, stuff.newWin);
};
const displayUrl = (url, newWin) => {
if (newWin) {
window.open(url);
} else {
document.location = url;
}
};
pg.fn.purgePopups = () => {
processAllPopups(true);
setupCache();
pg.option = {};
abortAllDownloads();
};
const processAllPopups = (nullify, banish) => {
for (let i = 0; pg.current.links && i < pg.current.links.length; ++i) {
if (!pg.current.links[i].navpopup) {
continue;
}
if (nullify || banish) {
pg.current.links[i].navpopup.banish();
}
pg.current.links[i].simpleNoMore = false;
if (nullify) {
pg.current.links[i].navpopup = null;
}
}
};
pg.fn.disablePopups = () => {
processAllPopups(false, true);
setupTooltips(null, true);
};
pg.fn.togglePreviews = () => {
processAllPopups(true, true);
pg.option.simplePopups = !pg.option.simplePopups;
abortAllDownloads();
};
const magicWatchLink = function magicWatchLink2(l) {
l.onclick = simplePrintf("pg.fn.modifyWatchlist('%s','%s');return false;", [l.article.toString(true).split("\\").join("\\\\").split("'").join("\\'"), this.id]);
return wikiLink(l);
};
pg.fn.modifyWatchlist = /* @__PURE__ */ function() {
var _ref = _asyncToGenerator(function* (title, action) {
const reqData = {
action: "watch",
formatversion: "2",
titles: title,
uselang: mw.config.get("wgUserLanguage")
};
if (action === "unwatch") {
reqData.unwatch = true;
}
const mwTitle = mw.Title.newFromText(title);
let messageName;
if (mwTitle && mwTitle.getNamespaceId() > 0 && mwTitle.getNamespaceId() % 2 === 1) {
messageName = action === "watch" ? "addedwatchtext-talk" : "removedwatchtext-talk";
} else {
messageName = action === "watch" ? "addedwatchtext" : "removedwatchtext";
}
yield getMwApi().postWithToken("watch", reqData);
yield getMwApi().loadMessagesIfMissing([messageName]);
void mw.notify(mw.message(messageName, title).parseDom(), {
tag: "popups"
});
});
return function(_x2, _x3) {
return _ref.apply(this, arguments);
};
}();
const magicHistoryLink = (l) => {
let jsUrl = "";
let title = "";
let onClick = "";
switch (l.id) {
case "lastContrib":
onClick = simplePrintf("pg.fn.getLastContrib('%s',%s)", [l.article.toString(true).split("\\").join("\\\\").split("'").join("\\'"), l.newWin]);
title = popupString("lastContribHint");
break;
case "sinceMe":
onClick = simplePrintf("pg.fn.getDiffSinceMyEdit('%s',%s)", [l.article.toString(true).split("\\").join("\\\\").split("'").join("\\'"), l.newWin]);
title = popupString("sinceMeHint");
break;
}
jsUrl = "javascript:".concat(onClick);
onClick += ";return false;";
return generalNavLink({
url: jsUrl,
newWin: false,
title,
text: l.text,
noPopup: l.noPopup,
onclick: onClick
});
};
const popupMenuLink = (l) => {
const jsUrl = simplePrintf("javascript:pg.fn.%s()", [l.id]);
const title = popupString(simplePrintf("%sHint", [l.id]));
const onClick = simplePrintf("pg.fn.%s();return false;", [l.id]);
return generalNavLink({
url: jsUrl,
newWin: false,
title,
text: l.text,
noPopup: l.noPopup,
onclick: onClick
});
};
const specialLink = (l) => {
if (l.specialpage === void 0 || !l.specialpage) {
return null;
}
const base = "".concat(pg.wiki.titlebase + mw.config.get("wgFormattedNamespaces")[pg.nsSpecialId], ":").concat(l.specialpage);
if (l.sep === void 0 || l.sep === null) {
l.sep = "&target=";
}
let article = l.article.urlString({
keepSpaces: l.specialpage === "Search"
});
let hint = popupString("".concat(l.specialpage, "Hint"));
switch (l.specialpage) {
case "Log":
switch (l.sep) {
case "&user=":
hint = popupString("userLogHint");
break;
case "&type=block&page=":
hint = popupString("blockLogHint");
break;
case "&page=":
hint = popupString("pageLogHint");
break;
case "&type=protect&page=":
hint = popupString("protectLogHint");
break;
case "&type=delete&page=":
hint = popupString("deleteLogHint");
break;
default:
log("Unknown log type, sep=".concat(l.sep));
hint = "Missing hint (FIXME)";
}
break;
case "PrefixIndex":
article += "/";
break;
}
hint = hint ? simplePrintf(hint, [safeDecodeURI(l.article)]) : safeDecodeURI("".concat(l.specialpage, ":").concat(l.article));
const url = base + l.sep + article;
return generalNavLink({
url,
title: hint,
text: l.text,
newWin: l.newWin,
noPopup: l.noPopup
});
};
const generalLink = (l) => {
if (l.url === void 0) {
return null;
}
const url = l.url.split('"').join("%22");
let ret = '<a href="'.concat(url, '"');
if (l.title !== void 0 && l.title) {
ret += ' title="'.concat(pg.escapeQuotesHTML(l.title), '"');
}
if (l.onclick !== void 0 && l.onclick) {
ret += ' onclick="'.concat(pg.escapeQuotesHTML(l.onclick), '"');
}
if (l.noPopup) {
ret += " noPopup=1";
}
let newWin;
if (l.newWin === void 0 || l.newWin === null) {
newWin = getValueOf("popupNewWindows");
} else {
({
newWin
} = l);
}
if (newWin) {
ret += ' rel="noopener" target="_blank"';
}
if (l.className !== void 0 && l.className) {
ret += ' class="'.concat(l.className, '"');
}
ret += ">";
if (typeof l.text === "string") {
ret += pg.escapeQuotesHTML(pg.unescapeQuotesHTML(l.text));
}
ret += "</a>";
return ret;
};
const appendParamsToLink = (linkstr, params) => {
const sp = linkstr.split(/(href="[^"]+?)"/i);
if (sp.length < 2) {
return null;
}
let ret = sp.shift() + sp.shift();
ret += "&".concat(params, '"');
ret += sp.join("");
return ret;
};
const changeLinkTargetLink = (x) => {
if (x.newTarget) {
log("changeLinkTargetLink: newTarget=".concat(x.newTarget));
}
if (x.oldTarget !== decodeURIComponent(x.oldTarget)) {
log("This might be an input problem: ".concat(x.oldTarget));
}
const cA = mw.util.escapeRegExp(x.oldTarget);
let chs = cA.charAt(0).toUpperCase();
chs = "[".concat(chs).concat(chs.toLowerCase(), "]");
let currentArticleRegexBit = chs + cA.slice(1);
currentArticleRegexBit = currentArticleRegexBit.split(/[ _]+|%20/g).join("(?:[_ ]+|%20)").split("\\(").join("(?:%28|\\()").split("\\)").join("(?:%29|\\))");
currentArticleRegexBit = "\\s*(".concat(currentArticleRegexBit, "(?:#[^\\[\\|]*)?)\\s*");
const title = x.title || mw.config.get("wgPageName").split("_").join(" ");
const lk = titledWikiLink({
article: new Title(title),
newWin: x.newWin,
action: "edit",
text: x.text,
title: x.hint,
className: "popup_change_title_link"
});
let cmd = "";
if (x.newTarget) {
const t = x.newTarget;
const s = mw.util.escapeRegExp(x.newTarget);
if (x.alsoChangeLabel) {
cmd += "s~\\[\\[".concat(currentArticleRegexBit, "\\]\\]~[[").concat(t, "]]~g;");
cmd += "s~\\[\\[".concat(currentArticleRegexBit, "[|]~[[").concat(t, "|~g;");
cmd += "s~\\[\\[".concat(s, "\\|").concat(s, "\\]\\]~[[").concat(t, "]]~g");
} else {
cmd += "s~\\[\\[".concat(currentArticleRegexBit, "\\]\\]~[[").concat(t, "|$1]]~g;");
cmd += "s~\\[\\[".concat(currentArticleRegexBit, "[|]~[[").concat(t, "|~g;");
cmd += "s~\\[\\[".concat(s, "\\|").concat(s, "\\]\\]~[[").concat(t, "]]~g");
}
} else {
cmd += "s~\\[\\[".concat(currentArticleRegexBit, "\\]\\]~$1~g;");
cmd += "s~\\[\\[".concat(currentArticleRegexBit, "[|](.*?)\\]\\]~$2~g");
}
cmd = "autoedit=".concat(encodeURIComponent(cmd));
cmd += "&autoclick=".concat(encodeURIComponent(x.clickButton), "&actoken=").concat(encodeURIComponent(autoClickToken()));
cmd += x.minor === null ? "" : "&autominor=".concat(encodeURIComponent(x.minor));
cmd += x.watch === null ? "" : "&autowatch=".concat(encodeURIComponent(x.watch));
cmd += "&autosummary=".concat(encodeURIComponent(x.summary));
cmd += "&autoimpl=".concat(encodeURIComponent(popupString("autoedit_version")));
return appendParamsToLink(lk, cmd);
};
const redirLink = (redirMatch, article) => {
let ret = "";
if (getValueOf("popupAppendRedirNavLinks") && getValueOf("popupNavLinks")) {
ret += "<hr>";
if (getValueOf("popupFixRedirs") && autoEdit !== void 0 && autoEdit) {
ret += popupString("Redirects to: (Fix ");
log("redirLink: newTarget=".concat(redirMatch));
ret += addPopupShortcut(changeLinkTargetLink({
newTarget: redirMatch,
text: popupString("target"),
hint: popupString("Fix this redirect, changing just the link target"),
summary: simplePrintf(getValueOf("popupFixRedirsSummary"), [article.toString(), redirMatch]),
oldTarget: article.toString(),
clickButton: getValueOf("popupRedirAutoClick"),
minor: true,
watch: getValueOf("popupWatchRedirredPages")
}), "R");
ret += popupString(" or ");
ret += addPopupShortcut(changeLinkTargetLink({
newTarget: redirMatch,
text: popupString("target & label"),
hint: popupString("Fix this redirect, changing the link target and label"),
summary: simplePrintf(getValueOf("popupFixRedirsSummary"), [article.toString(), redirMatch]),
oldTarget: article.toString(),
clickButton: getValueOf("popupRedirAutoClick"),
minor: true,
watch: getValueOf("popupWatchRedirredPages"),
alsoChangeLabel: true
}), "R");
ret += popupString(")");
} else {
ret += popupString("Redirects") + popupString(" to ");
}
return ret;
}
return "<br> ".concat(popupString("Redirects")).concat(popupString(" to ")).concat(titledWikiLink({
article: new Title().fromWikiText(redirMatch),
action: "view",
text: safeDecodeURI(redirMatch),
title: popupString("Bypass redirect")
}));
};
const arinLink = (l) => {
if (!saneLinkCheck(l)) {
return null;
}
if (!l.article.isIpUser() || !pg.wiki.wikimedia) {
return null;
}
const uN = l.article.userName();
return generalNavLink({
url: "http://ws.arin.net/cgi-bin/whois.pl?queryinput=".concat(encodeURIComponent(uN)),
newWin: l.newWin,
title: tprintf("Look up %s in ARIN whois database", [uN]),
text: l.text,
noPopup: 1
});
};
const toolDbName = (cookieStyle) => {
let ret = mw.config.get("wgDBname");
if (!cookieStyle) {
ret += "_p";
}
return ret;
};
const saneLinkCheck = (l) => {
if (typeof l.article !== typeof {} || typeof l.text !== "string") {
return false;
}
return true;
};
const editCounterLink = (l) => {
if (!saneLinkCheck(l)) {
return null;
}
if (!pg.wiki.wikimedia) {
return null;
}
const uN = l.article.userName();
const tool = getValueOf("popupEditCounterTool");
let url;
const defaultToolUrl = "//tools.wmflabs.org/supercount/index.php?user=$1&project=$2.$3";
switch (tool) {
case "custom":
url = simplePrintf(getValueOf("popupEditCounterUrl"), [encodeURIComponent(uN), toolDbName()]);
break;
default: {
const theWiki = pg.wiki.hostname.split(".");
url = simplePrintf(defaultToolUrl, [encodeURIComponent(uN), theWiki[0], theWiki[1]]);
}
}
return generalNavLink({
url,
title: tprintf("editCounterLinkHint", [uN]),
newWin: l.newWin,
text: l.text,
noPopup: 1
});
};
const editorListLink = (l) => {
if (!saneLinkCheck(l)) {
return null;
}
const article = l.article.articleFromTalkPage() || l.article;
const url = "https://xtools.wmflabs.org/articleinfo/".concat(encodeURI(pg.wiki.hostname), "/").concat(article.urlString(), "?uselang=").concat(mw.config.get("wgUserLanguage"));
return generalNavLink({
url,
title: tprintf("editorListHint", [article]),
newWin: l.newWin,
text: l.text,
noPopup: 1
});
};
const generalNavLink = (l) => {
l.className = l.className === null ? "popupNavLink" : l.className;
return generalLink(l);
};
const getHistoryInfo = (wikipage, whatNext) => {
log("getHistoryInfo");
getHistory(wikipage, whatNext ? (d) => {
whatNext(processHistory(d));
} : processHistory);
};
const getHistory = (wikipage, onComplete) => {
log("getHistory");
const url = "".concat(pg.wiki.apiwikibase, "?format=json&formatversion=2&action=query&prop=revisions&titles=").concat(new Title(wikipage).urlString(), "&rvlimit=").concat(getValueOf("popupHistoryLimit"));
log("getHistory: url=".concat(url));
return startDownload(url, "".concat(pg.idNumber, "history"), onComplete);
};
const processHistory = (download) => {
const jsobj = getJsObj(download.data);
try {
const {
revisions
} = anyChild(jsobj.query.pages);
const edits = [];
var _iterator27 = _createForOfIteratorHelper(revisions), _step27;
try {
for (_iterator27.s(); !(_step27 = _iterator27.n()).done; ) {
const revision = _step27.value;
edits.push({
oldid: revision.revid,
editor: revision.user
});
}
} catch (err) {
_iterator27.e(err);
} finally {
_iterator27.f();
}
log("processed ".concat(edits.length, " edits"));
return finishProcessHistory(edits, mw.config.get("wgUserName"));
} catch {
log("Something went wrong with JSON business");
return finishProcessHistory([]);
}
};
const finishProcessHistory = (edits, userName) => {
const histInfo = {};
histInfo.edits = edits;
histInfo.userName = userName;
for (let i = 0; i < edits.length; ++i) {
if (histInfo.myLastEdit === void 0 && userName && edits[i].editor === userName) {
histInfo.myLastEdit = {
index: i,
oldid: edits[i].oldid,
previd: i === 0 ? null : edits[i - 1].oldid
};
}
if (histInfo.firstNewEditor === void 0 && edits[i].editor !== edits[0].editor) {
histInfo.firstNewEditor = {
index: i,
oldid: edits[i].oldid,
previd: i === 0 ? null : edits[i - 1].oldid
};
}
}
return histInfo;
};
const defaultize = (x) => {
if (pg.option[x] === null || pg.option[x] === void 0) {
pg.option[x] = window[x] === void 0 ? pg.optionDefault[x] : window[x];
}
};
const newOption = (x, def) => {
pg.optionDefault[x] = def;
};
const setDefault = (x, def) => {
return newOption(x, def);
};
const getValueOf = (varName) => {
defaultize(varName);
return pg.option[varName];
};
const setOptions = () => {
let userIsSysop = false;
if (mw.config.get("wgUserGroups")) {
for (let g = 0; g < mw.config.get("wgUserGroups").length; ++g) {
if (mw.config.get("wgUserGroups")[g] === "sysop") {
userIsSysop = true;
}
if (mw.config.get("wgUserGroups")[g] === "steward") {
userIsSysop = true;
}
}
}
newOption("popupDelay", 0.5);
newOption("popupHideDelay", 0.5);
newOption("simplePopups", false);
newOption("popupStructure", "shortmenus");
newOption("popupActionsMenu", true);
newOption("popupSetupMenu", true);
newOption("popupAdminLinks", userIsSysop);
newOption("popupShortcutKeys", false);
newOption("popupHistoricalLinks", true);
newOption("popupOnlyArticleLinks", true);
newOption("removeTitles", true);
newOption("popupMaxWidth", 350);
newOption("popupSimplifyMainLink", true);
newOption("popupAppendRedirNavLinks", true);
newOption("popupTocLinks", false);
newOption("popupSubpopups", true);
newOption(
"popupDragHandle",
false
/* 'popupTopLinks' */
);
newOption("popupLazyPreviews", true);
newOption("popupLazyDownloads", true);
newOption("popupAllDabsStubs", false);
newOption("popupDebugging", false);
newOption("popupActiveNavlinks", true);
newOption("popupModifier", false);
newOption("popupModifierAction", "enable");
newOption("popupDraggable", true);
newOption("popupReview", false);
newOption("popupLocale", false);
newOption("popupDateTimeFormatterOptions", {
year: "numeric",
month: "long",
day: "numeric",
hour12: false,
hour: "2-digit",
minute: "2-digit",
second: "2-digit"
});
newOption("popupDateFormatterOptions", {
year: "numeric",
month: "long",
day: "numeric"
});
newOption("popupTimeFormatterOptions", {
hour12: false,
hour: "2-digit",
minute: "2-digit",
second: "2-digit"
});
newOption("popupImages", true);
newOption("imagePopupsForImages", true);
newOption("popupNeverGetThumbs", false);
newOption("popupThumbAction", "imagepage");
newOption("popupImageSize", 60);
newOption("popupImageSizeLarge", 200);
newOption("popupFixRedirs", false);
newOption("popupRedirAutoClick", "wpDiff");
newOption("popupFixDabs", false);
newOption("popupDabsAutoClick", "wpDiff");
newOption("popupRevertSummaryPrompt", false);
newOption("popupMinorReverts", false);
newOption("popupRedlinkRemoval", false);
newOption("popupRedlinkAutoClick", "wpDiff");
newOption("popupWatchDisambiggedPages", null);
newOption("popupWatchRedirredPages", null);
newOption("popupDabWiktionary", "last");
newOption("popupNavLinks", true);
newOption("popupNavLinkSeparator", " ⋅ ");
newOption("popupLastEditLink", true);
newOption("popupEditCounterTool", "supercount");
newOption("popupEditCounterUrl", "");
newOption("popupPreviews", true);
newOption("popupSummaryData", true);
newOption("popupMaxPreviewSentences", 5);
newOption("popupMaxPreviewCharacters", 600);
newOption("popupLastModified", true);
newOption("popupPreviewKillTemplates", true);
newOption("popupPreviewRawTemplates", true);
newOption("popupPreviewFirstParOnly", true);
newOption("popupPreviewCutHeadings", true);
newOption("popupPreviewButton", false);
newOption("popupPreviewButtonEvent", "click");
newOption("popupPreviewDiffs", true);
newOption("popupDiffMaxLines", 100);
newOption("popupDiffContextLines", 2);
newOption("popupDiffContextCharacters", 40);
newOption("popupDiffDates", true);
newOption("popupDiffDatePrinter", "toLocaleString");
newOption("popupReviewedSummary", popupString("defaultpopupReviewedSummary"));
newOption("popupFixDabsSummary", popupString("defaultpopupFixDabsSummary"));
newOption("popupExtendedRevertSummary", popupString("defaultpopupExtendedRevertSummary"));
newOption("popupRevertSummary", popupString("defaultpopupRevertSummary"));
newOption("popupRevertToPreviousSummary", popupString("defaultpopupRevertToPreviousSummary"));
newOption("popupQueriedRevertSummary", popupString("defaultpopupQueriedRevertSummary"));
newOption("popupQueriedRevertToPreviousSummary", popupString("defaultpopupQueriedRevertToPreviousSummary"));
newOption("popupFixRedirsSummary", popupString("defaultpopupFixRedirsSummary"));
newOption("popupRedlinkSummary", popupString("defaultpopupRedlinkSummary"));
newOption("popupRmDabLinkSummary", popupString("defaultpopupRmDabLinkSummary"));
newOption("popupHistoryLimit", 50);
newOption("popupFilters", [popupFilterStubDetect, popupFilterDisambigDetect, popupFilterPageSize, popupFilterCountLinks, popupFilterCountImages, popupFilterCountCategories, popupFilterLastModified]);
newOption("extraPopupFilters", []);
newOption("popupOnEditSelection", "cursor");
newOption("popupPreviewHistory", true);
newOption("popupImageLinks", true);
newOption("popupCategoryMembers", true);
newOption("popupUserInfo", true);
newOption("popupHistoryPreviewLimit", 25);
newOption("popupContribsPreviewLimit", 25);
newOption("popupRevDelUrl", "//en.wikipedia.org/wiki/Wikipedia:Revision_deletion");
newOption("popupShowGender", true);
newOption("popupNewWindows", false);
newOption("popupLinksNewWindow", {
lastContrib: true,
sinceMe: true
});
newOption("popupDabRegexp", "\\{\\{\\s*(d(ab|isamb(ig(uation)?)?)|(((geo|hn|road?|school|number)dis)|[234][lc][acw]|(road|ship)index))\\s*(\\|[^}]*)?\\}\\}|is a .*disambiguation.*page");
newOption("popupAnchorRegexp", "anchors?");
newOption("popupStubRegexp", "(sect)?stub[}][}]|This .*-related article is a .*stub");
newOption("popupImageVarsRegexp", "image|image_(?:file|skyline|name|flag|seal)|cover|badge|logo");
};
pg.string = {
// summary data, searching etc.
article: "article",
category: "category",
categories: "categories",
image: "image",
images: "images",
stub: "stub",
"section stub": "section stub",
"Empty page": "Empty page",
kB: "kB",
bytes: "bytes",
day: "day",
days: "days",
hour: "hour",
hours: "hours",
minute: "minute",
minutes: "minutes",
second: "second",
seconds: "seconds",
week: "week",
weeks: "weeks",
search: "search",
SearchHint: "Find English Wikipedia articles containing %s",
web: "web",
global: "global",
// article-related actions and info
// (some actions also apply to user pages)
actions: "actions",
popupsMenu: "popups",
togglePreviewsHint: "Toggle preview generation in popups on this page",
"enable previews": "enable previews",
"disable previews": "disable previews",
"toggle previews": "toggle previews",
"show preview": "show preview",
reset: "reset",
"more...": "more...",
disable: "disable popups",
disablePopupsHint: "Disable popups on this page. Reload page to re-enable.",
historyfeedHint: "RSS feed of recent changes to this page",
purgePopupsHint: "Reset popups, clearing all cached popup data.",
PopupsHint: "Reset popups, clearing all cached popup data.",
spacebar: "space",
view: "view",
"view article": "view article",
viewHint: "Go to %s",
talk: "talk",
"talk page": "talk page",
"this revision": "this revision",
"revision %s of %s": "revision %s of %s",
"Revision %s of %s": "Revision %s of %s",
"the revision prior to revision %s of %s": "the revision prior to revision %s of %s",
"Toggle image size": "Click to toggle image size",
del: "del",
delete: "delete",
deleteHint: "Delete %s",
undeleteShort: "un",
UndeleteHint: "Show the deletion history for %s",
protect: "protect",
protectHint: "Restrict editing rights to %s",
unprotectShort: "un",
unprotectHint: "Allow %s to be edited by anyone again",
"send thanks": "send thanks",
ThanksHint: "Send a thank you notification to this user",
move: "move",
"move page": "move page",
MovepageHint: "Change the title of %s",
edit: "edit",
"edit article": "edit article",
editHint: "Change the content of %s",
"edit talk": "edit talk",
new: "new",
"new topic": "new topic",
newSectionHint: "Start a new section on %s",
"null edit": "null edit",
nullEditHint: "Submit an edit to %s, making no changes ",
hist: "hist",
history: "history",
historyHint: "List the changes made to %s",
last: "prev",
lastEdit: "lastEdit",
"mark patrolled": "mark patrolled",
markpatrolledHint: "Mark this edit as patrolled",
"Could not marked this edit as patrolled": "Could not marked this edit as patrolled",
"show last edit": "most recent edit",
"Show the last edit": "Show the effects of the most recent change",
lastContrib: "lastContrib",
"last set of edits": "latest edits",
lastContribHint: "Show the net effect of changes made by the last editor",
cur: "cur",
diffCur: "diffCur",
"Show changes since revision %s": "Show changes since revision %s",
"%s old": "%s old",
oldEdit: "oldEdit",
purge: "purge",
purgeHint: "Demand a fresh copy of %s",
raw: "source",
rawHint: "Download the source of %s",
render: "simple",
renderHint: "Show a plain HTML version of %s",
"Show the edit made to get revision": "Show the edit made to get revision",
sinceMe: "sinceMe",
"changes since mine": "diff my edit",
sinceMeHint: "Show changes since my last edit",
"Couldn't find an edit by %s\nin the last %s edits to\n%s": "Couldn't find an edit by %s\nin the last %s edits to\n%s",
eds: "eds",
editors: "editors",
editorListHint: "List the users who have edited %s",
related: "related",
relatedChanges: "relatedChanges",
"related changes": "related changes",
RecentchangeslinkedHint: "Show changes in articles related to %s",
editOld: "editOld",
rv: "rv",
revert: "revert",
revertHint: "Revert to %s",
defaultpopupReviewedSummary: "Accepted by reviewing the [[Special:diff/%s/%s|difference]] between this version and previously accepted version using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
defaultpopupRedlinkSummary: "Removing link to empty page [[%s]] using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
defaultpopupFixDabsSummary: "Disambiguate [[%s]] to [[%s]] using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
defaultpopupFixRedirsSummary: "Redirect bypass from [[%s]] to [[%s]] using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
defaultpopupExtendedRevertSummary: "Revert to revision dated %s by %s, oldid %s using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
defaultpopupRevertToPreviousSummary: "Revert to the revision prior to revision %s using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
defaultpopupRevertSummary: "Revert to revision %s using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
defaultpopupQueriedRevertToPreviousSummary: "Revert to the revision prior to revision $1 dated $2 by $3 using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
defaultpopupQueriedRevertSummary: "Revert to revision $1 dated $2 by $3 using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
defaultpopupRmDabLinkSummary: "Remove link to dab page [[%s]] using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
Redirects: "Redirects",
" to ": " to ",
"Bypass redirect": "Bypass redirect",
"Fix this redirect": "Fix this redirect",
disambig: "disambig",
disambigHint: "Disambiguate this link to [[%s]]",
"Click to disambiguate this link to:": "Click to disambiguate this link to:",
"remove this link": "remove this link",
"remove all links to this page from this article": "remove all links to this page from this article",
"remove all links to this disambig page from this article": "remove all links to this disambig page from this article",
mainlink: "mainlink",
wikiLink: "wikiLink",
wikiLinks: "wikiLinks",
"links here": "links here",
whatLinksHere: "whatLinksHere",
"what links here": "what links here",
WhatlinkshereHint: "List the pages that are hyperlinked to %s",
unwatchShort: "un",
watchThingy: "watch",
watchHint: "Add %s to my watchlist",
unwatchHint: "Remove %s from my watchlist",
"Only found one editor: %s made %s edits": "Only found one editor: %s made %s edits",
"%s seems to be the last editor to the page %s": "%s seems to be the last editor to the page %s",
rss: "rss",
// diff previews
"Diff truncated for performance reasons": "Diff truncated for performance reasons",
"Old revision": "Old revision",
"New revision": "New revision",
"Something went wrong :-(": "Something went wrong :-(",
"Empty revision, maybe non-existent": "Empty revision, maybe non-existent",
"Unknown date": "Unknown date",
// other special previews
"Empty category": "Empty category",
"Category members (%s shown)": "Category members (%s shown)",
"No image links found": "No image links found",
"File links": "File links",
"No image found": "No image found",
"Image from Commons": "Image from Commons",
"Description page": "Description page",
"Alt text:": "Alt text:",
revdel: "Hidden revision",
// user-related actions and info
user: "user",
"user page": "user page",
"user talk": "user talk",
"edit user talk": "edit user talk",
"leave comment": "leave comment",
email: "email",
"email user": "email user",
EmailuserHint: "Send an email to %s",
space: "space",
PrefixIndexHint: "Show pages in the userspace of %s",
count: "count",
"edit counter": "edit counter",
editCounterLinkHint: "Count the contributions made by %s",
contribs: "contribs",
contributions: "contributions",
deletedContribs: "deleted contributions",
DeletedcontributionsHint: "List deleted edits made by %s",
ContributionsHint: "List the contributions made by %s",
log: "log",
"user log": "user log",
userLogHint: "Show %s's user log",
arin: "ARIN lookup",
"Look up %s in ARIN whois database": "Look up %s in the ARIN whois database",
unblockShort: "un",
block: "block",
"block user": "block user",
IpblocklistHint: "Unblock %s",
BlockipHint: "Prevent %s from editing",
"block log": "block log",
blockLogHint: "Show the block log for %s",
protectLogHint: "Show the protection log for %s",
pageLogHint: "Show the page log for %s",
deleteLogHint: "Show the deletion log for %s",
"Invalid %s %s": "The option %s is invalid: %s",
"No backlinks found": "No backlinks found",
" and more": " and more",
undo: "undo",
undoHint: "undo this edit",
"Download preview data": "Download preview data",
"Invalid or IP user": "Invalid or IP user",
"Not a registered username": "Not a registered username",
BLOCKED: "BLOCKED",
"Has blocks": "Has blocks",
" edits since: ": " edits since: ",
"last edit on ": "last edit on ",
"he/him": "he/him",
"she/her": "she/her",
// Autoediting
"Enter a non-empty edit summary or press cancel to abort": "Enter a non-empty edit summary or press cancel to abort",
"Failed to get revision information, please edit manually.\n\n": "Failed to get revision information, please edit manually.\n\n",
"The %s button has been automatically clicked. Please wait for the next page to load.": "The %s button has been automatically clicked. Please wait for the next page to load.",
"Could not find button %s. Please check the settings in your javascript file.": "Could not find button %s. Please check the settings in your javascript file.",
// Popups setup
"Open full-size image": "Open full-size image",
autoedit_version: "np20140416"
};
const popupString = (str) => {
if (message !== void 0 && message && message[str]) {
return message[str];
}
if (pg.string[str]) {
return pg.string[str];
}
return str;
};
const tprintf = (str, subs) => {
if (typeof subs !== typeof []) {
subs = [subs];
}
return simplePrintf(popupString(str), subs);
};
if (document.readyState === "complete") {
autoEdit();
} else {
$(window).on("load", autoEdit);
}
(() => {
let once = true;
const dynamicContentHandler = ($content) => {
if ($content.attr("id") === "mw-content-text" && once) {
once = false;
return;
}
const registerHooksForVisibleNavpops = () => {
for (let i = 0; pg.current.links && i < pg.current.links.length; i++) {
const navpop = pg.current.links[i].navpopup;
if (!navpop || !navpop.isVisible()) {
continue;
}
Navpopup.tracker.addHook(posCheckerHook(navpop));
}
};
const doIt = () => {
registerHooksForVisibleNavpops();
$content.each((_index, element) => {
element.ranSetupTooltipsAlready = false;
setupTooltips(element);
});
};
setupPopups(doIt);
};
mw.hook("wikipage.content").add(dynamicContentHandler);
mw.hook("ext.echo.overlay.beforeShowingOverlay").add(($overlay) => {
dynamicContentHandler($overlay.find(".mw-echo-state"));
});
})();
};
//! src/Navigation_popups/Navigation_popups.ts
$(popups);
})();
/* </nowiki> */
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXRydW5jLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnVuc2hpZnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmZsYWdzLmpzIiwgInNyYy9OYXZpZ2F0aW9uX3BvcHVwcy9tb2R1bGVzL2FwaS50cyIsICJzcmMvTmF2aWdhdGlvbl9wb3B1cHMvbW9kdWxlcy9zdHJpbmcudHMiLCAic3JjL05hdmlnYXRpb25fcG9wdXBzL21vZHVsZXMvY29yZS5qcyIsICJzcmMvTmF2aWdhdGlvbl9wb3B1cHMvTmF2aWdhdGlvbl9wb3B1cHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIid1c2Ugc3RyaWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIGNoZWNrKHR5cGVvZiB0aGlzID09ICdvYmplY3QnICYmIHRoaXMpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIERldGVjdCBJRTgncyBpbmNvbXBsZXRlIGRlZmluZVByb3BlcnR5IGltcGxlbWVudGF0aW9uXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT09IDc7XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tZnVuY3Rpb24tcHJvdG90eXBlLWJpbmQgLS0gc2FmZVxuICB2YXIgdGVzdCA9IChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pLmJpbmQoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiB0eXBlb2YgdGVzdCAhPSAnZnVuY3Rpb24nIHx8IHRlc3QuaGFzT3duUHJvcGVydHkoJ3Byb3RvdHlwZScpO1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyBjYWxsLmJpbmQoY2FsbCkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGNhbGwsIGFyZ3VtZW50cyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhJHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcbnZhciB1bmN1cnJ5VGhpc1dpdGhCaW5kID0gTkFUSVZFX0JJTkQgJiYgRnVuY3Rpb25Qcm90b3R5cGUuYmluZC5iaW5kKGNhbGwsIGNhbGwpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gdW5jdXJyeVRoaXNXaXRoQmluZCA6IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYWxsLmFwcGx5KGZuLCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKHt9LnRvU3RyaW5nKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHN0cmluZ1NsaWNlKHRvU3RyaW5nKGl0KSwgOCwgLTEpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xuXG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiAhJE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09PSAnU3RyaW5nJyA/IHNwbGl0KGl0LCAnJykgOiAkT2JqZWN0KGl0KTtcbn0gOiAkT2JqZWN0O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8vIHdlIGNhbid0IHVzZSBqdXN0IGBpdCA9PSBudWxsYCBzaW5jZSBvZiBgZG9jdW1lbnQuYWxsYCBzcGVjaWFsIGNhc2Vcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtSXNIVE1MRERBLWludGVybmFsLXNsb3QtYWVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IG51bGwgfHwgaXQgPT09IHVuZGVmaW5lZDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc051bGxPclVuZGVmaW5lZChpdCkpIHRocm93IG5ldyAkVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90XG52YXIgZG9jdW1lbnRBbGwgPSB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCcgJiYgZG9jdW1lbnQuYWxsO1xuXG4vLyBgSXNDYWxsYWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXR5cGVvZi11bmRlZmluZWQgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIGRvY3VtZW50QWxsID09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50QWxsICE9PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nIHx8IGFyZ3VtZW50ID09PSBkb2N1bWVudEFsbDtcbn0gOiBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUoYXJndW1lbnQpID8gYXJndW1lbnQgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pIDogZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKHt9LmlzUHJvdG90eXBlT2YpO1xuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIG5hdmlnYXRvciAhPSAndW5kZWZpbmVkJyAmJiBTdHJpbmcobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgJyc7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBEZW5vID0gZ2xvYmFsLkRlbm87XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnMgfHwgRGVubyAmJiBEZW5vLnZlcnNpb247XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgLy8gaW4gb2xkIENocm9tZSwgdmVyc2lvbnMgb2YgVjggaXNuJ3QgVjggPSBDaHJvbWUgLyAxMFxuICAvLyBidXQgdGhlaXIgY29ycmVjdCB2ZXJzaW9ucyBhcmUgbm90IGludGVyZXN0aW5nIGZvciB1c1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gPiAwICYmIG1hdGNoWzBdIDwgNCA/IDEgOiArKG1hdGNoWzBdICsgbWF0Y2hbMV0pO1xufVxuXG4vLyBCcm93c2VyRlMgTm9kZUpTIGBwcm9jZXNzYCBwb2x5ZmlsbCBpbmNvcnJlY3RseSBzZXQgYC52OGAgdG8gYDAuMGBcbi8vIHNvIGNoZWNrIGB1c2VyQWdlbnRgIGV2ZW4gaWYgYC52OGAgZXhpc3RzLCBidXQgMFxuaWYgKCF2ZXJzaW9uICYmIHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9ICttYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb247XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgJFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgc3ltYm9sID0gU3ltYm9sKCdzeW1ib2wgZGV0ZWN0aW9uJyk7XG4gIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gIC8vIGBnZXQtb3duLXByb3BlcnR5LXN5bWJvbHNgIHBvbHlmaWxsIHN5bWJvbHMgY29udmVydGVkIHRvIG9iamVjdCBhcmUgbm90IFN5bWJvbCBpbnN0YW5jZXNcbiAgLy8gbmI6IERvIG5vdCBjYWxsIGBTdHJpbmdgIGRpcmVjdGx5IHRvIGF2b2lkIHRoaXMgYmVpbmcgb3B0aW1pemVkIG91dCB0byBgc3ltYm9sKycnYCB3aGljaCB3aWxsLFxuICAvLyBvZiBjb3Vyc2UsIGZhaWwuXG4gIHJldHVybiAhJFN0cmluZyhzeW1ib2wpIHx8ICEoT2JqZWN0KHN5bWJvbCkgaW5zdGFuY2VvZiBTeW1ib2wpIHx8XG4gICAgLy8gQ2hyb21lIDM4LTQwIHN5bWJvbHMgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSBET00gY29sbGVjdGlvbnMgcHJvdG90eXBlcyB0byBpbnN0YW5jZXNcbiAgICAhU3ltYm9sLnNoYW0gJiYgVjhfVkVSU0lPTiAmJiBWOF9WRVJTSU9OIDwgNDE7XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCAkT2JqZWN0KGl0KSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB0cnkge1xuICAgIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NhbGxhYmxlKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcblxuLy8gYEdldE1ldGhvZGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldG1ldGhvZFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoViwgUCkge1xuICB2YXIgZnVuYyA9IFZbUF07XG4gIHJldHVybiBpc051bGxPclVuZGVmaW5lZChmdW5jKSA/IHVuZGVmaW5lZCA6IGFDYWxsYWJsZShmdW5jKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBPcmRpbmFyeVRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb3JkaW5hcnl0b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChwcmVmID09PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoaXNDYWxsYWJsZShmbiA9IGlucHV0LnZhbHVlT2YpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAocHJlZiAhPT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsIGtleSwgeyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHknKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWxUaGlzW1NIQVJFRF0gfHwgZGVmaW5lR2xvYmFsUHJvcGVydHkoU0hBUkVELCB7fSk7XG5cbihzdG9yZS52ZXJzaW9ucyB8fCAoc3RvcmUudmVyc2lvbnMgPSBbXSkpLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4zNy4wJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE0LTIwMjQgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknLFxuICBsaWNlbnNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zNy4wL0xJQ0VOU0UnLFxuICBzb3VyY2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcydcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlIHx8IHt9KTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuICRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaGFzb3duIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbnZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG52YXIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcygxLjAudG9TdHJpbmcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJyArIChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5KSArICcpXycgKyB0b1N0cmluZygrK2lkICsgcG9zdGZpeCwgMzYpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sWydmb3InXSB8fCBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzT3duKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkpIHtcbiAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpXG4gICAgICA/IFN5bWJvbFtuYW1lXVxuICAgICAgOiBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgb3JkaW5hcnlUb1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgaWYgKCFpc09iamVjdChpbnB1dCkgfHwgaXNTeW1ib2woaW5wdXQpKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBleG90aWNUb1ByaW0gPSBnZXRNZXRob2QoaW5wdXQsIFRPX1BSSU1JVElWRSk7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChleG90aWNUb1ByaW0pIHtcbiAgICBpZiAocHJlZiA9PT0gdW5kZWZpbmVkKSBwcmVmID0gJ2RlZmF1bHQnO1xuICAgIHJlc3VsdCA9IGNhbGwoZXhvdGljVG9QcmltLCBpbnB1dCwgcHJlZik7XG4gICAgaWYgKCFpc09iamVjdChyZXN1bHQpIHx8IGlzU3ltYm9sKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gIH1cbiAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdudW1iZXInO1xuICByZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgcHJlZik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcblxuLy8gYFRvUHJvcGVydHlLZXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3Byb3BlcnR5a2V5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsICdzdHJpbmcnKTtcbiAgcmV0dXJuIGlzU3ltYm9sKGtleSkgPyBrZXkgOiBrZXkgKyAnJztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rcyB0byBJRTggZm9yIGl0cyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPT0gNztcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXNPd24oTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIWNhbGwocHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiwgTywgUCksIE9bUF0pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBWOCB+IENocm9tZSAzNi1cbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMzMzRcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAncHJvdG90eXBlJywge1xuICAgIHZhbHVlOiA0MixcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSkucHJvdG90eXBlICE9PSA0Mjtcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyICRTdHJpbmcgPSBTdHJpbmc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogVHlwZShhcmd1bWVudCkgaXMgT2JqZWN0YFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzT2JqZWN0KGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcigkU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgRU5VTUVSQUJMRSA9ICdlbnVtZXJhYmxlJztcbnZhciBDT05GSUdVUkFCTEUgPSAnY29uZmlndXJhYmxlJztcbnZhciBXUklUQUJMRSA9ICd3cml0YWJsZSc7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmICh0eXBlb2YgTyA9PT0gJ2Z1bmN0aW9uJyAmJiBQID09PSAncHJvdG90eXBlJyAmJiAndmFsdWUnIGluIEF0dHJpYnV0ZXMgJiYgV1JJVEFCTEUgaW4gQXR0cmlidXRlcyAmJiAhQXR0cmlidXRlc1tXUklUQUJMRV0pIHtcbiAgICB2YXIgY3VycmVudCA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudFtXUklUQUJMRV0pIHtcbiAgICAgIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICAgICAgQXR0cmlidXRlcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBDT05GSUdVUkFCTEUgaW4gQXR0cmlidXRlcyA/IEF0dHJpYnV0ZXNbQ09ORklHVVJBQkxFXSA6IGN1cnJlbnRbQ09ORklHVVJBQkxFXSxcbiAgICAgICAgZW51bWVyYWJsZTogRU5VTUVSQUJMRSBpbiBBdHRyaWJ1dGVzID8gQXR0cmlidXRlc1tFTlVNRVJBQkxFXSA6IGN1cnJlbnRbRU5VTUVSQUJMRV0sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gIH0gcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbn0gOiAkZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gJGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IG5ldyAkVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldERlc2NyaXB0b3IgPSBERVNDUklQVE9SUyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgRVhJU1RTID0gaGFzT3duKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpO1xuLy8gYWRkaXRpb25hbCBwcm90ZWN0aW9uIGZyb20gbWluaWZpZWQgLyBtYW5nbGVkIC8gZHJvcHBlZCBmdW5jdGlvbiBuYW1lc1xudmFyIFBST1BFUiA9IEVYSVNUUyAmJiAoZnVuY3Rpb24gc29tZXRoaW5nKCkgeyAvKiBlbXB0eSAqLyB9KS5uYW1lID09PSAnc29tZXRoaW5nJztcbnZhciBDT05GSUdVUkFCTEUgPSBFWElTVFMgJiYgKCFERVNDUklQVE9SUyB8fCAoREVTQ1JJUFRPUlMgJiYgZ2V0RGVzY3JpcHRvcihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKS5jb25maWd1cmFibGUpKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEVYSVNUUzogRVhJU1RTLFxuICBQUk9QRVI6IFBST1BFUixcbiAgQ09ORklHVVJBQkxFOiBDT05GSUdVUkFCTEVcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhGdW5jdGlvbi50b1N0cmluZyk7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgY29yZS1qc0AzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICghaXNDYWxsYWJsZShzdG9yZS5pbnNwZWN0U291cmNlKSkge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcoaXQpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlLmluc3BlY3RTb3VyY2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNDYWxsYWJsZShXZWFrTWFwKSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKFdlYWtNYXApKTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlYWstbWFwLWJhc2ljLWRldGVjdGlvbicpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCA9ICdPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCB8fCBzaGFyZWQuc3RhdGUpIHtcbiAgdmFyIHN0b3JlID0gc2hhcmVkLnN0YXRlIHx8IChzaGFyZWQuc3RhdGUgPSBuZXcgV2Vha01hcCgpKTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1hc3NpZ24gLS0gcHJvdG90eXBlIG1ldGhvZHMgcHJvdGVjdGlvbiAqL1xuICBzdG9yZS5nZXQgPSBzdG9yZS5nZXQ7XG4gIHN0b3JlLmhhcyA9IHN0b3JlLmhhcztcbiAgc3RvcmUuc2V0ID0gc3RvcmUuc2V0O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi9cbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChzdG9yZS5oYXMoaXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEKTtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICBzdG9yZS5zZXQoaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBzdG9yZS5nZXQoaXQpIHx8IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gc3RvcmUuaGFzKGl0KTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaWYgKGhhc093bihpdCwgU1RBVEUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEKTtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzT3duKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1uYW1lJykuQ09ORklHVVJBQkxFO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgJFN0cmluZyA9IFN0cmluZztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBqb2luID0gdW5jdXJyeVRoaXMoW10uam9pbik7XG5cbnZhciBDT05GSUdVUkFCTEVfTEVOR1RIID0gREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgJ2xlbmd0aCcsIHsgdmFsdWU6IDggfSkubGVuZ3RoICE9PSA4O1xufSk7XG5cbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxudmFyIG1ha2VCdWlsdEluID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUsIG5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKHN0cmluZ1NsaWNlKCRTdHJpbmcobmFtZSksIDAsIDcpID09PSAnU3ltYm9sKCcpIHtcbiAgICBuYW1lID0gJ1snICsgcmVwbGFjZSgkU3RyaW5nKG5hbWUpLCAvXlN5bWJvbFxcKChbXildKilcXCkuKiQvLCAnJDEnKSArICddJztcbiAgfVxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmdldHRlcikgbmFtZSA9ICdnZXQgJyArIG5hbWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc2V0dGVyKSBuYW1lID0gJ3NldCAnICsgbmFtZTtcbiAgaWYgKCFoYXNPd24odmFsdWUsICduYW1lJykgfHwgKENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FICYmIHZhbHVlLm5hbWUgIT09IG5hbWUpKSB7XG4gICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCB7IHZhbHVlOiBuYW1lLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgZWxzZSB2YWx1ZS5uYW1lID0gbmFtZTtcbiAgfVxuICBpZiAoQ09ORklHVVJBQkxFX0xFTkdUSCAmJiBvcHRpb25zICYmIGhhc093bihvcHRpb25zLCAnYXJpdHknKSAmJiB2YWx1ZS5sZW5ndGggIT09IG9wdGlvbnMuYXJpdHkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgJ2xlbmd0aCcsIHsgdmFsdWU6IG9wdGlvbnMuYXJpdHkgfSk7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAob3B0aW9ucyAmJiBoYXNPd24ob3B0aW9ucywgJ2NvbnN0cnVjdG9yJykgJiYgb3B0aW9ucy5jb25zdHJ1Y3Rvcikge1xuICAgICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgJ3Byb3RvdHlwZScsIHsgd3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIC8vIGluIFY4IH4gQ2hyb21lIDUzLCBwcm90b3R5cGVzIG9mIHNvbWUgbWV0aG9kcywgbGlrZSBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AsIGFyZSBub24td3JpdGFibGVcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnByb3RvdHlwZSkgdmFsdWUucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTtcbiAgaWYgKCFoYXNPd24oc3RhdGUsICdzb3VyY2UnKSkge1xuICAgIHN0YXRlLnNvdXJjZSA9IGpvaW4oVEVNUExBVEUsIHR5cGVvZiBuYW1lID09ICdzdHJpbmcnID8gbmFtZSA6ICcnKTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuXG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRlbmQtbmF0aXZlIC0tIHJlcXVpcmVkXG5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBtYWtlQnVpbHRJbihmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUodGhpcykgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTtcbn0sICd0b1N0cmluZycpO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIG1ha2VCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zLmVudW1lcmFibGU7XG4gIHZhciBuYW1lID0gb3B0aW9ucy5uYW1lICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5hbWUgOiBrZXk7XG4gIGlmIChpc0NhbGxhYmxlKHZhbHVlKSkgbWFrZUJ1aWx0SW4odmFsdWUsIG5hbWUsIG9wdGlvbnMpO1xuICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIGRlZmluZUdsb2JhbFByb3BlcnR5KGtleSwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIW9wdGlvbnMudW5zYWZlKSBkZWxldGUgT1trZXldO1xuICAgICAgZWxzZSBpZiAoT1trZXldKSBzaW1wbGUgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogIW9wdGlvbnMubm9uQ29uZmlndXJhYmxlLFxuICAgICAgd3JpdGFibGU6ICFvcHRpb25zLm5vbldyaXRhYmxlXG4gICAgfSk7XG4gIH0gcmV0dXJuIE87XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYE1hdGgudHJ1bmNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLnRydW5jXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWF0aC10cnVuYyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgudHJ1bmMgfHwgZnVuY3Rpb24gdHJ1bmMoeCkge1xuICB2YXIgbiA9ICt4O1xuICByZXR1cm4gKG4gPiAwID8gZmxvb3IgOiBjZWlsKShuKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRydW5jID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtdHJ1bmMnKTtcblxuLy8gYFRvSW50ZWdlck9ySW5maW5pdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbnVtYmVyID0gK2FyZ3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IHRydW5jKG51bWJlcik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBsZW4gPSB0b0ludGVnZXJPckluZmluaXR5KGFyZ3VtZW50KTtcbiAgcmV0dXJuIGxlbiA+IDAgPyBtaW4obGVuLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xuXG4vLyBgTGVuZ3RoT2ZBcnJheUxpa2VgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1sZW5ndGhvZmFycmF5bGlrZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0b0xlbmd0aChvYmoubGVuZ3RoKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIGlmIChsZW5ndGggPT09IDApIHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9PSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9PSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuICBpbmRleE9mOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpICYmIGhhc093bihPLCBrZXkpICYmIHB1c2gocmVzdWx0LCBrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzT3duKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHB1c2gocmVzdWx0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsXG4gICdoYXNPd25Qcm9wZXJ0eScsXG4gICdpc1Byb3RvdHlwZU9mJyxcbiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ3ZhbHVlT2YnXG5dO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gY29uY2F0KGtleXMsIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgZXhjZXB0aW9ucykge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkgJiYgIShleGNlcHRpb25zICYmIGhhc093bihleGNlcHRpb25zLCBrZXkpKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH1cbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT09IE5BVElWRSA/IGZhbHNlXG4gICAgOiBpc0NhbGxhYmxlKGRldGVjdGlvbikgPyBmYWlscyhkZXRlY3Rpb24pXG4gICAgOiAhIWRldGVjdGlvbjtcbn07XG5cbnZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlcGxhY2VtZW50LCAnLicpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgZGF0YSA9IGlzRm9yY2VkLmRhdGEgPSB7fTtcbnZhciBOQVRJVkUgPSBpc0ZvcmNlZC5OQVRJVkUgPSAnTic7XG52YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJztcblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZvcmNlZDtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5Jyk7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgICAgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5kb250Q2FsbEdldFNldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiAgb3B0aW9ucy5uYW1lICAgICAgICAgICAtIHRoZSAubmFtZSBvZiB0aGUgZnVuY3Rpb24gaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGtleVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSAmJiBnbG9iYWxbVEFSR0VUXS5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKHRhcmdldCkgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAob3B0aW9ucy5kb250Q2FsbEdldFNldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTtcbiAgICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgIC8vIGNvbnRhaW5lZCBpbiB0YXJnZXRcbiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVByb3BlcnR5ID09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHNvdXJjZVByb3BlcnR5LCAnc2hhbScsIHRydWUpO1xuICAgIH1cbiAgICBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktaXNhcnJheSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmd1bWVudCkge1xuICByZXR1cm4gY2xhc3NvZihhcmd1bWVudCkgPT09ICdBcnJheSc7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gU2FmYXJpIDwgMTMgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3IgaW4gdGhpcyBjYXNlXG52YXIgU0lMRU5UX09OX05PTl9XUklUQUJMRV9MRU5HVEhfU0VUID0gREVTQ1JJUFRPUlMgJiYgIWZ1bmN0aW9uICgpIHtcbiAgLy8gbWFrZXMgbm8gc2Vuc2Ugd2l0aG91dCBwcm9wZXIgc3RyaWN0IG1vZGUgc3VwcG9ydFxuICBpZiAodGhpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5sZW5ndGggPSAxO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgfVxufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNJTEVOVF9PTl9OT05fV1JJVEFCTEVfTEVOR1RIX1NFVCA/IGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgaWYgKGlzQXJyYXkoTykgJiYgIWdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCAnbGVuZ3RoJykud3JpdGFibGUpIHtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcignQ2Fubm90IHNldCByZWFkIG9ubHkgLmxlbmd0aCcpO1xuICB9IHJldHVybiBPLmxlbmd0aCA9IGxlbmd0aDtcbn0gOiBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gIHJldHVybiBPLmxlbmd0aCA9IGxlbmd0aDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgJFR5cGVFcnJvcignTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBzZXRBcnJheUxlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoJyk7XG52YXIgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXInKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgSU5DT1JSRUNUX1RPX0xFTkdUSCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFtdLnB1c2guY2FsbCh7IGxlbmd0aDogMHgxMDAwMDAwMDAgfSwgMSkgIT09IDQyOTQ5NjcyOTc7XG59KTtcblxuLy8gVjggPD0gMTIxIGFuZCBTYWZhcmkgPD0gMTUuNDsgRkYgPCAyMyB0aHJvd3MgSW50ZXJuYWxFcnJvclxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTI2ODFcbnZhciBwcm9wZXJFcnJvck9uTm9uV3JpdGFibGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB3cml0YWJsZTogZmFsc2UgfSkucHVzaCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgfVxufTtcblxudmFyIEZPUkNFRCA9IElOQ09SUkVDVF9UT19MRU5HVEggfHwgIXByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCgpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnB1c2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucHVzaFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGFyaXR5OiAxLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIHB1c2g6IGZ1bmN0aW9uIHB1c2goaXRlbSkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBhcmdDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKGxlbiArIGFyZ0NvdW50KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ0NvdW50OyBpKyspIHtcbiAgICAgIE9bbGVuXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGxlbisrO1xuICAgIH1cbiAgICBzZXRBcnJheUxlbmd0aChPLCBsZW4pO1xuICAgIHJldHVybiBsZW47XG4gIH1cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBQKSB7XG4gIGlmICghZGVsZXRlIE9bUF0pIHRocm93IG5ldyAkVHlwZUVycm9yKCdDYW5ub3QgZGVsZXRlIHByb3BlcnR5ICcgKyB0cnlUb1N0cmluZyhQKSArICcgb2YgJyArIHRyeVRvU3RyaW5nKE8pKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBzZXRBcnJheUxlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoJyk7XG52YXIgZGVsZXRlUHJvcGVydHlPclRocm93ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlbGV0ZS1wcm9wZXJ0eS1vci10aHJvdycpO1xudmFyIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2VzLW5vdC1leGNlZWQtc2FmZS1pbnRlZ2VyJyk7XG5cbi8vIElFOC1cbnZhciBJTkNPUlJFQ1RfUkVTVUxUID0gW10udW5zaGlmdCgwKSAhPT0gMTtcblxuLy8gVjggfiBDaHJvbWUgPCA3MSBhbmQgU2FmYXJpIDw9IDE1LjQsIEZGIDwgMjMgdGhyb3dzIEludGVybmFsRXJyb3JcbnZhciBwcm9wZXJFcnJvck9uTm9uV3JpdGFibGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB3cml0YWJsZTogZmFsc2UgfSkudW5zaGlmdCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgfVxufTtcblxudmFyIEZPUkNFRCA9IElOQ09SUkVDVF9SRVNVTFQgfHwgIXByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCgpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnVuc2hpZnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUudW5zaGlmdFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGFyaXR5OiAxLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIHVuc2hpZnQ6IGZ1bmN0aW9uIHVuc2hpZnQoaXRlbSkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBhcmdDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKGFyZ0NvdW50KSB7XG4gICAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobGVuICsgYXJnQ291bnQpO1xuICAgICAgdmFyIGsgPSBsZW47XG4gICAgICB3aGlsZSAoay0tKSB7XG4gICAgICAgIHZhciB0byA9IGsgKyBhcmdDb3VudDtcbiAgICAgICAgaWYgKGsgaW4gTykgT1t0b10gPSBPW2tdO1xuICAgICAgICBlbHNlIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyhPLCB0byk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFyZ0NvdW50OyBqKyspIHtcbiAgICAgICAgT1tqXSA9IGFyZ3VtZW50c1tqXTtcbiAgICAgIH1cbiAgICB9IHJldHVybiBzZXRBcnJheUxlbmd0aChPLCBsZW4gKyBhcmdDb3VudCk7XG4gIH1cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBtYWtlQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYWtlLWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgaWYgKGRlc2NyaXB0b3IuZ2V0KSBtYWtlQnVpbHRJbihkZXNjcmlwdG9yLmdldCwgbmFtZSwgeyBnZXR0ZXI6IHRydWUgfSk7XG4gIGlmIChkZXNjcmlwdG9yLnNldCkgbWFrZUJ1aWx0SW4oZGVzY3JpcHRvci5zZXQsIG5hbWUsIHsgc2V0dGVyOiB0cnVlIH0pO1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkuZih0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXIgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZmxhZ3Ncbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmhhc0luZGljZXMpIHJlc3VsdCArPSAnZCc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC5kb3RBbGwpIHJlc3VsdCArPSAncyc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnVuaWNvZGVTZXRzKSByZXN1bHQgKz0gJ3YnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yJyk7XG52YXIgcmVnRXhwRmxhZ3MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCcuJywgJ2QnKSAtPiAvLi9kIGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbnZhciBGT1JDRUQgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBJTkRJQ0VTX1NVUFBPUlQgPSB0cnVlO1xuICB0cnkge1xuICAgIFJlZ0V4cCgnLicsICdkJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgSU5ESUNFU19TVVBQT1JUID0gZmFsc2U7XG4gIH1cblxuICB2YXIgTyA9IHt9O1xuICAvLyBtb2Rlcm4gVjggYnVnXG4gIHZhciBjYWxscyA9ICcnO1xuICB2YXIgZXhwZWN0ZWQgPSBJTkRJQ0VTX1NVUFBPUlQgPyAnZGdpbXN5JyA6ICdnaW1zeSc7XG5cbiAgdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChrZXksIGNocikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxscyArPSBjaHI7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IH0pO1xuICB9O1xuXG4gIHZhciBwYWlycyA9IHtcbiAgICBkb3RBbGw6ICdzJyxcbiAgICBnbG9iYWw6ICdnJyxcbiAgICBpZ25vcmVDYXNlOiAnaScsXG4gICAgbXVsdGlsaW5lOiAnbScsXG4gICAgc3RpY2t5OiAneSdcbiAgfTtcblxuICBpZiAoSU5ESUNFU19TVVBQT1JUKSBwYWlycy5oYXNJbmRpY2VzID0gJ2QnO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYWlycykgYWRkR2V0dGVyKGtleSwgcGFpcnNba2V5XSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihSZWdFeHBQcm90b3R5cGUsICdmbGFncycpLmdldC5jYWxsKE8pO1xuXG4gIHJldHVybiByZXN1bHQgIT09IGV4cGVjdGVkIHx8IGNhbGxzICE9PSBleHBlY3RlZDtcbn0pO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzXG5pZiAoRk9SQ0VEKSBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUmVnRXhwUHJvdG90eXBlLCAnZmxhZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiByZWdFeHBGbGFnc1xufSk7XG4iLCAiaW1wb3J0IHtpbml0TXdBcGl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbmNvbnN0IGFwaTogbXcuQXBpID0gaW5pdE13QXBpKCdOYXZpZ2F0aW9uIHBvcHVwcy8xLjAnKTtcblxuZXhwb3J0IHthcGl9O1xuIiwgIi8vIFRyYW5zbGF0YWJsZSBzdHJpbmdzXG5jb25zdCBtZXNzYWdlOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHtcblx0Ly8gc3VtbWFyeSBkYXRhLCBzZWFyY2hpbmcgZXRjLlxuXHRhcnRpY2xlOiB3aW5kb3cud2dVTFMoJ+adoeebricsICfmop3nm64nKSxcblx0Y2F0ZWdvcnk6IHdpbmRvdy53Z1VMUygn5Liq5YiG57G7JywgJ+WAi+WIhumhnicpLFxuXHRjYXRlZ29yaWVzOiB3aW5kb3cud2dVTFMoJ+S4quWIhuexuycsICflgIvliIbpoZ4nKSxcblx0aW1hZ2U6IHdpbmRvdy53Z1VMUygn5Liq5paH5Lu2JywgJ+WAi+aqlOahiCcpLFxuXHRpbWFnZXM6IHdpbmRvdy53Z1VMUygn5Liq5paH5Lu2JywgJ+WAi+aqlOahiCcpLFxuXHRzdHViOiAn5bCP5L2c5ZOBJyxcblx0J3NlY3Rpb24gc3R1Yic6IHdpbmRvdy53Z1VMUygn5bCP56ug6IqCJywgJ+Wwj+eroOevgCcpLFxuXHQnRW1wdHkgcGFnZSc6IHdpbmRvdy53Z1VMUygn56m66aG16Z2iJywgJ+epuumggemdoicpLFxuXHRrQjogd2luZG93LndnVUxTKCfljYPlrZfoioI8c3ViPu+8iOS7pTEwMDDkuLrkuIDov5vvvIk8L3N1Yj4nLCAn5Y2D5L2N5YWD57WEPHN1Yj7vvIjku6UxMDAw54K65LiA6YCy77yJPC9zdWI+JyksXG5cdGJ5dGVzOiB3aW5kb3cud2dVTFMoJ+Wtl+iKgicsICfkvY3lhYPntYQnKSxcblx0ZGF5OiAn5aSpJyxcblx0ZGF5czogJ+WkqScsXG5cdGhvdXI6IHdpbmRvdy53Z1VMUygn5bCP5pe2JywgJ+Wwj+aZgicpLFxuXHRob3Vyczogd2luZG93LndnVUxTKCflsI/ml7YnLCAn5bCP5pmCJyksXG5cdG1pbnV0ZTogJ+WIhicsXG5cdG1pbnV0ZXM6ICfliIYnLFxuXHRzZWNvbmQ6ICfnp5InLFxuXHRzZWNvbmRzOiAn56eSJyxcblx0d2VlazogJ+WRqCcsXG5cdHdlZWtzOiAn5ZGoJyxcblx0bW9udGg6ICfmnIgnLFxuXHRtb250aHM6ICfmnIgnLFxuXHR5ZWFyOiAn5bm0Jyxcblx0eWVhcnM6ICflubQnLFxuXHRzZWFyY2g6IHdpbmRvdy53Z1VMUygn5pCc57SiJywgJ+aQnOWwiycpLFxuXHRTZWFyY2hIaW50OiB3aW5kb3cud2dVTFMoJ+aQnOe0ouWMheWQqyAlcyDnmoTpobXpnaInLCAn5pCc5bCL5YyF5ZCrICVzIOeahOmggemdoicpLFxuXHR3ZWI6ICdCaW5nJyxcblx0Z2xvYmFsOiAn5YWo5Z+fJyxcblx0J21vcmUuLi4nOiAn5pu05aSa4oCm4oCmJyxcblx0Ly8gYXJ0aWNsZS1yZWxhdGVkIGFjdGlvbnMgYW5kIGluZm9cblx0Ly8gKHNvbWUgYWN0aW9ucyBhbHNvIGFwcGx5IHRvIHVzZXIgcGFnZXMpXG5cdGFjdGlvbnM6IHdpbmRvdy53Z1VMUygn5pON5L2cJywgJ+WLleS9nCcpLFxuXHQvLyAvLy8gdmlldyBhcnRpY2xlcyBhbmQgdmlldyB0YWxrXG5cdHBvcHVwc01lbnU6ICdQb3B1cHMnLFxuXHQnZGlzYWJsZSBwcmV2aWV3cyc6IHdpbmRvdy53Z1VMUygn56aB55So6aKE6KeIJywgJ+emgeeUqOmgkOimvScpLFxuXHR0b2dnbGVQcmV2aWV3c0hpbnQ6IHdpbmRvdy53Z1VMUygn5YiH5o2i5pys6aG1IFBvcHVwcyDnmoTpooTop4jlvIDlhbMnLCAn5YiH5o+b5pys6aCBIFBvcHVwcyDnmoTpoJDopr3plovpl5wnKSxcblx0J3RvZ2dsZSBwcmV2aWV3cyc6IHdpbmRvdy53Z1VMUygn5YiH5o2i6aKE6KeI5byA5YWzJywgJ+WIh+aPm+mgkOimvemWi+mXnCcpLFxuXHRyZXNldDogd2luZG93LndnVUxTKCflpI3kvY0nLCAn6KSH5L2NJyksXG5cdGRpc2FibGU6ICfnpoHnlKggUG9wdXBzJyxcblx0ZGlzYWJsZVBvcHVwc0hpbnQ6IHdpbmRvdy53Z1VMUyhcblx0XHQn5Zyo5pys6aG156aB55SoIFBvcHVwc++8jOWIt+aWsOmhtemdouS7pemHjeaWsOWQr+eUqOOAgicsXG5cdFx0J+WcqOacrOmggeemgeeUqCBQb3B1cHPvvIzph43mlrDmlbTnkIbpoIHpnaLku6Xph43mlrDllZ/nlKjjgIInXG5cdCksXG5cdHB1cmdlUG9wdXBzSGludDogd2luZG93LndnVUxTKCflpI3kvY0gUG9wdXBz77yM5riF6Zmk5omA5pyJ57yT5a2Y5pWw5o2u44CCJywgJ+ikh+S9jSBQb3B1cHPvvIzmuIXpmaTmiYDmnInlv6vlj5bos4fmlpnjgIInKSxcblx0UG9wdXBzSGludDogd2luZG93LndnVUxTKCflpI3kvY0gUG9wdXBz77yM5riF6Zmk5omA5pyJ57yT5a2Y5pWw5o2u44CCJywgJ+ikh+S9jSBQb3B1cHPvvIzmuIXpmaTmiYDmnInlv6vlj5bos4fmlpnjgIInKSxcblx0c3BhY2ViYXI6ICfnqbrmoLwnLFxuXHR2aWV3OiB3aW5kb3cud2dVTFMoJ+afpeeciycsICfmqqLoppYnKSxcblx0J3ZpZXcgYXJ0aWNsZSc6IHdpbmRvdy53Z1VMUygn5p+l55yL5p2h55uuJywgJ+aqouimluaineebricpLFxuXHR2aWV3SGludDogd2luZG93LndnVUxTKCfliY3lvoAgJXMnLCAn5YmN5b6AICVzJyksXG5cdHRhbGs6IHdpbmRvdy53Z1VMUygn6K6o6K66JywgJ+iojuirlicpLFxuXHQndGFsayBwYWdlJzogd2luZG93LndnVUxTKCforqjorrrpobUnLCAn6KiO6KuW6aCBJyksXG5cdCd0aGlzJm5ic3A7cmV2aXNpb24nOiB3aW5kb3cud2dVTFMoJ+atpOS/ruiuoueJiOacrCcsICfmraTkv67oqILniYjmnKwnKSxcblx0J3JldmlzaW9uICVzIG9mICVzJzogd2luZG93LndnVUxTKCfpobXpnaIgJDIg55qE5L+u6K6i54mI5pysICQxJywgJ+mggemdoiAkMiDnmoTkv67oqILniYjmnKwgJDEnKSxcblx0J1JldmlzaW9uICVzIG9mICVzJzogd2luZG93LndnVUxTKCfpobXpnaIgJDIg55qE5L+u6K6i54mI5pysICQxJywgJ+mggemdoiAkMiDnmoTkv67oqILniYjmnKwgJDEnKSxcblx0J3RoZSByZXZpc2lvbiBwcmlvciB0byByZXZpc2lvbiAlcyBvZiAlcyc6IHdpbmRvdy53Z1VMUyhcblx0XHQn6aG16Z2iICQyIOeahOS/ruiuoueJiOacrCAkMSDkuYvliY3nmoTkv67orqLniYjmnKwnLFxuXHRcdCfpoIHpnaIgJDIg55qE5L+u6KiC54mI5pysICQxIOS5i+WJjeeahOS/ruiogueJiOacrCdcblx0KSxcblx0J1RvZ2dsZSBpbWFnZSBzaXplJzogd2luZG93LndnVUxTKCfngrnlh7vliIfmjaLlm77niYflpKflsI8nLCAn6bue5pOK5YiH5o+b5ZyW54mH5aSn5bCPJyksXG5cdGRlbDogd2luZG93LndnVUxTKCfliKDpmaQnLCAn5Yig6ZmkJyksXG5cdC8vIC8vLyBkZWxldGUsIHByb3RlY3QsIG1vdmVcblx0ZGVsZXRlOiB3aW5kb3cud2dVTFMoJ+WIoOmZpCcsICfliKDpmaQnKSxcblx0ZGVsZXRlSGludDogd2luZG93LndnVUxTKCfliKDpmaQgJXMnLCAn5Yig6ZmkICVzJyksXG5cdHVuZGVsZXRlU2hvcnQ6IHdpbmRvdy53Z1VMUygn5oGi5aSNJywgJ+aBouW+qScpLFxuXHRVbmRlbGV0ZUhpbnQ6IHdpbmRvdy53Z1VMUygn5oGi5aSNICVzJywgJ+aBouW+qSAlcycpLFxuXHRwcm90ZWN0OiB3aW5kb3cud2dVTFMoJ+S/neaKpCcsICfkv53orbcnKSxcblx0cHJvdGVjdEhpbnQ6IHdpbmRvdy53Z1VMUygn5L+d5oqkICVzJywgJ+S/neittyAlcycpLFxuXHR1bnByb3RlY3RTaG9ydDogd2luZG93LndnVUxTKCfop6PpmaQnLCAn6Kej6ZmkJyksXG5cdHVucHJvdGVjdEhpbnQ6IHdpbmRvdy53Z1VMUygn6Kej6Zmk5a+5ICVzIOeahOS/neaKpCcsICfop6PpmaTlsI0gJXMg55qE5L+d6K23JyksXG5cdG1vdmU6IHdpbmRvdy53Z1VMUygn56e75YqoJywgJ+enu+WLlScpLFxuXHQnbW92ZSBwYWdlJzogd2luZG93LndnVUxTKCfnp7vliqjpobXpnaInLCAn56e75YuV6aCB6Z2iJyksXG5cdE1vdmVwYWdlSGludDogd2luZG93LndnVUxTKCfkv67mlLkgJXMg55qE5qCH6aKYJywgJ+S/ruaUuSAlcyDnmoTmqJnpoYwnKSxcblx0ZWRpdDogd2luZG93LndnVUxTKCfnvJbovpEnLCAn57eo6LyvJyksXG5cdC8vIC8vLyBlZGl0IGFydGljbGVzIGFuZCB0YWxrXG5cdCdlZGl0IGFydGljbGUnOiB3aW5kb3cud2dVTFMoJ+e8lui+keadoeebricsICfnt6jovK/mop3nm64nKSxcblx0ZWRpdEhpbnQ6IHdpbmRvdy53Z1VMUygn5L+u5pS5ICVzIOeahOWGheWuuScsICfkv67mlLkgJXMg55qE5YWn5a65JyksXG5cdCdlZGl0IHRhbGsnOiB3aW5kb3cud2dVTFMoJ+e8lui+keiuqOiuuumhtScsICfnt6jovK/lsI3oqbHpoIEnKSxcblx0bmV3OiB3aW5kb3cud2dVTFMoJ+aWsCcsICfmlrAnKSxcblx0J25ldyB0b3BpYyc6IHdpbmRvdy53Z1VMUygn5paw6K+d6aKYJywgJ+aWsOipsemhjCcpLFxuXHRuZXdTZWN0aW9uSGludDogd2luZG93LndnVUxTKCflnKggJXMg5aKe5Yqg5paw55qE6K6o6K666K+d6aKYJywgJ+WcqCAlcyDlop7liqDmlrDnmoToqI7oq5boqbHpoYwnKSxcblx0J251bGwgZWRpdCc6IHdpbmRvdy53Z1VMUygn56m657yW6L6RJywgJ+epuue3qOi8rycpLFxuXHRudWxsRWRpdEhpbnQ6IHdpbmRvdy53Z1VMUygn6L+b6KGM5LiA5qyh5a+5ICVzIOeahOepuue8lui+kScsICfoo73pgKDkuIDmrKHlsI0gJXMg55qE56m657eo6LyvJyksXG5cdGhpc3Q6IHdpbmRvdy53Z1VMUygn5Y6G5Y+yJywgJ+att+WPsicpLFxuXHQvLyAvLy8gaGlzdG9yeSwgZGlmZnMsIGVkaXRvcnMsIHJlbGF0ZWRcblx0aGlzdG9yeTogd2luZG93LndnVUxTKCfljoblj7InLCAn5q235Y+yJyksXG5cdGhpc3RvcnlIaW50OiB3aW5kb3cud2dVTFMoJyVzIOeahOS/ruiuouWOhuWPsicsICclcyDnmoTkv67oqILmrbflj7InKSxcblx0bGFzdDogd2luZG93LndnVUxTKCfkuYvliY0nLCAn5LmL5YmNJyksXG5cdC8vIFtbTWVkaWFXaWtpOkxhc3RdXVxuXHRsYXN0RWRpdDogd2luZG93LndnVUxTKCfmnIDov5Hmm7TmlLknLCAn5pyA6L+R5pu05pS5JyksXG5cdCdzaG93IGxhc3QgZWRpdCc6IHdpbmRvdy53Z1VMUygn5pyA6L+R5LiA5qyh5pu05pS5JywgJ+acgOaWsOS4gOasoeS/ruiogicpLFxuXHQnU2hvdyB0aGUgbGFzdCBlZGl0Jzogd2luZG93LndnVUxTKCfmmL7npLrmnIDov5HkuIDmrKHmm7TmlLnnmoTlt67lvIInLCAn6aGv56S65pyA5paw5LiA5qyh5L+u6KiC55qE5beu55WwJyksXG5cdGxhc3RDb250cmliOiB3aW5kb3cud2dVTFMoJ+acgOi/kee8lui+kScsICfmnIDov5Hnt6jovK8nKSxcblx0J2xhc3Qgc2V0IG9mIGVkaXRzJzogd2luZG93LndnVUxTKCfmnIDov5HnvJbovpEnLCAn5pyA6L+R57eo6LyvJyksXG5cdGxhc3RDb250cmliSGludDogd2luZG93LndnVUxTKCfmmL7npLrnlLHmnIDlkI7kuIDkvY3nvJbovpHogIXpgKDmiJDnmoTlt67lvIInLCAn6aGv56S655Sx5pyA5b6M5LiA5L2N57eo6Lyv6ICF6KO96YCg55qE5beu55WwJyksXG5cdGN1cjogd2luZG93LndnVUxTKCflvZPliY0nLCAn55W25YmNJyksXG5cdGRpZmZDdXI6IHdpbmRvdy53Z1VMUygn5LiO5b2T5YmN54mI5pys55qE5beu5byCJywgJ+iIh+ebruWJjeeJiOacrOeahOW3rueVsCcpLFxuXHQnU2hvdyBjaGFuZ2VzIHNpbmNlIHJldmlzaW9uICVzJzogd2luZG93LndnVUxTKCfmmL7npLroh6rkv67orqLniYjmnKwgJXMg55qE5beu5byCJywgJ+mhr+ekuuiHquS/ruiogueJiOacrCAlcyDnmoTlt67nlbAnKSxcblx0JyVzIG9sZCc6IHdpbmRvdy53Z1VMUygnJXMg5YmN55qE5pyA5ZCO54mI5pysJywgJyVzIOWJjeeahOacgOWQjueJiOacrCcpLFxuXHQvLyBhcyBpbiA0IHdlZWtzIG9sZFxuXHRvbGRFZGl0OiB3aW5kb3cud2dVTFMoJ+aXp+e8lui+kScsICfoiIrnt6jovK8nKSxcblx0cHVyZ2U6IHdpbmRvdy53Z1VMUygn5riF6Zmk57yT5a2YJywgJ+a4hemZpOW/q+WPlicpLFxuXHRwdXJnZUhpbnQ6IHdpbmRvdy53Z1VMUygn5riF6Zmk5pyN5Yqh5Zmo5LitICVzIOeahOe8k+WtmCcsICfmuIXpmaTkvLrmnI3lmajkuK0gJXMg55qE5b+r5Y+WJyksXG5cdHJhdzogd2luZG93LndnVUxTKCfmupDku6PnoIEnLCAn5Y6f5aeL56K8JyksXG5cdHJhd0hpbnQ6IHdpbmRvdy53Z1VMUygn5p+l55yLICVzIOeahOa6kOS7o+eggScsICfmqqLoppYgJXMg55qE5Y6f5aeL56K8JyksXG5cdHJlbmRlcjogd2luZG93LndnVUxTKCfku4XmraPmlocnLCAn5YOF5q2j5paHJyksXG5cdHJlbmRlckhpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S6ICVzIOeahOe6r0hUTUzop6PmnpDvvIjku4XmraPmloflhoXlrrnvvIknLCAn6aGv56S6ICVzIOeahOe0lEhUTUzop6PmnpDvvIjlg4XmraPmloflhaflrrnvvIknKSxcblx0J1Nob3cgdGhlIGVkaXQgbWFkZSB0byBnZXQgcmV2aXNpb24nOiB3aW5kb3cud2dVTFMoJ+aYvuekuue8lui+keS7peW+l+WIsOS/ruiuoueJiOacrCcsICfpoa/npLrnt6jovK/ku6XlvpfliLDkv67oqILniYjmnKwnKSxcblx0c2luY2VNZTogd2luZG93LndnVUxTKCfoh6rmiJEnLCAn6Ieq5oiRJyksXG5cdCdjaGFuZ2VzIHNpbmNlIG1pbmUnOiB3aW5kb3cud2dVTFMoJ+iHquaIkeS/ruiuoueahOW3ruW8gicsICfoh6rmiJHkv67oqILnmoTlt67nlbAnKSxcblx0c2luY2VNZUhpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S66Ieq5oiR5LiK5qyh5L+u5pS55Lul5p2l55qE5beu5byCJywgJ+mhr+ekuuiHquaIkeS4iuasoeS/ruaUueS7peS+hueahOW3rueVsCcpLFxuXHRcIkNvdWxkbid0IGZpbmQgYW4gZWRpdCBieSAlc1xcbmluIHRoZSBsYXN0ICVzIGVkaXRzIHRvXFxuJXNcIjogd2luZG93LndnVUxTKFxuXHRcdCflnKggJDMg5pyA6L+RICQyIOasoee8lui+keS4reaJvuS4jeWIsCAkMSDlgZrlh7rnmoTkv67mlLknLFxuXHRcdCflnKggJDMg5pyA6L+RICQyIOasoee3qOi8r+S4reaJvuS4jeWIsCAkMSDlgZrlh7rnmoTkv67mlLknXG5cdCksXG5cdGVkczogd2luZG93LndnVUxTKCfnvJbovpEnLCAn57eo6LyvJyksXG5cdGVkaXRvcnM6IHdpbmRvdy53Z1VMUygn57yW6L6R6ICFJywgJ+e3qOi8r+iAhScpLFxuXHRlZGl0b3JMaXN0SGludDogd2luZG93LndnVUxTKCfliJflh7rnvJbovpHov4cgJXMg55qE55So5oi3JywgJ+WIl+WHuue3qOi8r+mBjiAlcyDnmoTkvb/nlKjogIUnKSxcblx0cmVsYXRlZDogd2luZG93LndnVUxTKCfnm7jlhbMnLCAn55u46ZecJyksXG5cdHJlbGF0ZWRDaGFuZ2VzOiB3aW5kb3cud2dVTFMoJ+ebuOWFs+abtOaUuScsICfnm7jpl5zmm7TmlLknKSxcblx0J3JlbGF0ZWQgY2hhbmdlcyc6IHdpbmRvdy53Z1VMUygn55u45YWz5pu05pS5JywgJ+ebuOmXnOabtOaUuScpLFxuXHRSZWNlbnRjaGFuZ2VzbGlua2VkSGludDogd2luZG93LndnVUxTKCfmmL7npLrnm7jlhbMgJXMg55qE5L+u5pS5JywgJ+mhr+ekuuebuOmXnCAlcyDnmoTkv67mlLknKSxcblx0ZWRpdE9sZDogd2luZG93LndnVUxTKCfnvJbovpHml6fniYgnLCAn57eo6Lyv6IiK54mIJyksXG5cdC8vIC8vLyBlZGl0IG9sZCB2ZXJzaW9uLCBvciByZXZlcnRcblx0cnY6IHdpbmRvdy53Z1VMUygn5Zue6YCAJywgJ+aBouW+qScpLFxuXHRyZXZlcnQ6IHdpbmRvdy53Z1VMUygn5Zue6YCAJywgJ+aBouW+qScpLFxuXHRyZXZlcnRIaW50OiB3aW5kb3cud2dVTFMoJ+WbnumAgOWIsCAlcycsICfmgaLlvqnliLAgJXMnKSxcblx0dW5kbzogd2luZG93LndnVUxTKCfmkqTplIAnLCAn5pKk6Yq3JyksXG5cdHVuZG9IaW50OiB3aW5kb3cud2dVTFMoJ+aSpOmUgOi/measoee8lui+kScsICfmkqTpirfpgJnmrKHnt6jovK8nKSxcblx0ZGVmYXVsdHBvcHVwUmVkbGlua1N1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHQn56e76Zmk5Yiw56m66aG16Z2iW1slc11d55qE6ZO+5o6l77yIUG9wdXBz77yJJyxcblx0XHQn56e76Zmk5Yiw56m66aCB6Z2iW1slc11d55qE6YCj57WQ77yIUG9wdXBz77yJJ1xuXHQpLFxuXHRkZWZhdWx0cG9wdXBGaXhEYWJzU3VtbWFyeTogd2luZG93LndnVUxTKCfmtojmrafkuYlbWyVzXV3liLBbWyVzXV3vvIhQb3B1cHPvvIknLCAn5raI5q2n576pW1slc11d5YiwW1slc11d77yIUG9wdXBz77yJJyksXG5cdGRlZmF1bHRwb3B1cEZpeFJlZGlyc1N1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHQn5b+955Wl5LuOW1slc11d5YiwW1slc11d55qE6YeN5a6a5ZCR77yIUG9wdXBz77yJJyxcblx0XHQn5b+955Wl5b6eW1slc11d5YiwW1slc11d55qE6YeN5paw5bCO5ZCR77yIUG9wdXBz77yJJ1xuXHQpLFxuXHRkZWZhdWx0cG9wdXBFeHRlbmRlZFJldmVydFN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHQn5Zue6YCA5YiwJDLlnKgkMeaXtue8lui+keeahOS/ruiuoueJiOacrCQz77yIUG9wdXBz77yJJyxcblx0XHQn6YKE5Y6f5YiwJDLlnKgkMeaZguijveS9nOeahOS/ruiogueJiOacrCQz77yIUG9wdXBz77yJJ1xuXHQpLFxuXHRkZWZhdWx0cG9wdXBSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdCflm57pgIDliLDkv67orqLniYjmnKwlc+eahOS4iuS4gOS4queJiOacrO+8iFBvcHVwc++8iScsXG5cdFx0J+mChOWOn+WIsOS/ruiogueJiOacrCVz55qE5LiK5LiA5YCL54mI5pys77yIUG9wdXBz77yJJ1xuXHQpLFxuXHRkZWZhdWx0cG9wdXBSZXZlcnRTdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WbnumAgOWIsOS/ruiuoueJiOacrCVz77yIUG9wdXBz77yJJywgJ+mChOWOn+WIsOS/ruiogueJiOacrCVz77yIUG9wdXBz77yJJyksXG5cdGRlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdCflm57pgIDliLDkv67orqLniYjmnKwkMeeahOS4iuS4gOS4queJiOacrO+8jOeUsSQz5ZyoJDLml7bnvJbovpHvvIhQb3B1cHPvvIknLFxuXHRcdCfpgoTljp/liLDkv67oqILniYjmnKwkMeeahOS4iuS4gOWAi+eJiOacrO+8jOeUsSQz5ZyoJDLmmYLoo73kvZzvvIhQb3B1cHPvvIknXG5cdCksXG5cdGRlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRTdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0J+WbnumAgOWIsCQz5ZyoJDLml7bnvJbovpHnmoTkv67orqLniYjmnKwkMe+8iFBvcHVwc++8iScsXG5cdFx0J+mChOWOn+WIsCQz5ZyoJDLmmYLoo73kvZznmoTkv67oqILniYjmnKwkMe+8iFBvcHVwc++8iSdcblx0KSxcblx0ZGVmYXVsdHBvcHVwUm1EYWJMaW5rU3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdCfnp7vpmaTliLDmtojmrafkuYnpobVbWyVzXV3nmoTpk77mjqXvvIhQb3B1cHPvvIknLFxuXHRcdCfnp7vpmaTliLDmtojmrafnvqnpoIFbWyVzXV3nmoTpgKPntZDvvIhQb3B1cHPvvIknXG5cdCksXG5cdFJlZGlyZWN0czogd2luZG93LndnVUxTKCfph43lrprlkJEnLCAn6YeN5a6a5ZCRJyksXG5cdC8vIGFzIGluIFJlZGlyZWN0cyB0byAuLi5cblx0Ly8gXCIgdG8gXCI6IHdpbmRvdy53Z1VMUyggXCLliLBcIixcIuWIsFwiICksXG5cdC8vIGFzIGluIFJlZGlyZWN0cyB0byAuLi5cblx0J0J5cGFzcyByZWRpcmVjdCc6IHdpbmRvdy53Z1VMUygn5b+955Wl6YeN5a6a5ZCRJywgJ+W/veeVpemHjeaWsOWwjuWQkScpLFxuXHQnRml4IHRoaXMgcmVkaXJlY3QnOiB3aW5kb3cud2dVTFMoJ+S/ruWkjemHjeWumuWQkScsICfkv67lvqnph43mlrDlsI7lkJEnKSxcblx0ZGlzYW1iaWc6IHdpbmRvdy53Z1VMUygn5raI5q2n5LmJJywgJ+a2iOatp+e+qScpLFxuXHQvLyAvLy8gYWRkIG9yIHJlbW92ZSBkYWIgZXRjLlxuXHRkaXNhbWJpZ0hpbnQ6IHdpbmRvdy53Z1VMUygn5raI5q2n5LmJ6L+Z5Liq6ZO+5o6l5YiwIFtbJXNdXScsICfmtojmrafnvqnpgJnlgIvpgKPntZDliLAgW1slc11dJyksXG5cdCdDbGljayB0byBkaXNhbWJpZ3VhdGUgdGhpcyBsaW5rIHRvOic6IHdpbmRvdy53Z1VMUygn54K55Ye75Lul5raI5q2n5LmJ6L+Z5Liq6ZO+5o6l5Yiw77yaJywgJ+m7nuaTiuS7pea2iOatp+e+qemAmeWAi+mAo+e1kOWIsO+8micpLFxuXHQncmVtb3ZlIHRoaXMgbGluayc6IHdpbmRvdy53Z1VMUygn56e76Zmk6ZO+5o6lJywgJ+enu+mZpOmAo+e1kCcpLFxuXHQncmVtb3ZlIGFsbCBsaW5rcyB0byB0aGlzIHBhZ2UgZnJvbSB0aGlzIGFydGljbGUnOiB3aW5kb3cud2dVTFMoXG5cdFx0J+enu+mZpOatpOadoeebruWIsOi/memhteeahOaJgOaciemTvuaOpScsXG5cdFx0J+enu+mZpOatpOaineebruWIsOmAmemggeeahOaJgOaciemAo+e1kCdcblx0KSxcblx0J3JlbW92ZSBhbGwgbGlua3MgdG8gdGhpcyBkaXNhbWJpZyBwYWdlIGZyb20gdGhpcyBhcnRpY2xlJzogd2luZG93LndnVUxTKFxuXHRcdCfnp7vpmaTmraTmnaHnm67liLDov5nmtojmrafkuYnnmoTmiYDmnInpk77mjqUnLFxuXHRcdCfnp7vpmaTmraTmop3nm67liLDpgJnmtojmrafnvqnnmoTmiYDmnInpgKPntZAnXG5cdCksXG5cdG1haW5saW5rOiB3aW5kb3cud2dVTFMoJ+S4u+mTvuaOpScsICfkuLvpgKPntZAnKSxcblx0Ly8gLy8vIGxpbmtzLCB3YXRjaCwgdW53YXRjaFxuXHR3aWtpTGluazogd2luZG93LndnVUxTKCfkuKrlhoXpg6jpk77mjqUnLCAn5Liq5YWn6YOo6YCj57WQJyksXG5cdHdpa2lMaW5rczogd2luZG93LndnVUxTKCfkuKrlhoXpg6jpk77mjqUnLCAn5Liq5YWn6YOo6YCj57WQJyksXG5cdCdsaW5rcyBoZXJlJzogd2luZG93LndnVUxTKCfpk77lhaUnLCAn6Y+I5YWlJyksXG5cdHdoYXRMaW5rc0hlcmU6IHdpbmRvdy53Z1VMUygn6ZO+5YWl6aG16Z2iJywgJ+mPiOWFpemggemdoicpLFxuXHQnd2hhdCBsaW5rcyBoZXJlJzogd2luZG93LndnVUxTKCfpk77lhaXpobXpnaInLCAn6Y+I5YWl6aCB6Z2iJyksXG5cdFdoYXRsaW5rc2hlcmVIaW50OiB3aW5kb3cud2dVTFMoJ+aYvuekuumTvuaOpeWIsCAlcyDnmoTpobXpnaInLCAn6aGv56S66YCj57WQ5YiwICVzIOeahOmggemdoicpLFxuXHR1bndhdGNoU2hvcnQ6IHdpbmRvdy53Z1VMUygn5Y+W5raIJywgJ+WPlua2iCcpLFxuXHR3YXRjaFRoaW5neTogd2luZG93LndnVUxTKCfnm5Hop4YnLCAn55uj6KaWJyksXG5cdC8vIGNhbGxlZCB3YXRjaFRoaW5neSBiZWNhdXNlIHt9LndhdGNoIGlzIGEgZnVuY3Rpb25cblx0d2F0Y2hIaW50OiB3aW5kb3cud2dVTFMoJ+WKoOWFpSAlcyDliLDmiJHnmoTnm5Hop4bliJfooagnLCAn5Yqg5YWlICVzIOWIsOaIkeeahOebo+imluWIl+ihqCcpLFxuXHR1bndhdGNoSGludDogd2luZG93LndnVUxTKCfku47miJHnmoTnm5Hop4bliJfooajnp7vpmaQgJXMnLCAn5b6e5oiR55qE55uj6KaW5YiX6KGo56e76ZmkICVzJyksXG5cdCdPbmx5IGZvdW5kIG9uZSBlZGl0b3I6ICVzIG1hZGUgJXMgZWRpdHMnOiB3aW5kb3cud2dVTFMoXG5cdFx0J+S7heaJvuWIsOS4gOS9jee8luiAhe+8miVzIOWItumAoOS6hiAlcyDmrKHnvJbovpEnLFxuXHRcdCflg4Xmib7liLDkuIDkvY3nt6jogIXvvJolcyDoo73pgKDkuoYgJXMg5qyh57eo6LyvJ1xuXHQpLFxuXHQnJXMgc2VlbXMgdG8gYmUgdGhlIGxhc3QgZWRpdG9yIHRvIHRoZSBwYWdlICVzJzogd2luZG93LndnVUxTKFxuXHRcdCclcyDnnIvkuIrljrvmmK8gJXMg6L+Z6aG155qE5pyA5ZCO5LiA5L2N57yW6ICFJyxcblx0XHQnJXMg55yL5LiK5Y675pivICVzIOmAmemggeeahOacgOW+jOS4gOS9jee3qOiAhSdcblx0KSxcblx0cnNzOiB3aW5kb3cud2dVTFMoJ1JTUycsICdSU1MnKSxcblx0Ly8gZGlmZiBwcmV2aWV3c1xuXHQnRGlmZiB0cnVuY2F0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMnOiB3aW5kb3cud2dVTFMoJ+WHuuS6juaAp+iDveiAg+iZke+8jOW3ruW8guW3suiiq+aIquaWrScsICflh7rmlrzmlYjog73ogIPmha7vvIzlt67nlbDlt7LooqvmiKrmlrcnKSxcblx0J09sZCByZXZpc2lvbic6IHdpbmRvdy53Z1VMUygn5pen54mI5pysJywgJ+iIiueJiOacrCcpLFxuXHQnTmV3IHJldmlzaW9uJzogd2luZG93LndnVUxTKCfmlrDniYjmnKwnLCAn5paw54mI5pysJyksXG5cdCdTb21ldGhpbmcgd2VudCB3cm9uZyA6LSgnOiB3aW5kb3cud2dVTFMoJ+WHuumXrumimOS6hiA6LSgnLCAn5Ye65ZWP6aGM5LqGIDotKCcpLFxuXHQnRW1wdHkgcmV2aXNpb24sIG1heWJlIG5vbi1leGlzdGVudCc6IHdpbmRvdy53Z1VMUygn56m655qE5L+u6K6i77yM5Y+v6IO95bm25LiN5a2Y5ZyoJywgJ+epuueahOS/ruiogu+8jOWPr+iDveS4puS4jeWtmOWcqCcpLFxuXHQnVW5rbm93biBkYXRlJzogd2luZG93LndnVUxTKCfmnKrnn6Xml6XmnJ8nLCAn5pyq55+l5pel5pyfJyksXG5cdC8vIG90aGVyIHNwZWNpYWwgcHJldmlld3Ncblx0J0VtcHR5IGNhdGVnb3J5Jzogd2luZG93LndnVUxTKCfnqbrnmoTliIbnsbsnLCAn56m655qE5YiG6aGeJyksXG5cdCdDYXRlZ29yeSBtZW1iZXJzICglcyBzaG93biknOiB3aW5kb3cud2dVTFMoJ+WIhuexu+aIkOWRmO+8iCVzIOaYvuekuu+8iScsICfliIbpoZ7miJDlk6HvvIglcyDpoa/npLrvvIknKSxcblx0J05vIGltYWdlIGxpbmtzIGZvdW5kJzogd2luZG93LndnVUxTKCfmnKrmib7liLDmlofku7bpk77mjqUnLCAn5pyq5om+5Yiw5qqU5qGI6YCj57WQJyksXG5cdCdGaWxlIGxpbmtzJzogd2luZG93LndnVUxTKCfmlofku7bpk77mjqUnLCAn5qqU5qGI6YCj57WQJyksXG5cdCdub3QgY29tbW9ucyc6IHdpbmRvdy53Z1VMUygn57u05Z+65YWx5Lqr5Lit5peg5q2k5ZCN56ew55qE5paH5Lu244CCJywgJ+e2reWfuuWFseS6q+S4reeEoeatpOWQjeeoseeahOaqlOahiOOAgicpLFxuXHQnY29tbW9ucyBvbmx5Jzogd2luZG93LndnVUxTKCfmraTmlofku7bmnaXoh6rnu7Tln7rlhbHkuqvjgIInLCAn5q2k5qqU5qGI5L6G6Ieq57at5Z+65YWx5Lqr44CCJyksXG5cdCdObyBpbWFnZSBmb3VuZCc6IHdpbmRvdy53Z1VMUygn5om+5LiN5Yiw5paH5Lu2JywgJ+aJvuS4jeWIsOaqlOahiCcpLFxuXHQnY29tbW9ucyBkdXBlJzogd2luZG93LndnVUxTKCfnu7Tln7rlhbHkuqvkuK3lrZjlnKjmraTmlofku7bnmoTlia/mnKzjgIInLCAn57at5Z+65YWx5Lqr5Lit5a2Y5Zyo5q2k5qqU5qGI55qE5Ymv5pys44CCJyksXG5cdCdjb21tb25zIGNvbmZsaWN0Jzogd2luZG93LndnVUxTKCfnu7Tln7rlhbHkuqvkuK3lrZjlnKjmraTmlofku7blkI3np7DkuI3lkIznmoTlia/mnKzjgIInLCAn57at5Z+65YWx5Lqr5Lit5a2Y5Zyo5q2k5qqU5ZCN56ix5LiN5ZCM55qE5Ymv5pys44CCJyksXG5cdC8vIHVzZXItcmVsYXRlZCBhY3Rpb25zIGFuZCBpbmZvXG5cdHVzZXI6IHdpbmRvdy53Z1VMUygn55So5oi3JywgJ+S9v+eUqOiAhScpLFxuXHQvLyAvLy8gdXNlciBwYWdlLCB0YWxrLCBlbWFpbCwgc3BhY2Vcblx0J3VzZXImbmJzcDtwYWdlJzogd2luZG93LndnVUxTKCfnlKjmiLfpobUnLCAn5L2/55So6ICF6aCBJyksXG5cdCd1c2VyIHRhbGsnOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+iuqOiuuicsICfkvb/nlKjogIXlsI3oqbEnKSxcblx0J2VkaXQgdXNlciB0YWxrJzogd2luZG93LndnVUxTKCfnvJbovpHnlKjmiLforqjorronLCAn57eo6Lyv5L2/55So6ICF5bCN6KmxJyksXG5cdCdsZWF2ZSBjb21tZW50Jzogd2luZG93LndnVUxTKCfnlZnoqIAnLCAn55WZ6KiAJyksXG5cdGVtYWlsOiB3aW5kb3cud2dVTFMoJ+eUtemCricsICfpm7vpg7UnKSxcblx0J2VtYWlsIHVzZXInOiB3aW5kb3cud2dVTFMoJ+eUtemCrueUqOaItycsICfpm7vpg7Xkvb/nlKjogIUnKSxcblx0RW1haWx1c2VySGludDogd2luZG93LndnVUxTKCfnu5kgJXMg5Y+R6YCB55S15a2Q6YKu5Lu2JywgJ+e1piAlcyDnmbzpgIHpm7vlrZDpg7Xku7YnKSxcblx0c3BhY2U6IHdpbmRvdy53Z1VMUygn5a2Q6aG16Z2iJywgJ+WtkOmggemdoicpLFxuXHQvLyBzaG9ydCBmb3JtIGZvciB1c2VyU3BhY2UgbGlua1xuXHRQcmVmaXhpbmRleEhpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S6ICVzIOeahOeUqOaIt+mhteWtkOmhtemdoicsICfpoa/npLogJXMg55qE5L2/55So6ICF6aCB5a2Q6aCB6Z2iJyksXG5cdGNvdW50OiB3aW5kb3cud2dVTFMoJ+e7n+iuoScsICfntbHoqIgnKSxcblx0Ly8gLy8vIGNvbnRyaWJ1dGlvbnMsIHRyZWUsIGxvZ1xuXHQnZWRpdCBjb3VudGVyJzogd2luZG93LndnVUxTKCfnvJbovpHmrKHmlbAnLCAn57eo6Lyv5qyh5pW4JyksXG5cdGthdGVsaW5rSGludDogd2luZG93LndnVUxTKCclcyDnmoTnvJbovpHmrKHmlbAnLCAnJXMg55qE57eo6Lyv5qyh5pW4JyksXG5cdGNvbnRyaWJzOiB3aW5kb3cud2dVTFMoJ+i0oeeMricsICfosqLnjbsnKSxcblx0Y29udHJpYnV0aW9uczogd2luZG93LndnVUxTKCfotKHnjK4nLCAn6LKi5427JyksXG5cdGRlbGV0ZWRDb250cmliczogd2luZG93LndnVUxTKCflt7LliKDpmaTnmoTotKHnjK4nLCAn5bey5Yiq6Zmk55qE6LKi5427JyksXG5cdENvbnRyaWJ1dGlvbnNIaW50OiB3aW5kb3cud2dVTFMoJyVzIOeahOeUqOaIt+i0oeeMricsICclcyDnmoTkvb/nlKjogIXosqLnjbsnKSxcblx0dHJlZTogd2luZG93LndnVUxTKCfmoJEnLCAn5qi5JyksXG5cdGNvbnRyaWJzVHJlZUhpbnQ6IHdpbmRvdy53Z1VMUygn5qC55o2u5ZCN5a2X56m66Ze05p+l55yLICVzIOeahOi0oeeMricsICfmoLnmk5rlkb3lkI3nqbrplpPmqqLoppYgJXMg55qE6LKi5427JyksXG5cdGxvZzogd2luZG93LndnVUxTKCfml6Xlv5cnLCAn5pel6KqMJyksXG5cdCd1c2VyIGxvZyc6IHdpbmRvdy53Z1VMUygn55So5oi35pel5b+XJywgJ+S9v+eUqOiAheaXpeiqjCcpLFxuXHR1c2VyTG9nSGludDogd2luZG93LndnVUxTKCfmmL7npLogJXMg55qE55So5oi35pel5b+XJywgJ+mhr+ekuiAlcyDnmoTkvb/nlKjogIXml6XoqownKSxcblx0dW5ibG9ja1Nob3J0OiB3aW5kb3cud2dVTFMoJ+ino+mZpCcsICfop6PpmaQnKSxcblx0YmxvY2s6IHdpbmRvdy53Z1VMUygn5bCB56aBJywgJ+WwgemOlicpLFxuXHQnYmxvY2sgdXNlcic6IHdpbmRvdy53Z1VMUygn5bCB56aB55So5oi3JywgJ+WwgemOluS9v+eUqOiAhScpLFxuXHRJcGJsb2NrbGlzdEhpbnQ6IHdpbmRvdy53Z1VMUygn6Kej5bCBICVzJywgJ+ino+WwgSAlcycpLFxuXHRCbG9ja2lwSGludDogd2luZG93LndnVUxTKCflsIHnpoEgJXMnLCAn5bCB6Y6WICVzJyksXG5cdCdibG9jayBsb2cnOiB3aW5kb3cud2dVTFMoJ+WwgeemgeaXpeW/lycsICflsIHpjpbml6XoqownKSxcblx0YmxvY2tMb2dIaW50OiB3aW5kb3cud2dVTFMoJ+aYvuekuiAlcyDnmoTlsIHnpoHml6Xlv5cnLCAn6aGv56S6ICVzIOeahOWwgemOluaXpeiqjCcpLFxuXHRwcm90ZWN0TG9nSGludDogd2luZG93LndnVUxTKCfmmL7npLogJXMg55qE5L+d5oqk5pel5b+XJywgJ+mhr+ekuiAlcyDnmoTkv53orbfml6XoqownKSxcblx0cGFnZUxvZ0hpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S6ICVzIOeahOaXpeW/lycsICfpoa/npLogJXMg55qE5pel6KqMJyksXG5cdGRlbGV0ZUxvZ0hpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S6ICVzIOeahOWIoOmZpOaXpeW/lycsICfpoa/npLogJXMg55qE5Yiq6Zmk5pel6KqMJyksXG5cdCdJbnZhbGlkICVzICVzJzogd2luZG93LndnVUxTKCfpgInpobkgJXMg5LiN5Y+v55So77yaJXMnLCAn6YG46aCFICVzIOS4jeWPr+eUqO+8miVzJyksXG5cdG06ICflsI8nLFxuXHQvLyBBdXRvZWRpdGluZ1xuXHQnRW50ZXIgYSBub24tZW1wdHkgZWRpdCBzdW1tYXJ5IG9yIHByZXNzIGNhbmNlbCB0byBhYm9ydCc6IHdpbmRvdy53Z1VMUyhcblx0XHQn6L6T5YWl57yW6L6R5pGY6KaB77yM5oiW5oyJ5Y+W5raI5Lit5q2i5pON5L2cJyxcblx0XHQn6Ly45YWl57eo6Lyv5pGY6KaB77yM5oiW5oyJ5Y+W5raI5Lit5q2i5pON5L2cJ1xuXHQpLFxuXHQnRmFpbGVkIHRvIGdldCByZXZpc2lvbiBpbmZvcm1hdGlvbiwgcGxlYXNlIGVkaXQgbWFudWFsbHkuXFxuXFxuJzogd2luZG93LndnVUxTKFxuXHRcdCfojrflj5bkv67orqLniYjmnKzkv6Hmga/lpLHotKXvvIzor7fmiYvliqjkv67mlLnjgIJcXG5cXG4nLFxuXHRcdCfnjbLlj5bkv67oqILniYjmnKzos4foqIrlpLHmlZfvvIzoq4vmiYvli5Xkv67mlLnjgIJcXG5cXG4nXG5cdCksXG5cdCdUaGUgJXMgYnV0dG9uIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY2xpY2tlZC4gUGxlYXNlIHdhaXQgZm9yIHRoZSBuZXh0IHBhZ2UgdG8gbG9hZC4nOiB3aW5kb3cud2dVTFMoXG5cdFx0J+aMiemSriAlcyDlt7Looqvoh6rliqjngrnlh7vvvIzor7fnrYnlvoXkuIvkuIDkuKrpobXpnaLliqDovb3jgIInLFxuXHRcdCfmjInpiJUgJXMg5bey6KKr6Ieq5YuV6bue5pOK77yM6KuL562J5b6F5LiL5LiA5YCL6aCB6Z2i6LyJ5YWl44CCJ1xuXHQpLFxuXHQnQ291bGQgbm90IGZpbmQgYnV0dG9uICVzLiBQbGVhc2UgY2hlY2sgdGhlIHNldHRpbmdzIGluIHlvdXIgamF2YXNjcmlwdCBmaWxlLic6IHdpbmRvdy53Z1VMUyhcblx0XHQn5om+5LiN5Yiw5oyJ6ZKuICVz77yM6K+35qOA5p+l5oKoIEphdmFTY3JpcHQg5paH5Lu25Lit55qE6K6+572u44CCJyxcblx0XHQn5om+5LiN5Yiw5oyJ6YiVICVz77yM6KuL5qqi5p+l5oKoIEphdmFTY3JpcHQg5qqU5qGI5Lit55qE6Kit5a6a44CCJ1xuXHQpLFxuXHQvLyBQb3B1cHMgc2V0dXBcblx0J09wZW4gZnVsbC1zaXplIGltYWdlJzogd2luZG93LndnVUxTKCfmn6XnnIvlhajlsLrlr7jlm77lg48nLCAn5qqi6KaW5YWo5bC65a+45b2x5YOPJyksXG5cdC8vIOS7peS4i+WGheWuueeUsSBBbm5BbmdlbGEg6KGl5q2jXG5cdGJpbmdTZWFyY2hIaW50OiB3aW5kb3cud2dVTFMoJ+WcqCBCaW5nIOS4iuaQnOe0ouKAnCVz4oCdJywgJ+WcqCBiaW5nIOS4iuaQnOWwi+OAjCVz44CNJyksXG5cdCdlbmFibGUgcHJldmlld3MnOiB3aW5kb3cud2dVTFMoJ+WQr+eUqOmihOiniCcsICfllZ/nlKjpoJDopr0nKSxcblx0J3Nob3cgcHJldmlldyc6IHdpbmRvdy53Z1VMUygn56aB55So6aKE6KeIJywgJ+emgeeUqOmgkOimvScpLFxuXHRoaXN0b3J5ZmVlZEhpbnQ6IHdpbmRvdy53Z1VMUygn6K+l6aG16Z2i55qE6L+R5pyf5pu05pS5IFJTUyBmZWVkJywgJ+ipsumggemdoueahOi/keacn+abtOaUuSBSU1MgZmVlZCcpLFxuXHQnc2VuZCB0aGFua3MnOiB3aW5kb3cud2dVTFMoJ+WPkemAgeaEn+iwoicsICflgrPpgIHmhJ/orJ0nKSxcblx0VGhhbmtzSGludDogd2luZG93LndnVUxTKCflkJHor6XnlKjmiLflj5HpgIHkuIDlsIHmhJ/osKLmtojmga8nLCAn5ZCR6Kmy5L2/55So6ICF5YKz6YCB5LiA5bCB5oSf6Kyd6KiK5oGvJyksXG5cdCdtYXJrIHBhdHJvbGxlZCc6IHdpbmRvdy53Z1VMUygn5qCH6K6w5Li65bey5beh5p+lJywgJ+aomeiomOeCuuW3suW3oeafpScpLFxuXHRtYXJrcGF0cm9sbGVkSGludDogd2luZG93LndnVUxTKCfmoIforrDor6XnvJbovpHkuLrlt7Llt6Hmn6UnLCAn5qiZ6KiY6Kmy57eo6Lyv54K65bey5beh5p+lJyksXG5cdCdDb3VsZCBub3QgbWFya2VkIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnOiB3aW5kb3cud2dVTFMoJ+aXoOazleagh+iusOivpee8lui+keS4uuW3suW3oeafpScsICfnhKHms5XmqJnoqJjoqbLnt6jovK/ngrrlt7Llt6Hmn6UnKSxcblx0ZGVmYXVsdHBvcHVwUmV2aWV3ZWRTdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+agh+iusOS7jueJiOacrCVz5YiwJXPpl7TnmoTnvJbovpHkuLrlt7Llt6Hmn6UnLCAn5qiZ6KiY5b6e54mI5pysJXPliLAlc+mWk+eahOe3qOi8r+eCuuW3suW3oeafpScpLFxuXHQnSW1hZ2UgZnJvbSBDb21tb25zJzogd2luZG93LndnVUxTKCfmnaXoh6rnu7Tln7rlhbHkuqvnmoTlm77niYcnLCAn5L6G6Ieq57at5Z+65YWx55So55qE5ZyW54mHJyksXG5cdCdEZXNjcmlwdGlvbiBwYWdlJzogd2luZG93LndnVUxTKCflm77niYfmj4/ov7DpobUnLCAn5ZyW54mH5o+P6L+w6aCBJyksXG5cdCdBbHQgdGV4dDonOiB3aW5kb3cud2dVTFMoJ+abv+aNouaWh+acrO+8iEFsdO+8ie+8micsICfmm7/mj5vmloflrZfvvIhBbHTvvInvvJonKSxcblx0cmV2ZGVsOiB3aW5kb3cud2dVTFMoJ+WOhuWPsueJiOacrOiiq+makOiXjycsICfmrbflj7LniYjmnKzooqvpmrHol48nKSxcblx0RGVsZXRlZGNvbnRyaWJ1dGlvbnNIaW50OiB3aW5kb3cud2dVTFMoJ+eUqOaItyVz55qE6KKr5Yig6Zmk57yW6L6R5qyh5pWwJywgJ+S9v+eUqOiAhSVz55qE6KKr5Yiq6Zmk57eo6Lyv5qyh5pW4JyksXG5cdCdObyBiYWNrbGlua3MgZm91bmQnOiB3aW5kb3cud2dVTFMoJ+aJvuS4jeWIsOmTvuWFpemhtemdoicsICfmib7kuI3liLDpj4jlhaXpoIHpnaInKSxcblx0JyBhbmQgbW9yZSc6IHdpbmRvdy53Z1VMUygn5Lul5Y+K5YW25LuW6aG16Z2iJywgJ+S7peWPiuWFtuS7lumggemdoicpLFxuXHQnRG93bmxvYWQgcHJldmlldyBkYXRhJzogd2luZG93LndnVUxTKCfkuIvovb3pooTop4jmlbDmja4nLCAn5LiL6LyJ6aCQ6Ka96LOH5paZJyksXG5cdCdOb3QgYSByZWdpc3RlcmVkIHVzZXJuYW1lJzogd2luZG93LndnVUxTKCfpnZ7lt7Lms6jlhoznmoTnlKjmiLcnLCAn6Z2e5bey6Ki75YaK55qE5L2/55So6ICFJyksXG5cdEJMT0NLRUQ6IHdpbmRvdy53Z1VMUygn6KKr5bCB56aBJywgJ+iiq+WwgemOlicpLFxuXHQnSGFzIGJsb2Nrcyc6IHdpbmRvdy53Z1VMUygn6KKr6YOo5YiG5bCB56aBJywgJ+iiq+mDqOWIhuWwgemOlicpLFxuXHQnIGVkaXRzIHNpbmNlOiAnOiB3aW5kb3cud2dVTFMoJ+asoee8lui+ke+8jOazqOWGjOaXpeacn+S4uicsICfmrKHnt6jovK/vvIzoqLvlhorml6XmnJ/ngronKSxcblx0J2xhc3QgZWRpdCBvbiAnOiB3aW5kb3cud2dVTFMoJ+acgOWQjuS4gOasoee8lui+keS6jicsICfmnIDlvozkuIDmrKHnt6jovK/mlrwnKSxcblx0RW1haWxVc2VySGludDogd2luZG93LndnVUxTKCfnu5kgJXMg5Y+R6YCB55S15a2Q6YKu5Lu2JywgJ+e1piAlcyDnmbzpgIHpm7vlrZDpg7Xku7YnKSxcblx0UkFOR0VCTE9DS0VEOiB3aW5kb3cud2dVTFMoJ0lQ5q616KKr5bCB56aBJywgJ0lQ5q616KKr5bCB6Y6WJyksXG5cdCdJUCB1c2VyJzogd2luZG93LndnVUxTKCdJUOeUqOaItycsICdJUOS9v+eUqOiAhScpLFxuXHQn4pmAJzogJ+KZgCcsXG5cdCfimYInOiAn4pmCJyxcblx0SElEREVOOiB3aW5kb3cud2dVTFMoJ+WFqOWfn+makOiXjycsICflhajln5/pmrHol48nKSxcblx0TE9DS0VEOiB3aW5kb3cud2dVTFMoJ+WFqOWfn+mUgeWumicsICflhajln5/pjpblrponKSxcblx0J0ludmFsaWQgdXNlcic6IHdpbmRvdy53Z1VMUygn6Z2e5rOV55So5oi35ZCNJywgJ+mdnuazleS9v+eUqOiAheWQjeeosScpLFxuXHRkaWZmOiB3aW5kb3cud2dVTFMoJ+W3ruW8gicsICflt67nlbAnKSxcblx0JyB0byAnOiAn6IezJyxcblxuXHRhdXRvZWRpdF92ZXJzaW9uOiAnbnAyMDE0MDQxNicsXG5cdFByZWZpeEluZGV4SGludDogd2luZG93LndnVUxTKCfmmL7npLrnlKjmiLclc+eahOWtkOmhtemdoicsICfpoa/npLrkvb/nlKjogIUlc+eahOWtkOmggemdoicpLFxuXHRudWxsRWRpdFN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6L+b6KGM5LiA5qyh6Zu257yW6L6RJywgJ+mAsuihjOS4gOasoembtue3qOi8rycpLFxuXHQvLyDnlKjmiLfnu4TlkI3np7Dku47ns7vnu5/mtojmga/ojrflj5Zcblx0J2dyb3VwLW5vLWF1dG9jb25maXJtZWQnOiB3aW5kb3cud2dVTFMoJ+mdnuiHquWKqOehruiupOeUqOaItycsICfpnZ7oh6rli5Xnorroqo3kvb/nlKjogIUnKSxcblx0c2VwYXJhdG9yOiAn44CBJyxcblx0Y29tbWE6ICfvvIwnLFxufTtcblxuZXhwb3J0IHttZXNzYWdlfTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuaW1wb3J0IHthcGl9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7bWVzc2FnZX0gZnJvbSAnLi9zdHJpbmcnO1xuXG5jb25zdCBwb3B1cHMgPSAoKSA9PiB7XG5cdC8vIFNUQVJURklMRTogbWFpbi5qc1xuXHQvLyBGaXggbGF0ZXJcblx0Ly8gR2xvYmFsc1xuXHQvL1xuXHQvLyBUcnlpbmcgdG8gc2hvdmUgYXMgbWFueSBvZiB0aGVzZSBhcyBwb3NzaWJsZSBpbnRvIHRoZSBwZyAocG9wdXAgZ2xvYmFscykgb2JqZWN0XG5cdGNvbnN0IHBnID0ge1xuXHRcdGFwaToge30sXG5cdFx0cmU6IHt9LFxuXHRcdG5zOiB7fSxcblx0XHRzdHJpbmc6IHt9LFxuXHRcdHdpa2k6IHt9LFxuXHRcdHVzZXI6IHt9LFxuXHRcdG1pc2M6IHt9LFxuXHRcdG9wdGlvbjoge30sXG5cdFx0b3B0aW9uRGVmYXVsdDoge30sXG5cdFx0ZmxhZzoge30sXG5cdFx0Y2FjaGU6IHt9LFxuXHRcdHN0cnVjdHVyZXM6IHt9LFxuXHRcdHRpbWVyOiB7fSxcblx0XHRjb3VudGVyOiB7fSxcblx0XHRjdXJyZW50OiB7fSxcblx0XHRmbjoge30sXG5cdFx0ZW5kb2ZsaXN0OiBudWxsLFxuXHR9O1xuXHQvKiBCYWlsIGlmIHRoZSBnYWRnZXQvc2NyaXB0IGlzIGJlaW5nIGxvYWRlZCB0d2ljZSAqL1xuXHQvKiBBbiBlbGVtZW50IHdpdGggaWQgXCJwZ1wiIHdvdWxkIGFkZCBhIHdpbmRvdy5wZyBwcm9wZXJ0eSwgaWdub3JlIHN1Y2ggcHJvcGVydHkgKi9cblx0aWYgKHdpbmRvdy5wZyAmJiAhKHdpbmRvdy5wZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuXHRcdHJldHVybjtcblx0fVxuXHQvKiBFeHBvcnQgdG8gZ2xvYmFsIGNvbnRleHQgKi9cblx0d2luZG93LnBnID0gcGc7XG5cdC8vIEVOREZJTEU6IG1haW4uanNcblx0Ly8gU1RBUlRGSUxFOiBhY3Rpb25zLmpzXG5cdGNvbnN0IHNldHVwVG9vbHRpcHMgPSAoY29udGFpbmVyLCByZW1vdmUsIGZvcmNlLCBwb3BEYXRhKSA9PiB7XG5cdFx0bG9nKGBzZXR1cFRvb2x0aXBzLCBjb250YWluZXI9JHtjb250YWluZXJ9LCByZW1vdmU9JHtyZW1vdmV9YCk7XG5cdFx0aWYgKCFjb250YWluZXIpIHtcblx0XHRcdC8vIHRoZSBtYWluIGluaXRpYWwgY2FsbFxuXHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwT25FZGl0U2VsZWN0aW9uJykgJiYgZG9jdW1lbnQgJiYgZG9jdW1lbnQuZWRpdGZvcm0gJiYgZG9jdW1lbnQuZWRpdGZvcm0ud3BUZXh0Ym94MSkge1xuXHRcdFx0XHRkb2N1bWVudC5lZGl0Zm9ybS53cFRleHRib3gxLm9ubW91c2V1cCA9IGRvU2VsZWN0aW9uUG9wdXA7XG5cdFx0XHR9XG5cdFx0XHQvLyBhcnRpY2xlL2NvbnRlbnQgaXMgYSBzdHJ1Y3R1cmUtZGVwZW5kZW50IHRoaW5nXG5cdFx0XHRjb250YWluZXIgPSBkZWZhdWx0UG9wdXBzQ29udGFpbmVyKCk7XG5cdFx0fVxuXHRcdGlmICghcmVtb3ZlICYmICFmb3JjZSAmJiBjb250YWluZXIucmFuU2V0dXBUb29sdGlwc0FscmVhZHkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29udGFpbmVyLnJhblNldHVwVG9vbHRpcHNBbHJlYWR5ID0gIXJlbW92ZTtcblx0XHRjb25zdCBhbmNob3JzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcblx0XHRzZXR1cFRvb2x0aXBzTG9vcChhbmNob3JzLCAwLCAyNTAsIDEwMCwgcmVtb3ZlLCBwb3BEYXRhKTtcblx0fTtcblx0Y29uc3QgZGVmYXVsdFBvcHVwc0NvbnRhaW5lciA9ICgpID0+IHtcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBPbmx5QXJ0aWNsZUxpbmtzJykpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5za2luLXZlY3Rvci0yMDIyIC52ZWN0b3ItYm9keScpIHx8XG5cdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd19jb250ZW50JykgfHxcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnQnKSB8fFxuXHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXJ0aWNsZScpIHx8XG5cdFx0XHRcdGRvY3VtZW50XG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gZG9jdW1lbnQ7XG5cdH07XG5cdGNvbnN0IHNldHVwVG9vbHRpcHNMb29wID0gZnVuY3Rpb24gc2V0dXBUb29sdGlwc0xvb3AoYW5jaG9ycywgYmVnaW4sIGhvd21hbnksIHNsZWVwLCByZW1vdmUsIHBvcERhdGEsIC4uLmFyZ3MpIHtcblx0XHRsb2coXG5cdFx0XHRzaW1wbGVQcmludGYoJ3NldHVwVG9vbHRpcHNMb29wKCVzLCVzLCVzLCVzLCVzKScsIFtcblx0XHRcdFx0YW5jaG9ycyxcblx0XHRcdFx0YmVnaW4sXG5cdFx0XHRcdGhvd21hbnksXG5cdFx0XHRcdHNsZWVwLFxuXHRcdFx0XHRyZW1vdmUsXG5cdFx0XHRcdHBvcERhdGEsXG5cdFx0XHRcdC4uLmFyZ3MsXG5cdFx0XHRdKVxuXHRcdCk7XG5cdFx0Y29uc3QgZmluaXNoID0gYmVnaW4gKyBob3dtYW55O1xuXHRcdGNvbnN0IGxvb3BlbmQgPSBNYXRoLm1pbihmaW5pc2gsIGFuY2hvcnMubGVuZ3RoKTtcblx0XHRsZXQgaiA9IGxvb3BlbmQgLSBiZWdpbjtcblx0XHRsb2coXG5cdFx0XHRgc2V0dXBUb29sdGlwczogYW5jaG9ycy5sZW5ndGg9JHthbmNob3JzLmxlbmd0aH0sIGJlZ2luPSR7YmVnaW59LCBob3dtYW55PSR7aG93bWFueX0sIGxvb3BlbmQ9JHtsb29wZW5kfSwgcmVtb3ZlPSR7cmVtb3ZlfWBcblx0XHQpO1xuXHRcdGNvbnN0IGRvVG9vbHRpcCA9IHJlbW92ZSA/IHJlbW92ZVRvb2x0aXAgOiBhZGRUb29sdGlwO1xuXHRcdC8vIHRyeSBhIGZhc3RlciAoPykgbG9vcCBjb25zdHJ1Y3Rcblx0XHRpZiAoaiA+IDApIHtcblx0XHRcdGRvIHtcblx0XHRcdFx0Y29uc3QgYSA9IGFuY2hvcnNbbG9vcGVuZCAtIGpdO1xuXHRcdFx0XHRpZiAoYSA9PT0gdW5kZWZpbmVkIHx8ICFhIHx8ICFhLmhyZWYpIHtcblx0XHRcdFx0XHRsb2coYGdvdCBudWxsIGFuY2hvciBhdCBpbmRleCAke2xvb3BlbmR9YCAtIGopO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRvVG9vbHRpcChhLCBwb3BEYXRhKTtcblx0XHRcdH0gd2hpbGUgKC0taik7XG5cdFx0fVxuXHRcdGlmIChmaW5pc2ggPCBhbmNob3JzLmxlbmd0aCkge1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHNldHVwVG9vbHRpcHNMb29wKGFuY2hvcnMsIGZpbmlzaCwgaG93bWFueSwgc2xlZXAsIHJlbW92ZSwgcG9wRGF0YSk7XG5cdFx0XHR9LCBzbGVlcCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghcmVtb3ZlICYmICFnZXRWYWx1ZU9mKCdwb3B1cFRvY0xpbmtzJykpIHtcblx0XHRcdFx0cm1Ub2NUb29sdGlwcygpO1xuXHRcdFx0fVxuXHRcdFx0cGcuZmxhZy5maW5pc2hlZExvYWRpbmcgPSB0cnVlO1xuXHRcdH1cblx0fTtcblx0Ly8gZWxpbWluYXRlIHBvcHVwcyBmcm9tIHRoZSBUT0Ncblx0Ly8gVGhpcyBhbHNvIGtpbGxzIGFueSBvbmNsaWNrIHN0dWZmIHRoYXQgdXNlZCB0byBiZSBnb2luZyBvbiBpbiB0aGUgdG9jXG5cdGNvbnN0IHJtVG9jVG9vbHRpcHMgPSAoKSA9PiB7XG5cdFx0Y29uc3QgdG9jID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvYycpO1xuXHRcdGlmICh0b2MpIHtcblx0XHRcdGNvbnN0IHRvY0xpbmtzID0gdG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcblx0XHRcdGNvbnN0IHRvY0xlbiA9IHRvY0xpbmtzLmxlbmd0aDtcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgdG9jTGVuOyArK2opIHtcblx0XHRcdFx0cmVtb3ZlVG9vbHRpcCh0b2NMaW5rc1tqXSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBhZGRUb29sdGlwID0gKGEsIHBvcERhdGEpID0+IHtcblx0XHRpZiAoIWlzUG9wdXBMaW5rKGEpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGEub25tb3VzZW92ZXIgPSBtb3VzZU92ZXJXaWtpTGluaztcblx0XHRhLm9ubW91c2VvdXQgPSBtb3VzZU91dFdpa2lMaW5rO1xuXHRcdGEub25tb3VzZWRvd24gPSBraWxsUG9wdXA7XG5cdFx0YS5oYXNQb3B1cCA9IHRydWU7XG5cdFx0YS5wb3BEYXRhID0gcG9wRGF0YTtcblx0fTtcblx0Y29uc3QgcmVtb3ZlVG9vbHRpcCA9IChhKSA9PiB7XG5cdFx0aWYgKCFhLmhhc1BvcHVwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGEub25tb3VzZW92ZXIgPSBudWxsO1xuXHRcdGEub25tb3VzZW91dCA9IG51bGw7XG5cdFx0aWYgKGEub3JpZ2luYWxUaXRsZSkge1xuXHRcdFx0YS50aXRsZSA9IGEub3JpZ2luYWxUaXRsZTtcblx0XHR9XG5cdFx0YS5oYXNQb3B1cCA9IGZhbHNlO1xuXHR9O1xuXHRjb25zdCByZW1vdmVUaXRsZSA9IChhKSA9PiB7XG5cdFx0aWYgKCFhLm9yaWdpbmFsVGl0bGUpIHtcblx0XHRcdGEub3JpZ2luYWxUaXRsZSA9IGEudGl0bGU7XG5cdFx0fVxuXHRcdGEudGl0bGUgPSAnJztcblx0fTtcblx0Y29uc3QgcmVzdG9yZVRpdGxlID0gKGEpID0+IHtcblx0XHRpZiAoYS50aXRsZSB8fCAhYS5vcmlnaW5hbFRpdGxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGEudGl0bGUgPSBhLm9yaWdpbmFsVGl0bGU7XG5cdH07XG5cdGNvbnN0IHJlZ2lzdGVySG9va3MgPSAobnApID0+IHtcblx0XHRjb25zdCBwb3B1cE1heFdpZHRoID0gZ2V0VmFsdWVPZigncG9wdXBNYXhXaWR0aCcpO1xuXHRcdGlmICh0eXBlb2YgcG9wdXBNYXhXaWR0aCA9PT0gJ251bWJlcicpIHtcblx0XHRcdGNvbnN0IHNldE1heFdpZHRoID0gKCkgPT4ge1xuXHRcdFx0XHRucC5tYWluRGl2LnN0eWxlLm1heFdpZHRoID0gYCR7cG9wdXBNYXhXaWR0aH1weGA7XG5cdFx0XHRcdG5wLm1heFdpZHRoID0gcG9wdXBNYXhXaWR0aDtcblx0XHRcdH07XG5cdFx0XHRucC5hZGRIb29rKHNldE1heFdpZHRoLCAndW5oaWRlJywgJ2JlZm9yZScpO1xuXHRcdH1cblx0XHRucC5hZGRIb29rKGFkZFBvcHVwU2hvcnRjdXRzLCAndW5oaWRlJywgJ2FmdGVyJyk7XG5cdFx0bnAuYWRkSG9vayhybVBvcHVwU2hvcnRjdXRzLCAnaGlkZScsICdiZWZvcmUnKTtcblx0fTtcblx0Y29uc3QgcmVtb3ZlTW9kaWZpZXJLZXlMaXN0ZW5lciA9IChhKSA9PiB7XG5cdFx0Ly8gcmVtb3ZlIGxpc3RlbmVycyBmb3IgbW9kaWZpZXIga2V5IGlmIGFueSB0aGF0IHdlcmUgYWRkZWQgaW4gbW91c2VPdmVyV2lraUxpbmtcblx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgYS5tb2RpZmllcktleUxpc3RlbmVyLCBmYWxzZSk7XG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBhLm1vZGlmaWVyS2V5TGlzdGVuZXIsIGZhbHNlKTtcblx0fTtcblx0Y29uc3QgbW91c2VPdmVyV2lraUxpbmsgPSBmdW5jdGlvbiBtb3VzZU92ZXJXaWtpTGluayhldnQpIHtcblx0XHRpZiAoIWV2dCAmJiB3aW5kb3cuZXZlbnQpIHtcblx0XHRcdGV2dCA9IHdpbmRvdy5ldmVudDtcblx0XHR9XG5cdFx0Ly8gaWYgdGhlIG1vZGlmaWVyIGlzIG5lZWRlZCwgbGlzdGVuIGZvciBpdCxcblx0XHQvLyB3ZSB3aWxsIHJlbW92ZSB0aGUgbGlzdGVuZXIgd2hlbiB3ZSBtb3VzZW91dCBvZiB0aGlzIGxpbmsgb3Iga2lsbCBwb3B1cC5cblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBNb2RpZmllcicpKSB7XG5cdFx0XHQvLyBpZiBwb3B1cE1vZGlmaWVyQWN0aW9uID0gZW5hYmxlLCB3ZSBzaG91bGQgcG9wdXAgd2hlbiB0aGUgbW9kaWZpZXIgaXMgcHJlc3NlZFxuXHRcdFx0Ly8gaWYgcG9wdXBNb2RpZmllckFjdGlvbiA9IGRpc2FibGUsIHdlIHNob3VsZCBwb3B1cCB1bmxlc3MgdGhlIG1vZGlmaWVyIGlzIHByZXNzZWRcblx0XHRcdGNvbnN0IGFjdGlvbiA9IGdldFZhbHVlT2YoJ3BvcHVwTW9kaWZpZXJBY3Rpb24nKTtcblx0XHRcdGNvbnN0IGtleSA9IGFjdGlvbiA9PT0gJ2Rpc2FibGUnID8gJ2tleXVwJyA6ICdrZXlkb3duJztcblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0c2VsZi5tb2RpZmllcktleUxpc3RlbmVyID0gKGV2dCkgPT4ge1xuXHRcdFx0XHRtb3VzZU92ZXJXaWtpTGluazIoc2VsZiwgZXZ0KTtcblx0XHRcdH07XG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGtleSwgc2VsZi5tb2RpZmllcktleUxpc3RlbmVyLCBmYWxzZSk7XG5cdFx0fVxuXHRcdHJldHVybiBtb3VzZU92ZXJXaWtpTGluazIodGhpcywgZXZ0KTtcblx0fTtcblx0LyoqXG5cdCAqIEdldHMgdGhlIHJlZmVyZW5jZXMgbGlzdCBpdGVtIHRoYXQgdGhlIHByb3ZpZGVkIGZvb3Rub3RlIGxpbmsgdGFyZ2V0cy4gVGhpc1xuXHQgKiBpcyB0eXBpY2FsbHkgYSBsaSBlbGVtZW50IHdpdGhpbiB0aGUgb2wucmVmZXJlbmNlcyBlbGVtZW50IGluc2lkZSB0aGUgcmVmbGlzdC5cblx0ICpcblx0ICogQHBhcmFtIHtFbGVtZW50fSBhIC0gQSBmb290bm90ZSBsaW5rLlxuXHQgKiBAcmV0dXJuIHtFbGVtZW50fGJvb2xlYW59IFRoZSB0YXJnZXRlZCBlbGVtZW50LCBvciBmYWxzZSBpZiBvbmUgY2FuJ3QgYmUgZm91bmQuXG5cdCAqL1xuXHRjb25zdCBmb290bm90ZVRhcmdldCA9IChhKSA9PiB7XG5cdFx0Y29uc3QgYVRpdGxlID0gVGl0bGUuZnJvbUFuY2hvcihhKTtcblx0XHQvLyBXZSB3YW50IFwiLjNBXCIgcmF0aGVyIHRoYW4gXCIlM0FcIiBvciBcIj9cIiBoZXJlLCBzbyB1c2UgdGhlIGFuY2hvciBwcm9wZXJ0eSBkaXJlY3RseVxuXHRcdGNvbnN0IGFuY2ggPSBhVGl0bGUuYW5jaG9yO1xuXHRcdGlmICghL14oY2l0ZV9ub3RlLXxfbm90ZS18ZW5kbm90ZSkvLnRlc3QoYW5jaCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgbFRpdGxlID0gVGl0bGUuZnJvbVVSTChsb2NhdGlvbi5ocmVmKTtcblx0XHRpZiAobFRpdGxlLnRvU3RyaW5nKHRydWUpICE9PSBhVGl0bGUudG9TdHJpbmcodHJ1ZSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0bGV0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7YW5jaH1gKTtcblx0XHR3aGlsZSAoZWwgJiYgdHlwZW9mIGVsLm5vZGVOYW1lID09PSAnc3RyaW5nJykge1xuXHRcdFx0Y29uc3QgbnQgPSBlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aWYgKG50ID09PSAnbGknKSB7XG5cdFx0XHRcdHJldHVybiBlbDtcblx0XHRcdH0gZWxzZSBpZiAobnQgPT09ICdib2R5Jykge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKGVsLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0ZWwgPSBlbC5wYXJlbnROb2RlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cdGNvbnN0IGZvb3Rub3RlUHJldmlldyA9ICh4LCBuYXZwb3ApID0+IHtcblx0XHRzZXRQb3B1cEhUTUwoYDxocj4ke3guaW5uZXJIVE1MfWAsICdwb3B1cFByZXZpZXcnLCBuYXZwb3AuaWROdW1iZXIpO1xuXHR9O1xuXHRjb25zdCBtb2RpZmllclByZXNzZWQgPSAoZXZ0KSA9PiB7XG5cdFx0Y29uc3QgbW9kID0gZ2V0VmFsdWVPZigncG9wdXBNb2RpZmllcicpO1xuXHRcdGlmICghbW9kKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghZXZ0ICYmIHdpbmRvdy5ldmVudCkge1xuXHRcdFx0ZXZ0ID0gd2luZG93LmV2ZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gZXZ0ICYmIG1vZCAmJiBldnRbYCR7bW9kLnRvTG93ZXJDYXNlKCl9S2V5YF07XG5cdH07XG5cdC8vIENoZWNrcyBpZiB0aGUgY29ycmVjdCBtb2RpZmllciBwcmVzc2VkL3VucHJlc3NlZCBpZiBuZWVkZWRcblx0Y29uc3QgaXNDb3JyZWN0TW9kaWZpZXIgPSAoX2EsIGV2dCkgPT4ge1xuXHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBNb2RpZmllcicpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0Ly8gaWYgcG9wdXBNb2RpZmllckFjdGlvbiA9IGVuYWJsZSwgd2Ugc2hvdWxkIHBvcHVwIHdoZW4gdGhlIG1vZGlmaWVyIGlzIHByZXNzZWRcblx0XHQvLyBpZiBwb3B1cE1vZGlmaWVyQWN0aW9uID0gZGlzYWJsZSwgd2Ugc2hvdWxkIHBvcHVwIHVubGVzcyB0aGUgbW9kaWZpZXIgaXMgcHJlc3NlZFxuXHRcdGNvbnN0IGFjdGlvbiA9IGdldFZhbHVlT2YoJ3BvcHVwTW9kaWZpZXJBY3Rpb24nKTtcblx0XHRyZXR1cm4gKGFjdGlvbiA9PT0gJ2VuYWJsZScgJiYgbW9kaWZpZXJQcmVzc2VkKGV2dCkpIHx8IChhY3Rpb24gPT09ICdkaXNhYmxlJyAmJiAhbW9kaWZpZXJQcmVzc2VkKGV2dCkpO1xuXHR9O1xuXHRjb25zdCBtb3VzZU92ZXJXaWtpTGluazIgPSAoYSwgZXZ0KSA9PiB7XG5cdFx0aWYgKCFpc0NvcnJlY3RNb2RpZmllcihhLCBldnQpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChnZXRWYWx1ZU9mKCdyZW1vdmVUaXRsZXMnKSkge1xuXHRcdFx0cmVtb3ZlVGl0bGUoYSk7XG5cdFx0fVxuXHRcdGlmIChhID09PSBwZy5jdXJyZW50LmxpbmsgJiYgYS5uYXZwb3B1cCAmJiBhLm5hdnBvcHVwLmlzVmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHBnLmN1cnJlbnQubGluayA9IGE7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3NpbXBsZVBvcHVwcycpICYmICFwZy5vcHRpb24ucG9wdXBTdHJ1Y3R1cmUpIHtcblx0XHRcdC8vIHJlc2V0ICpkZWZhdWx0IHZhbHVlKiBvZiBwb3B1cFN0cnVjdHVyZVxuXHRcdFx0c2V0RGVmYXVsdCgncG9wdXBTdHJ1Y3R1cmUnLCAnb3JpZ2luYWwnKTtcblx0XHR9XG5cdFx0Y29uc3QgYXJ0aWNsZSA9IG5ldyBUaXRsZSgpLmZyb21BbmNob3IoYSk7XG5cdFx0Ly8gc2V0IGdsb2JhbCB2YXJpYWJsZSAodWdoKSB0byBob2xkIGFydGljbGUgKHdpa2lwYWdlKVxuXHRcdHBnLmN1cnJlbnQuYXJ0aWNsZSA9IGFydGljbGU7XG5cdFx0aWYgKCFhLm5hdnBvcHVwKSB7XG5cdFx0XHRhLm5hdnBvcHVwID0gbmV3TmF2cG9wdXAoYSwgYXJ0aWNsZSk7XG5cdFx0XHRwZy5jdXJyZW50LmxpbmtzSGFzaFthLmhyZWZdID0gYS5uYXZwb3B1cDtcblx0XHRcdHBnLmN1cnJlbnQubGlua3MucHVzaChhKTtcblx0XHR9XG5cdFx0aWYgKGEubmF2cG9wdXAucGVuZGluZyA9PT0gbnVsbCB8fCBhLm5hdnBvcHVwLnBlbmRpbmcgIT09IDApIHtcblx0XHRcdC8vIGVpdGhlciBmcmVzaCBwb3B1cHMgb3IgdGhvc2Ugd2l0aCB1bmZpbnNoZWQgYnVzaW5lc3MgYXJlIHJlZG9uZSBmcm9tIHNjcmF0Y2hcblx0XHRcdHNpbXBsZVBvcHVwQ29udGVudChhLCBhcnRpY2xlKTtcblx0XHR9XG5cdFx0YS5uYXZwb3B1cC5zaG93U29vbklmU3RhYmxlKGEubmF2cG9wdXAuZGVsYXkpO1xuXHRcdGNsZWFySW50ZXJ2YWwocGcudGltZXIuY2hlY2tQb3B1cFBvc2l0aW9uKTtcblx0XHRwZy50aW1lci5jaGVja1BvcHVwUG9zaXRpb24gPSBzZXRJbnRlcnZhbChjaGVja1BvcHVwUG9zaXRpb24sIDYwMCk7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3NpbXBsZVBvcHVwcycpICYmIGdldFZhbHVlT2YoJ3BvcHVwUHJldmlld0J1dHRvbicpICYmICFhLnNpbXBsZU5vTW9yZSkge1xuXHRcdFx0Y29uc3QgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0ZC5jbGFzc05hbWUgPSAncG9wdXBQcmV2aWV3QnV0dG9uRGl2Jztcblx0XHRcdGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cdFx0XHRkLmFwcGVuZChzKTtcblx0XHRcdHMuY2xhc3NOYW1lID0gJ3BvcHVwUHJldmlld0J1dHRvbic7XG5cdFx0XHRzW2BvbiR7Z2V0VmFsdWVPZigncG9wdXBQcmV2aWV3QnV0dG9uRXZlbnQnKX1gXSA9ICgpID0+IHtcblx0XHRcdFx0YS5zaW1wbGVOb01vcmUgPSB0cnVlO1xuXHRcdFx0XHRkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRcdG5vbnNpbXBsZVBvcHVwQ29udGVudChhLCBhcnRpY2xlKTtcblx0XHRcdH07XG5cdFx0XHRzLmlubmVySFRNTCA9IHBvcHVwU3RyaW5nKCdzaG93IHByZXZpZXcnKTtcblx0XHRcdHNldFBvcHVwSFRNTChkLCAncG9wdXBQcmV2aWV3JywgYS5uYXZwb3B1cC5pZE51bWJlcik7XG5cdFx0fVxuXHRcdGlmIChhLm5hdnBvcHVwLnBlbmRpbmcgIT09IDApIHtcblx0XHRcdG5vbnNpbXBsZVBvcHVwQ29udGVudChhLCBhcnRpY2xlKTtcblx0XHR9XG5cdH07XG5cdC8vIHNpbXBsZVBvcHVwQ29udGVudDogdGhlIGNvbnRlbnQgdGhhdCBkbyBub3QgcmVxdWlyZSBhZGRpdGlvbmFsIGRvd25sb2FkXG5cdC8vIChpdCBpcyBzaG93biBldmVuIHdoZW4gc2ltcGxlUG9wdXBzIGlzIHRydWUpXG5cdGNvbnN0IHNpbXBsZVBvcHVwQ29udGVudCA9IChhLCBhcnRpY2xlKSA9PiB7XG5cdFx0LyogRklYTUUgaGFjayAqL1xuXHRcdGEubmF2cG9wdXAuaGFzUG9wdXBNZW51ID0gZmFsc2U7XG5cdFx0YS5uYXZwb3B1cC5zZXRJbm5lckhUTUwocG9wdXBIVE1MKGEpKTtcblx0XHRmaWxsRW1wdHlTcGFucyh7XG5cdFx0XHRuYXZwb3B1cDogYS5uYXZwb3B1cCxcblx0XHR9KTtcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBEcmFnZ2FibGUnKSkge1xuXHRcdFx0bGV0IGRyYWdIYW5kbGUgPSBnZXRWYWx1ZU9mKCdwb3B1cERyYWdIYW5kbGUnKSB8fCBudWxsO1xuXHRcdFx0aWYgKGRyYWdIYW5kbGUgJiYgZHJhZ0hhbmRsZSAhPT0gJ2FsbCcpIHtcblx0XHRcdFx0ZHJhZ0hhbmRsZSArPSBhLm5hdnBvcHVwLmlkTnVtYmVyO1xuXHRcdFx0fVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGEubmF2cG9wdXAubWFrZURyYWdnYWJsZShkcmFnSGFuZGxlKTtcblx0XHRcdH0sIDE1MCk7XG5cdFx0fVxuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFJlZGxpbmtSZW1vdmFsJykgJiYgYS5jbGFzc05hbWUgPT09ICduZXcnKSB7XG5cdFx0XHRzZXRQb3B1cEhUTUwoYDxicj4ke3BvcHVwUmVkbGlua0hUTUwoYXJ0aWNsZSl9YCwgJ3BvcHVwUmVkbGluaycsIGEubmF2cG9wdXAuaWROdW1iZXIpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZGVidWdEYXRhID0gKG5hdnBvcHVwKSA9PiB7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwRGVidWdnaW5nJykgJiYgbmF2cG9wdXAuaWROdW1iZXIpIHtcblx0XHRcdHNldFBvcHVwSFRNTChgaWROdW1iZXI9JHtuYXZwb3B1cC5pZE51bWJlcn0sIHBlbmRpbmc9JHtuYXZwb3B1cC5wZW5kaW5nfWAsICdwb3B1cEVycm9yJywgbmF2cG9wdXAuaWROdW1iZXIpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgbmV3TmF2cG9wdXAgPSAoYSwgYXJ0aWNsZSkgPT4ge1xuXHRcdGNvbnN0IG5hdnBvcHVwID0gbmV3IE5hdnBvcHVwKCk7XG5cdFx0bmF2cG9wdXAuZnV6eiA9IDU7XG5cdFx0bmF2cG9wdXAuZGVsYXkgPSBnZXRWYWx1ZU9mKCdwb3B1cERlbGF5JykgKiAxMDAwO1xuXHRcdC8vIGluY3JlbWVudCBnbG9iYWwgY291bnRlciBub3dcblx0XHRuYXZwb3B1cC5pZE51bWJlciA9ICsrcGcuaWROdW1iZXI7XG5cdFx0bmF2cG9wdXAucGFyZW50QW5jaG9yID0gYTtcblx0XHRuYXZwb3B1cC5wYXJlbnRQb3B1cCA9IGEucG9wRGF0YSAmJiBhLnBvcERhdGEub3duZXI7XG5cdFx0bmF2cG9wdXAuYXJ0aWNsZSA9IGFydGljbGU7XG5cdFx0cmVnaXN0ZXJIb29rcyhuYXZwb3B1cCk7XG5cdFx0cmV0dXJuIG5hdnBvcHVwO1xuXHR9O1xuXHQvLyBTaG91bGQgd2Ugc2hvdyBub25zaW1wbGUgY29udGV4dD9cblx0Ly8gSWYgc2ltcGxlUG9wdXBzIGlzIHNldCB0byB0cnVlLCB0aGVuIHdlIGRvIG5vdCBzaG93IG5vbnNpbXBsZSBjb250ZXh0LFxuXHQvLyBidXQgaWYgYSBib3R0b20gXCJzaG93IHByZXZpZXdcIiB3YXMgY2xpY2tlZCB3ZSBkbyBzaG93IG5vbnNpbXBsZSBjb250ZXh0XG5cdGNvbnN0IHNob3VsZFNob3dOb25TaW1wbGUgPSAoYSkgPT4ge1xuXHRcdHJldHVybiAhZ2V0VmFsdWVPZignc2ltcGxlUG9wdXBzJykgfHwgYS5zaW1wbGVOb01vcmU7XG5cdH07XG5cdC8vIFNob3VsZCB3ZSBzaG93IG5vbnNpbXBsZSBjb250ZXh0IGdvdmVybiBieSB0aGUgb3B0aW9uIChlLmcuIHBvcHVwVXNlckluZm8pP1xuXHQvLyBJZiB0aGUgdXNlciBleHBsaWNpdGx5IGFza2VkIGZvciBub25zaW1wbGUgY29udGV4dCBieSBzZXR0aW5nIHRoZSBvcHRpb24gdG8gdHJ1ZSxcblx0Ly8gdGhlbiB3ZSBzaG93IGl0IGV2ZW4gaW4gbm9uc2ltcGxlIG1vZGUuXG5cdGNvbnN0IHNob3VsZFNob3cgPSAoYSwgb3B0aW9uKSA9PiB7XG5cdFx0aWYgKHNob3VsZFNob3dOb25TaW1wbGUoYSkpIHtcblx0XHRcdHJldHVybiBnZXRWYWx1ZU9mKG9wdGlvbik7XG5cdFx0fVxuXHRcdHJldHVybiB3aW5kb3dbb3B0aW9uXSAhPT0gdW5kZWZpbmVkICYmIHdpbmRvd1tvcHRpb25dO1xuXHR9O1xuXHRjb25zdCBub25zaW1wbGVQb3B1cENvbnRlbnQgPSAoYSwgYXJ0aWNsZSkgPT4ge1xuXHRcdGxldCBkaWZmO1xuXHRcdGxldCBoaXN0b3J5O1xuXHRcdGNvbnN0IHBhcmFtcyA9IHBhcnNlUGFyYW1zKGEuaHJlZik7XG5cdFx0Y29uc3Qgb2xkaWQgPSBwYXJhbXMub2xkaWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBwYXJhbXMub2xkaWQ7XG5cdFx0aWYgKHNob3VsZFNob3coYSwgJ3BvcHVwUHJldmlld0RpZmZzJykpIHtcblx0XHRcdCh7ZGlmZn0gPSBwYXJhbXMpO1xuXHRcdH1cblx0XHRpZiAoc2hvdWxkU2hvdyhhLCAncG9wdXBQcmV2aWV3SGlzdG9yeScpKSB7XG5cdFx0XHRoaXN0b3J5ID0gcGFyYW1zLmFjdGlvbiA9PT0gJ2hpc3RvcnknO1xuXHRcdH1cblx0XHRhLm5hdnBvcHVwLnBlbmRpbmcgPSAwO1xuXHRcdGNvbnN0IHJlZmVyZW5jZUVsZW1lbnQgPSBmb290bm90ZVRhcmdldChhKTtcblx0XHRpZiAocmVmZXJlbmNlRWxlbWVudCkge1xuXHRcdFx0Zm9vdG5vdGVQcmV2aWV3KHJlZmVyZW5jZUVsZW1lbnQsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSBpZiAoZGlmZiB8fCBkaWZmID09PSAwKSB7XG5cdFx0XHRsb2FkRGlmZihhcnRpY2xlLCBvbGRpZCwgZGlmZiwgYS5uYXZwb3B1cCk7XG5cdFx0fSBlbHNlIGlmIChoaXN0b3J5KSB7XG5cdFx0XHRsb2FkQVBJUHJldmlldygnaGlzdG9yeScsIGFydGljbGUsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSBpZiAoc2hvdWxkU2hvd05vblNpbXBsZShhKSAmJiBwZy5yZS5jb250cmlicy50ZXN0KGEuaHJlZikpIHtcblx0XHRcdGxvYWRBUElQcmV2aWV3KCdjb250cmlicycsIGFydGljbGUsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSBpZiAoc2hvdWxkU2hvd05vblNpbXBsZShhKSAmJiBwZy5yZS5iYWNrbGlua3MudGVzdChhLmhyZWYpKSB7XG5cdFx0XHRsb2FkQVBJUHJldmlldygnYmFja2xpbmtzJywgYXJ0aWNsZSwgYS5uYXZwb3B1cCk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdC8vIEZJWE1FIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhbGwgcHJldmlldyBjb21iaW5hdGlvbnMgd2l0aCBvcHRpb25zXG5cdFx0XHRhcnRpY2xlLm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zSW1hZ2VJZCAmJlxuXHRcdFx0KHNob3VsZFNob3coYSwgJ2ltYWdlUG9wdXBzRm9ySW1hZ2VzJykgfHwgIWFuY2hvckNvbnRhaW5zSW1hZ2UoYSkpXG5cdFx0KSB7XG5cdFx0XHRsb2FkQVBJUHJldmlldygnaW1hZ2VwYWdlcHJldmlldycsIGFydGljbGUsIGEubmF2cG9wdXApO1xuXHRcdFx0bG9hZEltYWdlKGFydGljbGUsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYXJ0aWNsZS5uYW1lc3BhY2VJZCgpID09PSBwZy5uc0NhdGVnb3J5SWQgJiYgc2hvdWxkU2hvdyhhLCAncG9wdXBDYXRlZ29yeU1lbWJlcnMnKSkge1xuXHRcdFx0XHRsb2FkQVBJUHJldmlldygnY2F0ZWdvcnknLCBhcnRpY2xlLCBhLm5hdnBvcHVwKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChhcnRpY2xlLm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zVXNlcklkIHx8IGFydGljbGUubmFtZXNwYWNlSWQoKSA9PT0gcGcubnNVc2VydGFsa0lkKSAmJlxuXHRcdFx0XHRzaG91bGRTaG93KGEsICdwb3B1cFVzZXJJbmZvJylcblx0XHRcdCkge1xuXHRcdFx0XHRsb2FkQVBJUHJldmlldygndXNlcmluZm8nLCBhcnRpY2xlLCBhLm5hdnBvcHVwKTtcblx0XHRcdH1cblx0XHRcdGlmIChzaG91bGRTaG93Tm9uU2ltcGxlKGEpKSB7XG5cdFx0XHRcdHN0YXJ0QXJ0aWNsZVByZXZpZXcoYXJ0aWNsZSwgb2xkaWQsIGEubmF2cG9wdXApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgcGVuZGluZ05hdnBvcFRhc2sgPSAobmF2cG9wKSA9PiB7XG5cdFx0aWYgKG5hdnBvcCAmJiBuYXZwb3AucGVuZGluZyA9PT0gbnVsbCkge1xuXHRcdFx0bmF2cG9wLnBlbmRpbmcgPSAwO1xuXHRcdH1cblx0XHQrK25hdnBvcC5wZW5kaW5nO1xuXHRcdGRlYnVnRGF0YShuYXZwb3ApO1xuXHR9O1xuXHRjb25zdCBjb21wbGV0ZWROYXZwb3BUYXNrID0gKG5hdnBvcCkgPT4ge1xuXHRcdGlmIChuYXZwb3AgJiYgbmF2cG9wLnBlbmRpbmcpIHtcblx0XHRcdC0tbmF2cG9wLnBlbmRpbmc7XG5cdFx0fVxuXHRcdGRlYnVnRGF0YShuYXZwb3ApO1xuXHR9O1xuXHRjb25zdCBzdGFydEFydGljbGVQcmV2aWV3ID0gKGFydGljbGUsIG9sZGlkLCBuYXZwb3ApID0+IHtcblx0XHRuYXZwb3AucmVkaXIgPSAwO1xuXHRcdGxvYWRQcmV2aWV3KGFydGljbGUsIG9sZGlkLCBuYXZwb3ApO1xuXHR9O1xuXHRjb25zdCBsb2FkUHJldmlldyA9IChhcnRpY2xlLCBvbGRpZCwgbmF2cG9wKSA9PiB7XG5cdFx0aWYgKCFuYXZwb3AucmVkaXIpIHtcblx0XHRcdG5hdnBvcC5vcmlnaW5hbEFydGljbGUgPSBhcnRpY2xlO1xuXHRcdH1cblx0XHRhcnRpY2xlLm9sZGlkID0gb2xkaWQ7XG5cdFx0bG9hZEFQSVByZXZpZXcoJ3JldmlzaW9uJywgYXJ0aWNsZSwgbmF2cG9wKTtcblx0fTtcblx0Y29uc3QgbG9hZFByZXZpZXdGcm9tUmVkaXIgPSAocmVkaXJNYXRjaCwgbmF2cG9wKSA9PiB7XG5cdFx0Ly8gcmVkaXJNYXRjaCBpcyBhIHJlZ2V4IG1hdGNoXG5cdFx0Y29uc3QgdGFyZ2V0ID0gbmV3IFRpdGxlKCkuZnJvbVdpa2lUZXh0KHJlZGlyTWF0Y2hbMl0pO1xuXHRcdC8vIG92ZXJ3cml0ZSAob3IgYWRkKSBhbmNob3IgZnJvbSBvcmlnaW5hbCB0YXJnZXRcblx0XHQvLyBtZWRpYXdpa2kgZG9lcyBvdmVyd3JpdGVcblx0XHRpZiAobmF2cG9wLmFydGljbGUuYW5jaG9yKSB7XG5cdFx0XHR0YXJnZXQuYW5jaG9yID0gbmF2cG9wLmFydGljbGUuYW5jaG9yO1xuXHRcdH1cblx0XHRuYXZwb3AucmVkaXIrKztcblx0XHRuYXZwb3AucmVkaXJUYXJnZXQgPSB0YXJnZXQ7XG5cdFx0Y29uc3Qgd2FyblJlZGlyID0gcmVkaXJMaW5rKHRhcmdldCwgbmF2cG9wLmFydGljbGUpO1xuXHRcdHNldFBvcHVwSFRNTCh3YXJuUmVkaXIsICdwb3B1cFdhcm5SZWRpcicsIG5hdnBvcC5pZE51bWJlcik7XG5cdFx0bmF2cG9wLmFydGljbGUgPSB0YXJnZXQ7XG5cdFx0ZmlsbEVtcHR5U3BhbnMoe1xuXHRcdFx0cmVkaXI6IHRydWUsXG5cdFx0XHRyZWRpclRhcmdldDogdGFyZ2V0LFxuXHRcdFx0bmF2cG9wdXA6IG5hdnBvcCxcblx0XHR9KTtcblx0XHRyZXR1cm4gbG9hZFByZXZpZXcodGFyZ2V0LCBudWxsLCBuYXZwb3ApO1xuXHR9O1xuXHRjb25zdCBpbnNlcnRQcmV2aWV3ID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0aWYgKCFkb3dubG9hZC5vd25lcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCByZWRpck1hdGNoID0gcGcucmUucmVkaXJlY3QuZXhlYyhkb3dubG9hZC5kYXRhKTtcblx0XHRpZiAoZG93bmxvYWQub3duZXIucmVkaXIgPT09IDAgJiYgcmVkaXJNYXRjaCkge1xuXHRcdFx0bG9hZFByZXZpZXdGcm9tUmVkaXIocmVkaXJNYXRjaCwgZG93bmxvYWQub3duZXIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZG93bmxvYWQub3duZXIudmlzaWJsZSB8fCAhZ2V0VmFsdWVPZigncG9wdXBMYXp5UHJldmlld3MnKSkge1xuXHRcdFx0aW5zZXJ0UHJldmlld05vdyhkb3dubG9hZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGlkID0gZG93bmxvYWQub3duZXIucmVkaXIgPyAnUFJFVklFV19SRURJUl9IT09LJyA6ICdQUkVWSUVXX0hPT0snO1xuXHRcdFx0ZG93bmxvYWQub3duZXIuYWRkSG9vayhcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGluc2VydFByZXZpZXdOb3coZG93bmxvYWQpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQndW5oaWRlJyxcblx0XHRcdFx0J2FmdGVyJyxcblx0XHRcdFx0aWRcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBpbnNlcnRQcmV2aWV3Tm93ID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0aWYgKCFkb3dubG9hZC5vd25lcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB3aWtpVGV4dCA9IGRvd25sb2FkLmRhdGE7XG5cdFx0Y29uc3QgbmF2cG9wID0gZG93bmxvYWQub3duZXI7XG5cdFx0Y29uc3QgYXJ0ID0gbmF2cG9wLnJlZGlyVGFyZ2V0IHx8IG5hdnBvcC5vcmlnaW5hbEFydGljbGU7XG5cdFx0bWFrZUZpeERhYnMod2lraVRleHQsIG5hdnBvcCk7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwU3VtbWFyeURhdGEnKSkge1xuXHRcdFx0Z2V0UGFnZUluZm8od2lraVRleHQsIGRvd25sb2FkKTtcblx0XHRcdHNldFBvcHVwVHJhaWxlcihnZXRQYWdlSW5mbyh3aWtpVGV4dCwgZG93bmxvYWQpLCBuYXZwb3AuaWROdW1iZXIpO1xuXHRcdH1cblx0XHRsZXQgaW1hZ2VQYWdlID0gJyc7XG5cdFx0aW1hZ2VQYWdlID0gYXJ0Lm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zSW1hZ2VJZCA/IGFydC50b1N0cmluZygpIDogZ2V0VmFsaWRJbWFnZUZyb21XaWtpVGV4dCh3aWtpVGV4dCk7XG5cdFx0aWYgKGltYWdlUGFnZSkge1xuXHRcdFx0bG9hZEltYWdlKFRpdGxlLmZyb21XaWtpVGV4dChpbWFnZVBhZ2UpLCBuYXZwb3ApO1xuXHRcdH1cblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBQcmV2aWV3cycpKSB7XG5cdFx0XHRpbnNlcnRBcnRpY2xlUHJldmlldyhkb3dubG9hZCwgYXJ0LCBuYXZwb3ApO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgaW5zZXJ0QXJ0aWNsZVByZXZpZXcgPSAoZG93bmxvYWQsIGFydCwgbmF2cG9wKSA9PiB7XG5cdFx0aWYgKGRvd25sb2FkICYmIHR5cGVvZiBkb3dubG9hZC5kYXRhID09PSB0eXBlb2YgJycpIHtcblx0XHRcdGlmIChhcnQubmFtZXNwYWNlSWQoKSA9PT0gcGcubnNUZW1wbGF0ZUlkICYmIGdldFZhbHVlT2YoJ3BvcHVwUHJldmlld1Jhd1RlbXBsYXRlcycpKSB7XG5cdFx0XHRcdC8vIEZJWE1FIGNvbXBhcmUvY29uc29saWRhdGUgd2l0aCBkaWZmIGVzY2FwaW5nIGNvZGUgZm9yIHdpa2l0ZXh0XG5cdFx0XHRcdGNvbnN0IGggPSBgPGhyPjxzcGFuIHN0eWxlPVwiZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj4ke2Rvd25sb2FkLmRhdGFcblx0XHRcdFx0XHQuZW50aWZ5KClcblx0XHRcdFx0XHQuc3BsaXQoJ1xcXFxuJylcblx0XHRcdFx0XHQuam9pbignPGJyPlxcXFxuJyl9PC9zcGFuPmA7XG5cdFx0XHRcdHNldFBvcHVwSFRNTChoLCAncG9wdXBQcmV2aWV3JywgbmF2cG9wLmlkTnVtYmVyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHAgPSBwcmVwUHJldmlld21ha2VyKGRvd25sb2FkLmRhdGEsIGFydCwgbmF2cG9wKTtcblx0XHRcdFx0cC5zaG93UHJldmlldygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgcHJlcFByZXZpZXdtYWtlciA9IChkYXRhLCBhcnRpY2xlLCBuYXZwb3ApID0+IHtcblx0XHQvLyBkZWFsIHdpdGggdHJpY2tzeSBhbmNob3JzXG5cdFx0Y29uc3QgZCA9IGFuY2hvcml6ZShkYXRhLCBhcnRpY2xlLmFuY2hvclN0cmluZygpKTtcblx0XHRjb25zdCB1cmxCYXNlID0gam9pblBhdGgoW3BnLndpa2kuYXJ0aWNsZWJhc2UsIGFydGljbGUudXJsU3RyaW5nKCldKTtcblx0XHRjb25zdCBwID0gbmV3IFByZXZpZXdtYWtlcihkLCB1cmxCYXNlLCBuYXZwb3ApO1xuXHRcdHJldHVybiBwO1xuXHR9O1xuXHQvLyBUcnkgdG8gaW1pdGF0ZSB0aGUgd2F5IG1lZGlhd2lraSBnZW5lcmF0ZXMgSFRNTCBhbmNob3JzIGZyb20gc2VjdGlvbiB0aXRsZXNcblx0Y29uc3QgYW5jaG9yaXplID0gKGQsIGFuY2gpID0+IHtcblx0XHRpZiAoIWFuY2gpIHtcblx0XHRcdHJldHVybiBkO1xuXHRcdH1cblx0XHRjb25zdCBhbmNoUmUgPSBuZXcgUmVnRXhwKFxuXHRcdFx0YCg/Oj0rXFxcXHMqJHtsaXRlcmFsaXplUmVnZXgoYW5jaCkucmVwbGFjZSgvWyBfXS9nLCAnW18gXScpfVxcXFxzKj0rfFxcXFx7XFxcXHtcXFxccyoke2dldFZhbHVlT2YoXG5cdFx0XHRcdCdwb3B1cEFuY2hvclJlZ2V4cCdcblx0XHRcdCl9XFxcXHMqKD86XFxcXHxbXnx9XSopKj9cXFxccyoke2xpdGVyYWxpemVSZWdleChhbmNoKX1cXFxccyooPzpcXFxcfFtefV0qKT99fSlgXG5cdFx0KTtcblx0XHRjb25zdCBtYXRjaCA9IGQubWF0Y2goYW5jaFJlKTtcblx0XHRpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMCAmJiBtYXRjaFswXSkge1xuXHRcdFx0cmV0dXJuIGQuc2xpY2UoTWF0aC5tYXgoMCwgZC5pbmRleE9mKG1hdGNoWzBdKSkpO1xuXHRcdH1cblx0XHQvLyBub3cgdHJ5IHRvIGRlYWwgd2l0aCA9PT0gZm9vIFtbYmFyfGJhel1dIGJvb20gPT09IC0+ICNmb29fYmF6X2Jvb21cblx0XHRjb25zdCBsaW5lcyA9IGQuc3BsaXQoJ1xcbicpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcblx0XHRcdGxpbmVzW2ldID0gbGluZXNbaV1cblx0XHRcdFx0LnJlcGxhY2UoL1xcW3syfShbXlxcXXxdKj9cXHwpPyguKj8pXXsyfS9nLCAnJDInKVxuXHRcdFx0XHQucmVwbGFjZSgvJycnKFteJ10pL2csICckMScpXG5cdFx0XHRcdC5yZXBsYWNlKC8nJyhbXiddKS9nLCAnJDEnKTtcblx0XHRcdGlmIChhbmNoUmUudGVzdChsaW5lc1tpXSkpIHtcblx0XHRcdFx0cmV0dXJuIGRcblx0XHRcdFx0XHQuc3BsaXQoJ1xcbicpXG5cdFx0XHRcdFx0LnNsaWNlKGkpXG5cdFx0XHRcdFx0LmpvaW4oJ1xcbicpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL15bXj1dKi8sICcnKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGQ7XG5cdH07XG5cdGNvbnN0IGtpbGxQb3B1cCA9IGZ1bmN0aW9uIGtpbGxQb3B1cCgpIHtcblx0XHRyZW1vdmVNb2RpZmllcktleUxpc3RlbmVyKHRoaXMpO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFNob3J0Y3V0S2V5cycpKSB7XG5cdFx0XHRybVBvcHVwU2hvcnRjdXRzKCk7XG5cdFx0fVxuXHRcdGlmICghcGcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHBnLmN1cnJlbnQubGluayAmJiBwZy5jdXJyZW50LmxpbmsubmF2cG9wdXApIHtcblx0XHRcdHBnLmN1cnJlbnQubGluay5uYXZwb3B1cC5iYW5pc2goKTtcblx0XHR9XG5cdFx0cGcuY3VycmVudC5saW5rID0gbnVsbDtcblx0XHRhYm9ydEFsbERvd25sb2FkcygpO1xuXHRcdGlmIChwZy50aW1lci5jaGVja1BvcHVwUG9zaXRpb24pIHtcblx0XHRcdGNsZWFySW50ZXJ2YWwocGcudGltZXIuY2hlY2tQb3B1cFBvc2l0aW9uKTtcblx0XHRcdHBnLnRpbWVyLmNoZWNrUG9wdXBQb3NpdGlvbiA9IG51bGw7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlOyAvLyBwcmVzZXJ2ZSBkZWZhdWx0IGFjdGlvblxuXHR9O1xuXHQvLyBFTkRGSUxFOiBhY3Rpb25zLmpzXG5cdC8vIFNUQVJURklMRTogZG9tZHJhZy5qc1xuXHQvKipcblx0ICogQGZpbGVvdmVydmlld1xuXHQgKiBUaGUge0Bzb3VyY2UgRHJhZ30gb2JqZWN0LCB3aGljaCBlbmFibGVzIG9iamVjdHMgdG8gYmUgZHJhZ2dlZCBhcm91bmQuXG5cdCAqIDxwcmU+XG5cdCAqXG5cdCAqIGRvbS1kcmFnLmpzXG5cdCAqIDA5LjI1LjIwMDFcblx0ICogd3d3LnlvdW5ncHVwLm5ldFxuXHQgKlxuXHQgKiAxMC4yOC4yMDAxIC0gZml4ZWQgbWlub3IgYnVnIHdoZXJlIGV2ZW50c1xuXHQgKlxuXHQgKiBzb21ldGltZXMgZmlyZWQgb2ZmIHRoZSBoYW5kbGUsIG5vdCB0aGUgcm9vdC5cblx0ICogUGFyZWQgZG93biwgc29tZSBob29rcyBhZGRlZCBieSBMdXBpblxuXHQgKiBDb3B5cmlnaHQgQWFyb24gQm9vZG1hbi5cblx0ICogU2F5aW5nIHN0dXBpZCB0aGluZ3MgZGFpbHkgc2luY2UgTWFyY2ggMjAwMS5cblx0ICogPC9wcmU+XG5cdCAqL1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBEcmFnIG9iamVjdC4gVGhpcyBpcyB1c2VkIHRvIG1ha2UgdmFyaW91cyBET00gZWxlbWVudHMgZHJhZ2dhYmxlLlxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdGNsYXNzIERyYWcge1xuXHRcdGNvbnN0cnVjdG9yKCkge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBDb25kaXRpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRvIGRyYWcuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHRha2Ugb25lIHBhcmFtZXRlcixcblx0XHRcdCAqIGFuIEV2ZW50LiAgVG8gZGlzYWJsZSB0aGlzLCBzZXQgaXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgRnVuY3Rpb25cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5zdGFydENvbmRpdGlvbiA9IG51bGw7XG5cdFx0XHQvKipcblx0XHRcdCAqIEhvb2sgdG8gYmUgcnVuIHdoZW4gdGhlIGRyYWcgZmluaXNoZXMuIFRoaXMgaXMgcGFzc2VkIHRoZSBmaW5hbCBjb29yZGluYXRlcyBvZiB0aGVcblx0XHRcdCAqIGRyYWdnZWQgb2JqZWN0ICh0d28gaW50ZWdlcnMsIHggYW5kIHkpLiBUbyBkaXNhYmxlcyB0aGlzLCBzZXQgaXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgRnVuY3Rpb25cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5lbmRIb29rID0gbnVsbDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogR2V0cyBhbiBldmVudCBpbiBhIGNyb3NzLWJyb3dzZXIgbWFubmVyLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0c3RhdGljIGZpeEUoZSkge1xuXHRcdFx0aWYgKGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRlID0gd2luZG93LmV2ZW50O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGUubGF5ZXJYID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZS5sYXllclggPSBlLm9mZnNldFg7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZS5sYXllclkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRlLmxheWVyWSA9IGUub2Zmc2V0WTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBlO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBJbml0aWFsaXNlcyB0aGUgRHJhZyBpbnN0YW5jZSBieSB0ZWxsaW5nIGl0IHdoaWNoIG9iamVjdCB5b3Ugd2FudCB0byBiZSBkcmFnZ2FibGUsIGFuZCB3aGF0XG5cdFx0ICogeW91IHdhbnQgdG8gZHJhZyBpdCBieS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbyBUaGUgXCJoYW5kbGVcIiBieSB3aGljaCA8Y29kZT5vUm9vdDwvY29kZT4gaXMgZHJhZ2dlZC5cblx0XHQgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG9Sb290IFRoZSBvYmplY3Qgd2hpY2ggbW92ZXMgd2hlbiA8Y29kZT5vPC9jb2RlPiBpcyBkcmFnZ2VkLCBvciA8Y29kZT5vPC9jb2RlPiBpZiBvbWl0dGVkLlxuXHRcdCAqL1xuXHRcdGluaXQobywgb1Jvb3QpIHtcblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0dGhpcy5vYmogPSBvO1xuXHRcdFx0by5vbm1vdXNlZG93biA9IChlKSA9PiB7XG5cdFx0XHRcdHNlbGYuc3RhcnQoZSk7XG5cdFx0XHR9O1xuXHRcdFx0by5kcmFnZ2luZyA9IGZhbHNlO1xuXHRcdFx0by5wb3B1cHNfZHJhZ2dhYmxlID0gdHJ1ZTtcblx0XHRcdG8uaG1vZGUgPSB0cnVlO1xuXHRcdFx0by52bW9kZSA9IHRydWU7XG5cdFx0XHRvLnJvb3QgPSBvUm9vdCB8fCBvO1xuXHRcdFx0aWYgKE51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQoby5yb290LnN0eWxlLmxlZnQsIDEwKSkpIHtcblx0XHRcdFx0by5yb290LnN0eWxlLmxlZnQgPSAnMHB4Jztcblx0XHRcdH1cblx0XHRcdGlmIChOdW1iZXIuaXNOYU4oTnVtYmVyLnBhcnNlSW50KG8ucm9vdC5zdHlsZS50b3AsIDEwKSkpIHtcblx0XHRcdFx0by5yb290LnN0eWxlLnRvcCA9ICcwcHgnO1xuXHRcdFx0fVxuXHRcdFx0by5yb290Lm9udGhpc1N0YXJ0ID0gKCkgPT4ge307XG5cdFx0XHRvLnJvb3Qub250aGlzRW5kID0gKCkgPT4ge307XG5cdFx0XHRvLnJvb3Qub250aGlzID0gKCkgPT4ge307XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFN0YXJ0cyB0aGUgZHJhZy5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZVxuXHRcdCAqL1xuXHRcdHN0YXJ0KGUpIHtcblx0XHRcdGNvbnN0IG8gPSB0aGlzLm9iajsgLy8gPSB0aGlzO1xuXHRcdFx0ZSA9IERyYWcuZml4RShlKTtcblx0XHRcdGlmICh0aGlzLnN0YXJ0Q29uZGl0aW9uICYmICF0aGlzLnN0YXJ0Q29uZGl0aW9uKGUpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHkgPSBOdW1iZXIucGFyc2VJbnQoby52bW9kZSA/IG8ucm9vdC5zdHlsZS50b3AgOiBvLnJvb3Quc3R5bGUuYm90dG9tLCAxMCk7XG5cdFx0XHRjb25zdCB4ID0gTnVtYmVyLnBhcnNlSW50KG8uaG1vZGUgPyBvLnJvb3Quc3R5bGUubGVmdCA6IG8ucm9vdC5zdHlsZS5yaWdodCwgMTApO1xuXHRcdFx0by5yb290Lm9udGhpc1N0YXJ0KHgsIHkpO1xuXHRcdFx0by5sYXN0TW91c2VYID0gZS5jbGllbnRYO1xuXHRcdFx0by5sYXN0TW91c2VZID0gZS5jbGllbnRZO1xuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0XHRvLm9ubW91c2Vtb3ZlRGVmYXVsdCA9IGRvY3VtZW50Lm9ubW91c2Vtb3ZlO1xuXHRcdFx0by5kcmFnZ2luZyA9IHRydWU7XG5cdFx0XHRkb2N1bWVudC5vbm1vdXNlbW92ZSA9IChlKSA9PiB7XG5cdFx0XHRcdHNlbGYuZHJhZyhlKTtcblx0XHRcdH07XG5cdFx0XHRkb2N1bWVudC5vbm1vdXNldXAgPSAoZSkgPT4ge1xuXHRcdFx0XHRzZWxmLmVuZChlKTtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIERvZXMgdGhlIGRyYWcuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBlXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRkcmFnKGUpIHtcblx0XHRcdGUgPSBEcmFnLmZpeEUoZSk7XG5cdFx0XHRjb25zdCBvID0gdGhpcy5vYmo7XG5cdFx0XHRjb25zdCBleSA9IGUuY2xpZW50WTtcblx0XHRcdGNvbnN0IGV4ID0gZS5jbGllbnRYO1xuXHRcdFx0Y29uc3QgeSA9IE51bWJlci5wYXJzZUludChvLnZtb2RlID8gby5yb290LnN0eWxlLnRvcCA6IG8ucm9vdC5zdHlsZS5ib3R0b20sIDEwKTtcblx0XHRcdGNvbnN0IHggPSBOdW1iZXIucGFyc2VJbnQoby5obW9kZSA/IG8ucm9vdC5zdHlsZS5sZWZ0IDogby5yb290LnN0eWxlLnJpZ2h0LCAxMCk7XG5cdFx0XHRjb25zdCBueCA9IHggKyAoZXggLSBvLmxhc3RNb3VzZVgpICogKG8uaG1vZGUgPyAxIDogLTEpO1xuXHRcdFx0Y29uc3QgbnkgPSB5ICsgKGV5IC0gby5sYXN0TW91c2VZKSAqIChvLnZtb2RlID8gMSA6IC0xKTtcblx0XHRcdHRoaXMub2JqLnJvb3Quc3R5bGVbby5obW9kZSA/ICdsZWZ0JyA6ICdyaWdodCddID0gYCR7bnh9cHhgO1xuXHRcdFx0dGhpcy5vYmoucm9vdC5zdHlsZVtvLnZtb2RlID8gJ3RvcCcgOiAnYm90dG9tJ10gPSBgJHtueX1weGA7XG5cdFx0XHR0aGlzLm9iai5sYXN0TW91c2VYID0gZXg7XG5cdFx0XHR0aGlzLm9iai5sYXN0TW91c2VZID0gZXk7XG5cdFx0XHR0aGlzLm9iai5yb290Lm9udGhpcyhueCwgbnkpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBFbmRzIHRoZSBkcmFnLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRlbmQoKSB7XG5cdFx0XHRkb2N1bWVudC5vbm1vdXNlbW92ZSA9IHRoaXMub2JqLm9ubW91c2Vtb3ZlRGVmYXVsdDtcblx0XHRcdGRvY3VtZW50Lm9ubW91c2V1cCA9IG51bGw7XG5cdFx0XHR0aGlzLm9iai5kcmFnZ2luZyA9IGZhbHNlO1xuXHRcdFx0aWYgKHRoaXMuZW5kSG9vaykge1xuXHRcdFx0XHR0aGlzLmVuZEhvb2soXG5cdFx0XHRcdFx0TnVtYmVyLnBhcnNlSW50KHRoaXMub2JqLnJvb3Quc3R5bGVbdGhpcy5vYmouaG1vZGUgPyAnbGVmdCcgOiAncmlnaHQnXSwgMTApLFxuXHRcdFx0XHRcdE51bWJlci5wYXJzZUludCh0aGlzLm9iai5yb290LnN0eWxlW3RoaXMub2JqLnZtb2RlID8gJ3RvcCcgOiAnYm90dG9tJ10sIDEwKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvLyBFTkRGSUxFOiBkb21kcmFnLmpzXG5cdC8vIFNUQVJURklMRTogc3RydWN0dXJlcy5qc1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsID0ge307XG5cdHBnLnN0cnVjdHVyZXMub3JpZ2luYWwucG9wdXBMYXlvdXQgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdCdwb3B1cEVycm9yJyxcblx0XHRcdCdwb3B1cEltYWdlJyxcblx0XHRcdCdwb3B1cFRvcExpbmtzJyxcblx0XHRcdCdwb3B1cFRpdGxlJyxcblx0XHRcdCdwb3B1cFVzZXJEYXRhJyxcblx0XHRcdCdwb3B1cERhdGEnLFxuXHRcdFx0J3BvcHVwT3RoZXJMaW5rcycsXG5cdFx0XHQncG9wdXBSZWRpcicsXG5cdFx0XHRbJ3BvcHVwV2FyblJlZGlyJywgJ3BvcHVwUmVkaXJUb3BMaW5rcycsICdwb3B1cFJlZGlyVGl0bGUnLCAncG9wdXBSZWRpckRhdGEnLCAncG9wdXBSZWRpck90aGVyTGlua3MnXSxcblx0XHRcdCdwb3B1cE1pc2NUb29scycsXG5cdFx0XHRbJ3BvcHVwUmVkbGluayddLFxuXHRcdFx0J3BvcHVwUHJlUHJldmlld1NlcCcsXG5cdFx0XHQncG9wdXBQcmV2aWV3Jyxcblx0XHRcdCdwb3B1cFNlY29uZFByZXZpZXcnLFxuXHRcdFx0J3BvcHVwUHJldmlld01vcmUnLFxuXHRcdFx0J3BvcHVwUG9zdFByZXZpZXcnLFxuXHRcdFx0J3BvcHVwRml4RGFiJyxcblx0XHRdO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwUmVkaXJTcGFucyA9ICgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0J3BvcHVwUmVkaXInLFxuXHRcdFx0J3BvcHVwV2FyblJlZGlyJyxcblx0XHRcdCdwb3B1cFJlZGlyVG9wTGlua3MnLFxuXHRcdFx0J3BvcHVwUmVkaXJUaXRsZScsXG5cdFx0XHQncG9wdXBSZWRpckRhdGEnLFxuXHRcdFx0J3BvcHVwUmVkaXJPdGhlckxpbmtzJyxcblx0XHRdO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwVGl0bGUgPSAoeCkgPT4ge1xuXHRcdGxvZygnZGVmYXVsdHN0cnVjdHVyZS5wb3B1cFRpdGxlJyk7XG5cdFx0aWYgKCFnZXRWYWx1ZU9mKCdwb3B1cE5hdkxpbmtzJykpIHtcblx0XHRcdHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKCc8Yj48PG1haW5saW5rPj48L2I+JywgeC5hcnRpY2xlLCB4LnBhcmFtcyk7XG5cdFx0fVxuXHRcdHJldHVybiAnJztcblx0fTtcblx0cGcuc3RydWN0dXJlcy5vcmlnaW5hbC5wb3B1cFRvcExpbmtzID0gKHgpID0+IHtcblx0XHRsb2coJ2RlZmF1bHRzdHJ1Y3R1cmUucG9wdXBUb3BMaW5rcycpO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cE5hdkxpbmtzJykpIHtcblx0XHRcdHJldHVybiBuYXZMaW5rc0hUTUwoeC5hcnRpY2xlLCB4LmhpbnQsIHgucGFyYW1zKTtcblx0XHR9XG5cdFx0cmV0dXJuICcnO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwSW1hZ2UgPSAoeCkgPT4ge1xuXHRcdGxvZyhgb3JpZ2luYWwucG9wdXBJbWFnZSwgeC5hcnRpY2xlPSR7eC5hcnRpY2xlfSwgeC5uYXZwb3AuaWROdW1iZXI9JHt4Lm5hdnBvcC5pZE51bWJlcn1gKTtcblx0XHRyZXR1cm4gaW1hZ2VIVE1MKHguYXJ0aWNsZSwgeC5uYXZwb3AuaWROdW1iZXIpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwUmVkaXJUaXRsZSA9IHBnLnN0cnVjdHVyZXMub3JpZ2luYWwucG9wdXBUaXRsZTtcblx0cGcuc3RydWN0dXJlcy5vcmlnaW5hbC5wb3B1cFJlZGlyVG9wTGlua3MgPSBwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwVG9wTGlua3M7XG5cdGNvbnN0IGNvcHlTdHJ1Y3R1cmUgPSAob2xkU3RydWN0dXJlLCBuZXdTdHJ1Y3R1cmUpID0+IHtcblx0XHRwZy5zdHJ1Y3R1cmVzW25ld1N0cnVjdHVyZV0gPSB7fTtcblx0XHRmb3IgKGNvbnN0IHByb3AgaW4gcGcuc3RydWN0dXJlc1tvbGRTdHJ1Y3R1cmVdKSB7XG5cdFx0XHRpZiAoIU9iamVjdC5oYXNPd24ocGcuc3RydWN0dXJlc1tvbGRTdHJ1Y3R1cmVdLCBwcm9wKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdHBnLnN0cnVjdHVyZXNbbmV3U3RydWN0dXJlXVtwcm9wXSA9IHBnLnN0cnVjdHVyZXNbb2xkU3RydWN0dXJlXVtwcm9wXTtcblx0XHR9XG5cdH07XG5cdGNvcHlTdHJ1Y3R1cmUoJ29yaWdpbmFsJywgJ25vc3RhbGdpYScpO1xuXHRwZy5zdHJ1Y3R1cmVzLm5vc3RhbGdpYS5wb3B1cFRvcExpbmtzID0gKHgpID0+IHtcblx0XHRsZXQgc3RyID0gJyc7XG5cdFx0c3RyICs9ICc8Yj48PG1haW5saW5rfHNob3J0Y3V0PSA+PjwvYj4nO1xuXHRcdC8vIHVzZXIgbGlua3Ncblx0XHQvLyBjb250cmlicyAtIGxvZyAtIGNvdW50IC0gZW1haWwgLSBibG9ja1xuXHRcdC8vIGNvdW50IG9ubHkgaWYgYXBwbGljYWJsZTsgYmxvY2sgb25seSBpZiBwb3B1cEFkbWluTGlua3Ncblx0XHRzdHIgKz0gJ2lmKHVzZXIpezxicj48PGNvbnRyaWJzfHNob3J0Y3V0PWM+Pic7XG5cdFx0c3RyICs9ICdpZih3aWtpbWVkaWEpeyo8PGNvdW50fHNob3J0Y3V0PSM+Pn0nO1xuXHRcdHN0ciArPSAnaWYoaXB1c2VyKXt9ZWxzZXsqPDxlbWFpbHxzaG9ydGN1dD1FPj59aWYoYWRtaW4peyo8PGJsb2NrfHNob3J0Y3V0PWI+Pn19Jztcblx0XHQvLyBlZGl0aW5nIGxpbmtzXG5cdFx0Ly8gdGFsa3BhZ2UgICAtPiBlZGl0fG5ldyAtIGhpc3RvcnkgLSB1bnx3YXRjaCAtIGFydGljbGV8ZWRpdFxuXHRcdC8vIG90aGVyIHBhZ2UgLT4gZWRpdCAtIGhpc3RvcnkgLSB1bnx3YXRjaCAtIHRhbGt8ZWRpdHxuZXdcblx0XHRjb25zdCBlZGl0c3RyID0gJzw8ZWRpdHxzaG9ydGN1dD1lPj4nO1xuXHRcdGNvbnN0IGVkaXRPbGRpZFN0ciA9IGBpZihvbGRpZCl7PDxlZGl0T2xkfHNob3J0Y3V0PWU+Pnw8PHJldmVydHxzaG9ydGN1dD12fHJ2Pj58PDxlZGl0fGN1cj4+fWVsc2V7JHtlZGl0c3RyfX1gO1xuXHRcdGNvbnN0IGhpc3RvcnlzdHIgPSAnPDxoaXN0b3J5fHNob3J0Y3V0PWg+Pic7XG5cdFx0Y29uc3Qgd2F0Y2hzdHIgPSAnPDx1bndhdGNofHVud2F0Y2hTaG9ydD4+fDw8d2F0Y2h8c2hvcnRjdXQ9d3x3YXRjaFRoaW5neT4+Jztcblx0XHRzdHIgKz1cblx0XHRcdGA8YnI+aWYodGFsayl7JHtlZGl0T2xkaWRTdHJ9fDw8bmV3fHNob3J0Y3V0PSs+PmAgK1xuXHRcdFx0YCoke2hpc3RvcnlzdHJ9KiR7d2F0Y2hzdHJ9KmAgK1xuXHRcdFx0JzxiPjw8YXJ0aWNsZXxzaG9ydGN1dD1hPj48L2I+fDw8ZWRpdEFydGljbGV8ZWRpdD4+JyArXG5cdFx0XHRgfWVsc2V7JHtcblx0XHRcdFx0Ly8gbm90IGEgdGFsayBwYWdlXG5cdFx0XHRcdGVkaXRPbGRpZFN0clxuXHRcdFx0fSoke2hpc3RvcnlzdHJ9KiR7d2F0Y2hzdHJ9KmAgK1xuXHRcdFx0JzxiPjw8dGFsa3xzaG9ydGN1dD10Pj48L2I+fDw8ZWRpdFRhbGt8ZWRpdD4+fDw8bmV3VGFsa3xzaG9ydGN1dD0rfG5ldz4+fSc7XG5cdFx0Ly8gbWlzYyBsaW5rc1xuXHRcdHN0ciArPSAnPGJyPjw8d2hhdExpbmtzSGVyZXxzaG9ydGN1dD1sPj4qPDxyZWxhdGVkQ2hhbmdlc3xzaG9ydGN1dD1yPj4nO1xuXHRcdHN0ciArPSAnaWYoYWRtaW4pezxicj59ZWxzZXsqfTw8bW92ZXxzaG9ydGN1dD1tPj4nO1xuXHRcdC8vIGFkbWluIGxpbmtzXG5cdFx0c3RyICs9XG5cdFx0XHQnaWYoYWRtaW4peyo8PHVucHJvdGVjdHx1bnByb3RlY3RTaG9ydD4+fDw8cHJvdGVjdHxzaG9ydGN1dD1wPj4qJyArXG5cdFx0XHQnPDx1bmRlbGV0ZXx1bmRlbGV0ZVNob3J0Pj58PDxkZWxldGV8c2hvcnRjdXQ9ZD4+fSc7XG5cdFx0cmV0dXJuIG5hdmxpbmtTdHJpbmdUb0hUTUwoc3RyLCB4LmFydGljbGUsIHgucGFyYW1zKTtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5ub3N0YWxnaWEucG9wdXBSZWRpclRvcExpbmtzID0gcGcuc3RydWN0dXJlcy5ub3N0YWxnaWEucG9wdXBUb3BMaW5rcztcblx0LyoqIC0tIGZhbmN5IC0tICovXG5cdGNvcHlTdHJ1Y3R1cmUoJ29yaWdpbmFsJywgJ2ZhbmN5Jyk7XG5cdHBnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBUaXRsZSA9ICh4KSA9PiB7XG5cdFx0cmV0dXJuIG5hdmxpbmtTdHJpbmdUb0hUTUwoJzxmb250IHNpemU9KzA+PDxtYWlubGluaz4+PC9mb250PicsIHguYXJ0aWNsZSwgeC5wYXJhbXMpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwVG9wTGlua3MgPSAoeCkgPT4ge1xuXHRcdGNvbnN0IGhpc3QgPSAnPDxoaXN0b3J5fHNob3J0Y3V0PWh8aGlzdD4+fDw8bGFzdEVkaXR8c2hvcnRjdXQ9L3xsYXN0Pj58PDxlZGl0b3JzfHNob3J0Y3V0PUV8ZWRzPj4nO1xuXHRcdGNvbnN0IHdhdGNoID0gJzw8dW53YXRjaHx1bndhdGNoU2hvcnQ+Pnw8PHdhdGNofHNob3J0Y3V0PXd8d2F0Y2hUaGluZ3k+Pic7XG5cdFx0Y29uc3QgbW92ZSA9ICc8PG1vdmV8c2hvcnRjdXQ9bXxtb3ZlPj4nO1xuXHRcdHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKFxuXHRcdFx0J2lmKHRhbGspeycgK1xuXHRcdFx0XHRgPDxlZGl0fHNob3J0Y3V0PWU+Pnw8PG5ld3xzaG9ydGN1dD0rfCs+Pioke2hpc3R9KmAgK1xuXHRcdFx0XHQnPDxhcnRpY2xlfHNob3J0Y3V0PWE+Pnw8PGVkaXRBcnRpY2xlfGVkaXQ+PicgK1xuXHRcdFx0XHRgKiR7d2F0Y2h9KiR7bW92ZX19ZWxzZXs8PGVkaXR8c2hvcnRjdXQ9ZT4+KiR7aGlzdH0qPDx0YWxrfHNob3J0Y3V0PXR8Pj58PDxlZGl0VGFsa3xlZGl0Pj58PDxuZXdUYWxrfHNob3J0Y3V0PSt8bmV3Pj5gICtcblx0XHRcdFx0YCoke3dhdGNofSoke21vdmV9fTxicj5gLFxuXHRcdFx0eC5hcnRpY2xlLFxuXHRcdFx0eC5wYXJhbXNcblx0XHQpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwT3RoZXJMaW5rcyA9ICh4KSA9PiB7XG5cdFx0Y29uc3QgYWRtaW4gPVxuXHRcdFx0Jzw8dW5wcm90ZWN0fHVucHJvdGVjdFNob3J0Pj58PDxwcm90ZWN0fHNob3J0Y3V0PXA+Pio8PHVuZGVsZXRlfHVuZGVsZXRlU2hvcnQ+Pnw8PGRlbGV0ZXxzaG9ydGN1dD1kfGRlbD4+Jztcblx0XHRsZXQgdXNlciA9ICc8PGNvbnRyaWJzfHNob3J0Y3V0PWM+PmlmKHdpa2ltZWRpYSl7fDw8Y291bnR8c2hvcnRjdXQ9I3wjPj59Jztcblx0XHR1c2VyICs9IGBpZihpcHVzZXIpe3w8PGFyaW4+Pn1lbHNleyo8PGVtYWlsfHNob3J0Y3V0PUV8JHtwb3B1cFN0cmluZyhcblx0XHRcdCdlbWFpbCdcblx0XHQpfT4+fWlmKGFkbWluKXsqPDxibG9ja3xzaG9ydGN1dD1iPj59YDtcblx0XHRjb25zdCBub3JtYWwgPSAnPDx3aGF0TGlua3NIZXJlfHNob3J0Y3V0PWx8bGlua3MgaGVyZT4+Kjw8cmVsYXRlZENoYW5nZXN8c2hvcnRjdXQ9cnxyZWxhdGVkPj4nO1xuXHRcdHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKFxuXHRcdFx0YDxicj5pZih1c2VyKXske3VzZXJ9Kn1pZihhZG1pbil7JHthZG1pbn1pZih1c2VyKXs8YnI+fWVsc2V7Kn19JHtub3JtYWx9YCxcblx0XHRcdHguYXJ0aWNsZSxcblx0XHRcdHgucGFyYW1zXG5cdFx0KTtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5mYW5jeS5wb3B1cFJlZGlyVGl0bGUgPSBwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwVGl0bGU7XG5cdHBnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBSZWRpclRvcExpbmtzID0gcGcuc3RydWN0dXJlcy5mYW5jeS5wb3B1cFRvcExpbmtzO1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwUmVkaXJPdGhlckxpbmtzID0gcGcuc3RydWN0dXJlcy5mYW5jeS5wb3B1cE90aGVyTGlua3M7XG5cdC8qKiAtLSBmYW5jeTIgLS0gKi9cblx0Ly8gaGFjayBmb3IgTWFjR3l2ZXJNYWdpY1xuXHRjb3B5U3RydWN0dXJlKCdmYW5jeScsICdmYW5jeTInKTtcblx0cGcuc3RydWN0dXJlcy5mYW5jeTIucG9wdXBUb3BMaW5rcyA9IC8vIGhhY2sgb3V0IHRoZSA8YnI+IGF0IHRoZSBlbmQgYW5kIHB1dCBvbmUgYXQgdGhlIGJlZ2lubmluZ1xuXHRcdCh4KSA9PiB7XG5cdFx0XHRyZXR1cm4gYDxicj4ke3BnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBUb3BMaW5rcyh4KS5yZXBsYWNlKC88YnI+JC9pLCAnJyl9YDtcblx0XHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5Mi5wb3B1cExheW91dCA9ICgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0J3BvcHVwRXJyb3InLFxuXHRcdFx0J3BvcHVwSW1hZ2UnLFxuXHRcdFx0J3BvcHVwVGl0bGUnLFxuXHRcdFx0J3BvcHVwVXNlckRhdGEnLFxuXHRcdFx0J3BvcHVwRGF0YScsXG5cdFx0XHQncG9wdXBUb3BMaW5rcycsXG5cdFx0XHQncG9wdXBPdGhlckxpbmtzJyxcblx0XHRcdCdwb3B1cFJlZGlyJyxcblx0XHRcdFsncG9wdXBXYXJuUmVkaXInLCAncG9wdXBSZWRpclRvcExpbmtzJywgJ3BvcHVwUmVkaXJUaXRsZScsICdwb3B1cFJlZGlyRGF0YScsICdwb3B1cFJlZGlyT3RoZXJMaW5rcyddLFxuXHRcdFx0J3BvcHVwTWlzY1Rvb2xzJyxcblx0XHRcdFsncG9wdXBSZWRsaW5rJ10sXG5cdFx0XHQncG9wdXBQcmVQcmV2aWV3U2VwJyxcblx0XHRcdCdwb3B1cFByZXZpZXcnLFxuXHRcdFx0J3BvcHVwU2Vjb25kUHJldmlldycsXG5cdFx0XHQncG9wdXBQcmV2aWV3TW9yZScsXG5cdFx0XHQncG9wdXBQb3N0UHJldmlldycsXG5cdFx0XHQncG9wdXBGaXhEYWInLFxuXHRcdF07XG5cdH07XG5cdC8qKiAtLSBtZW51cyAtLSAqL1xuXHRjb3B5U3RydWN0dXJlKCdvcmlnaW5hbCcsICdtZW51cycpO1xuXHRwZy5zdHJ1Y3R1cmVzLm1lbnVzLnBvcHVwTGF5b3V0ID0gKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHQncG9wdXBFcnJvcicsXG5cdFx0XHQncG9wdXBJbWFnZScsXG5cdFx0XHQncG9wdXBUb3BMaW5rcycsXG5cdFx0XHQncG9wdXBUaXRsZScsXG5cdFx0XHQncG9wdXBPdGhlckxpbmtzJyxcblx0XHRcdCdwb3B1cFJlZGlyJyxcblx0XHRcdFsncG9wdXBXYXJuUmVkaXInLCAncG9wdXBSZWRpclRvcExpbmtzJywgJ3BvcHVwUmVkaXJUaXRsZScsICdwb3B1cFJlZGlyRGF0YScsICdwb3B1cFJlZGlyT3RoZXJMaW5rcyddLFxuXHRcdFx0J3BvcHVwVXNlckRhdGEnLFxuXHRcdFx0J3BvcHVwRGF0YScsXG5cdFx0XHQncG9wdXBNaXNjVG9vbHMnLFxuXHRcdFx0Wydwb3B1cFJlZGxpbmsnXSxcblx0XHRcdCdwb3B1cFByZVByZXZpZXdTZXAnLFxuXHRcdFx0J3BvcHVwUHJldmlldycsXG5cdFx0XHQncG9wdXBTZWNvbmRQcmV2aWV3Jyxcblx0XHRcdCdwb3B1cFByZXZpZXdNb3JlJyxcblx0XHRcdCdwb3B1cFBvc3RQcmV2aWV3Jyxcblx0XHRcdCdwb3B1cEZpeERhYicsXG5cdFx0XTtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5tZW51cy5wb3B1cFRvcExpbmtzID0gKHgsIHNob3J0ZXIpID0+IHtcblx0XHQvLyBGSVhNRSBtYXliZSB0aGlzIHN0dWZmIHNob3VsZCBiZSBjYWNoZWRcblx0XHRjb25zdCBzID0gW107XG5cdFx0Y29uc3QgZHJvcGRpdiA9ICc8ZGl2IGNsYXNzPVwicG9wdXBfZHJvcFwiPic7XG5cdFx0Y29uc3QgZW5kZGl2ID0gJzwvZGl2Pic7XG5cdFx0bGV0IGhpc3QgPSAnPDxoaXN0b3J5fHNob3J0Y3V0PWg+Pic7XG5cdFx0aWYgKCFzaG9ydGVyKSB7XG5cdFx0XHRoaXN0ID0gYDxtZW51cm93PiR7aGlzdH18PDxoaXN0b3J5ZmVlZHxyc3M+Pnw8PGVkaXRvcnN8c2hvcnRjdXQ9RT4+PC9tZW51cm93PmA7XG5cdFx0fVxuXHRcdGNvbnN0IGxhc3RlZGl0ID0gJzw8bGFzdEVkaXR8c2hvcnRjdXQ9L3xzaG93IGxhc3QgZWRpdD4+Jztcblx0XHRjb25zdCB0aGFuayA9ICdpZihkaWZmKXs8PHRoYW5rfHNlbmQgdGhhbmtzPj59Jztcblx0XHRjb25zdCBqc0hpc3RvcnkgPSAnPDxsYXN0Q29udHJpYnxsYXN0IHNldCBvZiBlZGl0cz4+PDxzaW5jZU1lfGNoYW5nZXMgc2luY2UgbWluZT4+Jztcblx0XHRjb25zdCBsaW5rc2hlcmUgPSAnPDx3aGF0TGlua3NIZXJlfHNob3J0Y3V0PWx8d2hhdCBsaW5rcyBoZXJlPj4nO1xuXHRcdGNvbnN0IHJlbGF0ZWQgPSAnPDxyZWxhdGVkQ2hhbmdlc3xzaG9ydGN1dD1yfHJlbGF0ZWQgY2hhbmdlcz4+Jztcblx0XHRjb25zdCBzZWFyY2ggPSAnPG1lbnVyb3c+PDxzZWFyY2h8c2hvcnRjdXQ9cz4+PC9tZW51cm93Pic7XG5cdFx0Y29uc3Qgd2F0Y2ggPSAnPG1lbnVyb3c+PDx1bndhdGNofHVud2F0Y2hTaG9ydD4+fDw8d2F0Y2h8c2hvcnRjdXQ9d3x3YXRjaFRoaW5neT4+PC9tZW51cm93Pic7XG5cdFx0Y29uc3QgcHJvdGVjdCA9ICc8bWVudXJvdz48PHVucHJvdGVjdHx1bnByb3RlY3RTaG9ydD4+fDw8cHJvdGVjdHxzaG9ydGN1dD1wPj58PDxwcm90ZWN0bG9nfGxvZz4+PC9tZW51cm93Pic7XG5cdFx0Y29uc3QgZGVsID0gJzxtZW51cm93Pjw8dW5kZWxldGV8dW5kZWxldGVTaG9ydD4+fDw8ZGVsZXRlfHNob3J0Y3V0PWQ+Pnw8PGRlbGV0ZWxvZ3xsb2c+PjwvbWVudXJvdz4nO1xuXHRcdGNvbnN0IG1vdmUgPSAnPDxtb3ZlfHNob3J0Y3V0PW18bW92ZSBwYWdlPj4nO1xuXHRcdGNvbnN0IG51bGxQdXJnZSA9ICc8bWVudXJvdz48PG51bGxFZGl0fHNob3J0Y3V0PW58bnVsbCBlZGl0Pj58PDxwdXJnZXxzaG9ydGN1dD1QPj48L21lbnVyb3c+Jztcblx0XHRjb25zdCB2aWV3T3B0aW9ucyA9ICc8bWVudXJvdz48PHZpZXd8c2hvcnRjdXQ9dj4+fDw8cmVuZGVyfHNob3J0Y3V0PVM+Pnw8PHJhdz4+PC9tZW51cm93Pic7XG5cdFx0Y29uc3QgZWRpdFJvdyA9XG5cdFx0XHQnaWYob2xkaWQpeycgK1xuXHRcdFx0JzxtZW51cm93Pjw8ZWRpdHxzaG9ydGN1dD1lPj58PDxlZGl0T2xkfHNob3J0Y3V0PWV8dGhpcyZuYnNwO3JldmlzaW9uPj48L21lbnVyb3c+JyArXG5cdFx0XHQnPG1lbnVyb3c+PDxyZXZlcnR8c2hvcnRjdXQ9dj4+fDw8dW5kbz4+PC9tZW51cm93PicgK1xuXHRcdFx0J31lbHNlezw8ZWRpdHxzaG9ydGN1dD1lPj59Jztcblx0XHRjb25zdCBtYXJrUGF0cm9sbGVkID0gJ2lmKHJjaWQpezw8bWFya3BhdHJvbGxlZHxtYXJrIHBhdHJvbGxlZD4+fSc7XG5cdFx0Y29uc3QgbmV3VG9waWMgPSAnaWYodGFsayl7PDxuZXd8c2hvcnRjdXQ9K3xuZXcgdG9waWM+Pn0nO1xuXHRcdGNvbnN0IHByb3RlY3REZWxldGUgPSBgaWYoYWRtaW4peyR7cHJvdGVjdH0ke2RlbH19YDtcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBBY3Rpb25zTWVudScpKSB7XG5cdFx0XHRzLnB1c2goYDw8bWFpbmxpbms+Pioke2Ryb3BkaXZ9JHttZW51VGl0bGUoJ2FjdGlvbnMnKX1gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cy5wdXNoKGAke2Ryb3BkaXZ9PDxtYWlubGluaz4+YCk7XG5cdFx0fVxuXHRcdHMucHVzaCgnPG1lbnU+JywgZWRpdFJvdyArIG1hcmtQYXRyb2xsZWQgKyBuZXdUb3BpYyArIGhpc3QgKyBsYXN0ZWRpdCArIHRoYW5rKTtcblx0XHRpZiAoIXNob3J0ZXIpIHtcblx0XHRcdHMucHVzaChqc0hpc3RvcnkpO1xuXHRcdH1cblx0XHRzLnB1c2gobW92ZSArIGxpbmtzaGVyZSArIHJlbGF0ZWQpO1xuXHRcdGlmICghc2hvcnRlcikge1xuXHRcdFx0cy5wdXNoKG51bGxQdXJnZSArIHNlYXJjaCk7XG5cdFx0fVxuXHRcdGlmICghc2hvcnRlcikge1xuXHRcdFx0cy5wdXNoKHZpZXdPcHRpb25zKTtcblx0XHR9XG5cdFx0cy5wdXNoKFxuXHRcdFx0YDxocj4ke3dhdGNofSR7cHJvdGVjdERlbGV0ZX1gLFxuXHRcdFx0Jzxocj4nICtcblx0XHRcdFx0J2lmKHRhbGspezw8YXJ0aWNsZXxzaG9ydGN1dD1hfHZpZXcgYXJ0aWNsZT4+PDxlZGl0QXJ0aWNsZXxlZGl0IGFydGljbGU+Pn0nICtcblx0XHRcdFx0J2Vsc2V7PDx0YWxrfHNob3J0Y3V0PXR8dGFsayBwYWdlPj48PGVkaXRUYWxrfGVkaXQgdGFsaz4+JyArXG5cdFx0XHRcdGA8PG5ld1RhbGt8c2hvcnRjdXQ9K3xuZXcgdG9waWM+Pn08L21lbnU+JHtlbmRkaXZ9YFxuXHRcdCk7XG5cdFx0Ly8gdXNlciBtZW51IHN0YXJ0cyBoZXJlXG5cdFx0Y29uc3QgZW1haWwgPSAnPDxlbWFpbHxzaG9ydGN1dD1FfGVtYWlsIHVzZXI+Pic7XG5cdFx0Y29uc3QgY29udHJpYnMgPVxuXHRcdFx0J2lmKHdpa2ltZWRpYSl7PG1lbnVyb3c+fTw8Y29udHJpYnN8c2hvcnRjdXQ9Y3xjb250cmlidXRpb25zPj5pZih3aWtpbWVkaWEpezwvbWVudXJvdz59JyArXG5cdFx0XHQnaWYoYWRtaW4pezxtZW51cm93Pjw8ZGVsZXRlZENvbnRyaWJzPj48L21lbnVyb3c+fSc7XG5cdFx0cy5wdXNoKFxuXHRcdFx0YGlmKHVzZXIpeyoke2Ryb3BkaXZ9JHttZW51VGl0bGUoJ3VzZXInKX1gLFxuXHRcdFx0JzxtZW51PicsXG5cdFx0XHQnPG1lbnVyb3c+PDx1c2VyUGFnZXxzaG9ydGN1dD11fHVzZXImbmJzcDtwYWdlPj58PDx1c2VyU3BhY2V8c3BhY2U+PjwvbWVudXJvdz4nLFxuXHRcdFx0Jzw8dXNlclRhbGt8c2hvcnRjdXQ9dHx1c2VyIHRhbGs+Pjw8ZWRpdFVzZXJUYWxrfGVkaXQgdXNlciB0YWxrPj4nICtcblx0XHRcdFx0Jzw8bmV3VXNlclRhbGt8c2hvcnRjdXQ9K3xsZWF2ZSBjb21tZW50Pj4nXG5cdFx0KTtcblx0XHRpZiAoc2hvcnRlcikge1xuXHRcdFx0cy5wdXNoKGBpZihpcHVzZXIpe31lbHNleyR7ZW1haWx9fWApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzLnB1c2goYGlmKGlwdXNlcil7PDxhcmluPj59ZWxzZXske2VtYWlsfX1gKTtcblx0XHR9XG5cdFx0cy5wdXNoKFxuXHRcdFx0YDxocj4ke2NvbnRyaWJzfTw8dXNlcmxvZ3xzaG9ydGN1dD1MfHVzZXIgbG9nPj5gLFxuXHRcdFx0J2lmKHdpa2ltZWRpYSl7PDxjb3VudHxzaG9ydGN1dD0jfGVkaXQgY291bnRlcj4+fScsXG5cdFx0XHQnaWYoYWRtaW4pezxtZW51cm93Pjw8dW5ibG9ja3x1bmJsb2NrU2hvcnQ+Pnw8PGJsb2NrfHNob3J0Y3V0PWJ8YmxvY2sgdXNlcj4+PC9tZW51cm93Pn0nLFxuXHRcdFx0Jzw8YmxvY2tsb2d8c2hvcnRjdXQ9QnxibG9jayBsb2c+PicsXG5cdFx0XHRgPC9tZW51PiR7ZW5kZGl2fX1gXG5cdFx0KTtcblx0XHQvLyBwb3B1cHMgbWVudSBzdGFydHMgaGVyZVxuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFNldHVwTWVudScpICYmICF4Lm5hdnBvcC5oYXNQb3B1cE1lbnUgLyogRklYTUU6IGhhY2sgKi8pIHtcblx0XHRcdHgubmF2cG9wLmhhc1BvcHVwTWVudSA9IHRydWU7XG5cdFx0XHRzLnB1c2goXG5cdFx0XHRcdGAqJHtkcm9wZGl2fSR7bWVudVRpdGxlKCdwb3B1cHNNZW51Jyl9PG1lbnU+YCxcblx0XHRcdFx0Jzw8dG9nZ2xlUHJldmlld3N8dG9nZ2xlIHByZXZpZXdzPj4nLFxuXHRcdFx0XHQnPDxwdXJnZVBvcHVwc3xyZXNldD4+Jyxcblx0XHRcdFx0Jzw8ZGlzYWJsZVBvcHVwc3xkaXNhYmxlPj4nLFxuXHRcdFx0XHRgPC9tZW51PiR7ZW5kZGl2fWBcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKHMuam9pbignJyksIHguYXJ0aWNsZSwgeC5wYXJhbXMpO1xuXHR9O1xuXHRjb25zdCBtZW51VGl0bGUgPSAocykgPT4ge1xuXHRcdHJldHVybiBgPGEgaHJlZj1cIiNcIiBub1BvcHVwPTE+JHtwb3B1cFN0cmluZyhzKX08L2E+YDtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5tZW51cy5wb3B1cFJlZGlyVGl0bGUgPSBwZy5zdHJ1Y3R1cmVzLm1lbnVzLnBvcHVwVGl0bGU7XG5cdHBnLnN0cnVjdHVyZXMubWVudXMucG9wdXBSZWRpclRvcExpbmtzID0gcGcuc3RydWN0dXJlcy5tZW51cy5wb3B1cFRvcExpbmtzO1xuXHRjb3B5U3RydWN0dXJlKCdtZW51cycsICdzaG9ydG1lbnVzJyk7XG5cdHBnLnN0cnVjdHVyZXMuc2hvcnRtZW51cy5wb3B1cFRvcExpbmtzID0gKHgpID0+IHtcblx0XHRyZXR1cm4gcGcuc3RydWN0dXJlcy5tZW51cy5wb3B1cFRvcExpbmtzKHgsIHRydWUpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLnNob3J0bWVudXMucG9wdXBSZWRpclRvcExpbmtzID0gcGcuc3RydWN0dXJlcy5zaG9ydG1lbnVzLnBvcHVwVG9wTGlua3M7XG5cdHBnLnN0cnVjdHVyZXMubGl0ZSA9IHt9O1xuXHRwZy5zdHJ1Y3R1cmVzLmxpdGUucG9wdXBMYXlvdXQgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIFsncG9wdXBUaXRsZScsICdwb3B1cFByZXZpZXcnXTtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5saXRlLnBvcHVwVGl0bGUgPSAoeCkgPT4ge1xuXHRcdGxvZyhgJHt4LmFydGljbGV9OiBzdHJ1Y3R1cmVzLmxpdGUucG9wdXBUaXRsZWApO1xuXHRcdC8vIHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKCc8Yj48PG1haW5saW5rPj48L2I+Jyx4LmFydGljbGUseC5wYXJhbXMpO1xuXHRcdHJldHVybiBgPGRpdj48c3BhbiBjbGFzcz1cInBvcHVwX21haW5saW5rXCI+PGI+JHt4LmFydGljbGUudG9TdHJpbmcoKX08L2I+PC9zcGFuPjwvZGl2PmA7XG5cdH07XG5cdC8vIEVOREZJTEU6IHN0cnVjdHVyZXMuanNcblx0Ly8gU1RBUlRGSUxFOiBhdXRvZWRpdC5qc1xuXHRjb25zdCBzdWJzdGl0dXRlID0gKGRhdGEsIGNtZEJvZHkpID0+IHtcblx0XHQvLyBtdy5ub3RpZnkoYHN1YlxcbmZyb206ICR7Y21kQm9keS5mcm9tfVxcbnRvOiAke2NtZEJvZHkudG99XFxuZmxhZ3M6ICR7Y21kQm9keS5mbGFnc31gLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ3dhcm4nfSk7XG5cdFx0Y29uc3QgZnJvbVJlID0gbmV3IFJlZ0V4cChjbWRCb2R5LmZyb20sIGNtZEJvZHkuZmxhZ3MpO1xuXHRcdHJldHVybiBkYXRhLnJlcGxhY2UoZnJvbVJlLCBjbWRCb2R5LnRvKTtcblx0fTtcblx0Y29uc3QgZXhlY0NtZHMgPSAoZGF0YSwgY21kTGlzdCkgPT4ge1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBjbWRMaXN0KSB7XG5cdFx0XHRkYXRhID0gZWxlbWVudC5hY3Rpb24oZGF0YSwgZWxlbWVudCk7XG5cdFx0fVxuXHRcdHJldHVybiBkYXRhO1xuXHR9O1xuXHRjb25zdCBwYXJzZUNtZCA9IGZ1bmN0aW9uIHBhcnNlQ21kKHN0cikge1xuXHRcdC8vIHJldHVybnMgYSBsaXN0IG9mIGNvbW1hbmRzXG5cdFx0aWYgKHN0ci5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cdFx0bGV0IHAgPSBmYWxzZTtcblx0XHRzd2l0Y2ggKHN0ci5jaGFyQXQoMCkpIHtcblx0XHRcdGNhc2UgJ3MnOlxuXHRcdFx0XHRwID0gcGFyc2VTdWJzdGl0dXRlKHN0cik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAocCkge1xuXHRcdFx0cmV0dXJuIFtwLCBwYXJzZUNtZChwLnJlbWFpbmRlcildO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cdC8vIEZJWE1FOiBPbmx5IHVzZWQgb25jZSBoZXJlLCBjb25mdXNpbmcgd2l0aCBuYXRpdmUgKGFuZCBtb3JlIHdpZGVseS11c2VkKSB1bmVzY2FwZSwgc2hvdWxkIHByb2JhYmx5IGJlIHJlcGxhY2VkXG5cdC8vIFRoZW4gYWdhaW4sIHVuZXNjYXBlIGlzIHNlbWktc29mdC1kZXByZWNhdGVkLCBzbyB3ZSBzaG91bGQgbG9vayBpbnRvIHJlcGxhY2luZyB0aGF0IHRvb1xuXHRjb25zdCB1bkVzY2FwZSA9IChzdHIsIHNlcCkgPT4ge1xuXHRcdHJldHVybiBzdHIuc3BsaXQoJ1xcXFxcXFxcJykuam9pbignXFxcXCcpLnNwbGl0KGBcXFxcJHtzZXB9YCkuam9pbihzZXApLnNwbGl0KCdcXFxcbicpLmpvaW4oJ1xcbicpO1xuXHR9O1xuXHRjb25zdCBwYXJzZVN1YnN0aXR1dGUgPSAoc3RyKSA9PiB7XG5cdFx0Ly8gdGFrZXMgYSBzdHJpbmcgbGlrZSBzL2EvYi9mbGFncztvdGhlcmNtZHMgYW5kIHBhcnNlcyBpdFxuXHRcdGxldCBmcm9tO1xuXHRcdGxldCB0bztcblx0XHRsZXQgZmxhZ3M7XG5cdFx0bGV0IHRtcDtcblx0XHRpZiAoc3RyLmxlbmd0aCA8IDQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3Qgc2VwID0gc3RyLmNoYXJBdCgxKTtcblx0XHRzdHIgPSBzdHIuc2xpY2UoMik7XG5cdFx0dG1wID0gc2tpcE92ZXIoc3RyLCBzZXApO1xuXHRcdGlmICh0bXApIHtcblx0XHRcdGZyb20gPSB0bXAuc2VnbWVudDtcblx0XHRcdHN0ciA9IHRtcC5yZW1haW5kZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dG1wID0gc2tpcE92ZXIoc3RyLCBzZXApO1xuXHRcdGlmICh0bXApIHtcblx0XHRcdHRvID0gdG1wLnNlZ21lbnQ7XG5cdFx0XHRzdHIgPSB0bXAucmVtYWluZGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGZsYWdzID0gJyc7XG5cdFx0aWYgKHN0ci5sZW5ndGggPiAwKSB7XG5cdFx0XHR0bXAgPSBza2lwT3ZlcihzdHIsICc7JykgfHwgc2tpcFRvRW5kKHN0ciwgJzsnKTtcblx0XHRcdGlmICh0bXApIHtcblx0XHRcdFx0ZmxhZ3MgPSB0bXAuc2VnbWVudDtcblx0XHRcdFx0c3RyID0gdG1wLnJlbWFpbmRlcjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFjdGlvbjogc3Vic3RpdHV0ZSxcblx0XHRcdGZyb20sXG5cdFx0XHR0byxcblx0XHRcdGZsYWdzLFxuXHRcdFx0cmVtYWluZGVyOiBzdHIsXG5cdFx0fTtcblx0fTtcblx0Y29uc3Qgc2tpcE92ZXIgPSAoc3RyLCBzZXApID0+IHtcblx0XHRjb25zdCBlbmRTZWdtZW50ID0gZmluZE5leHQoc3RyLCBzZXApO1xuXHRcdGlmIChlbmRTZWdtZW50IDwgMCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBzZWdtZW50ID0gdW5Fc2NhcGUoc3RyLnNsaWNlKDAsIE1hdGgubWF4KDAsIGVuZFNlZ21lbnQpKSwgc2VwKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VnbWVudCxcblx0XHRcdHJlbWFpbmRlcjogc3RyLnNsaWNlKE1hdGgubWF4KDAsIGVuZFNlZ21lbnQgKyAxKSksXG5cdFx0fTtcblx0fTtcblx0Y29uc3Qgc2tpcFRvRW5kID0gKHN0ciwgX3NlcCkgPT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWdtZW50OiBzdHIsXG5cdFx0XHRyZW1haW5kZXI6ICcnLFxuXHRcdH07XG5cdH07XG5cdGNvbnN0IGZpbmROZXh0ID0gKHN0ciwgY2gpID0+IHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYgKHN0ci5jaGFyQXQoaSkgPT09ICdcXFxcJykge1xuXHRcdFx0XHRpICs9IDI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RyLmNoYXJBdChpKSA9PT0gY2gpIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fTtcblx0Y29uc3Qgc2V0Q2hlY2tib3ggPSAocGFyYW0sIGJveCkgPT4ge1xuXHRcdGNvbnN0IHZhbCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZShwYXJhbSk7XG5cdFx0aWYgKHZhbCkge1xuXHRcdFx0c3dpdGNoICh2YWwpIHtcblx0XHRcdFx0Y2FzZSAnMSc6XG5cdFx0XHRcdGNhc2UgJ3llcyc6XG5cdFx0XHRcdGNhc2UgJ3RydWUnOlxuXHRcdFx0XHRcdGJveC5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnMCc6XG5cdFx0XHRcdGNhc2UgJ25vJzpcblx0XHRcdFx0Y2FzZSAnZmFsc2UnOlxuXHRcdFx0XHRcdGJveC5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBhdXRvRWRpdCA9IGZ1bmN0aW9uIGF1dG9FZGl0KCkge1xuXHRcdHNldHVwUG9wdXBzKCgpID0+IHtcblx0XHRcdGlmIChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2F1dG9pbXBsJykgIT09IHBvcHVwU3RyaW5nKCdhdXRvZWRpdF92ZXJzaW9uJykpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b3dhdGNobGlzdCcpICYmIG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYWN0b2tlbicpID09PSBhdXRvQ2xpY2tUb2tlbigpKSB7XG5cdFx0XHRcdHBnLmZuLm1vZGlmeVdhdGNobGlzdChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3RpdGxlJyksIG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYWN0aW9uJykpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFkb2N1bWVudC5lZGl0Zm9ybSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYXV0b0VkaXQuYWxyZWFkeVJhbikge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRhdXRvRWRpdC5hbHJlYWR5UmFuID0gdHJ1ZTtcblx0XHRcdGNvbnN0IGNtZFN0cmluZyA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b2VkaXQnKTtcblx0XHRcdGlmIChjbWRTdHJpbmcpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBlZGl0Ym94ID0gZG9jdW1lbnQuZWRpdGZvcm0ud3BUZXh0Ym94MTtcblx0XHRcdFx0XHRjb25zdCBjbWRMaXN0ID0gcGFyc2VDbWQoY21kU3RyaW5nKTtcblx0XHRcdFx0XHRjb25zdCBpbnB1dCA9IGVkaXRib3gudmFsdWU7XG5cdFx0XHRcdFx0Y29uc3Qgb3V0cHV0ID0gZXhlY0NtZHMoaW5wdXQsIGNtZExpc3QpO1xuXHRcdFx0XHRcdGVkaXRib3gudmFsdWUgPSBvdXRwdXQ7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0c2V0Q2hlY2tib3goJ2F1dG9taW5vcicsIGRvY3VtZW50LmVkaXRmb3JtLndwTWlub3JlZGl0KTtcblx0XHRcdHNldENoZWNrYm94KCdhdXRvd2F0Y2gnLCBkb2N1bWVudC5lZGl0Zm9ybS53cFdhdGNodGhpcyk7XG5cdFx0XHRjb25zdCBydmlkID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvcnYnKTtcblx0XHRcdGlmIChydmlkKSB7XG5cdFx0XHRcdGNvbnN0IHVybCA9IGAke3BnLndpa2kuYXBpd2lraWJhc2V9P2FjdGlvbj1xdWVyeSZmb3JtYXQ9anNvbiZmb3JtYXR2ZXJzaW9uPTImcHJvcD1yZXZpc2lvbnMmcmV2aWRzPSR7cnZpZH1gO1xuXHRcdFx0XHRzdGFydERvd25sb2FkKHVybCwgbnVsbCwgYXV0b0VkaXQyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGF1dG9FZGl0MigpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBhdXRvRWRpdDIgPSAoZCkgPT4ge1xuXHRcdGxldCBzdW1tYXJ5ID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvc3VtbWFyeScpO1xuXHRcdGxldCBzdW1tYXJ5cHJvbXB0ID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvc3VtbWFyeXByb21wdCcpO1xuXHRcdGxldCBzdW1tYXJ5bm90aWNlID0gJyc7XG5cdFx0aWYgKGQgJiYgZC5kYXRhICYmIG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b3J2JykpIHtcblx0XHRcdGNvbnN0IHMgPSBnZXRSdlN1bW1hcnkoc3VtbWFyeSwgZC5kYXRhKTtcblx0XHRcdGlmIChzID09PSBmYWxzZSkge1xuXHRcdFx0XHRzdW1tYXJ5cHJvbXB0ID0gdHJ1ZTtcblx0XHRcdFx0c3VtbWFyeW5vdGljZSA9IHBvcHVwU3RyaW5nKCdGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIGluZm9ybWF0aW9uLCBwbGVhc2UgZWRpdCBtYW51YWxseS5cXG5cXG4nKTtcblx0XHRcdFx0c3VtbWFyeSA9IHNpbXBsZVByaW50ZihzdW1tYXJ5LCBbbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvcnYnKSwgJyh1bmtub3duKScsICcodW5rbm93biknXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdW1tYXJ5ID0gcztcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHN1bW1hcnlwcm9tcHQpIHtcblx0XHRcdGNvbnN0IHR4dCA9IHN1bW1hcnlub3RpY2UgKyBwb3B1cFN0cmluZygnRW50ZXIgYSBub24tZW1wdHkgZWRpdCBzdW1tYXJ5IG9yIHByZXNzIGNhbmNlbCB0byBhYm9ydCcpO1xuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBwcm9tcHQodHh0LCBzdW1tYXJ5KTtcblx0XHRcdGlmIChyZXNwb25zZSkge1xuXHRcdFx0XHRzdW1tYXJ5ID0gcmVzcG9uc2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzdW1tYXJ5KSB7XG5cdFx0XHRkb2N1bWVudC5lZGl0Zm9ybS53cFN1bW1hcnkudmFsdWUgPSBzdW1tYXJ5O1xuXHRcdH1cblx0XHQvLyBBdHRlbXB0IHRvIGF2b2lkIHBvc3NpYmxlIHByZW1hdHVyZSBjbGlja2luZyBvZiB0aGUgc2F2ZSBidXR0b25cblx0XHQvLyAobWF5YmUgZGVsYXlzIGluIHVwZGF0ZXMgdG8gdGhlIERPTSBhcmUgdG8gYmxhbWU/PyBvciBhIHJlZCBoZXJyaW5nKVxuXHRcdHNldFRpbWVvdXQoYXV0b0VkaXQzLCAxMDApO1xuXHR9O1xuXHRjb25zdCBhdXRvQ2xpY2tUb2tlbiA9ICgpID0+IHtcblx0XHRyZXR1cm4gbXcudXNlci5zZXNzaW9uSWQoKTtcblx0fTtcblx0Y29uc3QgYXV0b0VkaXQzID0gKCkgPT4ge1xuXHRcdGlmIChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2FjdG9rZW4nKSAhPT0gYXV0b0NsaWNrVG9rZW4oKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBidG4gPSBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2F1dG9jbGljaycpO1xuXHRcdGlmIChidG4pIHtcblx0XHRcdGlmIChkb2N1bWVudC5lZGl0Zm9ybSAmJiBkb2N1bWVudC5lZGl0Zm9ybVtidG5dKSB7XG5cdFx0XHRcdGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmVkaXRmb3JtW2J0bl07XG5cdFx0XHRcdGNvbnN0IG1zZyA9IHRwcmludGYoXG5cdFx0XHRcdFx0J1RoZSAlcyBidXR0b24gaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbGlja2VkLiBQbGVhc2Ugd2FpdCBmb3IgdGhlIG5leHQgcGFnZSB0byBsb2FkLicsXG5cdFx0XHRcdFx0W2J1dHRvbi52YWx1ZV1cblx0XHRcdFx0KTtcblx0XHRcdFx0YmFubmVyTWVzc2FnZShtc2cpO1xuXHRcdFx0XHRkb2N1bWVudC50aXRsZSA9IGAoJHtkb2N1bWVudC50aXRsZX0pYDtcblx0XHRcdFx0YnV0dG9uLmNsaWNrKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeShcblx0XHRcdFx0XHR0cHJpbnRmKCdDb3VsZCBub3QgZmluZCBidXR0b24gJXMuIFBsZWFzZSBjaGVjayB0aGUgc2V0dGluZ3MgaW4geW91ciBqYXZhc2NyaXB0IGZpbGUuJywgW2J0bl0pLFxuXHRcdFx0XHRcdHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnZXJyb3InfVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgYmFubmVyTWVzc2FnZSA9IChzKSA9PiB7XG5cdFx0Y29uc3QgaGVhZGluZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMScpO1xuXHRcdGlmIChoZWFkaW5ncykge1xuXHRcdFx0Y29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRkaXYuaW5uZXJIVE1MID0gYDxmb250IHNpemU9KzE+PGI+JHtwZy5lc2NhcGVRdW90ZXNIVE1MKHMpfTwvYj48L2ZvbnQ+YDtcblx0XHRcdGhlYWRpbmdzWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgaGVhZGluZ3NbMF0pO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZ2V0UnZTdW1tYXJ5ID0gKHRlbXBsYXRlLCBqc29uKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG8gPSBnZXRKc09iaihqc29uKTtcblx0XHRcdGNvbnN0IFtlZGl0XSA9IGFueUNoaWxkKG8ucXVlcnkucGFnZXMpLnJldmlzaW9ucztcblx0XHRcdGNvbnN0IHRpbWVzdGFtcCA9IGVkaXQudGltZXN0YW1wXG5cdFx0XHRcdC5zcGxpdCgvW0EtWl0vZylcblx0XHRcdFx0LmpvaW4oJyAnKVxuXHRcdFx0XHQucmVwbGFjZSgvXiAqfCAqJC9nLCAnJyk7XG5cdFx0XHRyZXR1cm4gc2ltcGxlUHJpbnRmKHRlbXBsYXRlLCBbZWRpdC5yZXZpZCwgdGltZXN0YW1wLCBlZGl0LnVzZXJoaWRkZW4gPyAnKGhpZGRlbiknIDogZWRpdC51c2VyXSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXHQvLyBFTkRGSUxFOiBhdXRvZWRpdC5qc1xuXHQvLyBTVEFSVEZJTEU6IGRvd25sb2FkZXIuanNcblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICoge0Bzb3VyY2UgRG93bmxvYWRlcn0sIGEgeG1saHR0cHJlcXVlc3Qgd3JhcHBlciwgYW5kIGhlbHBlciBmdW5jdGlvbnMuXG5cdCAqL1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBEb3dubG9hZGVyXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAY2xhc3MgVGhlIERvd25sb2FkZXIgY2xhc3MuIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRvIGRvd25sb2FkIHN0dWZmLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSB1cmwgdG8gZG93bmxvYWQuIFRoaXMgY2FuIGJlIG9taXR0ZWQgYW5kIHN1cHBsaWVkIGxhdGVyLlxuXHQgKi9cblx0Y2xhc3MgRG93bmxvYWRlciB7XG5cdFx0Y29uc3RydWN0b3IodXJsKSB7XG5cdFx0XHRpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aGlzLmh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0XHRcdH1cblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIHVybCB0byBkb3dubG9hZFxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnVybCA9IHVybDtcblx0XHRcdC8qKlxuXHRcdFx0ICogQSB1bml2ZXJzYWxseSB1bmlxdWUgSUQgbnVtYmVyXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgaW50ZWdlclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmlkID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogTW9kaWZpY2F0aW9uIGRhdGUsIHRvIGJlIGN1bGxlZCBmcm9tIHRoZSBpbmNvbWluZyBoZWFkZXJzXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgRGF0ZVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5sYXN0TW9kaWZpZWQgPSBudWxsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBXaGF0IHRvIGRvIHdoZW4gdGhlIGRvd25sb2FkIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHlcblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBGdW5jdGlvblxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5jYWxsYmFja0Z1bmN0aW9uID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogV2hhdCB0byBkbyBvbiBmYWlsdXJlXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgRnVuY3Rpb25cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMub25GYWlsdXJlID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogRmxhZyBzZXQgb24gPGNvZGU+YWJvcnQ8L2NvZGU+XG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmFib3J0ZWQgPSBmYWxzZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogSFRUUCBtZXRob2QuIFNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWM5Lmh0bWwgZm9yXG5cdFx0XHQgKiBwb3NzaWJpbGl0aWVzLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdFx0ICovXG5cdFx0XHR0aGlzLm1ldGhvZCA9ICdHRVQnO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBBc3luYyBmbGFnLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIGJvb2xlYW5cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5hc3luYyA9IHRydWU7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFN1Ym1pdHMgdGhlIGh0dHAgcmVxdWVzdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Kn0geFxuXHRcdCAqL1xuXHRcdHNlbmQoeCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5odHRwLnNlbmQoeCk7XG5cdFx0fVxuXHRcdC8qIEFib3J0cyB0aGUgZG93bmxvYWQsIHNldHRpbmcgdGhlIDxjb2RlPmFib3J0ZWQ8L2NvZGU+IGZpZWxkIHRvIHRydWUuICovXG5cdFx0YWJvcnQoKSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHRoaXMuYWJvcnRlZCA9IHRydWU7XG5cdFx0XHRyZXR1cm4gdGhpcy5odHRwLmFib3J0KCk7XG5cdFx0fVxuXHRcdC8qKiBSZXR1cm5zIHRoZSBkb3dubG9hZGVkIGRhdGEuICovXG5cdFx0Z2V0RGF0YSgpIHtcblx0XHRcdGlmICghdGhpcy5odHRwKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuaHR0cC5yZXNwb25zZVRleHQ7XG5cdFx0fVxuXHRcdC8qKiBQcmVwYXJlcyB0aGUgZG93bmxvYWQuICovXG5cdFx0c2V0VGFyZ2V0KCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmh0dHAub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRoaXMuYXN5bmMpO1xuXHRcdFx0dGhpcy5odHRwLnNldFJlcXVlc3RIZWFkZXIoJ0FwaS1Vc2VyLUFnZW50JywgcGcuYXBpLnVzZXJBZ2VudCk7XG5cdFx0fVxuXHRcdC8qKiBHZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZG93bmxvYWQuICovXG5cdFx0Z2V0UmVhZHlTdGF0ZSgpIHtcblx0XHRcdGlmICghdGhpcy5odHRwKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuaHR0cC5yZWFkeVN0YXRlO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBTdGFydHMgdGhlIGRvd25sb2FkLlxuXHRcdCAqIE5vdGUgdGhhdCBzZXRUYXJnZXQge0Bzb3VyY2UgRG93bmxvYWRlciNzZXRUYXJnZXR9IG11c3QgYmUgcnVuIGZpcnN0XG5cdFx0ICovXG5cdFx0c3RhcnQoKSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdHBnLm1pc2MuZG93bmxvYWRzSW5Qcm9ncmVzc1t0aGlzLmlkXSA9IHNlbGY7XG5cdFx0XHR0aGlzLmh0dHAuc2VuZChudWxsKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogR2V0cyB0aGUgJ0xhc3QtTW9kaWZpZWQnIGRhdGUgZnJvbSB0aGUgZG93bmxvYWQgaGVhZGVycy5cblx0XHQgKiBTaG91bGQgYmUgcnVuIGFmdGVyIHRoZSBkb3dubG9hZCBjb21wbGV0ZXMuXG5cdFx0ICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBvbiBmYWlsdXJlLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7RGF0ZX1cblx0XHQgKi9cblx0XHRnZXRMYXN0TW9kaWZpZWREYXRlKCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRsZXQgbGFzdG1vZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGxhc3Rtb2QgPSB0aGlzLmh0dHAuZ2V0UmVzcG9uc2VIZWFkZXIoJ0xhc3QtTW9kaWZpZWQnKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBlbXB0eSAqL1xuXHRcdFx0fVxuXHRcdFx0aWYgKGxhc3Rtb2QpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBEYXRlKGxhc3Rtb2QpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFNldHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZiBjYWxsYmFjayBmdW5jdGlvbiwgY2FsbGVkIGFzIDxjb2RlPmYodGhpcyk8L2NvZGU+IG9uIHN1Y2Nlc3Ncblx0XHQgKi9cblx0XHRzZXRDYWxsYmFjayhmKSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmh0dHAub25yZWFkeXN0YXRlY2hhbmdlID0gZjtcblx0XHR9XG5cdFx0Z2V0U3RhdHVzKCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5odHRwLnN0YXR1cztcblx0XHR9XG5cdH1cblx0bmV3IERvd25sb2FkZXIoKTtcblx0cGcubWlzYy5kb3dubG9hZHNJblByb2dyZXNzID0ge307XG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcge0Bzb3VyY2UgRG93bmxvYWRlcn0gYW5kIHByZXBhcmVzIGl0IGZvciBhY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIHVybCB0byBkb3dubG9hZFxuXHQgKiBAcGFyYW0ge2ludGVnZXJ9IGlkIFRoZSBJRCBvZiB0aGUge0Bzb3VyY2UgRG93bmxvYWRlcn0gb2JqZWN0XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIG9uIHN1Y2Nlc3Ncblx0ICogQHBhcmFtIHtudW1iZXJ9IG9uZmFpbHVyZVxuXHQgKiBAcmV0dXJuIHtTdHJpbmcvRG93bmxvYWRlcn0gdGhlIHtAc291cmNlIERvd25sb2FkZXJ9IG9iamVjdCBjcmVhdGVkLCBvciAnb2hkZWFyJyBpZiBhbiB1bnN1cHBvcnRlZCBicm93c2VyXG5cdCAqL1xuXHRjb25zdCBuZXdEb3dubG9hZCA9IGZ1bmN0aW9uIG5ld0Rvd25sb2FkKHVybCwgaWQsIGNhbGxiYWNrLCBvbmZhaWx1cmUpIHtcblx0XHRjb25zdCBkID0gbmV3IERvd25sb2FkZXIodXJsKTtcblx0XHRpZiAoIWQuaHR0cCkge1xuXHRcdFx0cmV0dXJuICdvaGRlYXInO1xuXHRcdH1cblx0XHRkLmlkID0gaWQ7XG5cdFx0ZC5zZXRUYXJnZXQoKTtcblx0XHRpZiAoIW9uZmFpbHVyZSkge1xuXHRcdFx0b25mYWlsdXJlID0gMjtcblx0XHR9XG5cdFx0Y29uc3QgZiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChkLmdldFJlYWR5U3RhdGUoKSA9PT0gNCkge1xuXHRcdFx0XHRkZWxldGUgcGcubWlzYy5kb3dubG9hZHNJblByb2dyZXNzW3RoaXMuaWRdO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGlmIChkLmdldFN0YXR1cygpID09PSAyMDApIHtcblx0XHRcdFx0XHRcdGQuZGF0YSA9IGQuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0ZC5sYXN0TW9kaWZpZWQgPSBkLmdldExhc3RNb2RpZmllZERhdGUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrKGQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIG9uZmFpbHVyZSA9PT0gdHlwZW9mIDEpIHtcblx0XHRcdFx0XHRcdGlmIChvbmZhaWx1cmUgPiAwKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHJldHJ5XG5cdFx0XHRcdFx0XHRcdG5ld0Rvd25sb2FkKHVybCwgaWQsIGNhbGxiYWNrLCBvbmZhaWx1cmUgLSAxKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBvbmZhaWx1cmUgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRcdG9uZmFpbHVyZShkLCB1cmwsIGlkLCBjYWxsYmFjayk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvKiBpZ25vcmUgaXQgKi9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0ZC5zZXRDYWxsYmFjayhmKTtcblx0XHRyZXR1cm4gZDtcblx0fTtcblx0LyoqXG5cdCAqIFNpbXVsYXRlcyBhIGRvd25sb2FkIGZyb20gY2FjaGVkIGRhdGEuXG5cdCAqIFRoZSBzdXBwbGllZCBkYXRhIGlzIHB1dCBpbnRvIGEge0Bzb3VyY2UgRG93bmxvYWRlcn0gYXMgaWYgaXQgaGFkIGRvd25sb2FkZWQgaXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIHVybC5cblx0ICogQHBhcmFtIHtpbnRlZ2VyfSBpZCBUaGUgSUQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjaywgd2hpY2ggaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhcyA8Y29kZT5jYWxsYmFjayhkKTwvY29kZT4sXG5cdCAqIHdoZXJlIDxjb2RlPmQ8L2NvZGU+IGlzIHRoZSBuZXcge0Bzb3VyY2UgRG93bmxvYWRlcn0uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIFRoZSAoY2FjaGVkKSBkYXRhLlxuXHQgKiBAcGFyYW0ge0RhdGV9IGxhc3RNb2RpZmllZCBUaGUgKGNhY2hlZCkgbGFzdCBtb2RpZmllZCBkYXRlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gb3duZXJcblx0ICovXG5cdGNvbnN0IGZha2VEb3dubG9hZCA9ICh1cmwsIGlkLCBjYWxsYmFjaywgZGF0YSwgbGFzdE1vZGlmaWVkLCBvd25lcikgPT4ge1xuXHRcdGNvbnN0IGQgPSBuZXdEb3dubG9hZCh1cmwsIGNhbGxiYWNrKTtcblx0XHRkLm93bmVyID0gb3duZXI7XG5cdFx0ZC5pZCA9IGlkO1xuXHRcdGQuZGF0YSA9IGRhdGE7XG5cdFx0ZC5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7XG5cdFx0cmV0dXJuIGNhbGxiYWNrKGQpO1xuXHR9O1xuXHQvKipcblx0ICogU3RhcnRzIGEgZG93bmxvYWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIHVybCB0byBkb3dubG9hZFxuXHQgKiBAcGFyYW0ge2ludGVnZXJ9IGlkIFRoZSBJRCBvZiB0aGUge0Bzb3VyY2UgRG93bmxvYWRlcn0gb2JqZWN0XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIG9uIHN1Y2Nlc3Ncblx0ICogQHJldHVybiB7U3RyaW5nL0Rvd25sb2FkZXJ9IHRoZSB7QHNvdXJjZSBEb3dubG9hZGVyfSBvYmplY3QgY3JlYXRlZCwgb3IgJ29oZGVhcicgaWYgYW4gdW5zdXBwb3J0ZWQgYnJvd3NlclxuXHQgKi9cblx0Y29uc3Qgc3RhcnREb3dubG9hZCA9ICh1cmwsIGlkLCBjYWxsYmFjaykgPT4ge1xuXHRcdGNvbnN0IGQgPSBuZXdEb3dubG9hZCh1cmwsIGlkLCBjYWxsYmFjayk7XG5cdFx0aWYgKHR5cGVvZiBkID09PSB0eXBlb2YgJycpIHtcblx0XHRcdHJldHVybiBkO1xuXHRcdH1cblx0XHRkLnN0YXJ0KCk7XG5cdFx0cmV0dXJuIGQ7XG5cdH07XG5cdC8qKlxuXHQgKiBBYm9ydHMgYWxsIGRvd25sb2FkcyB3aGljaCBoYXZlIGJlZW4gc3RhcnRlZC5cblx0ICovXG5cdGNvbnN0IGFib3J0QWxsRG93bmxvYWRzID0gKCkgPT4ge1xuXHRcdGZvciAoY29uc3QgeCBpbiBwZy5taXNjLmRvd25sb2Fkc0luUHJvZ3Jlc3MpIHtcblx0XHRcdGlmICghT2JqZWN0Lmhhc093bihwZy5taXNjLmRvd25sb2Fkc0luUHJvZ3Jlc3MsIHgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cGcubWlzYy5kb3dubG9hZHNJblByb2dyZXNzW3hdLmFib3J0ZWQgPSB0cnVlO1xuXHRcdFx0XHRwZy5taXNjLmRvd25sb2Fkc0luUHJvZ3Jlc3NbeF0uYWJvcnQoKTtcblx0XHRcdFx0ZGVsZXRlIHBnLm1pc2MuZG93bmxvYWRzSW5Qcm9ncmVzc1t4XTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBlbXB0eSAqL1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Ly8gRU5ERklMRTogZG93bmxvYWRlci5qc1xuXHQvLyBTVEFSVEZJTEU6IGxpdmVwcmV2aWV3LmpzXG5cdC8vIFRPRE86IGxvY2F0aW9uIGlzIG9mdGVuIG5vdCBjb3JyZWN0IChlZyByZWxhdGl2ZSBsaW5rcyBpbiBwcmV2aWV3cylcblx0Ly8gTk9URTogcmVtb3ZlZCBtZDUgYW5kIGltYWdlIGFuZCBtYXRoIHBhcnNpbmcuIHdhcyBicm9rZW4sIGxvdHMgb2YgYnl0ZXMuXG5cdC8qKlxuXHQgKiBJbnN0YVZpZXcgLSBhIE1lZGlhd2lraSB0byBIVE1MIGNvbnZlcnRlciBpbiBKYXZhU2NyaXB0XG5cdCAqIFZlcnNpb24gMC42LjFcblx0ICogQ29weXJpZ2h0IChDKSBQZWRybyBGYXlvbGxlIDIwMDUtMjAwNlxuXHQgKiB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVXNlcjpQaWxhZn1cblx0ICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlXG5cdCAqXG5cdCAqIENoYW5nZWxvZzpcblx0ICpcblx0ICogMC42LjFcblx0ICogLSBGaXhlZCBwcm9ibGVtIGNhdXNlZCBieSBcXHIgY2hhcmFjdGVyc1xuXHQgKiAtIEltcHJvdmVkIGlubGluZSBmb3JtYXR0aW5nIHBhcnNlclxuXHQgKlxuXHQgKiAwLjZcblx0ICogLSBDaGFuZ2VkIG5hbWUgdG8gSW5zdGFWaWV3XG5cdCAqIC0gU29tZSBtYWpvciBjb2RlIHJlb3JnYW5pemF0aW9ucyBhbmQgZmFjdG9yZWQgb3V0IHNvbWUgY29tbW9uIGZ1bmN0aW9uc1xuXHQgKiAtIEhhbmRsZWQgY29udmVyc2lvbiBvZiByZWxhdGl2ZSBsaW5rcyAoaS5lLiBbWy9mb29dXSlcblx0ICogLSBGaXhlZCBtaXNyZW5kZXJpbmcgb2YgYWRqYWNlbnQgZGVmaW5pdGlvbiBsaXN0IGl0ZW1zXG5cdCAqIC0gRml4ZWQgYnVnIGluIHRhYmxlIGhlYWRpbmdzIGhhbmRsaW5nXG5cdCAqIC0gQ2hhbmdlZCBkYXRlIGZvcm1hdCBpbiBzaWduYXR1cmVzIHRvIHJlZmxlY3QgTWVkaWF3aWtpJ3Ncblx0ICogLSBGaXhlZCBoYW5kbGluZyBvZiBbWzpJbWFnZTouLi5dXVxuXHQgKiAtIFVwZGF0ZWQgTUQ1IGZ1bmN0aW9uIChob3BlZnVsbHkgaXQgd2lsbCB3b3JrIHdpdGggVVRGLTgpXG5cdCAqIC0gRml4ZWQgYnVnIGluIGhhbmRsaW5nIG9mIGxpbmtzIGluc2lkZSBpbWFnZXNcblx0ICpcblx0ICogVG8gZG86XG5cdCAqIC0gQmV0dGVyIHN1cHBvcnQgZm9yIG1hdGggdGFnc1xuXHQgKiAtIEZ1bGwgc3VwcG9ydCBmb3Igbm93aWtpIHRhZ1xuXHQgKiAtIFBhcnNlci1iYXNlZCAoYXMgb3Bwb3NlZCB0byBSZWdFeHAtYmFzZWQpIGlubGluZSB3aWtpY29kZSBoYW5kbGluZyAobWFrZSBpdCBvbmUtcGFzcyBhbmRcblx0ICogICBidWxsZXQtcHJvb2YpXG5cdCAqIC0gU3VwcG9ydCBmb3IgdGVtcGxhdGVzICh0aHJvdWdoIEFKQVgpXG5cdCAqIC0gU3VwcG9ydCBmb3IgY29sb3VyZWQgbGlua3MgKEFKQVgpXG5cdCAqL1xuXHRjb25zdCBJbnN0YSA9IHt9O1xuXHRjb25zdCBzZXR1cExpdmVQcmV2aWV3ID0gKCkgPT4ge1xuXHRcdGxldCBfYjtcblx0XHQvLyBvcHRpb25zXG5cdFx0SW5zdGEuY29uZiA9IHtcblx0XHRcdGJhc2VVcmw6ICcnLFxuXHRcdFx0dXNlcjoge30sXG5cdFx0XHR3aWtpOiB7XG5cdFx0XHRcdGxhbmc6IHBnLndpa2kubGFuZyxcblx0XHRcdFx0aW50ZXJ3aWtpOiBwZy53aWtpLmludGVyd2lraSxcblx0XHRcdFx0ZGVmYXVsdF90aHVtYl93aWR0aDogMTgwLFxuXHRcdFx0fSxcblx0XHRcdHBhdGhzOiB7XG5cdFx0XHRcdGFydGljbGVzOiBgJHtwZy53aWtpLmFydGljbGVQYXRofS9gLFxuXHRcdFx0XHQvLyBPbmx5IHVzZWQgZm9yIEluc3RhIHByZXZpZXdzIHdpdGggaW1hZ2VzLiAobm90IGluIHBvcHVwcylcblx0XHRcdFx0bWF0aDogJy9tYXRoLycsXG5cdFx0XHRcdGltYWdlczogJ2h0dHBzOi8vdHUuemhvbmd3ZW4ud2lraS9pbWFnZXMvcWl1d2VuYmFpa2UvemgvJyxcblx0XHRcdFx0aW1hZ2VzX2ZhbGxiYWNrOiAnLy93bS56aG9uZ3dlbi53aWtpL2NvbW1vbnMvJyxcblx0XHRcdH0sXG5cdFx0XHRsb2NhbGU6IHtcblx0XHRcdFx0dXNlcjogbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbcGcubnNVc2VySWRdLFxuXHRcdFx0XHRpbWFnZTogbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbcGcubnNJbWFnZUlkXSxcblx0XHRcdFx0Y2F0ZWdvcnk6IG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zQ2F0ZWdvcnlJZF0sXG5cdFx0XHRcdC8vIHNob3VsZG4ndCBiZSB1c2VkIGluIHBvcHVwIHByZXZpZXdzLCBpIHRoaW5rXG5cdFx0XHRcdG1vbnRoczogWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddLFxuXHRcdFx0fSxcblx0XHR9O1xuXHRcdC8vIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBvciBiYWNrcmVmZXJlbmNlc1xuXHRcdChfYiA9IEluc3RhLmNvbmYudXNlcikubmFtZSB8fCAoX2IubmFtZSA9ICdRaXV3ZW4gQmFpa2UgY29udHJpYnV0b3JzJyk7XG5cdFx0SW5zdGEuY29uZi51c2VyLnNpZ25hdHVyZSA9IGBbWyR7SW5zdGEuY29uZi5sb2NhbGUudXNlcn06JHtJbnN0YS5jb25mLnVzZXIubmFtZX18JHtJbnN0YS5jb25mLnVzZXIubmFtZX1dXWA7XG5cdFx0Ly8gZGVmaW5lIGNvbnN0YW50c1xuXHRcdEluc3RhLkJMT0NLX0lNQUdFID0gbmV3IFJlZ0V4cChcblx0XHRcdGBeXFxcXFtcXFxcWyg/OkZpbGV8SW1hZ2V8JHtJbnN0YS5jb25mLmxvY2FsZS5pbWFnZX0pOi4qP1xcXFx8Lio/KD86ZnJhbWV8dGh1bWJuYWlsfHRodW1ifG5vbmV8cmlnaHR8bGVmdHxjZW50ZXIpYCxcblx0XHRcdCdpJ1xuXHRcdCk7XG5cdH07XG5cdEluc3RhLmR1bXAgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcblx0XHRpZiAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRmcm9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZnJvbX1gKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB0byA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHRvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dG99YCk7XG5cdFx0fVxuXHRcdHRvLmlubmVySFRNTCA9IHRoaXMuY29udmVydChmcm9tLnZhbHVlKTtcblx0fTtcblx0SW5zdGEuY29udmVydCA9ICh3aWtpKSA9PiB7XG5cdFx0Y29uc3QgbGwgPSB0eXBlb2Ygd2lraSA9PT0gJ3N0cmluZycgPyB3aWtpLnJlcGxhY2UoL1xcci9nLCAnJykuc3BsaXQoL1xcbi8pIDogd2lraTsgLy8gbGluZXMgb2Ygd2lraWNvZGVcblx0XHRsZXQgbyA9ICcnOyAvLyByZXN1bHQgb2YgcGFzc2luZyBhIHJlZ2V4cCB0byBjb21wYXJlTGluZVN0cmluZ09yUmVnKClcblx0XHRsZXQgcCA9IDA7XG5cdFx0bGV0IHI7XG5cdFx0Ly8gc29tZSBzaG9ydGhhbmRzXG5cdFx0Y29uc3QgcmVtYWluID0gKCkgPT4ge1xuXHRcdFx0cmV0dXJuIGxsLmxlbmd0aDtcblx0XHR9O1xuXHRcdGNvbnN0IHNoID0gKCkgPT4ge1xuXHRcdFx0cmV0dXJuIGxsLnNoaWZ0KCk7XG5cdFx0fTsgLy8gc2hpZnRcblx0XHRjb25zdCBwcyA9IChzKSA9PiB7XG5cdFx0XHRvICs9IHM7XG5cdFx0fTsgLy8gcHVzaFxuXG5cdFx0Ly8gc2ltaWxhciB0byBDJ3MgcHJpbnRmLCB1c2VzID8gYXMgcGxhY2Vob2xkZXJzLCA/PyB0byBlc2NhcGUgcXVlc3Rpb24gbWFya3Ncblx0XHRjb25zdCBmID0gZnVuY3Rpb24gZiguLi5hcmdzKSB7XG5cdFx0XHRsZXQgaSA9IDE7XG5cdFx0XHRjb25zdCBhID0gYXJncztcblx0XHRcdGxldCBbZl0gPSBhO1xuXHRcdFx0bGV0IG8gPSAnJztcblx0XHRcdGxldCBjO1xuXHRcdFx0bGV0IHA7XG5cdFx0XHRmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKChwID0gZi5pbmRleE9mKCc/JykpICsgMSkge1xuXHRcdFx0XHRcdC8vIGFsbG93IGNoYXJhY3RlciBlc2NhcGluZ1xuXHRcdFx0XHRcdGMgPSBmLmNoYXJBdChwICsgMSkgPT09ICc/JyA/IDEgOiAwO1xuXHRcdFx0XHRcdGkgLT0gYztcblx0XHRcdFx0XHRvICs9IGYuc2xpY2UoMCwgTWF0aC5tYXgoMCwgcCkpICsgKGMgPyAnPycgOiBhW2ldKTtcblx0XHRcdFx0XHRmID0gZi5zbGljZShwICsgMSArIGMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbyArIGY7XG5cdFx0fTtcblx0XHRjb25zdCBodG1sX2VudGl0aWVzID0gKHMpID0+IHtcblx0XHRcdHJldHVybiBzLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcblx0XHR9O1xuXHRcdC8vIFdpa2kgdGV4dCBwYXJzaW5nIHRvIGh0bWwgaXMgYSBuaWdodG1hcmUuXG5cdFx0Ly8gVGhlIGJlbG93IGZ1bmN0aW9ucyBkZWxpYmVyYXRlbHkgZG9uJ3QgZXNjYXBlIHRoZSBhbXBlcnNhbmQgc2luY2UgdGhpcyB3b3VsZCBtYWtlIGl0IG1vcmVcblx0XHQvLyBkaWZmaWN1bHQsIGFuZCB3ZSBkb24ndCBhYnNvbHV0ZWx5IG5lZWQgdG8gZm9yIGhvdyB3ZSBuZWVkIGl0LiBUaGlzIG1lYW5zIHRoYXQgYW55XG5cdFx0Ly8gdW5lc2NhcGVkIGFtcGVyc2FuZHMgaW4gd2lraXRleHQgd2lsbCByZW1haW4gdW5lc2NhcGVkIGFuZCBjYW4gY2F1c2UgaW52YWxpZCBIVE1MLlxuXHRcdC8vIEJyb3dzZXJzIHNob3VsZCBhbGwgYmUgYWJsZSB0byBoYW5kbGUgaXQgdGhvdWdoLiBXZSBhbHNvIGVzY2FwZSBzaWduaWZpY2FudCB3aWtpbWFya3VwXG5cdFx0Ly8gY2hhcmFjdGVycyB0byBwcmV2ZW50IGZ1cnRoZXIgbWF0Y2hpbmcgb24gdGhlIHByb2Nlc3NlZCB0ZXh0LlxuXHRcdGNvbnN0IGh0bWxlc2NhcGVfdGV4dCA9IChzKSA9PiB7XG5cdFx0XHRyZXR1cm4gc1xuXHRcdFx0XHQucmVwbGFjZSgvPC9nLCAnJmx0OycpXG5cdFx0XHRcdC5yZXBsYWNlKC8+L2csICcmZ3Q7Jylcblx0XHRcdFx0LnJlcGxhY2UoLzovZywgJyYjNTg7Jylcblx0XHRcdFx0LnJlcGxhY2UoL1xcWy9nLCAnJiM5MTsnKVxuXHRcdFx0XHQucmVwbGFjZSgvXS9nLCAnJiM5MzsnKTtcblx0XHR9O1xuXHRcdGNvbnN0IGh0bWxlc2NhcGVfYXR0ciA9IChzKSA9PiB7XG5cdFx0XHRyZXR1cm4gaHRtbGVzY2FwZV90ZXh0KHMpLnJlcGxhY2UoLycvZywgJyYjMzk7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuXHRcdH07XG5cdFx0Ly8gcmV0dXJuIHRoZSBmaXJzdCBub24gbWF0Y2hpbmcgY2hhcmFjdGVyIHBvc2l0aW9uIGJldHdlZW4gdHdvIHN0cmluZ3Ncblx0XHRjb25zdCBzdHJfaW1hdGNoID0gKGEsIGIpID0+IHtcblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IGw7XG5cdFx0XHRmb3IgKGkgPSAwLCBsID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRpZiAoYS5jaGFyQXQoaSkgIT09IGIuY2hhckF0KGkpKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBpO1xuXHRcdH07XG5cdFx0Ly8gY29tcGFyZSBjdXJyZW50IGxpbmUgYWdhaW5zdCBhIHN0cmluZyBvciByZWdleHBcblx0XHQvLyBpZiBwYXNzZWQgYSBzdHJpbmcgaXQgd2lsbCBjb21wYXJlIG9ubHkgdGhlIGZpcnN0IHN0cmluZy5sZW5ndGggY2hhcmFjdGVyc1xuXHRcdC8vIGlmIHBhc3NlZCBhIHJlZ2V4cCB0aGUgcmVzdWx0IGlzIHN0b3JlZCBpbiByXG5cdFx0Y29uc3QgY29tcGFyZUxpbmVTdHJpbmdPclJlZyA9IChjKSA9PiB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gbGxbMF0gJiYgbGxbMF0uc2xpY2UoMCwgYy5sZW5ndGgpID09PSBjIDogKHIgPSBsbFswXSAmJiBsbFswXS5tYXRjaChjKSk7XG5cdFx0fTtcblx0XHRjb25zdCBjb21wYXJlTGluZVN0cmluZyA9IChjKSA9PiB7XG5cdFx0XHRyZXR1cm4gbGxbMF0gPT09IGM7XG5cdFx0fTsgLy8gY29tcGFyZSBjdXJyZW50IGxpbmUgYWdhaW5zdCBhIHN0cmluZ1xuXHRcdGNvbnN0IGNoYXJBdFBvaW50ID0gKHApID0+IHtcblx0XHRcdHJldHVybiBsbFswXS5jaGFyQXQocCk7XG5cdFx0fTsgLy8gcmV0dXJuIGNoYXIgYXQgcG9zIHBcblx0XHRjb25zdCBlbmRsID0gKHMpID0+IHtcblx0XHRcdHBzKHMpO1xuXHRcdFx0c2goKTtcblx0XHR9O1xuXHRcdGNvbnN0IHBhcnNlX2xpc3QgPSAoKSA9PiB7XG5cdFx0XHRsZXQgcHJldiA9ICcnO1xuXHRcdFx0d2hpbGUgKHJlbWFpbigpICYmIGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoL14oWyMqOjtdKykoLiopJC8pKSB7XG5cdFx0XHRcdGNvbnN0IGxfbWF0Y2ggPSByO1xuXHRcdFx0XHRzaCgpO1xuXHRcdFx0XHRjb25zdCBpcG9zID0gc3RyX2ltYXRjaChwcmV2LCBsX21hdGNoWzFdKTtcblx0XHRcdFx0Ly8gY2xvc2UgdW5jb250aW51ZWQgbGlzdHNcblx0XHRcdFx0Zm9yIChsZXQgcHJldlBvcyA9IHByZXYubGVuZ3RoIC0gMTsgcHJldlBvcyA+PSBpcG9zOyBwcmV2UG9zLS0pIHtcblx0XHRcdFx0XHRjb25zdCBwaSA9IHByZXYuY2hhckF0KHByZXZQb3MpO1xuXHRcdFx0XHRcdGlmIChwaSA9PT0gJyonKSB7XG5cdFx0XHRcdFx0XHRwcygnPC91bD4nKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBpID09PSAnIycpIHtcblx0XHRcdFx0XHRcdHBzKCc8L29sPicpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoWycnLCAnKicsICcjJ10uaW5kZXhPZihsX21hdGNoWzFdLmNoYXJBdChwcmV2UG9zKSkpIHtcblx0XHRcdFx0XHRcdC8vIGNsb3NlIGEgZGwgb25seSBpZiB0aGUgbmV3IGl0ZW0gaXMgbm90IGEgZGwgaXRlbSAoOiwgOyBvciBlbXB0eSlcblx0XHRcdFx0XHRcdHBzKCc8L2RsPicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBvcGVuIG5ldyBsaXN0c1xuXHRcdFx0XHRmb3IgKGxldCBtYXRjaFBvcyA9IGlwb3M7IG1hdGNoUG9zIDwgbF9tYXRjaFsxXS5sZW5ndGg7IG1hdGNoUG9zKyspIHtcblx0XHRcdFx0XHRjb25zdCBsaSA9IGxfbWF0Y2hbMV0uY2hhckF0KG1hdGNoUG9zKTtcblx0XHRcdFx0XHRpZiAobGkgPT09ICcqJykge1xuXHRcdFx0XHRcdFx0cHMoJzx1bD4nKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpID09PSAnIycpIHtcblx0XHRcdFx0XHRcdHBzKCc8b2w+Jyk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChbJycsICcqJywgJyMnXS5pbmRleE9mKHByZXYuY2hhckF0KG1hdGNoUG9zKSkpIHtcblx0XHRcdFx0XHRcdC8vIG9wZW4gYSBuZXcgZGwgb25seSBpZiB0aGUgcHJldiBpdGVtIGlzIG5vdCBhIGRsIGl0ZW0gKDosIDsgb3IgZW1wdHkpXG5cdFx0XHRcdFx0XHRwcygnPGRsPicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRzd2l0Y2ggKGxfbWF0Y2hbMV0uYXQoLTEpKSB7XG5cdFx0XHRcdFx0Y2FzZSAnKic6XG5cdFx0XHRcdFx0Y2FzZSAnIyc6XG5cdFx0XHRcdFx0XHRwcyhgPGxpPiR7cGFyc2VfaW5saW5lX25vd2lraShsX21hdGNoWzJdKX1gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJzsnOiB7XG5cdFx0XHRcdFx0XHRwcygnPGR0PicpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHRfbWF0Y2ggPSBsX21hdGNoWzJdLm1hdGNoKC8oLio/KSg6Lio/KSQvKTtcblx0XHRcdFx0XHRcdC8vIGhhbmRsZSA7ZHQgOmRkIGZvcm1hdFxuXHRcdFx0XHRcdFx0aWYgKGR0X21hdGNoKSB7XG5cdFx0XHRcdFx0XHRcdHBzKHBhcnNlX2lubGluZV9ub3dpa2koZHRfbWF0Y2hbMV0pKTtcblx0XHRcdFx0XHRcdFx0bGwudW5zaGlmdChkdF9tYXRjaFsyXSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwcyhwYXJzZV9pbmxpbmVfbm93aWtpKGxfbWF0Y2hbMl0pKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjYXNlICc6Jzpcblx0XHRcdFx0XHRcdHBzKGA8ZGQ+JHtwYXJzZV9pbmxpbmVfbm93aWtpKGxfbWF0Y2hbMl0pfWApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFssIHByZXZdID0gbF9tYXRjaDtcblx0XHRcdH1cblx0XHRcdC8vIGNsb3NlIHJlbWFpbmluZyBsaXN0c1xuXHRcdFx0Zm9yIChsZXQgaSA9IHByZXYubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdFx0cHMoZignPC8/PicsIHByZXYuY2hhckF0KGkpID09PSAnKicgPyAndWwnIDogcHJldi5jaGFyQXQoaSkgPT09ICcjJyA/ICdvbCcgOiAnZGwnKSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBwYXJzZV90YWJsZSA9ICgpID0+IHtcblx0XHRcdGVuZGwoZignPHRhYmxlPicsIGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoL157XFx8KCAuKikkLykgPyByWzFdIDogJycpKTtcblx0XHRcdGZvciAoOyByZW1haW4oKTsgKSB7XG5cdFx0XHRcdGlmIChjb21wYXJlTGluZVN0cmluZ09yUmVnKCd8JykpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKGNoYXJBdFBvaW50KDEpKSB7XG5cdFx0XHRcdFx0XHRjYXNlICd9Jzpcblx0XHRcdFx0XHRcdFx0ZW5kbCgnPC90YWJsZT4nKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0Y2FzZSAnLSc6XG5cdFx0XHRcdFx0XHRcdGVuZGwoZignPHRyPicsIGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoL1xcfC0qKC4qKS8pWzFdKSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0cGFyc2VfdGFibGVfZGF0YSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChjb21wYXJlTGluZVN0cmluZ09yUmVnKCchJykpIHtcblx0XHRcdFx0XHRwYXJzZV90YWJsZV9kYXRhKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfdGFibGVfZGF0YSA9ICgpID0+IHtcblx0XHRcdGxldCB0ZF9saW5lO1xuXHRcdFx0bGV0IG1hdGNoX2k7XG5cdFx0XHQvLyAxOiBcInwrXCIsICd8JyBvciAnKydcblx0XHRcdC8vIDI6ID8/XG5cdFx0XHQvLyAzOiBhdHRyaWJ1dGVzID8/XG5cdFx0XHQvLyBUT0RPOiBmaW5pc2ggY29tbWVudGluZyB0aGlzIHJlZ2V4cFxuXHRcdFx0Y29uc3QgdGRfbWF0Y2ggPSBzaCgpLm1hdGNoKC9eKFxcfFxcK3xcXHx8ISkoKD86KFteW3xdKj8pXFx8KD8hXFx8KSk/KC4qKSkkLyk7XG5cdFx0XHRpZiAodGRfbWF0Y2hbMV0gPT09ICd8KycpIHtcblx0XHRcdFx0cHMoJzxjYXB0aW9uJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcyhgPHQke3RkX21hdGNoWzFdID09PSAnfCcgPyAnZCcgOiAnaCd9YCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGRfbWF0Y2hbM10pIHtcblx0XHRcdFx0Ly8gcHMoJyAnICsgdGRfbWF0Y2hbM10pXG5cdFx0XHRcdG1hdGNoX2kgPSA0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2hfaSA9IDI7XG5cdFx0XHR9XG5cdFx0XHRwcygnPicpO1xuXHRcdFx0aWYgKHRkX21hdGNoWzFdID09PSAnfCsnKSB7XG5cdFx0XHRcdHBzKHBhcnNlX2lubGluZV9ub3dpa2kodGRfbWF0Y2hbbWF0Y2hfaV0pKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHVzZSB8fCBvciAhISBhcyBhIGNlbGwgc2VwYXJhdG9yIGRlcGVuZGluZyBvbiBjb250ZXh0XG5cdFx0XHRcdC8vIE5PVEU6IHdoZW4gc3BsaXQoKSBpcyBwYXNzZWQgYSByZWdleHAgbWFrZSBzdXJlIHRvIHVzZSBub24tY2FwdHVyaW5nIGJyYWNrZXRzXG5cdFx0XHRcdHRkX2xpbmUgPSB0ZF9tYXRjaFttYXRjaF9pXS5zcGxpdCh0ZF9tYXRjaFsxXSA9PT0gJ3wnID8gJ3x8JyA6IC9cXHxcXHx8ISEvKTtcblx0XHRcdFx0cHMocGFyc2VfaW5saW5lX25vd2lraSh0ZF9saW5lLnNoaWZ0KCkpKTtcblx0XHRcdFx0d2hpbGUgKHRkX2xpbmUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGxsLnVuc2hpZnQodGRfbWF0Y2hbMV0gKyB0ZF9saW5lLnBvcCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGV0IHRjID0gMDtcblx0XHRcdGNvbnN0IHRkID0gW107XG5cdFx0XHR3aGlsZSAocmVtYWluKCkpIHtcblx0XHRcdFx0dGQucHVzaChzaCgpKTtcblx0XHRcdFx0aWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoJ3wnKSkge1xuXHRcdFx0XHRcdGlmICghdGMpIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoY2hhckF0UG9pbnQoMSkgPT09ICd9Jykge1xuXHRcdFx0XHRcdFx0Ly8gd2UncmUgYXQgdGhlIG91dGVyLW1vc3QgbGV2ZWwgKG5vIG5lc3RlZCB0YWJsZXMpLCBza2lwIHRvIHRkIHBhcnNlXG5cdFx0XHRcdFx0XHR0Yy0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICghdGMgJiYgY29tcGFyZUxpbmVTdHJpbmdPclJlZygnIScpKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygne3wnKSkge1xuXHRcdFx0XHRcdHRjKys7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0ZC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHBzKEluc3RhLmNvbnZlcnQodGQpKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IHBhcnNlX3ByZSA9ICgpID0+IHtcblx0XHRcdHBzKCc8cHJlPicpO1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHRlbmRsKGAke3BhcnNlX2lubGluZV9ub3dpa2kobGxbMF0uc2xpY2UoMSkpfVxcbmApO1xuXHRcdFx0fSB3aGlsZSAocmVtYWluKCkgJiYgY29tcGFyZUxpbmVTdHJpbmdPclJlZygnICcpKTtcblx0XHRcdHBzKCc8L3ByZT4nKTtcblx0XHR9O1xuXHRcdGNvbnN0IHBhcnNlX2Jsb2NrX2ltYWdlID0gKCkgPT4ge1xuXHRcdFx0cHMocGFyc2VfaW1hZ2Uoc2goKSkpO1xuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfaW1hZ2UgPSAoc3RyKSA9PiB7XG5cdFx0XHQvLyBnZXQgd2hhdCdzIGluIGJldHdlZW4gXCJbW0ltYWdlOlwiIGFuZCBcIl1dXCJcblx0XHRcdGxldCB0YWcgPSBzdHIuc3Vic3RyaW5nKHN0ci5pbmRleE9mKCc6JykgKyAxLCBzdHIubGVuZ3RoIC0gMik7XG5cdFx0XHRsZXQgd2lkdGg7XG5cdFx0XHRsZXQgYXR0ciA9IFtdO1xuXHRcdFx0bGV0IGZpbGVuYW1lO1xuXHRcdFx0bGV0IGNhcHRpb24gPSAnJztcblx0XHRcdGxldCB0aHVtYiA9IDA7XG5cdFx0XHRsZXQgZnJhbWUgPSAwO1xuXHRcdFx0bGV0IGNlbnRlciA9IDA7XG5cdFx0XHRsZXQgYWxpZ24gPSAnJztcblx0XHRcdGlmICgvXFx8Ly50ZXN0KHRhZykpIHtcblx0XHRcdFx0Ly8gbWFuYWdlIG5lc3RlZCBsaW5rc1xuXHRcdFx0XHRsZXQgbmVzdGluZyA9IDA7XG5cdFx0XHRcdGxldCBsYXN0X2F0dHI7XG5cdFx0XHRcdGZvciAobGV0IGkgPSB0YWcubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0XHRcdGlmICh0YWcuY2hhckF0KGkpID09PSAnfCcgJiYgIW5lc3RpbmcpIHtcblx0XHRcdFx0XHRcdGxhc3RfYXR0ciA9IHRhZy5zbGljZShpICsgMSk7XG5cdFx0XHRcdFx0XHR0YWcgPSB0YWcuc2xpY2UoMCwgTWF0aC5tYXgoMCwgaSkpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN3aXRjaCAodGFnLnNsaWNlKGkgLSAxLCBpIC0gMSArIDIpKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ11dJzpcblx0XHRcdFx0XHRcdFx0XHRuZXN0aW5nKys7XG5cdFx0XHRcdFx0XHRcdFx0aS0tO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlICdbWyc6XG5cdFx0XHRcdFx0XHRcdFx0bmVzdGluZy0tO1xuXHRcdFx0XHRcdFx0XHRcdGktLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YXR0ciA9IHRhZy5zcGxpdCgvXFxzKlxcfFxccyovKTtcblx0XHRcdFx0YXR0ci5wdXNoKGxhc3RfYXR0cik7XG5cdFx0XHRcdGZpbGVuYW1lID0gYXR0ci5zaGlmdCgpO1xuXHRcdFx0XHRsZXQgd19tYXRjaDtcblx0XHRcdFx0Zm9yICg7IGF0dHIubGVuZ3RoID4gMDsgYXR0ci5zaGlmdCgpKSB7XG5cdFx0XHRcdFx0d19tYXRjaCA9IGF0dHJbMF0ubWF0Y2goL14oXFxkKikoPzpbcHhdKlxcZCopP3B4JC8pO1xuXHRcdFx0XHRcdGlmICh3X21hdGNoKSB7XG5cdFx0XHRcdFx0XHRbLCB3aWR0aF0gPSB3X21hdGNoO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzd2l0Y2ggKGF0dHJbMF0pIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSAndGh1bWInOlxuXHRcdFx0XHRcdFx0XHRjYXNlICd0aHVtYm5haWwnOlxuXHRcdFx0XHRcdFx0XHRcdHRodW1iID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRmcmFtZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2ZyYW1lJzpcblx0XHRcdFx0XHRcdFx0XHRmcmFtZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ25vbmUnOlxuXHRcdFx0XHRcdFx0XHRjYXNlICdyaWdodCc6XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2xlZnQnOlxuXHRcdFx0XHRcdFx0XHRcdGNlbnRlciA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFthbGlnbl0gPSBhdHRyO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlICdjZW50ZXInOlxuXHRcdFx0XHRcdFx0XHRcdGNlbnRlciA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0YWxpZ24gPSAnbm9uZSc7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGF0dHIubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRbY2FwdGlvbl0gPSBhdHRyO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZpbGVuYW1lID0gdGFnO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfaW5saW5lX25vd2lraSA9IChzdHIpID0+IHtcblx0XHRcdGxldCBzdGFydDtcblx0XHRcdGxldCBsYXN0ZW5kID0gMDtcblx0XHRcdGxldCBzdWJzdGFydCA9IDA7XG5cdFx0XHRsZXQgbmVzdGxldiA9IDA7XG5cdFx0XHRsZXQgb3Blbjtcblx0XHRcdGxldCBjbG9zZTtcblx0XHRcdGxldCBzdWJsb29wO1xuXHRcdFx0bGV0IGh0bWwgPSAnJztcblx0XHRcdHdoaWxlICgoc3RhcnQgPSBzdHIuaW5kZXhPZignPG5vJy5jb25jYXQoJ3dpa2knLCAnPicpLCBzdWJzdGFydCkpICE9PSAtMSkge1xuXHRcdFx0XHRodG1sICs9IHBhcnNlX2lubGluZV93aWtpKHN0ci5zdWJzdHJpbmcobGFzdGVuZCwgc3RhcnQpKTtcblx0XHRcdFx0c3RhcnQgKz0gODtcblx0XHRcdFx0c3Vic3RhcnQgPSBzdGFydDtcblx0XHRcdFx0c3VibG9vcCA9IHRydWU7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRvcGVuID0gc3RyLmluZGV4T2YoJzxubycuY29uY2F0KCd3aWtpJywgJz4nKSwgc3Vic3RhcnQpO1xuXHRcdFx0XHRcdGNsb3NlID0gc3RyLmluZGV4T2YoJzwvbm8nLmNvbmNhdCgnd2lraScsICc+JyksIHN1YnN0YXJ0KTtcblx0XHRcdFx0XHRpZiAoY2xvc2UgPD0gb3BlbiB8fCBvcGVuID09PSAtMSkge1xuXHRcdFx0XHRcdFx0aWYgKGNsb3NlID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaHRtbCArIGh0bWxfZW50aXRpZXMoc3RyLnNsaWNlKHN0YXJ0KSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzdWJzdGFydCA9IGNsb3NlICsgOTtcblx0XHRcdFx0XHRcdGlmIChuZXN0bGV2KSB7XG5cdFx0XHRcdFx0XHRcdG5lc3RsZXYtLTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGxhc3RlbmQgPSBzdWJzdGFydDtcblx0XHRcdFx0XHRcdFx0aHRtbCArPSBodG1sX2VudGl0aWVzKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGxhc3RlbmQgLSA5KSk7XG5cdFx0XHRcdFx0XHRcdHN1Ymxvb3AgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c3Vic3RhcnQgPSBvcGVuICsgODtcblx0XHRcdFx0XHRcdG5lc3RsZXYrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKHN1Ymxvb3ApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGh0bWwgKyBwYXJzZV9pbmxpbmVfd2lraShzdHIuc2xpY2UobGFzdGVuZCkpO1xuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfaW5saW5lX2ltYWdlcyA9IChzdHIpID0+IHtcblx0XHRcdGxldCBzdGFydDtcblx0XHRcdGxldCBzdWJzdGFydCA9IDA7XG5cdFx0XHRsZXQgbmVzdGxldiA9IDA7XG5cdFx0XHRsZXQgbG9vcDtcblx0XHRcdGxldCBjbG9zZTtcblx0XHRcdGxldCBvcGVuO1xuXHRcdFx0bGV0IHdpa2k7XG5cdFx0XHRsZXQgaHRtbDtcblx0XHRcdHdoaWxlICgoc3RhcnQgPSBzdHIuaW5kZXhPZignW1snLCBzdWJzdGFydCkpICE9PSAtMSkge1xuXHRcdFx0XHRpZiAobmV3IFJlZ0V4cChgXihJbWFnZXxGaWxlfCR7SW5zdGEuY29uZi5sb2NhbGUuaW1hZ2V9KTpgLCAnaScpLnRlc3Qoc3RyLnNsaWNlKHN0YXJ0ICsgMikpKSB7XG5cdFx0XHRcdFx0bG9vcCA9IHRydWU7XG5cdFx0XHRcdFx0c3Vic3RhcnQgPSBzdGFydDtcblx0XHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0XHRzdWJzdGFydCArPSAyO1xuXHRcdFx0XHRcdFx0Y2xvc2UgPSBzdHIuaW5kZXhPZignXV0nLCBzdWJzdGFydCk7XG5cdFx0XHRcdFx0XHRvcGVuID0gc3RyLmluZGV4T2YoJ1tbJywgc3Vic3RhcnQpO1xuXHRcdFx0XHRcdFx0aWYgKGNsb3NlIDw9IG9wZW4gfHwgb3BlbiA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGNsb3NlID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBzdHI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0c3Vic3RhcnQgPSBjbG9zZTtcblx0XHRcdFx0XHRcdFx0aWYgKG5lc3RsZXYpIHtcblx0XHRcdFx0XHRcdFx0XHRuZXN0bGV2LS07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lraSA9IHN0ci5zdWJzdHJpbmcoc3RhcnQsIGNsb3NlICsgMik7XG5cdFx0XHRcdFx0XHRcdFx0aHRtbCA9IHBhcnNlX2ltYWdlKHdpa2kpO1xuXHRcdFx0XHRcdFx0XHRcdHN0ciA9IHN0ci5yZXBsYWNlKHdpa2ksIGh0bWwpO1xuXHRcdFx0XHRcdFx0XHRcdHN1YnN0YXJ0ID0gc3RhcnQgKyBodG1sLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRsb29wID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHN1YnN0YXJ0ID0gb3Blbjtcblx0XHRcdFx0XHRcdFx0bmVzdGxldisrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gd2hpbGUgKGxvb3ApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3RyO1xuXHRcdH07XG5cdFx0Ly8gdGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVzcGVjdCB0aGUgRklMTyBzdHJ1Y3R1cmUgb2YgSFRNTFxuXHRcdC8vIGJ1dCBzaW5jZSBtb3N0IGJyb3dzZXJzIGNhbiBoYW5kbGUgaXQgSSdsbCBzYXZlIG15c2VsZiB0aGUgaGFzc2xlXG5cdFx0Y29uc3QgcGFyc2VfaW5saW5lX2Zvcm1hdHRpbmcgPSAoc3RyKSA9PiB7XG5cdFx0XHRsZXQgZW07XG5cdFx0XHRsZXQgc3Q7XG5cdFx0XHRsZXQgaTtcblx0XHRcdGxldCBsaTtcblx0XHRcdGxldCBvID0gJyc7XG5cdFx0XHR3aGlsZSAoKGkgPSBzdHIuaW5kZXhPZihcIicnXCIsIGxpKSkgKyAxKSB7XG5cdFx0XHRcdG8gKz0gc3RyLnN1YnN0cmluZyhsaSwgaSk7XG5cdFx0XHRcdGxpID0gaSArIDI7XG5cdFx0XHRcdGlmIChzdHIuY2hhckF0KGkgKyAyKSA9PT0gXCInXCIpIHtcblx0XHRcdFx0XHRsaSsrO1xuXHRcdFx0XHRcdHN0ID0gIXN0O1xuXHRcdFx0XHRcdG8gKz0gc3QgPyAnPHN0cm9uZz4nIDogJzwvc3Ryb25nPic7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZW0gPSAhZW07XG5cdFx0XHRcdFx0byArPSBlbSA/ICc8ZW0+JyA6ICc8L2VtPic7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBvICsgc3RyLnNsaWNlKGxpKTtcblx0XHR9O1xuXHRcdGNvbnN0IHBhcnNlX2lubGluZV93aWtpID0gKHN0cikgPT4ge1xuXHRcdFx0c3RyID0gcGFyc2VfaW5saW5lX2ltYWdlcyhzdHIpO1xuXHRcdFx0c3RyID0gcGFyc2VfaW5saW5lX2Zvcm1hdHRpbmcoc3RyKTtcblx0XHRcdC8vIG1hdGhcblx0XHRcdHN0ciA9IHN0ci5yZXBsYWNlKC88bWF0aD4oLio/KTxcXC9tYXRoPi9naSwgJycpO1xuXHRcdFx0Ly8gQnVpbGQgYSBNZWRpYXdpa2ktZm9ybWF0dGVkIGRhdGUgc3RyaW5nXG5cdFx0XHRsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XG5cdFx0XHRsZXQgbWludXRlcyA9IGRhdGUuZ2V0VVRDTWludXRlcygpO1xuXHRcdFx0aWYgKG1pbnV0ZXMgPCAxMCkge1xuXHRcdFx0XHRtaW51dGVzID0gYDAke21pbnV0ZXN9YDtcblx0XHRcdH1cblx0XHRcdGRhdGUgPSBmKFxuXHRcdFx0XHQnPzo/LCA/ID8gPyAoVVRDKScsXG5cdFx0XHRcdGRhdGUuZ2V0VVRDSG91cnMoKSxcblx0XHRcdFx0bWludXRlcyxcblx0XHRcdFx0ZGF0ZS5nZXRVVENEYXRlKCksXG5cdFx0XHRcdEluc3RhLmNvbmYubG9jYWxlLm1vbnRoc1tkYXRlLmdldFVUQ01vbnRoKCldLFxuXHRcdFx0XHRkYXRlLmdldFVUQ0Z1bGxZZWFyKClcblx0XHRcdCk7XG5cdFx0XHQvLyB0ZXh0IGZvcm1hdHRpbmdcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHN0clxuXHRcdFx0XHRcdC8vIHNpZ25hdHVyZXNcblx0XHRcdFx0XHQucmVwbGFjZSgvfns1fSg/IX4pL2csIGRhdGUpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL357NH0oPyF+KS9nLCBgJHtJbnN0YS5jb25mLnVzZXIubmFtZX0gJHtkYXRlfWApXG5cdFx0XHRcdFx0LnJlcGxhY2UoL357M30oPyF+KS9nLCBJbnN0YS5jb25mLnVzZXIubmFtZSlcblx0XHRcdFx0XHQvLyBbWzpDYXRlZ29yeTouLi5dXSwgW1s6SW1hZ2U6Li4uXV0sIGV0Yy4uLlxuXHRcdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdFx0YFxcXFxbXFxcXFs6KCg/OiR7SW5zdGEuY29uZi5sb2NhbGUuY2F0ZWdvcnl9fEltYWdlfEZpbGV8JHtJbnN0YS5jb25mLmxvY2FsZS5pbWFnZX18JHtJbnN0YS5jb25mLndpa2kuaW50ZXJ3aWtpfSk6W158XSo/KVxcXFxdXFxcXF0oXFxcXHcqKWAsXG5cdFx0XHRcdFx0XHRcdCdnaSdcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHQoXyQwLCAkMSwgJDIpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFx0XCI8YSBocmVmPSc/Jz4/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRcdEluc3RhLmNvbmYucGF0aHMuYXJ0aWNsZXMgKyBodG1sZXNjYXBlX2F0dHIoJDEpLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMSkgKyBodG1sZXNjYXBlX3RleHQoJDIpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC8vIHJlbW92ZSBzdHJhaWdodCBjYXRlZ29yeSBhbmQgaW50ZXJ3aWtpIHRhZ3Ncblx0XHRcdFx0XHQucmVwbGFjZShcblx0XHRcdFx0XHRcdG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRcdGBcXFxcW1xcXFxbKD86JHtJbnN0YS5jb25mLmxvY2FsZS5jYXRlZ29yeX18JHtJbnN0YS5jb25mLndpa2kuaW50ZXJ3aWtpfSk6Lio/XFxcXF1cXFxcXWAsXG5cdFx0XHRcdFx0XHRcdCdnaSdcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHQnJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQvLyBbWzpDYXRlZ29yeTouLi58TGlua3NdXSwgW1s6SW1hZ2U6Li4ufExpbmtzXV0sIGV0Yy4uLlxuXHRcdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdFx0YFxcXFxbXFxcXFs6KCg/OiR7SW5zdGEuY29uZi5sb2NhbGUuY2F0ZWdvcnl9fEltYWdlfEZpbGV8JHtJbnN0YS5jb25mLmxvY2FsZS5pbWFnZX18JHtJbnN0YS5jb25mLndpa2kuaW50ZXJ3aWtpfSk6Lio/KVxcXFx8KFteXFxcXF1dKz8pXFxcXF1cXFxcXShcXFxcdyopYCxcblx0XHRcdFx0XHRcdFx0J2dpJ1xuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdChfJDAsICQxLCAkMiwgJDMpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFx0XCI8YSBocmVmPSc/Jz4/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRcdEluc3RhLmNvbmYucGF0aHMuYXJ0aWNsZXMgKyBodG1sZXNjYXBlX2F0dHIoJDEpLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMikgKyBodG1sZXNjYXBlX3RleHQoJDMpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC8vIFtbL1JlbGF0aXZlIGxpbmtzXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFxcL1tefF0qPyldXS9nLCAoXyQwLCAkMSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXCI8YSBocmVmPSc/Jz4/PC9hPlwiLCBJbnN0YS5jb25mLmJhc2VVcmwgKyBodG1sZXNjYXBlX2F0dHIoJDEpLCBodG1sZXNjYXBlX3RleHQoJDEpKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC8vIFtbL1JlcGxhY2VkfFJlbGF0aXZlIGxpbmtzXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFxcLy4qPylcXHwoLis/KV1dL2csIChfJDAsICQxLCAkMikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXCI8YSBocmVmPSc/Jz4/PC9hPlwiLCBJbnN0YS5jb25mLmJhc2VVcmwgKyBodG1sZXNjYXBlX2F0dHIoJDEpLCBodG1sZXNjYXBlX3RleHQoJDIpKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC8vIFtbQ29tbW9uIGxpbmtzXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFteW3xdKj8pXV0oXFx3KikvZywgKF8kMCwgJDEsICQyKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZihcblx0XHRcdFx0XHRcdFx0XCI8YSBocmVmPSc/Jz4/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRJbnN0YS5jb25mLnBhdGhzLmFydGljbGVzICsgaHRtbGVzY2FwZV9hdHRyKCQxKSxcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQxKSArIGh0bWxlc2NhcGVfdGV4dCgkMilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQvLyBbW1JlcGxhY2VkfExpbmtzXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFteW10qPylcXHwoW15cXF1dKz8pXV0oXFx3KikvZywgKF8kMCwgJDEsICQyLCAkMykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFwiPGEgaHJlZj0nPyc+PzwvYT5cIixcblx0XHRcdFx0XHRcdFx0SW5zdGEuY29uZi5wYXRocy5hcnRpY2xlcyArIGh0bWxlc2NhcGVfYXR0cigkMSksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMikgKyBodG1sZXNjYXBlX3RleHQoJDMpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0Ly8gW1tTdHJpcHBlZDpOYW1lc3BhY2V8TmFtZXNwYWNlXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFteXFxdXSo/Oik/KC4qPykoICpcXCguKj9cXCkpP1xcfF1dL2csIChfJDAsICQxLCAkMiwgJDMpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBmKFxuXHRcdFx0XHRcdFx0XHRcIjxhIGhyZWY9Jz8nPj88L2E+XCIsXG5cdFx0XHRcdFx0XHRcdEluc3RhLmNvbmYucGF0aHMuYXJ0aWNsZXMgKyBodG1sZXNjYXBlX2F0dHIoJDEpICsgaHRtbGVzY2FwZV9hdHRyKCQyKSArIGh0bWxlc2NhcGVfYXR0cigkMyksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQvLyBFeHRlcm5hbCBsaW5rc1xuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXFsoaHR0cHM/fG5ld3N8ZnRwfG1haWx0b3xnb3BoZXJ8aXJjKTooXFwvKikoW15cXF1dKj8pICguKj8pXS9nLCAoXyQwLCAkMSwgJDIsICQzLCAkNCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFwiPGEgY2xhc3M9J2V4dGVybmFsJyBocmVmPSc/Oj8nPj88L2E+XCIsXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfYXR0cigkMSksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfYXR0cigkMikgKyBodG1sZXNjYXBlX2F0dHIoJDMpLFxuXHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX3RleHQoJDQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnJlcGxhY2UoL1xcW2h0dHA6XFwvXFwvKC4qPyldL2csIChfJDAsICQxKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZihcIjxhIGNsYXNzPSdleHRlcm5hbCcgaHJlZj0naHR0cDovLz8nPlsjXTwvYT5cIiwgaHRtbGVzY2FwZV9hdHRyKCQxKSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbKG5ld3N8ZnRwfG1haWx0b3xnb3BoZXJ8aXJjKTooXFwvKikoLio/KV0vZywgKF8kMCwgJDEsICQyLCAkMykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFwiPGEgY2xhc3M9J2V4dGVybmFsJyBocmVmPSc/Oj8nPj86PzwvYT5cIixcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV9hdHRyKCQxKSxcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV9hdHRyKCQyKSArIGh0bWxlc2NhcGVfYXR0cigkMyksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMSksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMikgKyBodG1sZXNjYXBlX3RleHQoJDMpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnJlcGxhY2UoXG5cdFx0XHRcdFx0XHQvKF58ICkoaHR0cHM/fG5ld3N8ZnRwfG1haWx0b3xnb3BoZXJ8aXJjKTooXFwvKikoW14gJF0qW14gISQsLjo7P10pL2csXG5cdFx0XHRcdFx0XHQoXyQwLCAkMSwgJDIsICQzLCAkNCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZihcblx0XHRcdFx0XHRcdFx0XHRcIj88YSBjbGFzcz0nZXh0ZXJuYWwnIGhyZWY9Jz86Pyc+Pzo/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMSksXG5cdFx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV9hdHRyKCQyKSxcblx0XHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX2F0dHIoJDMpICsgaHRtbGVzY2FwZV9hdHRyKCQ0KSxcblx0XHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX3RleHQoJDIpLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMykgKyBodG1sZXNjYXBlX3RleHQoJDQpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5yZXBsYWNlKCdfX05PVE9DX18nLCAnJylcblx0XHRcdFx0XHQucmVwbGFjZSgnX19OT0lOREVYX18nLCAnJylcblx0XHRcdFx0XHQucmVwbGFjZSgnX19JTkRFWF9fJywgJycpXG5cdFx0XHRcdFx0LnJlcGxhY2UoJ19fTk9FRElUU0VDVElPTl9fJywgJycpXG5cdFx0XHQpO1xuXHRcdH07XG5cdFx0Ly8gYmVnaW4gcGFyc2luZ1xuXHRcdGZvciAoOyByZW1haW4oKTsgKSB7XG5cdFx0XHRpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygvXig9ezEsNn0pKC4qKVxcMSguKikkLykpIHtcblx0XHRcdFx0cCA9IDA7XG5cdFx0XHRcdGVuZGwoZignPGg/Pj88L2g/Pj8nLCByWzFdLmxlbmd0aCwgcGFyc2VfaW5saW5lX25vd2lraShyWzJdKSwgclsxXS5sZW5ndGgsIHJbM10pKTtcblx0XHRcdH0gZWxzZSBpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygvXlsjKjo7XS8pKSB7XG5cdFx0XHRcdHAgPSAwO1xuXHRcdFx0XHRwYXJzZV9saXN0KCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoJyAnKSkge1xuXHRcdFx0XHRwID0gMDtcblx0XHRcdFx0cGFyc2VfcHJlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoJ3t8JykpIHtcblx0XHRcdFx0cCA9IDA7XG5cdFx0XHRcdHBhcnNlX3RhYmxlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoL14tLS0tKyQvKSkge1xuXHRcdFx0XHRwID0gMDtcblx0XHRcdFx0ZW5kbCgnPGhyPicpO1xuXHRcdFx0fSBlbHNlIGlmIChjb21wYXJlTGluZVN0cmluZ09yUmVnKEluc3RhLkJMT0NLX0lNQUdFKSkge1xuXHRcdFx0XHRwID0gMDtcblx0XHRcdFx0cGFyc2VfYmxvY2tfaW1hZ2UoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGhhbmRsZSBwYXJhZ3JhcGhzXG5cdFx0XHRcdGlmIChjb21wYXJlTGluZVN0cmluZygnJykpIHtcblx0XHRcdFx0XHRwID0gcmVtYWluKCkgPiAxICYmIGxsWzFdID09PSAnJztcblx0XHRcdFx0XHRpZiAocCkge1xuXHRcdFx0XHRcdFx0ZW5kbCgnPHA+PGJyPicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoIXApIHtcblx0XHRcdFx0XHRcdHBzKCc8cD4nKTtcblx0XHRcdFx0XHRcdHAgPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwcyhgJHtwYXJzZV9pbmxpbmVfbm93aWtpKGxsWzBdKX0gYCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2goKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG87XG5cdH07XG5cdGNvbnN0IHdpa2kyaHRtbCA9ICh0eHQsIGJhc2V1cmwpID0+IHtcblx0XHRJbnN0YS5jb25mLmJhc2VVcmwgPSBiYXNldXJsO1xuXHRcdHJldHVybiBJbnN0YS5jb252ZXJ0KHR4dCk7XG5cdH07XG5cdC8vIEVOREZJTEU6IGxpdmVwcmV2aWV3LmpzXG5cdC8vIFNUQVJURklMRTogcGFnZWluZm8uanNcblx0Y29uc3QgcG9wdXBGaWx0ZXJQYWdlU2l6ZSA9IChkYXRhKSA9PiB7XG5cdFx0cmV0dXJuIGZvcm1hdEJ5dGVzKGRhdGEubGVuZ3RoKTtcblx0fTtcblx0Y29uc3QgcG9wdXBGaWx0ZXJDb3VudExpbmtzID0gKGRhdGEpID0+IHtcblx0XHRjb25zdCBudW0gPSBjb3VudExpbmtzKGRhdGEpO1xuXHRcdHJldHVybiBgJHtTdHJpbmcobnVtKX0mbmJzcDske251bSA9PT0gMSA/IHBvcHVwU3RyaW5nKCd3aWtpTGluaycpIDogcG9wdXBTdHJpbmcoJ3dpa2lMaW5rcycpfWA7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyQ291bnRJbWFnZXMgPSAoZGF0YSkgPT4ge1xuXHRcdGNvbnN0IG51bSA9IGNvdW50SW1hZ2VzKGRhdGEpO1xuXHRcdHJldHVybiBgJHtTdHJpbmcobnVtKX0mbmJzcDske251bSA9PT0gMSA/IHBvcHVwU3RyaW5nKCdpbWFnZScpIDogcG9wdXBTdHJpbmcoJ2ltYWdlcycpfWA7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyQ291bnRDYXRlZ29yaWVzID0gKGRhdGEpID0+IHtcblx0XHRjb25zdCBudW0gPSBjb3VudENhdGVnb3JpZXMoZGF0YSk7XG5cdFx0cmV0dXJuIGAke1N0cmluZyhudW0pfSZuYnNwOyR7bnVtID09PSAxID8gcG9wdXBTdHJpbmcoJ2NhdGVnb3J5JykgOiBwb3B1cFN0cmluZygnY2F0ZWdvcmllcycpfWA7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyTGFzdE1vZGlmaWVkID0gKF9kYXRhLCBkb3dubG9hZCkgPT4ge1xuXHRcdGNvbnN0IGxhc3Rtb2QgPSBkb3dubG9hZC5sYXN0TW9kaWZpZWQ7XG5cdFx0Y29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblx0XHRjb25zdCBhZ2UgPSBub3cgLSBsYXN0bW9kO1xuXHRcdGlmIChsYXN0bW9kICYmIGdldFZhbHVlT2YoJ3BvcHVwTGFzdE1vZGlmaWVkJykpIHtcblx0XHRcdHJldHVybiB0cHJpbnRmKCclcyBvbGQnLCBbZm9ybWF0QWdlKGFnZSldKS5yZXBsYWNlKC8gL2csICcmbmJzcDsnKTtcblx0XHR9XG5cdFx0cmV0dXJuICcnO1xuXHR9O1xuXHRjb25zdCBmb3JtYXRBZ2UgPSAoYWdlKSA9PiB7XG5cdFx0Ly8gY29lcmNlIGludG8gYSBudW1iZXJcblx0XHRsZXQgYSA9IDAgKyBhZ2U7XG5cdFx0Y29uc3QgYWEgPSBhO1xuXHRcdGNvbnN0IHNlY2xlbiA9IDEwMDA7XG5cdFx0Y29uc3QgbWlubGVuID0gNjAgKiBzZWNsZW47XG5cdFx0Y29uc3QgaG91cmxlbiA9IDYwICogbWlubGVuO1xuXHRcdGNvbnN0IGRheWxlbiA9IDI0ICogaG91cmxlbjtcblx0XHRjb25zdCB3ZWVrbGVuID0gNyAqIGRheWxlbjtcblx0XHRjb25zdCBudW13ZWVrcyA9IChhIC0gKGEgJSB3ZWVrbGVuKSkgLyB3ZWVrbGVuO1xuXHRcdGEgLT0gbnVtd2Vla3MgKiB3ZWVrbGVuO1xuXHRcdGNvbnN0IHN3ZWVrcyA9IGFkZHVuaXQobnVtd2Vla3MsICd3ZWVrJyk7XG5cdFx0Y29uc3QgbnVtZGF5cyA9IChhIC0gKGEgJSBkYXlsZW4pKSAvIGRheWxlbjtcblx0XHRhIC09IG51bWRheXMgKiBkYXlsZW47XG5cdFx0Y29uc3Qgc2RheXMgPSBhZGR1bml0KG51bWRheXMsICdkYXknKTtcblx0XHRjb25zdCBudW1ob3VycyA9IChhIC0gKGEgJSBob3VybGVuKSkgLyBob3VybGVuO1xuXHRcdGEgLT0gbnVtaG91cnMgKiBob3VybGVuO1xuXHRcdGNvbnN0IHNob3VycyA9IGFkZHVuaXQobnVtaG91cnMsICdob3VyJyk7XG5cdFx0Y29uc3QgbnVtbWlucyA9IChhIC0gKGEgJSBtaW5sZW4pKSAvIG1pbmxlbjtcblx0XHRhIC09IG51bW1pbnMgKiBtaW5sZW47XG5cdFx0Y29uc3Qgc21pbnMgPSBhZGR1bml0KG51bW1pbnMsICdtaW51dGUnKTtcblx0XHRjb25zdCBudW1zZWNzID0gKGEgLSAoYSAlIHNlY2xlbikpIC8gc2VjbGVuO1xuXHRcdGEgLT0gbnVtc2VjcyAqIHNlY2xlbjtcblx0XHRjb25zdCBzc2VjcyA9IGFkZHVuaXQobnVtc2VjcywgJ3NlY29uZCcpO1xuXHRcdGlmIChhYSA+IDQgKiB3ZWVrbGVuKSB7XG5cdFx0XHRyZXR1cm4gc3dlZWtzO1xuXHRcdH1cblx0XHRpZiAoYWEgPiB3ZWVrbGVuKSB7XG5cdFx0XHRyZXR1cm4gYCR7c3dlZWtzfSAke3NkYXlzfWA7XG5cdFx0fVxuXHRcdGlmIChhYSA+IGRheWxlbikge1xuXHRcdFx0cmV0dXJuIGAke3NkYXlzfSAke3Nob3Vyc31gO1xuXHRcdH1cblx0XHRpZiAoYWEgPiA2ICogaG91cmxlbikge1xuXHRcdFx0cmV0dXJuIHNob3Vycztcblx0XHR9XG5cdFx0aWYgKGFhID4gaG91cmxlbikge1xuXHRcdFx0cmV0dXJuIGAke3Nob3Vyc30gJHtzbWluc31gO1xuXHRcdH1cblx0XHRpZiAoYWEgPiAxMCAqIG1pbmxlbikge1xuXHRcdFx0cmV0dXJuIHNtaW5zO1xuXHRcdH1cblx0XHRpZiAoYWEgPiBtaW5sZW4pIHtcblx0XHRcdHJldHVybiBgJHtzbWluc30gJHtzc2Vjc31gO1xuXHRcdH1cblx0XHRyZXR1cm4gc3NlY3M7XG5cdH07XG5cdGNvbnN0IGFkZHVuaXQgPSAobnVtLCBzdHIpID0+IHtcblx0XHRyZXR1cm4gYCR7bnVtfSAke251bSA9PT0gMSA/IHBvcHVwU3RyaW5nKHN0cikgOiBwb3B1cFN0cmluZyhgJHtzdHJ9c2ApfWA7XG5cdH07XG5cdGNvbnN0IHJ1blBvcHVwRmlsdGVycyA9IChsaXN0LCBkYXRhLCBkb3dubG9hZCkgPT4ge1xuXHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBsaXN0KSB7XG5cdFx0XHRpZiAoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRjb25zdCBzID0gZWxlbWVudChkYXRhLCBkb3dubG9hZCwgZG93bmxvYWQub3duZXIuYXJ0aWNsZSk7XG5cdFx0XHRcdGlmIChzKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2gocyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgZ2V0UGFnZUluZm8gPSAoZGF0YSwgZG93bmxvYWQpID0+IHtcblx0XHRpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBwb3B1cFN0cmluZygnRW1wdHkgcGFnZScpO1xuXHRcdH1cblx0XHRjb25zdCBwb3B1cEZpbHRlcnMgPSBnZXRWYWx1ZU9mKCdwb3B1cEZpbHRlcnMnKSB8fCBbXTtcblx0XHRjb25zdCBleHRyYVBvcHVwRmlsdGVycyA9IGdldFZhbHVlT2YoJ2V4dHJhUG9wdXBGaWx0ZXJzJykgfHwgW107XG5cdFx0Y29uc3QgcGFnZUluZm9BcnJheSA9IHJ1blBvcHVwRmlsdGVycyhbLi4ucG9wdXBGaWx0ZXJzLCAuLi5leHRyYVBvcHVwRmlsdGVyc10sIGRhdGEsIGRvd25sb2FkKTtcblx0XHRsZXQgcGFnZUluZm8gPSBwYWdlSW5mb0FycmF5LmpvaW4oJywgJyk7XG5cdFx0aWYgKHBhZ2VJbmZvICE9PSAnJykge1xuXHRcdFx0cGFnZUluZm8gPSB1cGNhc2VGaXJzdChwYWdlSW5mbyk7XG5cdFx0fVxuXHRcdHJldHVybiBwYWdlSW5mbztcblx0fTtcblx0Ly8gdGhpcyBjb3VsZCBiZSBpbXByb3ZlZCFcblx0Y29uc3QgY291bnRMaW5rcyA9ICh3aWtpVGV4dCkgPT4ge1xuXHRcdHJldHVybiB3aWtpVGV4dC5zcGxpdCgnW1snKS5sZW5ndGggLSAxO1xuXHR9O1xuXHQvLyBpZiBOID0gIyBtYXRjaGVzLCBuID0gIyBicmFja2V0cywgdGhlblxuXHQvLyBTdHJpbmcuc3BsaXQocmVnZXgpIGludGVyc3BlcnNlcyB0aGUgTisxIHNwbGl0IGVsZW1lbnRzXG5cdC8vIHdpdGggTm4gb3RoZXIgZWxlbWVudHMuIFNvIHRvdGFsIGxlbmd0aCBpc1xuXHQvLyBMPSBOKzEgKyBObiA9IE4obisxKSsxLiBTbyBOPShMLTEpLyhuKzEpLlxuXHRjb25zdCBjb3VudEltYWdlcyA9ICh3aWtpVGV4dCkgPT4ge1xuXHRcdHJldHVybiAod2lraVRleHQuc3BsaXQocGcucmUuaW1hZ2UpLmxlbmd0aCAtIDEpIC8gKHBnLnJlLmltYWdlQnJhY2tldENvdW50ICsgMSk7XG5cdH07XG5cdGNvbnN0IGNvdW50Q2F0ZWdvcmllcyA9ICh3aWtpVGV4dCkgPT4ge1xuXHRcdHJldHVybiAod2lraVRleHQuc3BsaXQocGcucmUuY2F0ZWdvcnkpLmxlbmd0aCAtIDEpIC8gKHBnLnJlLmNhdGVnb3J5QnJhY2tldENvdW50ICsgMSk7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyU3R1YkRldGVjdCA9IChkYXRhLCBfZG93bmxvYWQsIGFydGljbGUpID0+IHtcblx0XHRjb25zdCBjb3VudHMgPSBzdHViQ291bnQoZGF0YSwgYXJ0aWNsZSk7XG5cdFx0aWYgKGNvdW50cy5yZWFsKSB7XG5cdFx0XHRyZXR1cm4gcG9wdXBTdHJpbmcoJ3N0dWInKTtcblx0XHR9XG5cdFx0aWYgKGNvdW50cy5zZWN0KSB7XG5cdFx0XHRyZXR1cm4gcG9wdXBTdHJpbmcoJ3NlY3Rpb24gc3R1YicpO1xuXHRcdH1cblx0XHRyZXR1cm4gJyc7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyRGlzYW1iaWdEZXRlY3QgPSAoZGF0YSwgX2Rvd25sb2FkLCBhcnRpY2xlKSA9PiB7XG5cdFx0aWYgKCFnZXRWYWx1ZU9mKCdwb3B1cEFsbERhYnNTdHVicycpICYmIGFydGljbGUubmFtZXNwYWNlKCkpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cdFx0cmV0dXJuIGlzRGlzYW1iaWcoZGF0YSwgYXJ0aWNsZSkgPyBwb3B1cFN0cmluZygnZGlzYW1iaWcnKSA6ICcnO1xuXHR9O1xuXHRjb25zdCBmb3JtYXRCeXRlcyA9IChudW0pID0+IHtcblx0XHRyZXR1cm4gbnVtID4gOTQ5ID8gTWF0aC5yb3VuZChudW0gLyAxMDApIC8gMTAgKyBwb3B1cFN0cmluZygna0InKSA6IGAke251bX0mbmJzcDske3BvcHVwU3RyaW5nKCdieXRlcycpfWA7XG5cdH07XG5cdC8vIEVOREZJTEU6IHBhZ2VpbmZvLmpzXG5cdC8vIFNUQVJURklMRTogdGl0bGVzLmpzXG5cdC8qKlxuXHQgKiBAZmlsZW92ZXJ2aWV3IERlZmluZXMgdGhlIHtAc291cmNlIFRpdGxlfSBjbGFzcywgYW5kIGFzc29jaWF0ZWQgY3J1ZnR5IGZ1bmN0aW9ucy5cblx0ICpcblx0ICogPGNvZGU+VGl0bGU8L2NvZGU+IGRlYWxzIHdpdGggYXJ0aWNsZSB0aXRsZXMgYW5kIHRoZWlyIHZhcmlvdXNcblx0ICogZm9ybXMuICB7QHNvdXJjZSBTdHJpbmd3cmFwcGVyfSBpcyB0aGUgcGFyZW50IGNsYXNzIG9mXG5cdCAqIDxjb2RlPlRpdGxlPC9jb2RlPiwgd2hpY2ggZXhpc3RzIHNpbXBseSB0byBtYWtlIHRoaW5ncyBhIGxpdHRsZVxuXHQgKiBuZWF0ZXIuXG5cdCAqL1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBTdHJpbmd3cmFwcGVyLlxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICpcblx0ICogQGNsYXNzIHRoZSBTdHJpbmd3cmFwcGVyIGNsYXNzLiBUaGlzIGJhc2UgY2xhc3MgaXMgbm90IHJlYWxseVxuXHQgKiB1c2VmdWwgb24gaXRzIG93bjsgaXQganVzdCB3cmFwcyB2YXJpb3VzIGNvbW1vbiBzdHJpbmcgb3BlcmF0aW9ucy5cblx0ICovXG5cdGNvbnN0IFN0cmluZ3dyYXBwZXIgPSBmdW5jdGlvbiBTdHJpbmd3cmFwcGVyKCkge1xuXHRcdC8qKlxuXHRcdCAqIFdyYXBwZXIgZm9yIHRoaXMudG9TdHJpbmcoKS5pbmRleE9mKClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB4XG5cdFx0ICogQHR5cGUgaW50ZWdlclxuXHRcdCAqL1xuXHRcdHRoaXMuaW5kZXhPZiA9IGZ1bmN0aW9uICh4KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLmluZGV4T2YoeCk7XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBSZXR1cm5zIHRoaXMudmFsdWUuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHR0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWU7XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBXcmFwcGVyIGZvciB7QHNvdXJjZSBTdHJpbmcjcGFyZW5TcGxpdH0gYXBwbGllZCB0byB0aGlzLnRvU3RyaW5nKClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7UmVnRXhwfSB4XG5cdFx0ICogQHR5cGUgQXJyYXlcblx0XHQgKi9cblx0XHR0aGlzLnNwbGl0ID0gZnVuY3Rpb24gKHgpIHtcblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkuc3BsaXQoeCk7XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBXcmFwcGVyIGZvciB0aGlzLnRvU3RyaW5nKCkuc3Vic3RyaW5nKClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB4XG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHkgKG9wdGlvbmFsKVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdHRoaXMuc3Vic3RyaW5nID0gZnVuY3Rpb24gKHgsIHkpIHtcblx0XHRcdGlmICh5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMudG9TdHJpbmcoKS5zbGljZShNYXRoLm1heCgwLCB4KSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLnN1YnN0cmluZyh4LCB5KTtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIFdyYXBwZXIgZm9yIHRoaXMudG9TdHJpbmcoKS5zcGxpdCgpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30geFxuXHRcdCAqIEB0eXBlIEFycmF5XG5cdFx0ICovXG5cdFx0dGhpcy5zcGxpdCA9IGZ1bmN0aW9uICh4KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLnNwbGl0KHgpO1xuXHRcdH07XG5cdFx0LyoqXG5cdFx0ICogV3JhcHBlciBmb3IgdGhpcy50b1N0cmluZygpLnJlcGxhY2UoKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHhcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30geVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLnJlcGxhY2UoeCwgeSk7XG5cdFx0fTtcblx0fTtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGl0bGU8L2NvZGU+LlxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICpcblx0ICogQGNsYXNzIFRoZSBUaXRsZSBjbGFzcy4gSG9sZHMgYXJ0aWNsZSB0aXRsZXMgYW5kIGNvbnZlcnRzIHRoZW0gaW50b1xuXHQgKiB2YXJpb3VzIGZvcm1zLiBBbHNvIGRlYWxzIHdpdGggYW5jaG9ycywgYnkgd2hpY2ggd2UgbWVhbiB0aGUgYml0c1xuXHQgKiBvZiB0aGUgYXJ0aWNsZSBVUkwgYWZ0ZXIgYSAjIGNoYXJhY3RlciwgcmVwcmVzZW50aW5nIGxvY2F0aW9uc1xuXHQgKiB3aXRoaW4gYW4gYXJ0aWNsZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSBpbml0aWFsIHZhbHVlIHRvIGFzc2lnbiB0byB0aGVcblx0ICogYXJ0aWNsZS4gVGhpcyBtdXN0IGJlIHRoZSBjYW5vbmljYWwgdGl0bGUgKHNlZSB7QGxpbmtcblx0ICogVGl0bGUjdmFsdWV9LiBPbWl0IHRoaXMgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB1c2UgYW5vdGhlciBmdW5jdGlvblxuXHQgKiB0byBzZXQgdGhlIHRpdGxlIGlmIHRoaXMgaXMgdW5hdmFpbGFibGUuXG5cdCAqL1xuXHRjbGFzcyBUaXRsZSBleHRlbmRzIFN0cmluZ3dyYXBwZXIge1xuXHRcdGNvbnN0cnVjdG9yKHZhbCkge1xuXHRcdFx0c3VwZXIoKTtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGNhbm9uaWNhbCBhcnRpY2xlIHRpdGxlLiBUaGlzIG11c3QgYmUgaW4gVVRGLTggd2l0aCBub1xuXHRcdFx0ICogZW50aXRpZXMsIGVzY2FwaW5nIG9yIG5hc3RpZXMuIEFsc28sIHVuZGVyc2NvcmVzIHNob3VsZCBiZVxuXHRcdFx0ICogcmVwbGFjZWQgd2l0aCBzcGFjZXMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgU3RyaW5nXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGNhbm9uaWNhbCBmb3JtIG9mIHRoZSBhbmNob3IuIFRoaXMgc2hvdWxkIGJlIGV4YWN0bHkgYXNcblx0XHRcdCAqIGl0IGFwcGVhcnMgaW4gdGhlIFVSTCwgaS5lLiB3aXRoIHRoZSAuQzMuMEEgYml0cyBpbi5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5hbmNob3IgPSAnJztcblx0XHRcdHRoaXMuc2V0VXRmKHZhbCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJ0aWNsZSB0aXRsZSwgb3B0aW9uYWxseSB3aXRob3V0IGFuY2hvci5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gb21pdEFuY2hvclxuXHRcdCAqIEBmaXhtZSBEZWNpZGUgc3BlY3MgZm9yIGFuY2hvclxuXHRcdCAqIEByZXR1cm4gU3RyaW5nIFRoZSBhcnRpY2xlIHRpdGxlIGFuZCB0aGUgYW5jaG9yLlxuXHRcdCAqL1xuXHRcdHRvU3RyaW5nKG9taXRBbmNob3IpIHtcblx0XHRcdHJldHVybiB0aGlzLnZhbHVlICsgKCFvbWl0QW5jaG9yICYmIHRoaXMuYW5jaG9yID8gYCMke3RoaXMuYW5jaG9yU3RyaW5nKCl9YCA6ICcnKTtcblx0XHR9XG5cdFx0YW5jaG9yU3RyaW5nKCkge1xuXHRcdFx0aWYgKCF0aGlzLmFuY2hvcikge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzcGxpdCA9IHRoaXMuYW5jaG9yLnNwbGl0KC8oKD86XFwuW1xcZEEtRl17Mn0pKykvKTtcblx0XHRcdGNvbnN0IGxlbiA9IHNwbGl0Lmxlbmd0aDtcblx0XHRcdGxldCB2YWx1ZTtcblx0XHRcdGZvciAobGV0IGogPSAxOyBqIDwgbGVuOyBqICs9IDIpIHtcblx0XHRcdFx0Ly8gRklYTUUgcy9kZWNvZGVVUkkvZGVjb2RlVVJJQ29tcG9uZW50L2cgP1xuXHRcdFx0XHR2YWx1ZSA9IHNwbGl0W2pdLnNwbGl0KCcuJykuam9pbignJScpO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Ly8gY2Fubm90IGRlY29kZVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNwbGl0W2pdID0gdmFsdWUuc3BsaXQoJ18nKS5qb2luKCcgJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3BsaXQuam9pbignJyk7XG5cdFx0fVxuXHRcdHVybEFuY2hvcigpIHtcblx0XHRcdGNvbnN0IHNwbGl0ID0gdGhpcy5hbmNob3Iuc3BsaXQoJy8oKD86WyVdWzAtOUEtRl17Mn0pKykvJyk7XG5cdFx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBqID0gMTsgaiA8IGxlbjsgaiArPSAyKSB7XG5cdFx0XHRcdHNwbGl0W2pdID0gc3BsaXRbal0uc3BsaXQoJyUnKS5qb2luKCcuJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3BsaXQuam9pbignJyk7XG5cdFx0fVxuXHRcdGFuY2hvckZyb21VdGYoc3RyKSB7XG5cdFx0XHR0aGlzLmFuY2hvciA9IGVuY29kZVVSSUNvbXBvbmVudChzdHIuc3BsaXQoJyAnKS5qb2luKCdfJykpXG5cdFx0XHRcdC5zcGxpdCgnJTNBJylcblx0XHRcdFx0LmpvaW4oJzonKVxuXHRcdFx0XHQuc3BsaXQoXCInXCIpXG5cdFx0XHRcdC5qb2luKCclMjcnKVxuXHRcdFx0XHQuc3BsaXQoJyUnKVxuXHRcdFx0XHQuam9pbignLicpO1xuXHRcdH1cblx0XHRmcm9tVVJMKGgpIHtcblx0XHRcdGlmICh0eXBlb2YgaCAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTk9URSA6IHBsYXlpbmcgd2l0aCBkZWNvZGVVUkksIGVuY29kZVVSSSwgZXNjYXBlLCB1bmVzY2FwZSxcblx0XHRcdC8vIHdlIHNlZW0gdG8gYmUgYWJsZSB0byByZXBsaWNhdGUgdGhlIElFIGJvcmtlZCBlbmNvZGluZ1xuXHRcdFx0Ly8gSUUgZG9lc24ndCBkbyB0aGlzIG5ldy1mYW5nbGVkIHV0Zi04IHRoaW5nLlxuXHRcdFx0Ly8gYW5kIGl0J3Mgd29yc2UgdGhhbiB0aGF0LlxuXHRcdFx0Ly8gSUUgc2VlbXMgdG8gdHJlYXQgdGhlIHF1ZXJ5IHN0cmluZyBkaWZmZXJlbnRseSB0byB0aGUgcmVzdCBvZiB0aGUgdXJsXG5cdFx0XHQvLyB0aGUgcXVlcnkgaXMgdHJlYXRlZCBhcyBib25hLWZpZGUgdXRmOCwgYnV0IHRoZSBmaXJzdCBiaXQgb2YgdGhlIHVybCBpcyBwaXNzZWQgYXJvdW5kIHdpdGhcblx0XHRcdC8vIHdlIGZpeCB1cCAmIGZvciBhbGwgYnJvd3NlcnMsIGp1c3QgaW4gY2FzZS5cblx0XHRcdGNvbnN0IHNwbGl0dGVkID0gaC5zcGxpdCgnPycpO1xuXHRcdFx0c3BsaXR0ZWRbMF0gPSBzcGxpdHRlZFswXS5zcGxpdCgnJicpLmpvaW4oJyUyNicpO1xuXHRcdFx0aCA9IHNwbGl0dGVkLmpvaW4oJz8nKTtcblx0XHRcdGNvbnN0IGNvbnRyaWJzID0gcGcucmUuY29udHJpYnMuZXhlYyhoKTtcblx0XHRcdGlmIChjb250cmlicykge1xuXHRcdFx0XHRpZiAoY29udHJpYnNbMV0gPT09ICd0aXRsZT0nKSB7XG5cdFx0XHRcdFx0Y29udHJpYnNbM10gPSBjb250cmlic1szXS5zcGxpdCgnKycpLmpvaW4oJyAnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB1ID0gbmV3IFRpdGxlKGNvbnRyaWJzWzNdKTtcblx0XHRcdFx0dGhpcy5zZXRVdGYoXG5cdFx0XHRcdFx0VGl0bGUuZGVjb2RlTmFzdGllcyhgJHttdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1VzZXJJZF19OiR7dS5zdHJpcE5hbWVzcGFjZSgpfWApXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZW1haWwgPSBwZy5yZS5lbWFpbC5leGVjKGgpO1xuXHRcdFx0aWYgKGVtYWlsKSB7XG5cdFx0XHRcdHRoaXMuc2V0VXRmKFxuXHRcdFx0XHRcdFRpdGxlLmRlY29kZU5hc3RpZXMoXG5cdFx0XHRcdFx0XHRgJHttdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1VzZXJJZF19OiR7bmV3IFRpdGxlKGVtYWlsWzNdKS5zdHJpcE5hbWVzcGFjZSgpfWBcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYmFja2xpbmtzID0gcGcucmUuYmFja2xpbmtzLmV4ZWMoaCk7XG5cdFx0XHRpZiAoYmFja2xpbmtzKSB7XG5cdFx0XHRcdHRoaXMuc2V0VXRmKFRpdGxlLmRlY29kZU5hc3RpZXMobmV3IFRpdGxlKGJhY2tsaW5rc1szXSkpKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0XHQvLyBBIGR1bW15IHRpdGxlIG9iamVjdCBmb3IgYSBTcGVjaWFsOkRpZmYgbGluay5cblx0XHRcdGNvbnN0IHNwZWNpYWxkaWZmID0gcGcucmUuc3BlY2lhbGRpZmYuZXhlYyhoKTtcblx0XHRcdGlmIChzcGVjaWFsZGlmZikge1xuXHRcdFx0XHR0aGlzLnNldFV0Zihcblx0XHRcdFx0XHRUaXRsZS5kZWNvZGVOYXN0aWVzKG5ldyBUaXRsZShgJHttdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1NwZWNpYWxJZF19OkRpZmZgKSlcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0XHQvLyBubyBtb3JlIHNwZWNpYWwgY2FzZXMgdG8gY2hlY2sgLS1cblx0XHRcdC8vIGhvcGVmdWxseSBpdCdzIG5vdCBhIGRpc2d1aXNlZCB1c2VyLXJlbGF0ZWQgb3Igc3BlY2lhbGx5IHRyZWF0ZWQgc3BlY2lhbCBwYWdlXG5cdFx0XHQvLyBJbmNsdWRlcyByZWZlcmVuY2VzXG5cdFx0XHRjb25zdCBtID0gcGcucmUubWFpbi5leGVjKGgpO1xuXHRcdFx0aWYgKG0gPT09IG51bGwpIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmcm9tQm90SW50ZXJmYWNlID0gL1xcPyguKyYpP3RpdGxlPS8udGVzdChoKTtcblx0XHRcdFx0aWYgKGZyb21Cb3RJbnRlcmZhY2UpIHtcblx0XHRcdFx0XHRtWzJdID0gbVsyXS5zcGxpdCgnKycpLmpvaW4oJ18nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBleHRyYWN0ZWQgPSBtWzJdICsgKG1bM10gPyBgIyR7bVszXX1gIDogJycpO1xuXHRcdFx0XHRpZiAocGcuZmxhZy5pc1NhZmFyaSAmJiAvJTI1W1xcZEEtRmEtZl17Mn0vLnRlc3QoZXh0cmFjdGVkKSkge1xuXHRcdFx0XHRcdC8vIEZpeCBTYWZhcmkgaXNzdWVcblx0XHRcdFx0XHQvLyBTYWZhcmkgc29tZXRpbWVzIGVuY29kZXMgJSBhcyAlMjUgaW4gVVRGLTggZW5jb2RlZCBzdHJpbmdzIGxpa2UgJUU1JUEzIC0+ICUyNUU1JTI1QTMuXG5cdFx0XHRcdFx0dGhpcy5zZXRVdGYoZGVjb2RlVVJJQ29tcG9uZW50KHVuZXNjYXBlKGV4dHJhY3RlZCkpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnNldFV0ZihUaXRsZS5kZWNvZGVOYXN0aWVzKGV4dHJhY3RlZCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0c3RhdGljIGRlY29kZU5hc3RpZXModHh0KSB7XG5cdFx0XHQvLyBteURlY29kZVVSSSB1c2VzIGRlY29kZUV4dHJhcywgd2hpY2ggcmVtb3ZlcyBfLFxuXHRcdFx0Ly8gdGh1cyBydWluaW5nIGNpdGF0aW9ucyBwcmV2aWV3cywgd2hpY2ggYXJlIGZvcm1hdGVkIGFzIFwiY2l0ZV9ub3RlLTFcIlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bGV0IHJldCA9IGRlY29kZVVSSShUaXRsZS5kZWNvZGVFc2NhcGVzKHR4dCkpO1xuXHRcdFx0XHRyZXQgPSByZXQucmVwbGFjZSgvWyBfXSokLywgJycpO1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdHJldHVybiB0eHQ7IC8vIGNhbm5vdCBkZWNvZGVcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gRGVjb2RlIHZhbGlkICUtZW5jb2RpbmdzLCBvdGhlcndpc2UgZXNjYXBlIHRoZW1cblx0XHRzdGF0aWMgZGVjb2RlRXNjYXBlcyh0eHQpIHtcblx0XHRcdGNvbnN0IHNwbGl0ID0gdHh0LnNwbGl0KC8oKD86JVtcXGRBLUZhLWZdezJ9KSspLyk7XG5cdFx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cdFx0XHQvLyBObyAlLWVuY29kZWQgaXRlbXMgZm91bmQsIHNvIHJlcGxhY2UgdGhlIGxpdGVyYWwgJVxuXHRcdFx0aWYgKGxlbiA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc3BsaXRbMF0ucmVwbGFjZSgvJSg/IVtcXGRBLUZhLWZdezJ9KS9nLCAnJTI1Jyk7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSArPSAyKSB7XG5cdFx0XHRcdHNwbGl0W2ldID0gZGVjb2RlVVJJQ29tcG9uZW50KHNwbGl0W2ldKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzcGxpdC5qb2luKCcnKTtcblx0XHR9XG5cdFx0ZnJvbUFuY2hvcihhKSB7XG5cdFx0XHRpZiAoIWEpIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuZnJvbVVSTChhLmhyZWYpO1xuXHRcdH1cblx0XHRmcm9tV2lraVRleHQodHh0KSB7XG5cdFx0XHQvLyBGSVhNRSAtIHRlc3RpbmcgbmVlZGVkXG5cdFx0XHR0eHQgPSBteURlY29kZVVSSSh0eHQpO1xuXHRcdFx0dGhpcy5zZXRVdGYodHh0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRoaW50VmFsdWUoKSB7XG5cdFx0XHRpZiAoIXRoaXMudmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNhZmVEZWNvZGVVUkkodGhpcy52YWx1ZSk7XG5cdFx0fVxuXHRcdHRvVXNlck5hbWUod2l0aE5zKSB7XG5cdFx0XHRpZiAodGhpcy5uYW1lc3BhY2VJZCgpICE9PSBwZy5uc1VzZXJJZCAmJiB0aGlzLm5hbWVzcGFjZUlkKCkgIT09IHBnLm5zVXNlcnRhbGtJZCkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy52YWx1ZSA9XG5cdFx0XHRcdCh3aXRoTnMgPyBgJHttdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1VzZXJJZF19OmAgOiAnJykgK1xuXHRcdFx0XHR0aGlzLnN0cmlwTmFtZXNwYWNlKCkuc3BsaXQoJy8nKVswXTtcblx0XHR9XG5cdFx0dXNlck5hbWUod2l0aE5zKSB7XG5cdFx0XHRjb25zdCB0ID0gbmV3IFRpdGxlKHRoaXMudmFsdWUpO1xuXHRcdFx0dC50b1VzZXJOYW1lKHdpdGhOcyk7XG5cdFx0XHRpZiAodC52YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHR0b1RhbGtQYWdlKCkge1xuXHRcdFx0Ly8gY29udmVydCBhcnRpY2xlIHRvIGEgdGFsayBwYWdlLCBvciBpZiB3ZSBjYW4ndCwgcmV0dXJuIG51bGxcblx0XHRcdC8vIEluIG90aGVyIHdvcmRzOiByZXR1cm4gbnVsbCBpZiB0aGlzIEFMUkVBRFkgSVMgYSB0YWxrIHBhZ2Vcblx0XHRcdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdGFsayBwYWdlIG90aGVyd2lzZVxuXHRcdFx0Ly9cblx0XHRcdC8vIFBlciB7QGxpbmsgaHR0cHM6Ly93d3cubWVkaWF3aWtpLm9yZy93aWtpL01hbnVhbDpOYW1lc3BhY2UjU3ViamVjdF9hbmRfdGFsa19uYW1lc3BhY2VzfVxuXHRcdFx0Ly8gKiBBbGwgZGlzY3Vzc2lvbiBuYW1lc3BhY2VzIGhhdmUgb2RkLWludGVnZXIgaW5kaWNlc1xuXHRcdFx0Ly8gKiBUaGUgZGlzY3Vzc2lvbiBuYW1lc3BhY2UgaW5kZXggZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlIHdpdGggaW5kZXggbiBpcyBuICsgMVxuXHRcdFx0aWYgKHRoaXMudmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBuYW1lc3BhY2VJZCA9IHRoaXMubmFtZXNwYWNlSWQoKTtcblx0XHRcdGlmIChuYW1lc3BhY2VJZCA+PSAwICYmIG5hbWVzcGFjZUlkICUgMiA9PT0gMCkge1xuXHRcdFx0XHQvLyBub24tc3BlY2lhbCBhbmQgc3ViamVjdCBuYW1lc3BhY2Vcblx0XHRcdFx0Y29uc3QgbG9jYWxpemVkTmFtZXNwYWNlID0gbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbbmFtZXNwYWNlSWQgKyAxXTtcblx0XHRcdFx0aWYgKGxvY2FsaXplZE5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy52YWx1ZSA9XG5cdFx0XHRcdFx0XHRsb2NhbGl6ZWROYW1lc3BhY2UgPT09ICcnXG5cdFx0XHRcdFx0XHRcdD8gdGhpcy5zdHJpcE5hbWVzcGFjZSgpXG5cdFx0XHRcdFx0XHRcdDogYCR7bG9jYWxpemVkTmFtZXNwYWNlLnNwbGl0KCcgJykuam9pbignXycpfToke3RoaXMuc3RyaXBOYW1lc3BhY2UoKX1gO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHQvLyBSZXR1cm4gY2Fub25pY2FsLCBsb2NhbGl6ZWQgbmFtZXNwYWNlXG5cdFx0bmFtZXNwYWNlKCkge1xuXHRcdFx0cmV0dXJuIG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3RoaXMubmFtZXNwYWNlSWQoKV07XG5cdFx0fVxuXHRcdG5hbWVzcGFjZUlkKCkge1xuXHRcdFx0Y29uc3QgbiA9IHRoaXMudmFsdWUuaW5kZXhPZignOicpO1xuXHRcdFx0aWYgKG4gPCAwKSB7XG5cdFx0XHRcdHJldHVybiAwOyAvLyBtYWluc3BhY2Vcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5hbWVzcGFjZUlkID1cblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VJZHMnKVt0aGlzLnZhbHVlLnNsaWNlKDAsIE1hdGgubWF4KDAsIG4pKS5zcGxpdCgnICcpLmpvaW4oJ18nKS50b0xvd2VyQ2FzZSgpXTtcblx0XHRcdGlmIChuYW1lc3BhY2VJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiAwOyAvLyBtYWluc3BhY2Vcblx0XHRcdH1cblx0XHRcdHJldHVybiBuYW1lc3BhY2VJZDtcblx0XHR9XG5cdFx0dGFsa1BhZ2UoKSB7XG5cdFx0XHRjb25zdCB0ID0gbmV3IFRpdGxlKHRoaXMudmFsdWUpO1xuXHRcdFx0dC50b1RhbGtQYWdlKCk7XG5cdFx0XHRpZiAodC52YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRpc1RhbGtQYWdlKCkge1xuXHRcdFx0aWYgKHRoaXMudGFsa1BhZ2UoKSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dG9BcnRpY2xlRnJvbVRhbGtQYWdlKCkge1xuXHRcdFx0Ly8gbGFyZ2VseSBjb3B5L3Bhc3RlIGZyb20gdG9UYWxrUGFnZSBhYm92ZS5cblx0XHRcdGlmICh0aGlzLnZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbmFtZXNwYWNlSWQgPSB0aGlzLm5hbWVzcGFjZUlkKCk7XG5cdFx0XHRpZiAobmFtZXNwYWNlSWQgPj0gMCAmJiBuYW1lc3BhY2VJZCAlIDIgPT09IDEpIHtcblx0XHRcdFx0Ly8gbm9uLXNwZWNpYWwgYW5kIHRhbGsgbmFtZXNwYWNlXG5cdFx0XHRcdGNvbnN0IGxvY2FsaXplZE5hbWVzcGFjZSA9IG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW25hbWVzcGFjZUlkIC0gMV07XG5cdFx0XHRcdGlmIChsb2NhbGl6ZWROYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRoaXMudmFsdWUgPVxuXHRcdFx0XHRcdFx0bG9jYWxpemVkTmFtZXNwYWNlID09PSAnJ1xuXHRcdFx0XHRcdFx0XHQ/IHRoaXMuc3RyaXBOYW1lc3BhY2UoKVxuXHRcdFx0XHRcdFx0XHQ6IGAke2xvY2FsaXplZE5hbWVzcGFjZS5zcGxpdCgnICcpLmpvaW4oJ18nKX06JHt0aGlzLnN0cmlwTmFtZXNwYWNlKCl9YDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0YXJ0aWNsZUZyb21UYWxrUGFnZSgpIHtcblx0XHRcdGNvbnN0IHQgPSBuZXcgVGl0bGUodGhpcy52YWx1ZSk7XG5cdFx0XHR0LnRvQXJ0aWNsZUZyb21UYWxrUGFnZSgpO1xuXHRcdFx0aWYgKHQudmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0YXJ0aWNsZUZyb21UYWxrT3JBcnRpY2xlKCkge1xuXHRcdFx0Y29uc3QgdCA9IG5ldyBUaXRsZSh0aGlzLnZhbHVlKTtcblx0XHRcdGlmICh0LnRvQXJ0aWNsZUZyb21UYWxrUGFnZSgpKSB7XG5cdFx0XHRcdHJldHVybiB0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlzSXBVc2VyKCkge1xuXHRcdFx0cmV0dXJuIHBnLnJlLmlwVXNlci50ZXN0KHRoaXMudXNlck5hbWUoKSk7XG5cdFx0fVxuXHRcdHN0cmlwTmFtZXNwYWNlKCkge1xuXHRcdFx0Ly8gcmV0dXJucyBhIHN0cmluZywgbm90IGEgVGl0bGVcblx0XHRcdGNvbnN0IG4gPSB0aGlzLnZhbHVlLmluZGV4T2YoJzonKTtcblx0XHRcdGlmIChuIDwgMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWx1ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5hbWVzcGFjZUlkID0gdGhpcy5uYW1lc3BhY2VJZCgpO1xuXHRcdFx0aWYgKG5hbWVzcGFjZUlkID09PSBwZy5uc01haW5zcGFjZUlkKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWUuc2xpY2UoTWF0aC5tYXgoMCwgbiArIDEpKTtcblx0XHR9XG5cdFx0c2V0VXRmKHZhbHVlKSB7XG5cdFx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSAnJztcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYW5jaCA9IHZhbHVlLmluZGV4T2YoJyMnKTtcblx0XHRcdGlmIChhbmNoIDwgMCkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsdWUuc3BsaXQoJ18nKS5qb2luKCcgJyk7XG5cdFx0XHRcdHRoaXMuYW5jaG9yID0gJyc7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBNYXRoLm1heCgwLCBhbmNoKSkuc3BsaXQoJ18nKS5qb2luKCcgJyk7XG5cdFx0XHR0aGlzLmFuY2hvciA9IHZhbHVlLnNsaWNlKE1hdGgubWF4KDAsIGFuY2ggKyAxKSk7XG5cdFx0XHR0aGlzLm5zID0gbnVsbDsgLy8gd2FpdCB1bnRpbCBuYW1lc3BhY2UoKSBpcyBjYWxsZWRcblx0XHR9XG5cdFx0c2V0VXJsKHVybGZyYWcpIHtcblx0XHRcdGNvbnN0IGFuY2ggPSB1cmxmcmFnLmluZGV4T2YoJyMnKTtcblx0XHRcdHRoaXMudmFsdWUgPSBzYWZlRGVjb2RlVVJJKHVybGZyYWcuc2xpY2UoMCwgTWF0aC5tYXgoMCwgYW5jaCkpKTtcblx0XHRcdHRoaXMuYW5jaG9yID0gdGhpcy52YWx1ZS5zbGljZShNYXRoLm1heCgwLCBhbmNoICsgMSkpO1xuXHRcdH1cblx0XHRhcHBlbmQoeCkge1xuXHRcdFx0dGhpcy5zZXRVdGYodGhpcy52YWx1ZSArIHgpO1xuXHRcdH1cblx0XHR1cmxTdHJpbmcoeCkge1xuXHRcdFx0aWYgKCF4KSB7XG5cdFx0XHRcdHggPSB7fTtcblx0XHRcdH1cblx0XHRcdGxldCB2ID0gdGhpcy50b1N0cmluZyh0cnVlKTtcblx0XHRcdGlmICgheC5vbWl0QW5jaG9yICYmIHRoaXMuYW5jaG9yKSB7XG5cdFx0XHRcdHYgKz0gYCMke3RoaXMudXJsQW5jaG9yKCl9YDtcblx0XHRcdH1cblx0XHRcdGlmICgheC5rZWVwU3BhY2VzKSB7XG5cdFx0XHRcdHYgPSB2LnNwbGl0KCcgJykuam9pbignXycpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGVuY29kZVVSSSh2KS5zcGxpdCgnJicpLmpvaW4oJyUyNicpLnNwbGl0KCc/Jykuam9pbignJTNGJykuc3BsaXQoJysnKS5qb2luKCclMkInKTtcblx0XHR9XG5cdFx0cmVtb3ZlQW5jaG9yKCkge1xuXHRcdFx0cmV0dXJuIG5ldyBUaXRsZSh0aGlzLnRvU3RyaW5nKHRydWUpKTtcblx0XHR9XG5cdFx0dG9VcmwoKSB7XG5cdFx0XHRyZXR1cm4gcGcud2lraS50aXRsZWJhc2UgKyB0aGlzLnVybFN0cmluZygpO1xuXHRcdH1cblx0fVxuXHRUaXRsZS5mcm9tVVJMID0gKGgpID0+IHtcblx0XHRyZXR1cm4gbmV3IFRpdGxlKCkuZnJvbVVSTChoKTtcblx0fTtcblx0VGl0bGUuZnJvbUFuY2hvciA9IChhKSA9PiB7XG5cdFx0cmV0dXJuIG5ldyBUaXRsZSgpLmZyb21BbmNob3IoYSk7XG5cdH07XG5cdFRpdGxlLmZyb21XaWtpVGV4dCA9ICh0eHQpID0+IHtcblx0XHRyZXR1cm4gbmV3IFRpdGxlKCkuZnJvbVdpa2lUZXh0KHR4dCk7XG5cdH07XG5cdGNvbnN0IHBhcnNlUGFyYW1zID0gKHVybCkgPT4ge1xuXHRcdGNvbnN0IHNwZWNpYWxEaWZmID0gcGcucmUuc3BlY2lhbGRpZmYuZXhlYyh1cmwpO1xuXHRcdGlmIChzcGVjaWFsRGlmZikge1xuXHRcdFx0Y29uc3Qgc3BsaXQgPSBzcGVjaWFsRGlmZlsxXS5zcGxpdCgnLycpO1xuXHRcdFx0aWYgKHNwbGl0Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZGlkOiBzcGxpdFswXSxcblx0XHRcdFx0XHRkaWZmOiAncHJldicsXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2UgaWYgKHNwbGl0Lmxlbmd0aCA9PT0gMikge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZGlkOiBzcGxpdFswXSxcblx0XHRcdFx0XHRkaWZmOiBzcGxpdFsxXSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgcmV0ID0ge307XG5cdFx0aWYgKCF1cmwuaW5jbHVkZXMoJz8nKSkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0W3VybF0gPSB1cmwuc3BsaXQoJyMnKTtcblx0XHRjb25zdCBzID0gdXJsLnNwbGl0KCc/Jykuc2xpY2UoMSkuam9pbignLCcpO1xuXHRcdGNvbnN0IHQgPSBzLnNwbGl0KCcmJyk7XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIHQpIHtcblx0XHRcdGNvbnN0IHogPSBlbGVtZW50LnNwbGl0KCc9Jyk7XG5cdFx0XHR6LnB1c2gobnVsbCk7XG5cdFx0XHRbLCByZXRbelswXV1dID0gejtcblx0XHR9XG5cdFx0Ly8gRGlmZiByZXZpc2lvbiB3aXRoIG5vIG9sZGlkIGlzIGludGVycHJldGVkIGFzIGEgZGlmZiB0byB0aGUgcHJldmlvdXMgcmV2aXNpb24gYnkgTWVkaWFXaWtpXG5cdFx0aWYgKHJldC5kaWZmICYmIHJldC5vbGRpZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXQub2xkaWQgPSAncHJldic7XG5cdFx0fVxuXHRcdC8vIERvY3VtZW50YXRpb24gc2VlbXMgdG8gc2F5IHNvbWV0aGluZyBkaWZmZXJlbnQsIGJ1dCBvbGRpZCBjYW4gYWxzbyBhY2NlcHQgcHJldi9uZXh0LCBhbmRcblx0XHQvLyBFY2hvIGlzIGVtaXR0aW5nIHN1Y2ggVVJMcy4gU2ltcGxlIGZpeHVwIGR1cmluZyBwYXJhbWV0ZXIgZGVjb2Rpbmc6XG5cdFx0aWYgKHJldC5vbGRpZCAmJiAocmV0Lm9sZGlkID09PSAncHJldicgfHwgcmV0Lm9sZGlkID09PSAnbmV4dCcgfHwgcmV0Lm9sZGlkID09PSAnY3VyJykpIHtcblx0XHRcdGNvbnN0IGhlbHBlciA9IHJldC5kaWZmO1xuXHRcdFx0cmV0LmRpZmYgPSByZXQub2xkaWQ7XG5cdFx0XHRyZXQub2xkaWQgPSBoZWxwZXI7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdC8vIChhKSBteURlY29kZVVSSSAoZmlyc3Qgc3RhbmRhcmQgZGVjb2RlVVJJLCB0aGVuIHBnLnJlLnVybE5vUG9wdXApXG5cdC8vIChiKSBjaGFuZ2Ugc3BhY2VzIHRvIHVuZGVyc2NvcmVzXG5cdC8vIChjKSBlbmNvZGVVUkkgKGp1c3QgdGhlIHN0cmFpZ2h0IG9uZSwgbm8gcGcucmUudXJsTm9Qb3B1cClcblx0Y29uc3QgbXlEZWNvZGVVUkkgPSAoc3RyKSA9PiB7XG5cdFx0bGV0IHJldDtcblx0XHQvLyBGSVhNRSBkZWNvZGVVUklDb21wb25lbnQ/P1xuXHRcdHRyeSB7XG5cdFx0XHRyZXQgPSBkZWNvZGVVUkkoc3RyLnRvU3RyaW5nKCkpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIHN0cjtcblx0XHR9XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwZy5taXNjLmRlY29kZUV4dHJhcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0Y29uc3Qge2Zyb219ID0gcGcubWlzYy5kZWNvZGVFeHRyYXNbaV07XG5cdFx0XHRjb25zdCB7dG99ID0gcGcubWlzYy5kZWNvZGVFeHRyYXNbaV07XG5cdFx0XHRyZXQgPSByZXQuc3BsaXQoZnJvbSkuam9pbih0byk7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IHNhZmVEZWNvZGVVUkkgPSAoc3RyKSA9PiB7XG5cdFx0Y29uc3QgcmV0ID0gbXlEZWNvZGVVUkkoc3RyKTtcblx0XHRyZXR1cm4gcmV0IHx8IHN0cjtcblx0fTtcblx0Ly8gVEVTVFMgLy9cblx0Y29uc3QgaXNEaXNhbWJpZyA9IChkYXRhLCBhcnRpY2xlKSA9PiB7XG5cdFx0aWYgKCFnZXRWYWx1ZU9mKCdwb3B1cEFsbERhYnNTdHVicycpICYmIGFydGljbGUubmFtZXNwYWNlKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuICFhcnRpY2xlLmlzVGFsa1BhZ2UoKSAmJiBwZy5yZS5kaXNhbWJpZy50ZXN0KGRhdGEpO1xuXHR9O1xuXHRjb25zdCBzdHViQ291bnQgPSAoZGF0YSwgYXJ0aWNsZSkgPT4ge1xuXHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBBbGxEYWJzU3R1YnMnKSAmJiBhcnRpY2xlLm5hbWVzcGFjZSgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGxldCBzZWN0U3R1YiA9IDA7XG5cdFx0bGV0IHJlYWxTdHViID0gMDtcblx0XHRpZiAocGcucmUuc3R1Yi50ZXN0KGRhdGEpKSB7XG5cdFx0XHRjb25zdCBzID0gZGF0YS5zcGxpdChwZy5yZS5zdHViKTtcblx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgcy5sZW5ndGg7IGkgKz0gMikge1xuXHRcdFx0XHRpZiAoc1tpXSkge1xuXHRcdFx0XHRcdCsrc2VjdFN0dWI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KytyZWFsU3R1Yjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVhbDogcmVhbFN0dWIsXG5cdFx0XHRzZWN0OiBzZWN0U3R1Yixcblx0XHR9O1xuXHR9O1xuXHRjb25zdCBpc1ZhbGlkSW1hZ2VOYW1lID0gKHN0cikgPT4ge1xuXHRcdHJldHVybiAhc3RyLmluY2x1ZGVzKCd7Jyk7XG5cdH07XG5cdGNvbnN0IGlzSW5TdHJpcHBhYmxlTmFtZXNwYWNlID0gKGFydGljbGUpID0+IHtcblx0XHRyZXR1cm4gYXJ0aWNsZS5uYW1lc3BhY2VJZCgpICE9PSAwO1xuXHR9O1xuXHRjb25zdCBpc0luTWFpbk5hbWVzcGFjZSA9IChhcnRpY2xlKSA9PiB7XG5cdFx0cmV0dXJuIGFydGljbGUubmFtZXNwYWNlSWQoKSA9PT0gMDtcblx0fTtcblx0Y29uc3QgYW5jaG9yQ29udGFpbnNJbWFnZSA9IChhKSA9PiB7XG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGNoaWxkcmVuIG9mIGFuY2hvciBhXG5cdFx0Ly8gc2VlIGlmIGFueSBhcmUgaW1hZ2VzXG5cdFx0aWYgKGEgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3Qga2lkcyA9IGEuY2hpbGROb2Rlcztcblx0XHRmb3IgKGNvbnN0IGtpZCBvZiBraWRzKSB7XG5cdFx0XHRpZiAoa2lkLm5vZGVOYW1lID09PSAnSU1HJykge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXHRjb25zdCBpc1BvcHVwTGluayA9IChhKSA9PiB7XG5cdFx0Ly8gTkIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIFRPQyBsaW5rcyBnZW5lcmFsbHkgcmV0dXJuIHRydWVcblx0XHQvLyB0aGV5IHNob3VsZCBiZSBzdHJpcHBlZCBvdXQgbGF0ZXJcblx0XHRpZiAoIW1hcmtOb3BvcHVwU3BhbkxpbmtzLmRvbmUpIHtcblx0XHRcdG1hcmtOb3BvcHVwU3BhbkxpbmtzKCk7XG5cdFx0fVxuXHRcdGlmIChhLmluTm9wb3B1cFNwYW4pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gRklYTUUgaXMgdGhpcyBmYXN0ZXIgaW5saW5lP1xuXHRcdGlmIChhLm9ubW91c2Vkb3duIHx8IGEuZ2V0QXR0cmlidXRlKCdub3BvcHVwJykpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgaCA9IGEuaHJlZjtcblx0XHRpZiAoaCA9PT0gYCR7ZG9jdW1lbnQubG9jYXRpb24uaHJlZn0jYCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoIXBnLnJlLmJhc2VuYW1lcy50ZXN0KGgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghcGcucmUudXJsTm9Qb3B1cC50ZXN0KGgpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdChwZy5yZS5lbWFpbC50ZXN0KGgpIHx8IHBnLnJlLmNvbnRyaWJzLnRlc3QoaCkgfHwgcGcucmUuYmFja2xpbmtzLnRlc3QoaCkgfHwgcGcucmUuc3BlY2lhbGRpZmYudGVzdChoKSkgJiZcblx0XHRcdCFoLmluY2x1ZGVzKCcmbGltaXQ9Jylcblx0XHQpO1xuXHR9O1xuXHRjb25zdCBtYXJrTm9wb3B1cFNwYW5MaW5rcyA9IGZ1bmN0aW9uIG1hcmtOb3BvcHVwU3BhbkxpbmtzKCkge1xuXHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBPbmx5QXJ0aWNsZUxpbmtzJykpIHtcblx0XHRcdGZpeFZlY3Rvck1lbnVQb3B1cHMoKTtcblx0XHR9XG5cdFx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdFx0Y29uc3QgcyA9ICRib2R5LmZpbmQoJy5ub3BvcHVwcycpLnRvQXJyYXkoKTtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygcykge1xuXHRcdFx0Y29uc3QgYXMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcblx0XHRcdGZvciAoY29uc3QgYSBvZiBhcykge1xuXHRcdFx0XHRhLmluTm9wb3B1cFNwYW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtYXJrTm9wb3B1cFNwYW5MaW5rcy5kb25lID0gdHJ1ZTtcblx0fTtcblx0Y29uc3QgZml4VmVjdG9yTWVudVBvcHVwcyA9ICgpID0+IHtcblx0XHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0XHQkYm9keS5maW5kKCduYXYudmVjdG9yLW1lbnUgaDM6Zmlyc3QgYTpmaXJzdCcpLnByb3AoJ2luTm9wb3B1cFNwYW4nLCB0cnVlKTtcblx0fTtcblx0Ly8gRU5ERklMRTogdGl0bGVzLmpzXG5cdC8vIFNUQVJURklMRTogZ2V0cGFnZS5qc1xuXHQvLyBXaWtpLXNwZWNpZmljIGRvd25sb2FkaW5nXG5cdC8vXG5cdC8vIFNjaGVtYXRpYyBmb3IgYSBnZXRXaWtpIGNhbGxcblx0Ly9cblx0Ly8gICAgICAgICAgICAgZ2V0UGFnZVdpdGhDYWNoaW5nXG5cdC8vXHRcdFx0XHRcdHxcblx0Ly9cdCAgIGZhbHNlXHRcdHxcdFx0ICB0cnVlXG5cdC8vIGdldFBhZ2U8LVtmaW5kUGljdHVyZUluQ2FjaGVdLT4tb25Db21wbGV0ZShhIGZha2UgZG93bmxvYWQpXG5cdC8vICAgXFwuXG5cdC8vXHQgKGFzeW5jKS0+YWRkUGFnZVRvQ2FjaGUoZG93bmxvYWQpLT4tb25Db21wbGV0ZShkb3dubG9hZClcblx0Ly8gY2hlY2sgY2FjaGUgdG8gc2VlIGlmIHBhZ2UgZXhpc3RzXG5cdGNvbnN0IGdldFBhZ2VXaXRoQ2FjaGluZyA9ICh1cmwsIG9uQ29tcGxldGUsIG93bmVyKSA9PiB7XG5cdFx0bG9nKGBnZXRQYWdlV2l0aENhY2hpbmcsIHVybD0ke3VybH1gKTtcblx0XHRjb25zdCBpID0gZmluZEluUGFnZUNhY2hlKHVybCk7XG5cdFx0bGV0IGQ7XG5cdFx0aWYgKGkgPiAtMSkge1xuXHRcdFx0ZCA9IGZha2VEb3dubG9hZChcblx0XHRcdFx0dXJsLFxuXHRcdFx0XHRvd25lci5pZE51bWJlcixcblx0XHRcdFx0b25Db21wbGV0ZSxcblx0XHRcdFx0cGcuY2FjaGUucGFnZXNbaV0uZGF0YSxcblx0XHRcdFx0cGcuY2FjaGUucGFnZXNbaV0ubGFzdE1vZGlmaWVkLFxuXHRcdFx0XHRvd25lclxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZCA9IGdldFBhZ2UodXJsLCBvbkNvbXBsZXRlLCBvd25lcik7XG5cdFx0XHRpZiAoZCAmJiBvd25lciAmJiBvd25lci5hZGREb3dubG9hZCkge1xuXHRcdFx0XHRvd25lci5hZGREb3dubG9hZChkKTtcblx0XHRcdFx0ZC5vd25lciA9IG93bmVyO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgZ2V0UGFnZSA9ICh1cmwsIG9uQ29tcGxldGUsIG93bmVyKSA9PiB7XG5cdFx0bG9nKCdnZXRQYWdlJyk7XG5cdFx0Y29uc3QgY2FsbGJhY2sgPSAoZCkgPT4ge1xuXHRcdFx0aWYgKCFkLmFib3J0ZWQpIHtcblx0XHRcdFx0YWRkUGFnZVRvQ2FjaGUoZCk7XG5cdFx0XHRcdG9uQ29tcGxldGUoZCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRyZXR1cm4gc3RhcnREb3dubG9hZCh1cmwsIG93bmVyLmlkTnVtYmVyLCBjYWxsYmFjayk7XG5cdH07XG5cdGNvbnN0IGZpbmRJblBhZ2VDYWNoZSA9ICh1cmwpID0+IHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBnLmNhY2hlLnBhZ2VzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAodXJsID09PSBwZy5jYWNoZS5wYWdlc1tpXS51cmwpIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fTtcblx0Y29uc3QgYWRkUGFnZVRvQ2FjaGUgPSAoZG93bmxvYWQpID0+IHtcblx0XHRsb2coYGFkZFBhZ2VUb0NhY2hlICR7ZG93bmxvYWQudXJsfWApO1xuXHRcdGNvbnN0IHBhZ2UgPSB7XG5cdFx0XHR1cmw6IGRvd25sb2FkLnVybCxcblx0XHRcdGRhdGE6IGRvd25sb2FkLmRhdGEsXG5cdFx0XHRsYXN0TW9kaWZpZWQ6IGRvd25sb2FkLmxhc3RNb2RpZmllZCxcblx0XHR9O1xuXHRcdHJldHVybiBwZy5jYWNoZS5wYWdlcy5wdXNoKHBhZ2UpO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBnZXRwYWdlLmpzXG5cdC8vIFNUQVJURklMRTogdG9vbHMuanNcblx0Ly8gSUUgbWFkbmVzcyB3aXRoIGVuY29kaW5nXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PVxuXHQvL1xuXHQvLyBzdXBwb3NlIHRocm91Z2hvdXQgdGhhdCB0aGUgcGFnZSBpcyBpbiB1dGY4LCBsaWtlIHdpa2lwZWRpYVxuXHQvL1xuXHQvLyBpZiBhIGlzIGFuIGFuY2hvciBET00gZWxlbWVudCBhbmQgYS5ocmVmIHNob3VsZCBjb25zaXN0IG9mXG5cdC8vXG5cdC8vIGh0dHA6Ly9ob3N0Lm5hbWUuaGVyZS93aWtpL2Zvbz9iYXI9YmF6XG5cdC8vXG5cdC8vIHRoZW4gSUUgZ2l2ZXMgZm9vIGFzIFwibGF0aW4xLWVuY29kZWRcIiB1dGY4OyB3ZSBoYXZlIGZvbyA9IGRlY29kZV91dGY4KGRlY29kZVVSSShmb29faWUpKVxuXHQvLyBidXQgSUUgZ2l2ZXMgYmFyPWJheiBjb3JyZWN0bHkgYXMgcGxhaW4gdXRmOFxuXHQvL1xuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cblx0Ly8gSUUncyB4bWxodHRwIGRvZXNuJ3QgdW5kZXJzdGFuZCB1dGY4IHVybHMuIEhhdmUgdG8gdXNlIGVuY29kZVVSSSBoZXJlLlxuXHQvL1xuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cblx0Ly8gc3VtbWF0IGVsc2Vcblx0Ly8gU291cmNlOiBodHRwOi8vYWt0dWVsbC5kZS5zZWxmaHRtbC5vcmcvYXJ0aWtlbC9qYXZhc2NyaXB0L3V0ZjhiNjQvdXRmOC5odG1cblx0Y29uc3QgZ2V0SnNPYmogPSAoanNvbikgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBqc29uX3JldCA9IEpTT04ucGFyc2UoanNvbik7XG5cdFx0XHRpZiAoanNvbl9yZXQud2FybmluZ3MpIHtcblx0XHRcdFx0Zm9yIChsZXQgdyA9IDA7IHcgPCBqc29uX3JldC53YXJuaW5ncy5sZW5ndGg7IHcrKykge1xuXHRcdFx0XHRcdGlmIChqc29uX3JldC53YXJuaW5nc1t3XVsnKiddKSB7XG5cdFx0XHRcdFx0XHRsb2coanNvbl9yZXQud2FybmluZ3Nbd11bJyonXSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGxvZyhqc29uX3JldC53YXJuaW5nc1t3XS53YXJuaW5ncyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGpzb25fcmV0LmVycm9yKSB7XG5cdFx0XHRcdGVycmxvZyhgJHtqc29uX3JldC5lcnJvci5jb2RlfTogJHtqc29uX3JldC5lcnJvci5pbmZvfWApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGpzb25fcmV0O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0ZXJybG9nKGBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGdldEpzT2JqLCBqc29uPSR7anNvbn1gKTtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgYW55Q2hpbGQgPSAob2JqKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBwIGluIG9iaikge1xuXHRcdFx0aWYgKCFPYmplY3QuaGFzT3duKG9iaiwgcCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb2JqW3BdO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblx0Y29uc3QgdXBjYXNlRmlyc3QgPSAoc3RyKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBzdHIgIT09IHR5cGVvZiAnJyB8fCBzdHIgPT09ICcnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG5cdH07XG5cdGNvbnN0IGZpbmRJbkFycmF5ID0gKGFyciwgZm9vKSA9PiB7XG5cdFx0aWYgKCFhcnIgfHwgYXJyLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblx0XHRjb25zdCBsZW4gPSBhcnIubGVuZ3RoO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdGlmIChhcnJbaV0gPT09IGZvbykge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9O1xuXHRjb25zdCBuZXh0T25lID0gKGFycmF5LCB2YWx1ZSkgPT4ge1xuXHRcdC8vIE5CIGlmIHRoZSBhcnJheSBoYXMgdHdvIGNvbnNlY3V0aXZlIGVudHJpZXMgZXF1YWxcblx0XHQvL1x0dGhlbiB0aGlzIHdpbGwgbG9vcCBvbiBzdWNjZXNzaXZlIGNhbGxzXG5cdFx0Y29uc3QgaSA9IGZpbmRJbkFycmF5KGFycmF5LCB2YWx1ZSk7XG5cdFx0aWYgKGkgPCAwKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0cmV0dXJuIGFycmF5W2kgKyAxXTtcblx0fTtcblx0Y29uc3QgbGl0ZXJhbGl6ZVJlZ2V4ID0gKHN0cikgPT4ge1xuXHRcdHJldHVybiBtdy51dGlsLmVzY2FwZVJlZ0V4cChzdHIpO1xuXHR9O1xuXHRTdHJpbmcucHJvdG90eXBlLmVudGlmeSA9IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBsZXQgc2h5ID0gJyZzaHk7Jztcblx0XHRyZXR1cm4gdGhpcy5zcGxpdCgnJicpXG5cdFx0XHQuam9pbignJmFtcDsnKVxuXHRcdFx0LnNwbGl0KCc8Jylcblx0XHRcdC5qb2luKCcmbHQ7Jylcblx0XHRcdC5zcGxpdCgnPicpXG5cdFx0XHQuam9pbignJmd0OycgLyogK3NoeSAqLylcblx0XHRcdC5zcGxpdCgnXCInKVxuXHRcdFx0LmpvaW4oJyZxdW90OycpO1xuXHR9O1xuXHQvLyBBcnJheSBmaWx0ZXIgZnVuY3Rpb25cblx0Y29uc3QgcmVtb3ZlTnVsbHMgPSAodmFsKSA9PiB7XG5cdFx0cmV0dXJuIHZhbCAhPT0gbnVsbDtcblx0fTtcblx0Y29uc3Qgam9pblBhdGggPSAobGlzdCkgPT4ge1xuXHRcdHJldHVybiBsaXN0LmZpbHRlcihyZW1vdmVOdWxscykuam9pbignLycpO1xuXHR9O1xuXHRjb25zdCBzaW1wbGVQcmludGYgPSAoc3RyLCBzdWJzKSA9PiB7XG5cdFx0aWYgKCFzdHIgfHwgIXN1YnMpIHtcblx0XHRcdHJldHVybiBzdHI7XG5cdFx0fVxuXHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdGNvbnN0IHMgPSBzdHIuc3BsaXQoLyglc3xcXCRcXGQrKS8pO1xuXHRcdGxldCBpID0gMDtcblx0XHRkbyB7XG5cdFx0XHRyZXQucHVzaChzLnNoaWZ0KCkpO1xuXHRcdFx0aWYgKHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY21kID0gcy5zaGlmdCgpO1xuXHRcdFx0aWYgKGNtZCA9PT0gJyVzJykge1xuXHRcdFx0XHRpZiAoaSA8IHN1YnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goc3Vic1tpXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goY21kKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQrK2k7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBqID0gTnVtYmVyLnBhcnNlSW50KGNtZC5yZXBsYWNlKCckJywgJycpLCAxMCkgLSAxO1xuXHRcdFx0XHRpZiAoaiA+IC0xICYmIGogPCBzdWJzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldC5wdXNoKHN1YnNbal0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldC5wdXNoKGNtZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IHdoaWxlIChzLmxlbmd0aCA+IDApO1xuXHRcdHJldHVybiByZXQuam9pbignJyk7XG5cdH07XG5cdGNvbnN0IGlzU3RyaW5nID0gKHgpID0+IHtcblx0XHRyZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnIHx8IHggaW5zdGFuY2VvZiBTdHJpbmc7XG5cdH07XG5cdGNvbnN0IGlzTnVtYmVyID0gKHgpID0+IHtcblx0XHRyZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInIHx8IHggaW5zdGFuY2VvZiBOdW1iZXI7XG5cdH07XG5cdGNvbnN0IGlzUmVnRXhwID0gKHgpID0+IHtcblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mIFJlZ0V4cDtcblx0fTtcblx0Y29uc3QgaXNBcnJheSA9ICh4KSA9PiB7XG5cdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkoeCk7XG5cdH07XG5cdGNvbnN0IGlzT2JqZWN0ID0gKHgpID0+IHtcblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mIE9iamVjdDtcblx0fTtcblx0Y29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB7XG5cdFx0cmV0dXJuICFpc1JlZ0V4cCh4KSAmJiAodHlwZW9mIHggPT09ICdmdW5jdGlvbicgfHwgeCBpbnN0YW5jZW9mIEZ1bmN0aW9uKTtcblx0fTtcblx0Y29uc3QgcmVwZWF0U3RyaW5nID0gKHMsIG11bHQpID0+IHtcblx0XHRsZXQgcmV0ID0gJyc7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtdWx0OyArK2kpIHtcblx0XHRcdHJldCArPSBzO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCB6ZXJvRmlsbCA9IChzLCBtaW4pID0+IHtcblx0XHRtaW4gfHw9IDI7XG5cdFx0Y29uc3QgdCA9IHMudG9TdHJpbmcoKTtcblx0XHRyZXR1cm4gcmVwZWF0U3RyaW5nKCcwJywgbWluIC0gdC5sZW5ndGgpICsgdDtcblx0fTtcblx0Y29uc3QgbWFwID0gKGYsIG8pID0+IHtcblx0XHRpZiAoaXNBcnJheShvKSkge1xuXHRcdFx0cmV0dXJuIG1hcF9hcnJheShmLCBvKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1hcF9vYmplY3QoZiwgbyk7XG5cdH07XG5cdGNvbnN0IG1hcF9hcnJheSA9IChmLCBvKSA9PiB7XG5cdFx0Y29uc3QgcmV0ID0gW107XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIG8pIHtcblx0XHRcdHJldC5wdXNoKGYoZWxlbWVudCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBtYXBfb2JqZWN0ID0gKGYsIG8pID0+IHtcblx0XHRjb25zdCByZXQgPSB7fTtcblx0XHRmb3IgKGNvbnN0IGkgaW4gbykge1xuXHRcdFx0aWYgKCFPYmplY3QuaGFzT3duKG8sIGkpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0W29dID0gZihvW2ldKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0cGcuZXNjYXBlUXVvdGVzSFRNTCA9ICh0ZXh0KSA9PiB7XG5cdFx0cmV0dXJuIHRleHQucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcblx0fTtcblx0cGcudW5lc2NhcGVRdW90ZXNIVE1MID0gKGh0bWwpID0+IHtcblx0XHQvLyBGcm9tIHtAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNzM5NDc4N31cblx0XHQvLyBUaGlzIHNlZW1zIHRvIGJlIGltcGxlbWVudGVkIGNvcnJlY3RseSBvbiBhbGwgbWFqb3IgYnJvd3NlcnMgbm93LCBzbyB3ZVxuXHRcdC8vIGRvbid0IGhhdmUgdG8gbWFrZSBvdXIgb3duIGZ1bmN0aW9uLlxuXHRcdGNvbnN0IHR4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG5cdFx0dHh0LmlubmVySFRNTCA9IGh0bWw7XG5cdFx0cmV0dXJuIHR4dC52YWx1ZTtcblx0fTtcblx0Ly8gRU5ERklMRTogdG9vbHMuanNcblx0Ly8gU1RBUlRGSUxFOiBkYWIuanNcblx0Ly8gRGFiLWZpeGluZyBjb2RlXG5cdC8vXG5cdGNvbnN0IHJldGFyZ2V0RGFiID0gKG5ld1RhcmdldCwgb2xkVGFyZ2V0LCBmcmllbmRseUN1cnJlbnRBcnRpY2xlTmFtZSwgdGl0bGVUb0VkaXQpID0+IHtcblx0XHRsb2coYHJldGFyZ2V0RGFiOiBuZXdUYXJnZXQ9JHtuZXdUYXJnZXR9IG9sZFRhcmdldD0ke29sZFRhcmdldH1gKTtcblx0XHRyZXR1cm4gY2hhbmdlTGlua1RhcmdldExpbmsoe1xuXHRcdFx0bmV3VGFyZ2V0LFxuXHRcdFx0dGV4dDogbmV3VGFyZ2V0LnNwbGl0KCcgJykuam9pbignJm5ic3A7JyksXG5cdFx0XHRoaW50OiB0cHJpbnRmKCdkaXNhbWJpZ0hpbnQnLCBbbmV3VGFyZ2V0XSksXG5cdFx0XHRzdW1tYXJ5OiBzaW1wbGVQcmludGYoZ2V0VmFsdWVPZigncG9wdXBGaXhEYWJzU3VtbWFyeScpLCBbZnJpZW5kbHlDdXJyZW50QXJ0aWNsZU5hbWUsIG5ld1RhcmdldF0pLFxuXHRcdFx0Y2xpY2tCdXR0b246IGdldFZhbHVlT2YoJ3BvcHVwRGFic0F1dG9DbGljaycpLFxuXHRcdFx0bWlub3I6IHRydWUsXG5cdFx0XHRvbGRUYXJnZXQsXG5cdFx0XHR3YXRjaDogZ2V0VmFsdWVPZigncG9wdXBXYXRjaERpc2FtYmlnZ2VkUGFnZXMnKSxcblx0XHRcdHRpdGxlOiB0aXRsZVRvRWRpdCxcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgbGlzdExpbmtzID0gKHdpa2l0ZXh0LCBvbGRUYXJnZXQsIHRpdGxlVG9FZGl0KSA9PiB7XG5cdFx0Ly8gbWVkaWF3aWtpIHN0cmlwcyB0cmFpbGluZyBzcGFjZXMsIHNvIHdlIGRvIHRoZSBzYW1lXG5cdFx0Ly8gdGVzdGNhc2U6IHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvdy9pbmRleC5waHA/dGl0bGU9UmFkaWFsJm9sZGlkPTk3MzY1NjMzfVxuXHRcdGNvbnN0IHJlZyA9IC9cXFtcXFsoW158XSo/KSAqKFxcfHxdXSkvZ2k7XG5cdFx0bGV0IHJldCA9IFtdO1xuXHRcdGNvbnN0IHNwbGl0dGVkID0gd2lraXRleHQuc3BsaXQocmVnKTtcblx0XHQvLyBeW2Etel0rIHNob3VsZCBtYXRjaCBpbnRlcndpa2kgbGlua3MsIGhvcGVmdWxseSAoY2FzZS1pbnNlbnNpdGl2ZSlcblx0XHQvLyBhbmQgXlthLXpdKiBzaG91bGQgbWF0Y2ggdGhvc2UgYW5kIFtbOkNhdGVnb3J5Li4uXV0gc3R5bGUgbGlua3MgdG9vXG5cdFx0Y29uc3Qgb21pdFJlZ2V4ID0gL15bYS16XSo6fF5bU3NdcGVjaWFsOnxeW0lpXW1hZ2V8XltDY11hdGVnb3J5Lztcblx0XHRjb25zdCBmcmllbmRseUN1cnJlbnRBcnRpY2xlTmFtZSA9IG9sZFRhcmdldC50b1N0cmluZygpO1xuXHRcdGNvbnN0IHdpa1BvcyA9IGdldFZhbHVlT2YoJ3BvcHVwRGFiV2lrdGlvbmFyeScpO1xuXHRcdGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXR0ZWQubGVuZ3RoOyBpICs9IDMpIHtcblx0XHRcdGlmICh0eXBlb2Ygc3BsaXR0ZWRbaV0gPT09IHR5cGVvZiAnc3RyaW5nJyAmJiBzcGxpdHRlZFtpXS5sZW5ndGggPiAwICYmICFvbWl0UmVnZXgudGVzdChzcGxpdHRlZFtpXSkpIHtcblx0XHRcdFx0cmV0LnB1c2gocmV0YXJnZXREYWIoc3BsaXR0ZWRbaV0sIG9sZFRhcmdldCwgZnJpZW5kbHlDdXJyZW50QXJ0aWNsZU5hbWUsIHRpdGxlVG9FZGl0KSk7XG5cdFx0XHR9IC8qIGlmICovXG5cdFx0fSAvKiBmb3IgbG9vcCAqL1xuXHRcdHJldCA9IHJtRHVwZXNGcm9tU29ydGVkTGlzdChyZXQuc29ydCgpKTtcblx0XHRpZiAod2lrUG9zKSB7XG5cdFx0XHRjb25zdCB3aWtUYXJnZXQgPSBgd2lrdGlvbmFyeToke2ZyaWVuZGx5Q3VycmVudEFydGljbGVOYW1lLnJlcGxhY2UoL14oLispXFxzK1xcKFteKV0rXFwpXFxzKiQvLCAnJDEnKX1gO1xuXHRcdFx0Y29uc3QgbWV0aCA9IHdpa1Bvcy50b0xvd2VyQ2FzZSgpID09PSAnZmlyc3QnID8gJ3Vuc2hpZnQnIDogJ3B1c2gnO1xuXHRcdFx0cmV0W21ldGhdKHJldGFyZ2V0RGFiKHdpa1RhcmdldCwgb2xkVGFyZ2V0LCBmcmllbmRseUN1cnJlbnRBcnRpY2xlTmFtZSwgdGl0bGVUb0VkaXQpKTtcblx0XHR9XG5cdFx0cmV0LnB1c2goXG5cdFx0XHRjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRcdG5ld1RhcmdldDogbnVsbCxcblx0XHRcdFx0dGV4dDogcG9wdXBTdHJpbmcoJ3JlbW92ZSB0aGlzIGxpbmsnKS5zcGxpdCgnICcpLmpvaW4oJyZuYnNwOycpLFxuXHRcdFx0XHRoaW50OiBwb3B1cFN0cmluZygncmVtb3ZlIGFsbCBsaW5rcyB0byB0aGlzIGRpc2FtYmlnIHBhZ2UgZnJvbSB0aGlzIGFydGljbGUnKSxcblx0XHRcdFx0Y2xpY2tCdXR0b246IGdldFZhbHVlT2YoJ3BvcHVwRGFic0F1dG9DbGljaycpLFxuXHRcdFx0XHRvbGRUYXJnZXQsXG5cdFx0XHRcdHN1bW1hcnk6IHNpbXBsZVByaW50ZihnZXRWYWx1ZU9mKCdwb3B1cFJtRGFiTGlua1N1bW1hcnknKSwgW2ZyaWVuZGx5Q3VycmVudEFydGljbGVOYW1lXSksXG5cdFx0XHRcdHdhdGNoOiBnZXRWYWx1ZU9mKCdwb3B1cFdhdGNoRGlzYW1iaWdnZWRQYWdlcycpLFxuXHRcdFx0XHR0aXRsZTogdGl0bGVUb0VkaXQsXG5cdFx0XHR9KVxuXHRcdCk7XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3Qgcm1EdXBlc0Zyb21Tb3J0ZWRMaXN0ID0gKGxpc3QpID0+IHtcblx0XHRjb25zdCByZXQgPSBbXTtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgbGlzdCkge1xuXHRcdFx0aWYgKHJldC5sZW5ndGggPT09IDAgfHwgZWxlbWVudCAhPT0gcmV0LmF0KC0xKSkge1xuXHRcdFx0XHRyZXQucHVzaChlbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgbWFrZUZpeERhYiA9IChkYXRhLCBuYXZwb3ApID0+IHtcblx0XHQvLyBncmFiIHRpdGxlIGZyb20gcGFyZW50IHBvcHVwIGlmIHRoZXJlIGlzIG9uZTsgZGVmYXVsdCBleGlzdHMgaW4gY2hhbmdlTGlua1RhcmdldExpbmtcblx0XHRjb25zdCB0aXRsZVRvRWRpdCA9IG5hdnBvcC5wYXJlbnRQb3B1cCAmJiBuYXZwb3AucGFyZW50UG9wdXAuYXJ0aWNsZS50b1N0cmluZygpO1xuXHRcdGNvbnN0IGxpc3QgPSBsaXN0TGlua3MoZGF0YSwgbmF2cG9wLm9yaWdpbmFsQXJ0aWNsZSwgdGl0bGVUb0VkaXQpO1xuXHRcdGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0bG9nKCdsaXN0TGlua3MgcmV0dXJuZWQgZW1wdHkgbGlzdCcpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGxldCBodG1sID0gYDxocj4ke3BvcHVwU3RyaW5nKCdDbGljayB0byBkaXNhbWJpZ3VhdGUgdGhpcyBsaW5rIHRvOicpfTxicj5gO1xuXHRcdGh0bWwgKz0gbGlzdC5qb2luKCcsICcpO1xuXHRcdHJldHVybiBodG1sO1xuXHR9O1xuXHRjb25zdCBtYWtlRml4RGFicyA9ICh3aWtpVGV4dCwgbmF2cG9wKSA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0Z2V0VmFsdWVPZigncG9wdXBGaXhEYWJzJykgJiZcblx0XHRcdGlzRGlzYW1iaWcod2lraVRleHQsIG5hdnBvcC5hcnRpY2xlKSAmJlxuXHRcdFx0VGl0bGUuZnJvbVVSTChsb2NhdGlvbi5ocmVmKS5uYW1lc3BhY2VJZCgpICE9PSBwZy5uc1NwZWNpYWxJZCAmJlxuXHRcdFx0bmF2cG9wLmFydGljbGUudGFsa1BhZ2UoKVxuXHRcdCkge1xuXHRcdFx0c2V0UG9wdXBIVE1MKG1ha2VGaXhEYWIod2lraVRleHQsIG5hdnBvcCksICdwb3B1cEZpeERhYicsIG5hdnBvcC5pZE51bWJlcik7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBwb3B1cFJlZGxpbmtIVE1MID0gKGFydGljbGUpID0+IHtcblx0XHRyZXR1cm4gY2hhbmdlTGlua1RhcmdldExpbmsoe1xuXHRcdFx0bmV3VGFyZ2V0OiBudWxsLFxuXHRcdFx0dGV4dDogcG9wdXBTdHJpbmcoJ3JlbW92ZSB0aGlzIGxpbmsnKS5zcGxpdCgnICcpLmpvaW4oJyZuYnNwOycpLFxuXHRcdFx0aGludDogcG9wdXBTdHJpbmcoJ3JlbW92ZSBhbGwgbGlua3MgdG8gdGhpcyBwYWdlIGZyb20gdGhpcyBhcnRpY2xlJyksXG5cdFx0XHRjbGlja0J1dHRvbjogZ2V0VmFsdWVPZigncG9wdXBSZWRsaW5rQXV0b0NsaWNrJyksXG5cdFx0XHRvbGRUYXJnZXQ6IGFydGljbGUudG9TdHJpbmcoKSxcblx0XHRcdHN1bW1hcnk6IHNpbXBsZVByaW50ZihnZXRWYWx1ZU9mKCdwb3B1cFJlZGxpbmtTdW1tYXJ5JyksIFthcnRpY2xlLnRvU3RyaW5nKCldKSxcblx0XHR9KTtcblx0fTtcblx0Ly8gRU5ERklMRTogZGFiLmpzXG5cdC8vIFNUQVJURklMRTogaHRtbG91dHB1dC5qc1xuXHQvLyB0aGlzIGhhcyB0byB1c2UgYSB0aW1lciBsb29wIGFzIHdlIGRvbid0IGtub3cgaWYgdGhlIERPTSBlbGVtZW50IGV4aXN0cyB3aGVuIHdlIHdhbnQgdG8gc2V0IHRoZSB0ZXh0XG5cdGNvbnN0IHNldFBvcHVwSFRNTCA9IGZ1bmN0aW9uIHNldFBvcHVwSFRNTChzdHIsIGVsZW1lbnRJZCwgcG9wdXBJZCwgb25TdWNjZXNzLCBhcHBlbmQpIHtcblx0XHRpZiAocG9wdXBJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBjb25zb2xlLmVycm9yKCdbUG9wdXBzXSBwb3B1cElkIGlzIG5vdCBkZWZpbmVkIGluIHNldFBvcHVwSFRNTCwgaHRtbD0nK3N0ci5zdWJzdHJpbmcoMCwxMDApKTtcblx0XHRcdHBvcHVwSWQgPSBwZy5pZE51bWJlcjtcblx0XHR9XG5cdFx0Y29uc3QgcG9wdXBFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudElkfSR7cG9wdXBJZH1gKTtcblx0XHRpZiAocG9wdXBFbGVtZW50KSB7XG5cdFx0XHRpZiAoIWFwcGVuZCkge1xuXHRcdFx0XHRwb3B1cEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNTdHJpbmcoc3RyKSkge1xuXHRcdFx0XHRwb3B1cEVsZW1lbnQuaW5uZXJIVE1MICs9IHN0cjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBvcHVwRWxlbWVudC5hcHBlbmQoc3RyKTtcblx0XHRcdH1cblx0XHRcdGlmIChvblN1Y2Nlc3MpIHtcblx0XHRcdFx0b25TdWNjZXNzKCk7XG5cdFx0XHR9XG5cdFx0XHRzZXRUaW1lb3V0KGNoZWNrUG9wdXBQb3NpdGlvbiwgMTAwKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHQvLyBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4gaW4gYSBsaXR0bGUgd2hpbGUuLi5cblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHNldFBvcHVwSFRNTChzdHIsIGVsZW1lbnRJZCwgcG9wdXBJZCwgb25TdWNjZXNzKTtcblx0XHR9LCA2MDApO1xuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXHRjb25zdCBzZXRQb3B1cFRyYWlsZXIgPSAoc3RyLCBpZCkgPT4ge1xuXHRcdHJldHVybiBzZXRQb3B1cEhUTUwoc3RyLCAncG9wdXBEYXRhJywgaWQpO1xuXHR9O1xuXHQvLyBhcmdzLm5hdnBvcHVwIGlzIG1hbmRhdG9yeVxuXHQvLyBvcHRpb25hbDogYXJncy5yZWRpciwgYXJncy5yZWRpclRhcmdldFxuXHQvLyBGSVhNRTogeWUgZ29kcywgdGhpcyBpcyB1Z2x5IHN0dWZmXG5cdGNvbnN0IGZpbGxFbXB0eVNwYW5zID0gKGFyZ3MpID0+IHtcblx0XHQvLyBpZiByZWRpciBpcyBwcmVzZW50IGFuZCB0cnVlIHRoZW4gcmVkaXJUYXJnZXQgaXMgbWFuZGF0b3J5XG5cdFx0bGV0IHJlZGlyID0gdHJ1ZTtcblx0XHRsZXQgcmNpZDtcblx0XHRpZiAodHlwZW9mIGFyZ3MgIT09ICdvYmplY3QnIHx8IGFyZ3MucmVkaXIgPT09IHVuZGVmaW5lZCB8fCAhYXJncy5yZWRpcikge1xuXHRcdFx0cmVkaXIgPSBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgYSA9IGFyZ3MubmF2cG9wdXAucGFyZW50QW5jaG9yO1xuXHRcdGxldCBhcnRpY2xlO1xuXHRcdGxldCBoaW50O1xuXHRcdGxldCBvbGRpZDtcblx0XHRsZXQgcGFyYW1zID0ge307XG5cdFx0aWYgKHJlZGlyICYmIHR5cGVvZiBhcmdzLnJlZGlyVGFyZ2V0ID09PSB0eXBlb2Yge30pIHtcblx0XHRcdGFydGljbGUgPSBhcmdzLnJlZGlyVGFyZ2V0O1xuXHRcdFx0Ly8gaGludD1hcnRpY2xlLmhpbnRWYWx1ZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhcnRpY2xlID0gbmV3IFRpdGxlKCkuZnJvbUFuY2hvcihhKTtcblx0XHRcdGhpbnQgPSBhLm9yaWdpbmFsVGl0bGUgfHwgYXJ0aWNsZS5oaW50VmFsdWUoKTtcblx0XHRcdHBhcmFtcyA9IHBhcnNlUGFyYW1zKGEuaHJlZik7XG5cdFx0XHRvbGRpZCA9IGdldFZhbHVlT2YoJ3BvcHVwSGlzdG9yaWNhbExpbmtzJykgPyBwYXJhbXMub2xkaWQgOiBudWxsO1xuXHRcdFx0KHtyY2lkfSA9IHBhcmFtcyk7XG5cdFx0fVxuXHRcdGNvbnN0IHggPSB7XG5cdFx0XHRhcnRpY2xlLFxuXHRcdFx0aGludCxcblx0XHRcdG9sZGlkLFxuXHRcdFx0cmNpZCxcblx0XHRcdG5hdnBvcDogYXJncy5uYXZwb3B1cCxcblx0XHRcdHBhcmFtcyxcblx0XHR9O1xuXHRcdGNvbnN0IHN0cnVjdHVyZSA9IHBnLnN0cnVjdHVyZXNbZ2V0VmFsdWVPZigncG9wdXBTdHJ1Y3R1cmUnKV07XG5cdFx0aWYgKHR5cGVvZiBzdHJ1Y3R1cmUgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRzZXRQb3B1cEhUTUwoXG5cdFx0XHRcdCdwb3B1cEVycm9yJyxcblx0XHRcdFx0YFVua25vd24gc3RydWN0dXJlICh0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4pOiAke3BnLm9wdGlvbi5wb3B1cFN0cnVjdHVyZX1gLFxuXHRcdFx0XHRhcmdzLm5hdnBvcHVwLmlkTnVtYmVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBzcGFucyA9IGZsYXR0ZW4ocGcubWlzYy5sYXlvdXQpO1xuXHRcdGNvbnN0IG51bXNwYW5zID0gc3BhbnMubGVuZ3RoO1xuXHRcdGNvbnN0IHJlZGlycyA9IHBnLm1pc2MucmVkaXJTcGFucztcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG51bXNwYW5zOyArK2kpIHtcblx0XHRcdGNvbnN0IGZvdW5kID0gcmVkaXJzICYmIHJlZGlycy5pbmNsdWRlcyhzcGFuc1tpXSk7XG5cdFx0XHQvLyBsb2coJ3JlZGlyPScgKyByZWRpciArICcsIGZvdW5kPScgKyBmb3VuZCArICcsIHNwYW5zW2ldPScgKyBzcGFuc1tpXSk7XG5cdFx0XHRpZiAoKGZvdW5kICYmICFyZWRpcikgfHwgKCFmb3VuZCAmJiByZWRpcikpIHtcblx0XHRcdFx0Ly8gbG9nKCdza2lwcGluZyB0aGlzIHNldCBvZiB0aGUgbG9vcCcpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHN0cnVjdHVyZWZuID0gc3RydWN0dXJlW3NwYW5zW2ldXTtcblx0XHRcdGlmIChzdHJ1Y3R1cmVmbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIG5vdGhpbmcgdG8gZG8gZm9yIHRoaXMgc3RydWN0dXJlIHBhcnRcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRsZXQgc2V0Zm4gPSBzZXRQb3B1cEhUTUw7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGdldFZhbHVlT2YoJ3BvcHVwQWN0aXZlTmF2bGlua3MnKSAmJlxuXHRcdFx0XHQoc3BhbnNbaV0uaW5kZXhPZigncG9wdXBUb3BMaW5rcycpID09PSAwIHx8IHNwYW5zW2ldLmluZGV4T2YoJ3BvcHVwUmVkaXJUb3BMaW5rcycpID09PSAwKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNldGZuID0gc2V0UG9wdXBUaXBzQW5kSFRNTDtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAodHlwZW9mIHN0cnVjdHVyZWZuKSB7XG5cdFx0XHRcdGNhc2UgJ2Z1bmN0aW9uJzpcblx0XHRcdFx0XHRsb2coYHJ1bm5pbmcgJHtzcGFuc1tpXX0oe1xuXHRcdFx0XHRcdFx0YXJ0aWNsZToke3guYXJ0aWNsZX0sIGhpbnQ6JHt4LmhpbnR9LCBvbGRpZDogJHt4Lm9sZGlkfX0pYCk7XG5cdFx0XHRcdFx0c2V0Zm4oc3RydWN0dXJlZm4oeCksIHNwYW5zW2ldLCBhcmdzLm5hdnBvcHVwLmlkTnVtYmVyKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnc3RyaW5nJzpcblx0XHRcdFx0XHRzZXRmbihzdHJ1Y3R1cmVmbiwgc3BhbnNbaV0sIGFyZ3MubmF2cG9wdXAuaWROdW1iZXIpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGVycmxvZyhgdW5rbm93biB0aGluZyB3aXRoIGxhYmVsICR7c3BhbnNbaV19IChzcGFuIGluZGV4IHdhcyAke2l9KWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Ly8gZmxhdHRlbiBhbiBhcnJheVxuXHRjb25zdCBmbGF0dGVuID0gZnVuY3Rpb24gZmxhdHRlbihsaXN0LCBzdGFydCkge1xuXHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzdGFydCA9IDA7XG5cdFx0fVxuXHRcdGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmICh0eXBlb2YgbGlzdFtpXSA9PT0gdHlwZW9mIFtdKSB7XG5cdFx0XHRcdHJldHVybiBbLi4ucmV0LCAuLi5mbGF0dGVuKGxpc3RbaV0pLCAuLi5mbGF0dGVuKGxpc3QsIGkgKyAxKV07XG5cdFx0XHR9XG5cdFx0XHRyZXQucHVzaChsaXN0W2ldKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Ly8gR2VuZXJhdGUgaHRtbCBmb3Igd2hvbGUgcG9wdXBcblx0Y29uc3QgcG9wdXBIVE1MID0gZnVuY3Rpb24gcG9wdXBIVE1MKGEpIHtcblx0XHRnZXRWYWx1ZU9mKCdwb3B1cFN0cnVjdHVyZScpO1xuXHRcdGNvbnN0IHN0cnVjdHVyZSA9IHBnLnN0cnVjdHVyZXNbcGcub3B0aW9uLnBvcHVwU3RydWN0dXJlXTtcblx0XHRpZiAodHlwZW9mIHN0cnVjdHVyZSAhPT0gJ29iamVjdCcpIHtcblx0XHRcdC8vIHJldHVybiAnVW5rbm93biBzdHJ1Y3R1cmU6ICcrcGcub3B0aW9uLnBvcHVwU3RydWN0dXJlO1xuXHRcdFx0Ly8gb3ZlcnJpZGUgdXNlciBjaG9pY2Vcblx0XHRcdHBnLm9wdGlvbi5wb3B1cFN0cnVjdHVyZSA9IHBnLm9wdGlvbkRlZmF1bHQucG9wdXBTdHJ1Y3R1cmU7XG5cdFx0XHRyZXR1cm4gcG9wdXBIVE1MKGEpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHN0cnVjdHVyZS5wb3B1cExheW91dCAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cmV0dXJuICdCYWQgbGF5b3V0Jztcblx0XHR9XG5cdFx0cGcubWlzYy5sYXlvdXQgPSBzdHJ1Y3R1cmUucG9wdXBMYXlvdXQoKTtcblx0XHRwZy5taXNjLnJlZGlyU3BhbnMgPSB0eXBlb2Ygc3RydWN0dXJlLnBvcHVwUmVkaXJTcGFucyA9PT0gJ2Z1bmN0aW9uJyA/IHN0cnVjdHVyZS5wb3B1cFJlZGlyU3BhbnMoKSA6IFtdO1xuXHRcdHJldHVybiBtYWtlRW1wdHlTcGFucyhwZy5taXNjLmxheW91dCwgYS5uYXZwb3B1cCk7XG5cdH07XG5cdGNvbnN0IG1ha2VFbXB0eVNwYW5zID0gZnVuY3Rpb24gbWFrZUVtcHR5U3BhbnMobGlzdCwgbmF2cG9wKSB7XG5cdFx0bGV0IHJldCA9ICcnO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBsaXN0KSB7XG5cdFx0XHRpZiAodHlwZW9mIGVsZW1lbnQgPT09IHR5cGVvZiAnJykge1xuXHRcdFx0XHRyZXQgKz0gZW1wdHlTcGFuSFRNTChlbGVtZW50LCBuYXZwb3AuaWROdW1iZXIsICdkaXYnKTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09IHR5cGVvZiBbXSAmJiBlbGVtZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0ID0gcmV0LnNwbGl0KC8oPFxcL1tePl0qPz4kKS8pLmpvaW4obWFrZUVtcHR5U3BhbnMoZWxlbWVudCwgbmF2cG9wKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSB0eXBlb2Yge30gJiYgZWxlbWVudC5ub2RlVHlwZSkge1xuXHRcdFx0XHRyZXQgKz0gZW1wdHlTcGFuSFRNTChlbGVtZW50Lm5hbWUsIG5hdnBvcC5pZE51bWJlciwgZWxlbWVudC5ub2RlVHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IGVtcHR5U3BhbkhUTUwgPSBmdW5jdGlvbiBlbXB0eVNwYW5IVE1MKG5hbWUsIGlkLCB0YWcsIGNsYXNzbmFtZSkge1xuXHRcdHRhZyB8fD0gJ3NwYW4nO1xuXHRcdGlmICghY2xhc3NuYW1lKSB7XG5cdFx0XHRjbGFzc25hbWUgPSBlbXB0eVNwYW5IVE1MLmNsYXNzQWxpYXNlc1tuYW1lXTtcblx0XHR9XG5cdFx0Y2xhc3NuYW1lIHx8PSBuYW1lO1xuXHRcdGlmIChuYW1lID09PSBnZXRWYWx1ZU9mKCdwb3B1cERyYWdIYW5kbGUnKSkge1xuXHRcdFx0Y2xhc3NuYW1lICs9ICcgcG9wdXBEcmFnSGFuZGxlJztcblx0XHR9XG5cdFx0cmV0dXJuIHNpbXBsZVByaW50ZignPCVzIGlkPVwiJXNcIiBjbGFzcz1cIiVzXCI+PC8lcz4nLCBbdGFnLCBuYW1lICsgaWQsIGNsYXNzbmFtZSwgdGFnXSk7XG5cdH07XG5cdGVtcHR5U3BhbkhUTUwuY2xhc3NBbGlhc2VzID0ge1xuXHRcdHBvcHVwU2Vjb25kUHJldmlldzogJ3BvcHVwUHJldmlldycsXG5cdH07XG5cdC8vIGdlbmVyYXRlIGh0bWwgZm9yIHBvcHVwIGltYWdlXG5cdC8vIDxhIGlkPVwicG9wdXBJbWFnZUxpbmtuXCI+PGltZyBpZD1cInBvcHVwSW1hZ2VuXCI+XG5cdC8vIHdoZXJlIG49aWROdW1iZXJcblx0Y29uc3QgaW1hZ2VIVE1MID0gKF9hcnRpY2xlLCBpZE51bWJlcikgPT4ge1xuXHRcdHJldHVybiBzaW1wbGVQcmludGYoXG5cdFx0XHQnPGEgaWQ9XCJwb3B1cEltYWdlTGluayQxXCI+JyArXG5cdFx0XHRcdCc8aW1nIGFsaWduPVwicmlnaHRcIiB2YWxpZ249XCJ0b3BcIiBpZD1cInBvcHVwSW1nJDFcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjwvaW1nPicgK1xuXHRcdFx0XHQnPC9hPicsXG5cdFx0XHRbaWROdW1iZXJdXG5cdFx0KTtcblx0fTtcblx0Y29uc3QgcG9wVGlwc1Nvb25GbiA9IChpZCwgd2hlbiwgcG9wRGF0YSkgPT4ge1xuXHRcdGlmICghd2hlbikge1xuXHRcdFx0d2hlbiA9IDI1MDtcblx0XHR9XG5cdFx0Y29uc3QgcG9wVGlwcyA9ICgpID0+IHtcblx0XHRcdHNldHVwVG9vbHRpcHMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7aWR9YCksIGZhbHNlLCB0cnVlLCBwb3BEYXRhKTtcblx0XHR9O1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRzZXRUaW1lb3V0KHBvcFRpcHMsIHdoZW4sIHBvcERhdGEpO1xuXHRcdH07XG5cdH07XG5cdGNvbnN0IHNldFBvcHVwVGlwc0FuZEhUTUwgPSAoaHRtbCwgZGl2bmFtZSwgaWRudW1iZXIsIHBvcERhdGEpID0+IHtcblx0XHRzZXRQb3B1cEhUTUwoXG5cdFx0XHRodG1sLFxuXHRcdFx0ZGl2bmFtZSxcblx0XHRcdGlkbnVtYmVyLFxuXHRcdFx0Z2V0VmFsdWVPZigncG9wdXBTdWJwb3B1cHMnKSA/IHBvcFRpcHNTb29uRm4oZGl2bmFtZSArIGlkbnVtYmVyLCBudWxsLCBwb3BEYXRhKSA6IG51bGxcblx0XHQpO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBodG1sb3V0cHV0LmpzXG5cdC8vIFNUQVJURklMRTogbW91c2VvdXQuanNcblx0Ly8gZnV6enkgY2hlY2tzXG5cdGNvbnN0IGZ1enp5Q3Vyc29yT2ZmTWVudXMgPSAoX3gsIF95LCBfZnV6eiwgcGFyZW50KSA9PiB7XG5cdFx0aWYgKCFwYXJlbnQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCB1bHMgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbCgndWwnKTtcblx0XHRmb3IgKGNvbnN0IHVsIG9mIHVscykge1xuXHRcdFx0aWYgKHVsLmNsYXNzTmFtZSA9PT0gJ3BvcHVwX21lbnUnICYmIHVsLm9mZnNldFdpZHRoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IC8vIGVsc2UgeyBkb2N1bWVudC50aXRsZSs9Jy4nOyB9XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXHRjb25zdCBjaGVja1BvcHVwUG9zaXRpb24gPSAoKSA9PiB7XG5cdFx0Ly8gc3RvcCB0aGUgcG9wdXAgcnVubmluZyBvZmYgdGhlIHJpZ2h0IG9mIHRoZSBzY3JlZW5cblx0XHQvLyBGSVhNRSBhdm9pZCBwZy5jdXJyZW50Lmxpbmtcblx0XHRpZiAocGcuY3VycmVudC5saW5rICYmIHBnLmN1cnJlbnQubGluay5uYXZwb3B1cCkge1xuXHRcdFx0cGcuY3VycmVudC5saW5rLm5hdnBvcHVwLmxpbWl0SG9yaXpvbnRhbFBvc2l0aW9uKCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBtb3VzZU91dFdpa2lMaW5rID0gZnVuY3Rpb24gbW91c2VPdXRXaWtpTGluaygpIHtcblx0XHQvLyBjb25zb2xlICgnbW91c2VPdXRXaWtpTGluaycpO1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdHJlbW92ZU1vZGlmaWVyS2V5TGlzdGVuZXIoc2VsZik7XG5cdFx0aWYgKHNlbGYubmF2cG9wdXAgPT09IG51bGwgfHwgc2VsZi5uYXZwb3B1cCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICghc2VsZi5uYXZwb3B1cC5pc1Zpc2libGUoKSkge1xuXHRcdFx0c2VsZi5uYXZwb3B1cC5iYW5pc2goKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cmVzdG9yZVRpdGxlKHNlbGYpO1xuXHRcdE5hdnBvcHVwLnRyYWNrZXIuYWRkSG9vayhwb3NDaGVja2VySG9vayhzZWxmLm5hdnBvcHVwKSk7XG5cdH07XG5cdGNvbnN0IHBvc0NoZWNrZXJIb29rID0gKG5hdnBvcCkgPT4ge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRpZiAoIW5hdnBvcC5pc1Zpc2libGUoKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLyogcmVtb3ZlIHRoaXMgaG9vayAqL1xuXHRcdFx0fVxuXHRcdFx0aWYgKE5hdnBvcHVwLnRyYWNrZXIuZGlydHkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qge3h9ID0gTmF2cG9wdXAudHJhY2tlcjtcblx0XHRcdGNvbnN0IHt5fSA9IE5hdnBvcHVwLnRyYWNrZXI7XG5cdFx0XHRjb25zdCBtb3VzZU92ZXJOYXZwb3AgPVxuXHRcdFx0XHRuYXZwb3AuaXNXaXRoaW4oeCwgeSwgbmF2cG9wLmZ1enosIG5hdnBvcC5tYWluRGl2KSB8fFxuXHRcdFx0XHQhZnV6enlDdXJzb3JPZmZNZW51cyh4LCB5LCBuYXZwb3AuZnV6eiwgbmF2cG9wLm1haW5EaXYpO1xuXHRcdFx0Ly8gRklYTUUgaXQnZCBiZSBwcmV0dGllciB0byBkbyB0aGlzIGludGVybmFsIHRvIHRoZSBOYXZwb3B1cCBvYmplY3RzXG5cdFx0XHRsZXQgdCA9IGdldFZhbHVlT2YoJ3BvcHVwSGlkZURlbGF5Jyk7XG5cdFx0XHRpZiAodCkge1xuXHRcdFx0XHR0ICo9IDEwMDA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXQpIHtcblx0XHRcdFx0aWYgKCFtb3VzZU92ZXJOYXZwb3ApIHtcblx0XHRcdFx0XHRpZiAobmF2cG9wLnBhcmVudEFuY2hvcikge1xuXHRcdFx0XHRcdFx0cmVzdG9yZVRpdGxlKG5hdnBvcC5wYXJlbnRBbmNob3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuYXZwb3AuYmFuaXNoKCk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7IC8qIHJlbW92ZSB0aGlzIGhvb2sgKi9cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHQvLyB3ZSBoYXZlIGEgaGlkZSBkZWxheSBzZXRcblx0XHRcdGNvbnN0IGQgPSBEYXRlLm5vdygpO1xuXHRcdFx0aWYgKCFuYXZwb3AubW91c2VMZWF2aW5nVGltZSkge1xuXHRcdFx0XHRuYXZwb3AubW91c2VMZWF2aW5nVGltZSA9IGQ7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmIChtb3VzZU92ZXJOYXZwb3ApIHtcblx0XHRcdFx0bmF2cG9wLm1vdXNlTGVhdmluZ1RpbWUgPSBudWxsO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZCAtIG5hdnBvcC5tb3VzZUxlYXZpbmdUaW1lID4gdCkge1xuXHRcdFx0XHRuYXZwb3AubW91c2VMZWF2aW5nVGltZSA9IG51bGw7XG5cdFx0XHRcdG5hdnBvcC5iYW5pc2goKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7IC8qIHJlbW92ZSB0aGlzIGhvb2sgKi9cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXHR9O1xuXHRjb25zdCBydW5TdG9wUG9wdXBUaW1lciA9IChuYXZwb3ApID0+IHtcblx0XHQvLyBhdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgaGF2ZSBsZWZ0IHRoZSBsaW5rIGJ1dCByZW1haW4gd2l0aGluIHRoZSBwb3B1cFxuXHRcdC8vIHNvIHdlIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbiB1bnRpbCB3ZSBsZWF2ZSB0aGUgcG9wdXAuXG5cdFx0aWYgKCFuYXZwb3Auc3RvcFBvcHVwVGltZXIpIHtcblx0XHRcdG5hdnBvcC5zdG9wUG9wdXBUaW1lciA9IHNldEludGVydmFsKHBvc0NoZWNrZXJIb29rKG5hdnBvcCksIDUwMCk7XG5cdFx0XHRuYXZwb3AuYWRkSG9vayhcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwobmF2cG9wLnN0b3BQb3B1cFRpbWVyKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J2hpZGUnLFxuXHRcdFx0XHQnYmVmb3JlJ1xuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdC8vIEVOREZJTEU6IG1vdXNlb3V0LmpzXG5cdC8vIFNUQVJURklMRTogcHJldmlld21ha2VyLmpzXG5cdC8qKlxuXHQgKiBAZmlsZW92ZXJ2aWV3XG5cdCAqIERlZmluZXMgdGhlIHtAc291cmNlIFByZXZpZXdtYWtlcn0gb2JqZWN0LCB3aGljaCBnZW5lcmF0ZXMgc2hvcnQgcHJldmlld3MgZnJvbSB3aWtpIG1hcmt1cC5cblx0ICovXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFByZXZpZXdtYWtlclxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQGNsYXNzIFRoZSBQcmV2aWV3bWFrZXIgY2xhc3MuIFVzZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHRvIGdlbmVyYXRlIHNob3J0IHByZXZpZXdzIGZyb20gV2lraXRleHQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB3aWtpVGV4dCBUaGUgV2lraXRleHQgc291cmNlIG9mIHRoZSBwYWdlIHdlIHdpc2ggdG8gcHJldmlldy5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVcmwgVGhlIHVybCB3ZSBzaG91bGQgcHJlcGVuZCB3aGVuIGNyZWF0aW5nIHJlbGF0aXZlIHVybHMuXG5cdCAqIEBwYXJhbSB7TmF2cG9wdXB9IG93bmVyIFRoZSBuYXZwb3AgYXNzb2NpYXRlZCB0byB0aGlzIHByZXZpZXcgZ2VuZXJhdG9yXG5cdCAqL1xuXHRjbGFzcyBQcmV2aWV3bWFrZXIge1xuXHRcdGNvbnN0cnVjdG9yKHdpa2lUZXh0LCBiYXNlVXJsLCBvd25lcikge1xuXHRcdFx0LyoqIFRoZSB3aWtpdGV4dCB3aGljaCBpcyBtYW5pcHVsYXRlZCB0byBnZW5lcmF0ZSB0aGUgcHJldmlldy4gKi9cblx0XHRcdHRoaXMub3JpZ2luYWxEYXRhID0gd2lraVRleHQ7XG5cdFx0XHR0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuXHRcdFx0dGhpcy5vd25lciA9IG93bmVyO1xuXHRcdFx0dGhpcy5tYXhDaGFyYWN0ZXJzID0gZ2V0VmFsdWVPZigncG9wdXBNYXhQcmV2aWV3Q2hhcmFjdGVycycpO1xuXHRcdFx0dGhpcy5tYXhTZW50ZW5jZXMgPSBnZXRWYWx1ZU9mKCdwb3B1cE1heFByZXZpZXdTZW50ZW5jZXMnKTtcblx0XHRcdHRoaXMuc2V0RGF0YSgpO1xuXHRcdH1cblx0XHRzZXREYXRhKCkge1xuXHRcdFx0Y29uc3QgbWF4U2l6ZSA9IE1hdGgubWF4KDFlNCwgMiAqIHRoaXMubWF4Q2hhcmFjdGVycyk7XG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLm9yaWdpbmFsRGF0YS5zbGljZSgwLCBNYXRoLm1heCgwLCBtYXhTaXplKSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFJlbW92ZSBIVE1MIGNvbW1lbnRzXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxDb21tZW50cygpIHtcblx0XHRcdC8vIHRoaXMgYWxzbyBraWxscyBvbmUgdHJhaWxpbmcgbmV3bGluZSwgZWcgW1tkaWFteW9dXVxuXHRcdFx0dGhpcy5kYXRhID0gdGhpcy5kYXRhLnJlcGxhY2UoL148IS0tW14kXSo/LS0+XFxufFxcbjwhLS1bXiRdKj8tLT4oPz1cXG4pfDwhLS1bXiRdKj8tLT4vZywgJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxEaXZzKCkge1xuXHRcdFx0Ly8gc2F5IGdvb2RieWUsIGRpdnMgKGNhbiBiZSBuZXN0ZWQsIHNvIHVzZSAqIG5vdCAqPylcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC88ICpkaXZbXj5dKiAqPltcXFNcXHNdKj88ICpcXC8gKmRpdiAqPi9naSwgJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxHYWxsZXJpZXMoKSB7XG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvPCAqZ2FsbGVyeVtePl0qICo+W1xcU1xcc10qPzwgKlxcLyAqZ2FsbGVyeSAqPi9naSwgJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3BlbmluZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBjbG9zaW5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN1Ym9wZW5pbmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3ViY2xvc2luZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSByZXBsXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRraWxsKG9wZW5pbmcsIGNsb3NpbmcsIHN1Ym9wZW5pbmcsIHN1YmNsb3NpbmcsIHJlcGwpIHtcblx0XHRcdGxldCBvbGRrID0gdGhpcy5kYXRhO1xuXHRcdFx0bGV0IGsgPSBQcmV2aWV3bWFrZXIua2lsbFN0dWZmKHRoaXMuZGF0YSwgb3BlbmluZywgY2xvc2luZywgc3Vib3BlbmluZywgc3ViY2xvc2luZywgcmVwbCk7XG5cdFx0XHR3aGlsZSAoay5sZW5ndGggPCBvbGRrLmxlbmd0aCkge1xuXHRcdFx0XHRvbGRrID0gaztcblx0XHRcdFx0ayA9IFByZXZpZXdtYWtlci5raWxsU3R1ZmYoaywgb3BlbmluZywgY2xvc2luZywgc3Vib3BlbmluZywgc3ViY2xvc2luZywgcmVwbCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmRhdGEgPSBrO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gdHh0XG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wZW5pbmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gY2xvc2luZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdWJvcGVuaW5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN1YmNsb3Npbmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gcmVwbFxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0c3RhdGljIGtpbGxTdHVmZih0eHQsIG9wZW5pbmcsIGNsb3NpbmcsIHN1Ym9wZW5pbmcsIHN1YmNsb3NpbmcsIHJlcGwpIHtcblx0XHRcdGNvbnN0IG9wID0gUHJldmlld21ha2VyLm1ha2VSZWdleHAob3BlbmluZyk7XG5cdFx0XHRjb25zdCBjbCA9IFByZXZpZXdtYWtlci5tYWtlUmVnZXhwKGNsb3NpbmcsICdeJyk7XG5cdFx0XHRjb25zdCBzYiA9IHN1Ym9wZW5pbmcgPyBQcmV2aWV3bWFrZXIubWFrZVJlZ2V4cChzdWJvcGVuaW5nLCAnXicpIDogbnVsbDtcblx0XHRcdGNvbnN0IHNjID0gc3ViY2xvc2luZyA/IFByZXZpZXdtYWtlci5tYWtlUmVnZXhwKHN1YmNsb3NpbmcsICdeJykgOiBjbDtcblx0XHRcdGlmICghb3AgfHwgIWNsKSB7XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KCdOYXZpZ2F0aW9uIFBvcHVwcyBlcnJvcjogb3Agb3IgY2wgaXMgbnVsbCEgc29tZXRoaW5nIGlzIHdyb25nLicsIHtcblx0XHRcdFx0XHR0YWc6ICdwb3B1cHMnLFxuXHRcdFx0XHRcdHR5cGU6ICdlcnJvcicsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW9wLnRlc3QodHh0KSkge1xuXHRcdFx0XHRyZXR1cm4gdHh0O1xuXHRcdFx0fVxuXHRcdFx0bGV0IHJldCA9ICcnO1xuXHRcdFx0Y29uc3Qgb3BSZXN1bHQgPSBvcC5leGVjKHR4dCk7XG5cdFx0XHRyZXQgPSB0eHQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgb3BSZXN1bHQuaW5kZXgpKTtcblx0XHRcdHR4dCA9IHR4dC5zbGljZShNYXRoLm1heCgwLCBvcFJlc3VsdC5pbmRleCArIG9wUmVzdWx0WzBdLmxlbmd0aCkpO1xuXHRcdFx0bGV0IGRlcHRoID0gMTtcblx0XHRcdHdoaWxlICh0eHQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsZXQgcmVtb3ZhbCA9IDA7XG5cdFx0XHRcdGlmIChkZXB0aCA9PT0gMSAmJiBjbC50ZXN0KHR4dCkpIHtcblx0XHRcdFx0XHRkZXB0aC0tO1xuXHRcdFx0XHRcdHJlbW92YWwgPSBjbC5leGVjKHR4dClbMF0ubGVuZ3RoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGRlcHRoID4gMSAmJiBzYy50ZXN0KHR4dCkpIHtcblx0XHRcdFx0XHRkZXB0aC0tO1xuXHRcdFx0XHRcdHJlbW92YWwgPSBzYy5leGVjKHR4dClbMF0ubGVuZ3RoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNiICYmIHNiLnRlc3QodHh0KSkge1xuXHRcdFx0XHRcdGRlcHRoKys7XG5cdFx0XHRcdFx0cmVtb3ZhbCA9IHNiLmV4ZWModHh0KVswXS5sZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFyZW1vdmFsKSB7XG5cdFx0XHRcdFx0cmVtb3ZhbCA9IDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0dHh0ID0gdHh0LnNsaWNlKE1hdGgubWF4KDAsIHJlbW92YWwpKTtcblx0XHRcdFx0aWYgKGRlcHRoID09PSAwKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQgKyAocmVwbCB8fCAnJykgKyB0eHQ7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0geFxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gcHJlZml4XG5cdFx0ICogQHBhcmFtIHtzdHJpbmd8UmVnRXhwfSBzdWZmaXhcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHN0YXRpYyBtYWtlUmVnZXhwKHgsIHByZWZpeCwgc3VmZml4KSB7XG5cdFx0XHRwcmVmaXggfHw9ICcnO1xuXHRcdFx0c3VmZml4IHx8PSAnJztcblx0XHRcdGxldCByZVN0ciA9ICcnO1xuXHRcdFx0bGV0IGZsYWdzID0gJyc7XG5cdFx0XHRpZiAoaXNTdHJpbmcoeCkpIHtcblx0XHRcdFx0cmVTdHIgPSBwcmVmaXggKyBsaXRlcmFsaXplUmVnZXgoeCkgKyBzdWZmaXg7XG5cdFx0XHR9IGVsc2UgaWYgKGlzUmVnRXhwKHgpKSB7XG5cdFx0XHRcdGxldCBzID0geC50b1N0cmluZygpLnNsaWNlKDEpO1xuXHRcdFx0XHRjb25zdCBzcCA9IHMuc3BsaXQoJy8nKTtcblx0XHRcdFx0ZmxhZ3MgPSBzcC5hdCgtMSk7XG5cdFx0XHRcdHNwW3NwLmxlbmd0aCAtIDFdID0gJyc7XG5cdFx0XHRcdHMgPSBzcC5qb2luKCcvJyk7XG5cdFx0XHRcdHMgPSBzLnNsaWNlKDAsIE1hdGgubWF4KDAsIHMubGVuZ3RoIC0gMSkpO1xuXHRcdFx0XHRyZVN0ciA9IHByZWZpeCArIHMgKyBzdWZmaXg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsb2coJ21ha2VSZWdleHAgZmFpbGVkJyk7XG5cdFx0XHR9XG5cdFx0XHRsb2coYG1ha2VSZWdleHA6IGdvdCByZVN0cj0ke3JlU3RyfSwgZmxhZ3M9JHtmbGFnc31gKTtcblx0XHRcdHJldHVybiBuZXcgUmVnRXhwKHJlU3RyLCBmbGFncyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEJveFRlbXBsYXRlcygpIHtcblx0XHRcdC8vIHRheG9ib3ggcmVtb3ZhbC4uLiBpbiBmYWN0LCB0aGVyZSdzIGEgc2F1ZGlwcmluY2Vib3hfYmVnaW4sIHNvIGxldCdzIGJlIG1vcmUgZ2VuZXJhbFxuXHRcdFx0Ly8gYWxzbywgaGF2ZSBmbG9hdF9iZWdpbiwgLi4uIGZsb2F0X2VuZFxuXHRcdFx0dGhpcy5raWxsKC97e1teXFxze3x9XSo/KGZsb2F0fGJveClbIF9dKGJlZ2lufHN0YXJ0KS9pLCAvfX1cXHMqLywgJ3t7Jyk7XG5cdFx0XHQvLyBpbmZvYm94ZXMgZXRjXG5cdFx0XHQvLyBmcm9tIFp5eHc6IGtpbGwgZnJhbWVzIHRvb1xuXHRcdFx0dGhpcy5raWxsKC97e1teXFxze3x9XSo/KGluZm9ib3h8ZWxlbWVudGJveHxmcmFtZSlbIF9dL2ksIC99fVxccyovLCAne3snKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRraWxsVGVtcGxhdGVzKCkge1xuXHRcdFx0dGhpcy5raWxsKCd7eycsICd9fScsICd7JywgJ30nLCAnICcpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxUYWJsZXMoKSB7XG5cdFx0XHQvLyB0YWJsZXMgYXJlIGJhZCwgdG9vXG5cdFx0XHQvLyB0aGlzIGNhbiBiZSBzbG93LCBidXQgaXQncyBhbiBpbnByb3ZlbWVudCBvdmVyIGEgYnJvd3NlciBoYW5nXG5cdFx0XHQvLyB0b3J0dXJlIHRlc3Q6IFtbQ29tcGFyaXNvbl9vZl9JbnRlbF9DZW50cmFsX1Byb2Nlc3NpbmdfVW5pdHNdXVxuXHRcdFx0dGhpcy5raWxsKCd7fCcsIC9cXHx9XFxzKi8sICd7fCcpO1xuXHRcdFx0dGhpcy5raWxsKC88dGFibGUuKj8+L2ksIC88XFwvdGFibGUuKj8+L2ksIC88dGFibGUuKj8+L2kpO1xuXHRcdFx0Ly8gcmVtb3ZlIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBwaXBlIGZvciB0aGUgaGVsbCBvZiBpdCAoPylcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC9eXFx8LiokL2dtLCAnJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEltYWdlcygpIHtcblx0XHRcdGNvbnN0IGZvcmJpZGRlbk5hbWVzcGFjZUFsaWFzZXMgPSBbXTtcblx0XHRcdGZvciAoY29uc3QgW2xvY2FsaXplZE5hbWVzcGFjZUxjLCBuYW1lc3BhY2VJZF0gb2YgT2JqZWN0LmVudHJpZXMobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VJZHMnKSkpIHtcblx0XHRcdFx0aWYgKG5hbWVzcGFjZUlkICE9PSBwZy5uc0ltYWdlSWQgJiYgbmFtZXNwYWNlSWQgIT09IHBnLm5zQ2F0ZWdvcnlJZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JiaWRkZW5OYW1lc3BhY2VBbGlhc2VzLnB1c2gobG9jYWxpemVkTmFtZXNwYWNlTGMuc3BsaXQoJyAnKS5qb2luKCdbIF9dJykpOyAvLyB0b2RvOiBlc2NhcGUgcmVnZXhwIGZyYWdtZW50cyFcblx0XHRcdH1cblx0XHRcdC8vIGltYWdlcyBhbmQgY2F0ZWdvcmllcyBhcmUgYSBub25vXG5cdFx0XHR0aGlzLmtpbGwobmV3IFJlZ0V4cChgW1tdW1tdXFxcXHMqKCR7Zm9yYmlkZGVuTmFtZXNwYWNlQWxpYXNlcy5qb2luKCd8Jyl9KVxcXFxzKjpgLCAnaScpLCAvXV1cXHMqLywgJ1snLCAnXScpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxIVE1MKCkge1xuXHRcdFx0Ly8ga2lsbCA8cmVmIC4uLj4uLi48L3JlZj5cblx0XHRcdHRoaXMua2lsbCgvPHJlZlxcYlteLz5dKj8+L2ksIC88XFwvcmVmPi9pKTtcblx0XHRcdC8vIGxldCdzIGFsc28gZGVsZXRlIGVudGlyZSBsaW5lcyBzdGFydGluZyB3aXRoIDwuIGl0J3Mgd29ydGggYSB0cnkuXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvKF58XFxuKSAqPC4qL2csICdcXG4nKTtcblx0XHRcdC8vIGFuZCB0aG9zZSBwZXNreSBodG1sIHRhZ3MsIGJ1dCBub3Qgbm93aWtpIG9yIGJsb2NrcXVvdGUgdGFnc1xuXHRcdFx0Y29uc3Qgc3BsaXR0ZWQgPSB0aGlzLmRhdGEuc3BsaXQoLyg8W1xcV1xcd10qPyg/Oj58JHwoPz08KSkpLyk7XG5cdFx0XHRjb25zdCBsZW4gPSBzcGxpdHRlZC5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSArPSAyKSB7XG5cdFx0XHRcdHN3aXRjaCAoc3BsaXR0ZWRbaV0pIHtcblx0XHRcdFx0XHRjYXNlICc8bm8nLmNvbmNhdCgnd2lraScsICc+Jyk6XG5cdFx0XHRcdFx0Y2FzZSAnPC9ubycuY29uY2F0KCd3aWtpJywgJz4nKTpcblx0XHRcdFx0XHRjYXNlICc8YmxvY2snLmNvbmNhdCgncXVvdGUnLCAnPicpOlxuXHRcdFx0XHRcdGNhc2UgJzwvYmxvY2snLmNvbmNhdCgncXVvdGUnLCAnPicpOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHNwbGl0dGVkW2ldID0gJyc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuZGF0YSA9IHNwbGl0dGVkLmpvaW4oJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxDaHVua3MoKSB7XG5cdFx0XHQvLyBoZXVyaXN0aWNzIGFsZXJ0XG5cdFx0XHQvLyBjaHVua3Mgb2YgaXRhbGljIHRleHQ/IHlvdSBjcmF6eSwgbWFuP1xuXHRcdFx0Y29uc3QgaXRhbGljQ2h1bmtSZWdleCA9IC8oKF58XFxuKVxccyo6KlxccyonJ1teJ10oW14nXXwnJyd8J1teJ10pezIwfSgufFxcblteXFxuXSkqJydbXFxzIS4/XSpcXG4pKy9nO1xuXHRcdFx0Ly8ga2VlcCBzdHVmZiBzZXBhcmF0ZWQsIHRob3VnaCwgc28gc3RpY2sgaW4gXFxuIChmaXhlcyBbW1VuaW9uIEphY2tdXT9cblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKGl0YWxpY0NodW5rUmVnZXgsICdcXG4nKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRtb3B1cCgpIHtcblx0XHRcdC8vIHdlIHNpbXBseSAqY2FuJ3QqIGJlIGRvaW5nIHdpdGggaG9yaXpvbnRhbCBydWxlcyByaWdodCBub3dcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC9eLXs0LH0vZ20sICcnKTtcblx0XHRcdC8vIG5vIGluZGVudGVkIGxpbmVzXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvKF58XFxuKSAqOlteXFxuXSovZywgJycpO1xuXHRcdFx0Ly8gcmVwbGFjZSBfX1RPQ19fLCBfX05PVE9DX18gYW5kIHdoYXRldmVyIGVsc2UgdGhlcmUgaXNcblx0XHRcdC8vIHRoaXMnbGwgcHJvYmFibHkgZG9cblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC9eX19bX2Etel0qX18gKiQvZ2ltLCAnJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Zmlyc3RCaXQoKSB7XG5cdFx0XHQvLyBkb250J3QgYmUgZ2l2aW4nIG1lIG5vIHN1YnNlcXVlbnQgcGFyYWdyYXBocywgeW91IGhlYXIgbWU/XG5cdFx0XHQvLyAvIGZpcnN0IHdlIFwibm9ybWFsaXplXCIgc2VjdGlvbiBoZWFkaW5ncywgcmVtb3Zpbmcgd2hpdGVzcGFjZSBhZnRlciwgYWRkaW5nIGJlZm9yZVxuXHRcdFx0bGV0IGQgPSB0aGlzLmRhdGE7XG5cdFx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBQcmV2aWV3Q3V0SGVhZGluZ3MnKSkge1xuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXFxzKig9PStbXj1dKj09KylcXHMqL2csICdcXG5cXG4kMSAnKTtcblx0XHRcdFx0Ly8gLyB0aGVuIHdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBwYXJhZ3JhcGggYnJlYWtzIHdob3NlIHRleHQgZW5kcyBiYWRseVxuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvKFs6O10pICpcXG57Mix9L2csICckMVxcbicpO1xuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXlxccyovLCAnJyk7XG5cdFx0XHRcdGNvbnN0IHN0dWZmID0gL14oW15cXG5dfFxcblxcUykqLy5leGVjKHRoaXMuZGF0YSk7XG5cdFx0XHRcdGlmIChzdHVmZikge1xuXHRcdFx0XHRcdFtkXSA9IHN0dWZmO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBQcmV2aWV3Rmlyc3RQYXJPbmx5JykpIHtcblx0XHRcdFx0XHRkID0gdGhpcy5kYXRhO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIC8gbm93IHB1dCBcXG5cXG4gYWZ0ZXIgc2VjdGlvbnMgc28gdGhhdCBidWxsZXRzIGFuZCBudW1iZXJlZCBsaXN0cyB3b3JrXG5cdFx0XHRcdGQgPSBkLnJlcGxhY2UoLyg9PStbXj1dKj09KylcXHMqL2csICckMVxcblxcbicpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gU3BsaXQgc2VudGVuY2VzLiBTdXBlcmZsdW91cyBzZW50ZW5jZXMgYXJlIFJJR0hUIE9VVC5cblx0XHRcdC8vIG5vdGU6IGV4YWN0bHkgMSBzZXQgb2YgcGFyZW5zIGhlcmUgbmVlZGVkIHRvIG1ha2UgdGhlIHNsaWNlIHdvcmtcblx0XHRcdGQgPSBkLnNwbGl0KC8oWyEuP10rW1wiJ10qXFxzKS9nKTtcblx0XHRcdC8vIGxlYWRpbmcgc3BhY2UgaXMgYmFkLCBtbWtheT9cblx0XHRcdGRbMF0gPSBkWzBdLnJlcGxhY2UoL15cXHMqLywgJycpO1xuXHRcdFx0Y29uc3Qgbm90U2VudGVuY2VFbmRzID0gLyhbXi5dW2Etel1cXC4gKlthLXpdfGV0Y3xzaWN8ZHJ8bXJ8bXJzfG1zfHN0fG5vfG9wfGNpdHxcXFtbXlxcXV0qfFxcc1thLXpdKSQvaTtcblx0XHRcdGQgPSB0aGlzLmZpeFNlbnRlbmNlRW5kcyhkLCBub3RTZW50ZW5jZUVuZHMpO1xuXHRcdFx0dGhpcy5mdWxsTGVuZ3RoID0gZC5qb2luKCcnKS5sZW5ndGg7XG5cdFx0XHRsZXQgbiA9IHRoaXMubWF4U2VudGVuY2VzO1xuXHRcdFx0bGV0IGRkID0gUHJldmlld21ha2VyLmZpcnN0U2VudGVuY2VzKGQsIG4pO1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHRkZCA9IFByZXZpZXdtYWtlci5maXJzdFNlbnRlbmNlcyhkLCBuKTtcblx0XHRcdFx0LS1uO1xuXHRcdFx0fSB3aGlsZSAoZGQubGVuZ3RoID4gdGhpcy5tYXhDaGFyYWN0ZXJzICYmIG4gIT09IDApO1xuXHRcdFx0dGhpcy5kYXRhID0gZGQ7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHJzXG5cdFx0ICogQHBhcmFtIHtSZWdFeHB9IHJlZ1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Zml4U2VudGVuY2VFbmRzKHN0cnMsIHJlZykge1xuXHRcdFx0Ly8gdGFrZSBhbiBhcnJheSBvZiBzdHJpbmdzLCBzdHJzXG5cdFx0XHQvLyBqb2luIHN0cnNbaV0gdG8gc3Ryc1tpKzFdICYgc3Ryc1tpKzJdIGlmIHN0cnNbaV0gbWF0Y2hlcyByZWdleCByZWdcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3Rycy5sZW5ndGggLSAyOyArK2kpIHtcblx0XHRcdFx0aWYgKHJlZy50ZXN0KHN0cnNbaV0pKSB7XG5cdFx0XHRcdFx0Y29uc3QgYSA9IFtdO1xuXHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgc3Rycy5sZW5ndGg7ICsraikge1xuXHRcdFx0XHRcdFx0aWYgKGogPCBpKSB7XG5cdFx0XHRcdFx0XHRcdGFbal0gPSBzdHJzW2pdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGogPT09IGkpIHtcblx0XHRcdFx0XHRcdFx0YVtpXSA9IHN0cnNbaV0gKyBzdHJzW2kgKyAxXSArIHN0cnNbaSArIDJdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGogPiBpICsgMikge1xuXHRcdFx0XHRcdFx0XHRhW2ogLSAyXSA9IHN0cnNbal07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmZpeFNlbnRlbmNlRW5kcyhhLCByZWcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3Rycztcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmdbXX0gc3Ryc1xuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBob3dtYW55XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdGF0aWMgZmlyc3RTZW50ZW5jZXMoc3RycywgaG93bWFueSkge1xuXHRcdFx0Y29uc3QgdCA9IHN0cnMuc2xpY2UoMCwgMiAqIGhvd21hbnkpO1xuXHRcdFx0cmV0dXJuIHQuam9pbignJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEJhZFdoaXRlc3BhY2UoKSB7XG5cdFx0XHQvLyBhbHNvIGNsZWFucyB1cCBpc29sYXRlZCAnJycnXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXiAqJysgKiQvZ20sICcnKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUnVucyB0aGUgdmFyaW91cyBtZXRob2RzIHRvIGdlbmVyYXRlIHRoZSBwcmV2aWV3LlxuXHRcdCAqIFRoZSBwcmV2aWV3IGlzIHN0b3JlZCBpbiB0aGUgPGNvZGU+aHRtbDwvaHRtbD4gZmllbGQuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG1ha2VQcmV2aWV3KCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLm93bmVyLmFydGljbGUubmFtZXNwYWNlSWQoKSAhPT0gcGcubnNUZW1wbGF0ZUlkICYmXG5cdFx0XHRcdHRoaXMub3duZXIuYXJ0aWNsZS5uYW1lc3BhY2VJZCgpICE9PSBwZy5uc0ltYWdlSWRcblx0XHRcdCkge1xuXHRcdFx0XHR0aGlzLmtpbGxDb21tZW50cygpO1xuXHRcdFx0XHR0aGlzLmtpbGxEaXZzKCk7XG5cdFx0XHRcdHRoaXMua2lsbEdhbGxlcmllcygpO1xuXHRcdFx0XHR0aGlzLmtpbGxCb3hUZW1wbGF0ZXMoKTtcblx0XHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwUHJldmlld0tpbGxUZW1wbGF0ZXMnKSkge1xuXHRcdFx0XHRcdHRoaXMua2lsbFRlbXBsYXRlcygpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMua2lsbE11bHRpbGluZVRlbXBsYXRlcygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMua2lsbFRhYmxlcygpO1xuXHRcdFx0XHR0aGlzLmtpbGxJbWFnZXMoKTtcblx0XHRcdFx0dGhpcy5raWxsSFRNTCgpO1xuXHRcdFx0XHR0aGlzLmtpbGxDaHVua3MoKTtcblx0XHRcdFx0dGhpcy5tb3B1cCgpO1xuXHRcdFx0XHR0aGlzLmZpcnN0Qml0KCk7XG5cdFx0XHRcdHRoaXMua2lsbEJhZFdoaXRlc3BhY2UoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMua2lsbEhUTUwoKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuaHRtbCA9IHdpa2kyaHRtbCh0aGlzLmRhdGEsIHRoaXMuYmFzZVVybCk7IC8vIG5lZWRzIGxpdmVwcmV2aWV3XG5cdFx0XHR0aGlzLmZpeEhUTUwoKTtcblx0XHRcdHRoaXMuc3RyaXBMb25nVGVtcGxhdGVzKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdGF0aWMgZXNXaWtpMkh0bWxQYXJ0KGRhdGEpIHtcblx0XHRcdGNvbnN0IHJlTGlua3MgPSAvKD86XFxbXFxbKFteXFxdfF0qKSg/OlxcfChbXlxcXXxdKikpKl1dKFthLXpdKikpL2dpOyAvLyBtYXRjaCBhIHdpa2lsaW5rXG5cdFx0XHRyZUxpbmtzLmxhc3RJbmRleCA9IDA7IC8vIHJlc2V0IHJlZ2V4XG5cdFx0XHRsZXQgbWF0Y2g7XG5cdFx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cdFx0XHRsZXQgcG9zdGZpeEluZGV4ID0gMDtcblx0XHRcdHdoaWxlICgobWF0Y2ggPSByZUxpbmtzLmV4ZWMoZGF0YSkpICE9PSBudWxsKSB7XG5cdFx0XHRcdC8vIG1hdGNoIGFsbCB3aWtpbGlua3Ncblx0XHRcdFx0Ly8gRklYTUU6IHRoZSB3YXkgdGhhdCBsaW5rIGlzIGJ1aWx0IGhlcmUgaXNuJ3QgcGVyZmVjdC4gSXQgaXMgY2xpY2thYmxlLCBidXQgcG9wdXBzIHByZXZpZXcgd29uJ3QgcmVjb2duaXplIGl0IGluIHNvbWUgY2FzZXMuXG5cdFx0XHRcdHJlc3VsdCArPSBgJHtwZy5lc2NhcGVRdW90ZXNIVE1MKGRhdGEuc3Vic3RyaW5nKHBvc3RmaXhJbmRleCwgbWF0Y2guaW5kZXgpKX08YSBocmVmPVwiJHtcblx0XHRcdFx0XHRJbnN0YS5jb25mLnBhdGhzLmFydGljbGVzXG5cdFx0XHRcdH0ke3BnLmVzY2FwZVF1b3Rlc0hUTUwobWF0Y2hbMV0pfVwiPiR7cGcuZXNjYXBlUXVvdGVzSFRNTCgobWF0Y2hbMl0gPz8gbWF0Y2hbMV0pICsgbWF0Y2hbM10pfTwvYT5gO1xuXHRcdFx0XHRwb3N0Zml4SW5kZXggPSByZUxpbmtzLmxhc3RJbmRleDtcblx0XHRcdH1cblx0XHRcdC8vIGFwcGVuZCB0aGUgcmVzdFxuXHRcdFx0cmVzdWx0ICs9IHBnLmVzY2FwZVF1b3Rlc0hUTUwoZGF0YS5zbGljZShNYXRoLm1heCgwLCBwb3N0Zml4SW5kZXgpKSk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHRlZGl0U3VtbWFyeVByZXZpZXcoKSB7XG5cdFx0XHRjb25zdCByZUFlcyA9IC9cXC9cXCogKiguKj8pICpcXCpcXC8vZzsgLy8gbWF0Y2ggdGhlIGZpcnN0IHNlY3Rpb24gbWFya2VyXG5cdFx0XHRyZUFlcy5sYXN0SW5kZXggPSAwOyAvLyByZXNldCByZWdleFxuXHRcdFx0Y29uc3QgbWF0Y2ggPSByZUFlcy5leGVjKHRoaXMuZGF0YSk7XG5cdFx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdFx0Ly8gd2UgaGF2ZSBhIHNlY3Rpb24gbGluay4gU3BsaXQgaXQsIHByb2Nlc3MgaXQsIGNvbWJpbmUgaXQuXG5cdFx0XHRcdGNvbnN0IHByZWZpeCA9IHRoaXMuZGF0YS5zbGljZSgwLCBNYXRoLm1heCgwLCBtYXRjaC5pbmRleCAtIDEpKTtcblx0XHRcdFx0Y29uc3QgWywgc2VjdGlvbl0gPSBtYXRjaDtcblx0XHRcdFx0Y29uc3QgcG9zdGZpeCA9IHRoaXMuZGF0YS5zbGljZShNYXRoLm1heCgwLCByZUFlcy5sYXN0SW5kZXgpKTtcblx0XHRcdFx0bGV0IHN0YXJ0ID0gXCI8c3BhbiBjbGFzcz0nYXV0b2NvbW1lbnQnPlwiO1xuXHRcdFx0XHRsZXQgZW5kID0gJzwvc3Bhbj4nO1xuXHRcdFx0XHRpZiAocHJlZml4Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRzdGFydCA9IGAke1ByZXZpZXdtYWtlci5lc1dpa2kySHRtbFBhcnQocHJlZml4KX0gJHtzdGFydH0tIGA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHBvc3RmaXgubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGVuZCA9IGA6ICR7ZW5kfSR7UHJldmlld21ha2VyLmVzV2lraTJIdG1sUGFydChwb3N0Zml4KX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHQgPSBuZXcgVGl0bGUoKS5mcm9tVVJMKHRoaXMuYmFzZVVybCk7XG5cdFx0XHRcdHQuYW5jaG9yRnJvbVV0ZihzZWN0aW9uKTtcblx0XHRcdFx0Y29uc3Qgc2VjdGlvbkxpbmsgPSBgJHtcblx0XHRcdFx0XHRJbnN0YS5jb25mLnBhdGhzLmFydGljbGVzICsgcGcuZXNjYXBlUXVvdGVzSFRNTCh0LnRvU3RyaW5nKHRydWUpKVxuXHRcdFx0XHR9IyR7cGcuZXNjYXBlUXVvdGVzSFRNTCh0LmFuY2hvcil9YDtcblx0XHRcdFx0cmV0dXJuIGAke3N0YXJ0fTxhIGhyZWY9XCIke3NlY3Rpb25MaW5rfVwiPiZyYXJyOzwvYT4gJHtwZy5lc2NhcGVRdW90ZXNIVE1MKHNlY3Rpb24pfSR7ZW5kfWA7XG5cdFx0XHR9XG5cdFx0XHQvLyBlbHNlIHRoZXJlJ3Mgbm8gc2VjdGlvbiBsaW5rLCBodG1saWZ5IHRoZSB3aG9sZSB0aGluZy5cblx0XHRcdHJldHVybiBQcmV2aWV3bWFrZXIuZXNXaWtpMkh0bWxQYXJ0KHRoaXMuZGF0YSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFdvcmtzIGFyb3VuZCBsaXZlcHJldmlldyBidWdzLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRmaXhIVE1MKCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0bWwpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHJldCA9IHRoaXMuaHRtbDtcblx0XHRcdC8vIGZpeCBxdWVzdGlvbiBtYXJrcyBpbiB3aWtpIGxpbmtzXG5cdFx0XHQvLyBtYXliZSB0aGlzJ2xsIGJyZWFrIHNvbWUgc3R1ZmYgOi0oXG5cdFx0XHRyZXQgPSByZXQucmVwbGFjZShuZXcgUmVnRXhwKGAoPGEgaHJlZj1cIiR7cGcud2lraS5hcnRpY2xlUGF0aH0vW15cIl0qKVs/XSguKj9cIilgLCAnZycpLCAnJDElM0YkMicpO1xuXHRcdFx0cmV0ID0gcmV0LnJlcGxhY2UobmV3IFJlZ0V4cChgKDxhIGhyZWY9JyR7cGcud2lraS5hcnRpY2xlUGF0aH0vW14nXSopWz9dKC4qPycpYCwgJ2cnKSwgJyQxJTNGJDInKTtcblx0XHRcdC8vIEZJWE1FIGZpeCB1cCAlIHRvb1xuXHRcdFx0dGhpcy5odG1sID0gcmV0O1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBHZW5lcmF0ZXMgdGhlIHByZXZpZXcgYW5kIGRpc3BsYXlzIGl0IGluIHRoZSBjdXJyZW50IHBvcHVwLlxuXHRcdCAqIERvZXMgbm90aGluZyBpZiB0aGUgZ2VuZXJhdGVkIHByZXZpZXcgaXMgaW52YWxpZCBvciBjb25zaXN0cyBvZiB3aGl0ZXNwYWNlIG9ubHkuXG5cdFx0ICogQWxzbyBhY3RpdmF0ZXMgd2lraWxpbmtzIGluIHRoZSBwcmV2aWV3IGZvciBzdWJwb3B1cHMgaWYgdGhlIHBvcHVwU3VicG9wdXBzIG9wdGlvbiBpcyB0cnVlLlxuXHRcdCAqL1xuXHRcdHNob3dQcmV2aWV3KCkge1xuXHRcdFx0dGhpcy5tYWtlUHJldmlldygpO1xuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLmh0bWwgIT09IHR5cGVvZiAnJykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoL15cXHMqJC8udGVzdCh0aGlzLmh0bWwpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHNldFBvcHVwSFRNTCgnPGhyPicsICdwb3B1cFByZVByZXZpZXdTZXAnLCB0aGlzLm93bmVyLmlkTnVtYmVyKTtcblx0XHRcdHNldFBvcHVwVGlwc0FuZEhUTUwodGhpcy5odG1sLCAncG9wdXBQcmV2aWV3JywgdGhpcy5vd25lci5pZE51bWJlciwge1xuXHRcdFx0XHRvd25lcjogdGhpcy5vd25lcixcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgbW9yZSA9IHRoaXMuZnVsbExlbmd0aCA+IHRoaXMuZGF0YS5sZW5ndGggPyB0aGlzLm1vcmVMaW5rKCkgOiAnJztcblx0XHRcdHNldFBvcHVwSFRNTChtb3JlLCAncG9wdXBQcmV2aWV3TW9yZScsIHRoaXMub3duZXIuaWROdW1iZXIpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG1vcmVMaW5rKCkge1xuXHRcdFx0Y29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdGEuY2xhc3NOYW1lID0gJ3BvcHVwTW9yZUxpbmsnO1xuXHRcdFx0YS5pbm5lckhUTUwgPSBwb3B1cFN0cmluZygnbW9yZS4uLicpO1xuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0XHRhLm9uY2xpY2sgPSAoKSA9PiB7XG5cdFx0XHRcdHNlbGYubWF4Q2hhcmFjdGVycyArPSAyMDAwO1xuXHRcdFx0XHRzZWxmLm1heFNlbnRlbmNlcyArPSAyMDtcblx0XHRcdFx0c2VsZi5zZXREYXRhKCk7XG5cdFx0XHRcdHNlbGYuc2hvd1ByZXZpZXcoKTtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gYTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdHJpcExvbmdUZW1wbGF0ZXMoKSB7XG5cdFx0XHQvLyBvcGVyYXRlcyBvbiB0aGUgSFRNTCFcblx0XHRcdHRoaXMuaHRtbCA9IHRoaXMuaHRtbC5yZXBsYWNlKC9eLnswLDEwMDB9e3tbXn1dKj8oPChwfGJyKSggXFwvKT8+XFxzKil7Mix9KFtee31dKj99fSk/L2dpLCAnJyk7XG5cdFx0XHR0aGlzLmh0bWwgPSB0aGlzLmh0bWwuc3BsaXQoJ1xcbicpLmpvaW4oJyAnKTsgLy8gd29ya2Fyb3VuZCBmb3IgPHByZT4gdGVtcGxhdGVzXG5cdFx0XHR0aGlzLmh0bWwgPSB0aGlzLmh0bWwucmVwbGFjZSgve3tbXn1dKjxwcmU+W159XSp9fS9naSwgJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxNdWx0aWxpbmVUZW1wbGF0ZXMoKSB7XG5cdFx0XHR0aGlzLmtpbGwoJ3t7eycsICd9fX0nKTtcblx0XHRcdHRoaXMua2lsbCgvXFxzKnt7W157fV0qXFxuLywgJ319JywgJ3t7Jyk7XG5cdFx0fVxuXHR9XG5cdC8vIEVOREZJTEU6IHByZXZpZXdtYWtlci5qc1xuXHQvLyBTVEFSVEZJTEU6IHF1ZXJ5cHJldmlldy5qc1xuXHRjb25zdCBsb2FkQVBJUHJldmlldyA9IChxdWVyeVR5cGUsIGFydGljbGUsIG5hdnBvcCkgPT4ge1xuXHRcdGNvbnN0IGFydCA9IG5ldyBUaXRsZShhcnRpY2xlKS51cmxTdHJpbmcoKTtcblx0XHRsZXQgdXJsID0gYCR7cGcud2lraS5hcGl3aWtpYmFzZX0/Zm9ybWF0PWpzb24mZm9ybWF0dmVyc2lvbj0yJmFjdGlvbj1xdWVyeSZgO1xuXHRcdGxldCBodG1sR2VuZXJhdG9yID0gKCkgPT4gLyogYSwgZCAqLyB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSgnaW52YWxpZCBodG1sIGdlbmVyYXRvcicsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnZXJyb3InfSk7XG5cdFx0fTtcblx0XHRsZXQgdXNlcm5hbWVhcnQgPSAnJztcblx0XHRzd2l0Y2ggKHF1ZXJ5VHlwZSkge1xuXHRcdFx0Y2FzZSAnaGlzdG9yeSc6XG5cdFx0XHRcdHVybCArPSBgdGl0bGVzPSR7YXJ0fSZwcm9wPXJldmlzaW9ucyZydmxpbWl0PSR7Z2V0VmFsdWVPZigncG9wdXBIaXN0b3J5UHJldmlld0xpbWl0Jyl9YDtcblx0XHRcdFx0aHRtbEdlbmVyYXRvciA9IEFQSWhpc3RvcnlQcmV2aWV3SFRNTDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjYXRlZ29yeSc6XG5cdFx0XHRcdHVybCArPSBgbGlzdD1jYXRlZ29yeW1lbWJlcnMmY210aXRsZT0ke2FydH1gO1xuXHRcdFx0XHRodG1sR2VuZXJhdG9yID0gQVBJY2F0ZWdvcnlQcmV2aWV3SFRNTDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VyaW5mbyc6IHtcblx0XHRcdFx0Y29uc3QgdXNlcm5hbWUgPSBuZXcgVGl0bGUoYXJ0aWNsZSkudXNlck5hbWUoKTtcblx0XHRcdFx0dXNlcm5hbWVhcnQgPSBlbmNvZGVVUklDb21wb25lbnQodXNlcm5hbWUpO1xuXHRcdFx0XHR1cmwgKz0gcGcucmUuaXBVc2VyLnRlc3QodXNlcm5hbWUpXG5cdFx0XHRcdFx0PyBgbGlzdD1ibG9ja3MmYmtwcm9wPXJhbmdlfHJlc3RyaWN0aW9ucyZia2lwPSR7dXNlcm5hbWVhcnR9YFxuXHRcdFx0XHRcdDogYGxpc3Q9dXNlcnN8dXNlcmNvbnRyaWJzJnVzcHJvcD1ibG9ja2luZm98Z3JvdXBzfGVkaXRjb3VudHxyZWdpc3RyYXRpb258Z2VuZGVyJnVzdXNlcnM9JHt1c2VybmFtZWFydH0mbWV0YT1nbG9iYWx1c2VyaW5mbyZndWlwcm9wPWdyb3Vwc3x1bmF0dGFjaGVkJmd1aXVzZXI9JHt1c2VybmFtZWFydH0mdWNsaW1pdD0xJnVjcHJvcD10aW1lc3RhbXAmdWN1c2VyPSR7dXNlcm5hbWVhcnR9YDtcblx0XHRcdFx0aHRtbEdlbmVyYXRvciA9IEFQSXVzZXJJbmZvUHJldmlld0hUTUw7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnY29udHJpYnMnOlxuXHRcdFx0XHR1c2VybmFtZWFydCA9IGVuY29kZVVSSUNvbXBvbmVudChuZXcgVGl0bGUoYXJ0aWNsZSkudXNlck5hbWUoKSk7XG5cdFx0XHRcdHVybCArPSBgbGlzdD11c2VyY29udHJpYnMmdWN1c2VyPSR7dXNlcm5hbWVhcnR9JnVjbGltaXQ9JHtnZXRWYWx1ZU9mKCdwb3B1cENvbnRyaWJzUHJldmlld0xpbWl0Jyl9YDtcblx0XHRcdFx0aHRtbEdlbmVyYXRvciA9IEFQSWNvbnRyaWJzUHJldmlld0hUTUw7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnaW1hZ2VwYWdlcHJldmlldyc6IHtcblx0XHRcdFx0bGV0IHRyYWlsID0gJyc7XG5cdFx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cEltYWdlTGlua3MnKSkge1xuXHRcdFx0XHRcdHRyYWlsID0gYCZsaXN0PWltYWdldXNhZ2UmaXV0aXRsZT0ke2FydH1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHVybCArPSBgdGl0bGVzPSR7YXJ0fSZwcm9wPXJldmlzaW9uc3xpbWFnZWluZm8mcnZwcm9wPWNvbnRlbnQke3RyYWlsfWA7XG5cdFx0XHRcdGh0bWxHZW5lcmF0b3IgPSBBUElpbWFnZXBhZ2VQcmV2aWV3SFRNTDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdiYWNrbGlua3MnOlxuXHRcdFx0XHR1cmwgKz0gYGxpc3Q9YmFja2xpbmtzJmJsdGl0bGU9JHthcnR9YDtcblx0XHRcdFx0aHRtbEdlbmVyYXRvciA9IEFQSWJhY2tsaW5rc1ByZXZpZXdIVE1MO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JldmlzaW9uJzpcblx0XHRcdFx0dXJsICs9IGFydGljbGUub2xkaWQgPyBgcmV2aWRzPSR7YXJ0aWNsZS5vbGRpZH1gIDogYHRpdGxlcz0ke2FydGljbGUucmVtb3ZlQW5jaG9yKCkudXJsU3RyaW5nKCl9YDtcblx0XHRcdFx0dXJsICs9XG5cdFx0XHRcdFx0JyZwcm9wPXJldmlzaW9uc3xwYWdlcHJvcHN8aW5mb3xpbWFnZXN8Y2F0ZWdvcmllcyZydnByb3A9aWRzfHRpbWVzdGFtcHxmbGFnc3xjb21tZW50fHVzZXJ8Y29udGVudCZjbGxpbWl0PW1heCZpbWxpbWl0PW1heCc7XG5cdFx0XHRcdGh0bWxHZW5lcmF0b3IgPSBBUElyZXZpc2lvblByZXZpZXdIVE1MO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0cGVuZGluZ05hdnBvcFRhc2sobmF2cG9wKTtcblx0XHRjb25zdCBjYWxsYmFjayA9IChkKSA9PiB7XG5cdFx0XHRsb2coJ2NhbGxiYWNrIG9mIEFQSSBmdW5jdGlvbnMgd2FzIGhpdCcpO1xuXHRcdFx0aWYgKHF1ZXJ5VHlwZSA9PT0gJ3VzZXJpbmZvJykge1xuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIGRvIGFub3RoZXIgQVBJIHJlcXVlc3Rcblx0XHRcdFx0ZmV0Y2hVc2VyR3JvdXBOYW1lcyhkLmRhdGEpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdHNob3dBUElQcmV2aWV3KHF1ZXJ5VHlwZSwgaHRtbEdlbmVyYXRvcihhcnRpY2xlLCBkLCBuYXZwb3ApLCBuYXZwb3AuaWROdW1iZXIsIG5hdnBvcCwgZCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRzaG93QVBJUHJldmlldyhxdWVyeVR5cGUsIGh0bWxHZW5lcmF0b3IoYXJ0aWNsZSwgZCwgbmF2cG9wKSwgbmF2cG9wLmlkTnVtYmVyLCBuYXZwb3AsIGQpO1xuXHRcdH07XG5cdFx0Y29uc3QgZ28gPSAoKSA9PiB7XG5cdFx0XHRnZXRQYWdlV2l0aENhY2hpbmcodXJsLCBjYWxsYmFjaywgbmF2cG9wKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdFx0aWYgKG5hdnBvcC52aXNpYmxlIHx8ICFnZXRWYWx1ZU9mKCdwb3B1cExhenlEb3dubG9hZHMnKSkge1xuXHRcdFx0Z28oKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2cG9wLmFkZEhvb2soZ28sICd1bmhpZGUnLCAnYmVmb3JlJywgYERPV05MT0FEXyR7cXVlcnlUeXBlfV9RVUVSWV9EQVRBYCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBsaW5rTGlzdCA9IChsaXN0KSA9PiB7XG5cdFx0bGlzdC5zb3J0KCh4LCB5KSA9PiB7XG5cdFx0XHRyZXR1cm4geCA9PT0geSA/IDAgOiB4IDwgeSA/IC0xIDogMTtcblx0XHR9KTtcblx0XHRjb25zdCBidWYgPSBbXTtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgbGlzdCkge1xuXHRcdFx0YnVmLnB1c2goXG5cdFx0XHRcdHdpa2lMaW5rKHtcblx0XHRcdFx0XHRhcnRpY2xlOiBuZXcgVGl0bGUoZWxlbWVudCksXG5cdFx0XHRcdFx0dGV4dDogZWxlbWVudC5zcGxpdCgnICcpLmpvaW4oJyZuYnNwOycpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ3ZpZXcnLFxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGJ1Zi5qb2luKCcsICcpO1xuXHR9O1xuXHRjb25zdCBnZXRUaW1lT2Zmc2V0ID0gKCkgPT4ge1xuXHRcdGNvbnN0IHR6ID0gbXcudXNlci5vcHRpb25zLmdldCgndGltZWNvcnJlY3Rpb24nKTtcblx0XHRpZiAodHogJiYgdHouaW5jbHVkZXMoJ3wnKSkge1xuXHRcdFx0Ly8gTmV3IGZvcm1hdFxuXHRcdFx0cmV0dXJuIE51bWJlci5wYXJzZUludCh0ei5zcGxpdCgnfCcpWzFdLCAxMCk7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9O1xuXHRjb25zdCBnZXRUaW1lWm9uZSA9ICgpID0+IHtcblx0XHRpZiAoIXBnLnVzZXIudGltZVpvbmUpIHtcblx0XHRcdGNvbnN0IHR6ID0gbXcudXNlci5vcHRpb25zLmdldCgndGltZWNvcnJlY3Rpb24nKTtcblx0XHRcdHBnLnVzZXIudGltZVpvbmUgPSAnVVRDJztcblx0XHRcdGlmICh0eikge1xuXHRcdFx0XHRjb25zdCB0ekNvbXBvbmVudHMgPSB0ei5zcGxpdCgnfCcpO1xuXHRcdFx0XHRpZiAodHpDb21wb25lbnRzLmxlbmd0aCA9PT0gMyAmJiB0ekNvbXBvbmVudHNbMF0gPT09ICdab25lSW5mbycpIHtcblx0XHRcdFx0XHRbLCAsIHBnLnVzZXIudGltZVpvbmVdID0gdHpDb21wb25lbnRzO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGVycmxvZyhgVW5leHBlY3RlZCB0aW1lem9uZSBpbmZvcm1hdGlvbjogJHt0en1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcGcudXNlci50aW1lWm9uZTtcblx0fTtcblx0LyoqXG5cdCAqIFNob3VsZCB3ZSB1c2UgYW4gb2Zmc2V0IG9yIGNhbiB3ZSB1c2UgcHJvcGVyIHRpbWV6b25lc1xuXHQgKi9cblx0Y29uc3QgdXNlVGltZU9mZnNldCA9ICgpID0+IHtcblx0XHRpZiAoSW50bC5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0VG9QYXJ0cyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBJRSAxMVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IHR6ID0gbXcudXNlci5vcHRpb25zLmdldCgndGltZWNvcnJlY3Rpb24nKTtcblx0XHRpZiAodHogJiYgIXR6LmluY2x1ZGVzKCdab25lSW5mb3wnKSkge1xuXHRcdFx0Ly8gU3lzdGVtfCBEZWZhdWx0IHN5c3RlbSB0aW1lLCBkZWZhdWx0IGZvciB1c2VycyB3aG8gZGlkbid0IGNvbmZpZ3VyZSB0aW1lem9uZVxuXHRcdFx0Ly8gT2Zmc2V0fCBNYW51YWwgZGVmaW5lZCBvZmZzZXQgYnkgdXNlclxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0LyoqXG5cdCAqIEFycmF5IG9mIGxvY2FsZXMgZm9yIHRoZSBwdXJwb3NlIG9mIGphdmFzY3JpcHQgbG9jYWxlIGJhc2VkIGZvcm1hdHRpbmdcblx0ICogRmlsdGVycyBkb3duIHRvIHRob3NlIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4gRW1wdHkgW10gPT09IFN5c3RlbSdzIGRlZmF1bHQgbG9jYWxlXG5cdCAqL1xuXHRjb25zdCBnZXRMb2NhbGVzID0gKCkgPT4ge1xuXHRcdGlmICghcGcudXNlci5sb2NhbGVzKSB7XG5cdFx0XHRsZXQgdXNlckxhbmd1YWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpLmdldEF0dHJpYnV0ZSgnbGFuZycpOyAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBIVE1MIGxvY2FsZVxuXHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwTG9jYWxlJykpIHtcblx0XHRcdFx0dXNlckxhbmd1YWdlID0gZ2V0VmFsdWVPZigncG9wdXBMb2NhbGUnKTtcblx0XHRcdH0gZWxzZSBpZiAodXNlckxhbmd1YWdlID09PSAnZW4nKSB7XG5cdFx0XHRcdC8vIGVuLndwIHRlbmRzIHRvIHRyZWF0IHRoaXMgYXMgaW50ZXJuYXRpb25hbCBlbmdsaXNoIC8gdW5zcGVjaWZpZWRcblx0XHRcdFx0Ly8gYnV0IHdlIGhhdmUgbW9yZSBzcGVjaWZpYyBzZXR0aW5ncyBpbiB1c2VyIG9wdGlvbnNcblx0XHRcdFx0dXNlckxhbmd1YWdlID0gZ2V0TVdEYXRlRm9ybWF0KCkgPT09ICdtZHknID8gJ2VuLVVTJyA6ICdlbi1HQic7XG5cdFx0XHR9XG5cdFx0XHRwZy51c2VyLmxvY2FsZXMgPSBJbnRsLkRhdGVUaW1lRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihbdXNlckxhbmd1YWdlLCBuYXZpZ2F0b3IubGFuZ3VhZ2VdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHBnLnVzZXIubG9jYWxlcztcblx0fTtcblx0LyoqXG5cdCAqIFJldHJpZXZlIGNvbmZpZ3VyZWQgTVcgZGF0ZSBmb3JtYXQgZm9yIHRoaXMgdXNlclxuXHQgKiBUaGVzZSBjYW4gYmVcblx0ICogZGVmYXVsdFxuXHQgKiBkbXk6IHRpbWUsIGRteVxuXHQgKiBtZHk6IHRpbWUsIG1keVxuXHQgKiB5bWQ6IHRpbWUsIHltZFxuXHQgKiBkbXl0OiBkbXksIHRpbWVcblx0ICogZG15dHM6IGRteSwgdGltZSArIHNlY29uZHNcblx0ICogSVNPIDg2MDE6IFlZWVktTU0tRERUaGg6bW06c3MgKGxvY2FsIHRpbWUpXG5cdCAqXG5cdCAqIFRoaXMgaXNuJ3QgdG9vIHVzZWZ1bCBmb3IgdXMsIGFzIEpTIGRvZXNuJ3QgaGF2ZSBmb3JtYXR0ZXJzIHRvIG1hdGNoIHRoZXNlIHByaXZhdGUgc3BlY2lmaWVyc1xuXHQgKi9cblx0Y29uc3QgZ2V0TVdEYXRlRm9ybWF0ID0gKCkgPT4ge1xuXHRcdHJldHVybiBtdy51c2VyLm9wdGlvbnMuZ2V0KCdkYXRlJyk7XG5cdH07XG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgSFRNTCB0YWJsZSB0aGF0J3Mgc2hvd24gaW4gdGhlIGhpc3RvcnkgYW5kIHVzZXItY29udHJpYnMgcG9wdXBzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYXJ0aWNsZVxuXHQgKiBAcGFyYW0ge09iamVjdFtdfSBoIC0gYSBsaXN0IG9mIHJldmlzaW9ucywgcmV0dXJuZWQgZnJvbSB0aGUgQVBJXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVhbGx5Q29udHJpYnMgLSB0cnVlIG9ubHkgaWYgd2UncmUgZGlzcGxheWluZyB1c2VyIGNvbnRyaWJ1dGlvbnNcblx0ICovXG5cdGNvbnN0IGVkaXRQcmV2aWV3VGFibGUgPSAoYXJ0aWNsZSwgaCwgcmVhbGx5Q29udHJpYnMpID0+IHtcblx0XHRsZXQgaHRtbCA9IFsnPHRhYmxlPiddO1xuXHRcdGxldCBkYXk7XG5cdFx0bGV0IGN1cmFydCA9IGFydGljbGU7XG5cdFx0bGV0IHBhZ2U7XG5cdFx0bGV0IG1ha2VGaXJzdENvbHVtbkxpbmtzO1xuXHRcdGlmIChyZWFsbHlDb250cmlicykge1xuXHRcdFx0Ly8gV2UncmUgc2hvd2luZyB1c2VyIGNvbnRyaWJ1dGlvbnMsIHNvIG1ha2UgKGRpZmYgfCBoaXN0KSBsaW5rc1xuXHRcdFx0bWFrZUZpcnN0Q29sdW1uTGlua3MgPSAoY3VycmVudFJldmlzaW9uKSA9PiB7XG5cdFx0XHRcdGxldCByZXN1bHQgPSAnKCc7XG5cdFx0XHRcdHJlc3VsdCArPVxuXHRcdFx0XHRcdGA8YSBocmVmPVwiJHtwZy53aWtpLnRpdGxlYmFzZX0ke25ldyBUaXRsZShjdXJyZW50UmV2aXNpb24udGl0bGUpLnVybFN0cmluZygpfSZkaWZmPXByZXZgICtcblx0XHRcdFx0XHRgJm9sZGlkPSR7Y3VycmVudFJldmlzaW9uLnJldmlkfVwiPiR7cG9wdXBTdHJpbmcoJ2RpZmYnKX08L2E+YDtcblx0XHRcdFx0cmVzdWx0ICs9ICcmbmJzcDt8Jm5ic3A7Jztcblx0XHRcdFx0cmVzdWx0ICs9IGA8YSBocmVmPVwiJHtwZy53aWtpLnRpdGxlYmFzZX0ke25ldyBUaXRsZShcblx0XHRcdFx0XHRjdXJyZW50UmV2aXNpb24udGl0bGVcblx0XHRcdFx0KS51cmxTdHJpbmcoKX0mYWN0aW9uPWhpc3RvcnlcIj4ke3BvcHVwU3RyaW5nKCdoaXN0Jyl9PC9hPmA7XG5cdFx0XHRcdHJlc3VsdCArPSAnKSc7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJdCdzIGEgcmVndWxhciBoaXN0b3J5IHBhZ2UsIHNvIG1ha2UgKGN1ciB8IGxhc3QpIGxpbmtzXG5cdFx0XHRjb25zdCBmaXJzdFJldmlkID0gaFswXS5yZXZpZDtcblx0XHRcdG1ha2VGaXJzdENvbHVtbkxpbmtzID0gKGN1cnJlbnRSZXZpc2lvbikgPT4ge1xuXHRcdFx0XHRsZXQgcmVzdWx0ID0gJygnO1xuXHRcdFx0XHRyZXN1bHQgKz0gYDxhIGhyZWY9XCIke3BnLndpa2kudGl0bGViYXNlfSR7bmV3IFRpdGxlKGN1cmFydCkudXJsU3RyaW5nKCl9JmRpZmY9JHtmaXJzdFJldmlkfSZvbGRpZD0ke1xuXHRcdFx0XHRcdGN1cnJlbnRSZXZpc2lvbi5yZXZpZFxuXHRcdFx0XHR9XCI+JHtwb3B1cFN0cmluZygnY3VyJyl9PC9hPmA7XG5cdFx0XHRcdHJlc3VsdCArPSAnJm5ic3A7fCZuYnNwOyc7XG5cdFx0XHRcdHJlc3VsdCArPSBgPGEgaHJlZj1cIiR7cGcud2lraS50aXRsZWJhc2V9JHtuZXcgVGl0bGUoY3VyYXJ0KS51cmxTdHJpbmcoKX0mZGlmZj1wcmV2Jm9sZGlkPSR7XG5cdFx0XHRcdFx0Y3VycmVudFJldmlzaW9uLnJldmlkXG5cdFx0XHRcdH1cIj4ke3BvcHVwU3RyaW5nKCdsYXN0Jyl9PC9hPmA7XG5cdFx0XHRcdHJlc3VsdCArPSAnKSc7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IFtpLCBlbGVtZW50XSBvZiBoLmVudHJpZXMoKSkge1xuXHRcdFx0aWYgKHJlYWxseUNvbnRyaWJzKSB7XG5cdFx0XHRcdHBhZ2UgPSBlbGVtZW50LnRpdGxlO1xuXHRcdFx0XHRjdXJhcnQgPSBuZXcgVGl0bGUocGFnZSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBtaW5vciA9IGVsZW1lbnQubWlub3IgPyAnPGI+bSA8L2I+JyA6ICcnO1xuXHRcdFx0Y29uc3QgZWRpdERhdGUgPSBuZXcgRGF0ZShlbGVtZW50LnRpbWVzdGFtcCk7XG5cdFx0XHRsZXQgdGhpc0RheSA9IGZvcm1hdHRlZERhdGUoZWRpdERhdGUpO1xuXHRcdFx0Y29uc3QgdGhpc1RpbWUgPSBmb3JtYXR0ZWRUaW1lKGVkaXREYXRlKTtcblx0XHRcdGlmICh0aGlzRGF5ID09PSBkYXkpIHtcblx0XHRcdFx0dGhpc0RheSA9ICcnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF5ID0gdGhpc0RheTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzRGF5KSB7XG5cdFx0XHRcdGh0bWwucHVzaChgPHRyPjx0ZCBjb2xzcGFuPTM+PHNwYW4gY2xhc3M9XCJwb3B1cF9oaXN0b3J5X2RhdGVcIj4ke3RoaXNEYXl9PC9zcGFuPjwvdGQ+PC90cj5gKTtcblx0XHRcdH1cblx0XHRcdGh0bWwucHVzaChcblx0XHRcdFx0YDx0ciBjbGFzcz1cInBvcHVwX2hpc3Rvcnlfcm93XyR7aSAlIDIgPyAnb2RkJyA6ICdldmVuJ31cIj5gLFxuXHRcdFx0XHRgPHRkPiR7bWFrZUZpcnN0Q29sdW1uTGlua3MoZWxlbWVudCl9PC90ZD5gLFxuXHRcdFx0XHQnPHRkPicgK1xuXHRcdFx0XHRcdGA8YSBocmVmPVwiJHtwZy53aWtpLnRpdGxlYmFzZX0ke25ldyBUaXRsZShjdXJhcnQpLnVybFN0cmluZygpfSZvbGRpZD0ke1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5yZXZpZFxuXHRcdFx0XHRcdH1cIj4ke3RoaXNUaW1lfTwvYT48L3RkPmBcblx0XHRcdCk7XG5cdFx0XHRsZXQgY29sM3VybCA9ICcnO1xuXHRcdFx0bGV0IGNvbDN0eHQgPSAnJztcblx0XHRcdGlmIChyZWFsbHlDb250cmlicykge1xuXHRcdFx0XHRjb2wzdXJsID0gcGcud2lraS50aXRsZWJhc2UgKyBjdXJhcnQudXJsU3RyaW5nKCk7XG5cdFx0XHRcdGNvbDN0eHQgPSBwZy5lc2NhcGVRdW90ZXNIVE1MKHBhZ2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qge3VzZXJ9ID0gZWxlbWVudDtcblx0XHRcdFx0aWYgKGVsZW1lbnQudXNlcmhpZGRlbikge1xuXHRcdFx0XHRcdGNvbDN1cmwgPSBnZXRWYWx1ZU9mKCdwb3B1cFJldkRlbFVybCcpO1xuXHRcdFx0XHRcdGNvbDN0eHQgPSBwZy5lc2NhcGVRdW90ZXNIVE1MKHBvcHVwU3RyaW5nKCdyZXZkZWwnKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29sM3VybCA9IHBnLnJlLmlwVXNlci50ZXN0KHVzZXIpXG5cdFx0XHRcdFx0XHQ/IGAke1xuXHRcdFx0XHRcdFx0XHRcdHBnLndpa2kudGl0bGViYXNlICsgbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbcGcubnNTcGVjaWFsSWRdXG5cdFx0XHRcdFx0XHRcdH06Q29udHJpYnV0aW9ucyZ0YXJnZXQ9JHtuZXcgVGl0bGUodXNlcikudXJsU3RyaW5nKCl9YFxuXHRcdFx0XHRcdFx0OiBgJHtwZy53aWtpLnRpdGxlYmFzZSArIG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zVXNlcklkXX06JHtuZXcgVGl0bGUoXG5cdFx0XHRcdFx0XHRcdFx0dXNlclxuXHRcdFx0XHRcdFx0XHQpLnVybFN0cmluZygpfWA7XG5cdFx0XHRcdFx0Y29sM3R4dCA9IHBnLmVzY2FwZVF1b3Rlc0hUTUwodXNlcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGh0bWwucHVzaChgPHRkPiR7cmVhbGx5Q29udHJpYnMgPyBtaW5vciA6ICcnfTxhIGhyZWY9XCIke2NvbDN1cmx9XCI+JHtjb2wzdHh0fTwvYT48L3RkPmApO1xuXHRcdFx0bGV0IGNvbW1lbnQgPSAnJztcblx0XHRcdGNvbnN0IGMgPSBlbGVtZW50LmNvbW1lbnQgfHwgZWxlbWVudC5jb250ZW50O1xuXHRcdFx0aWYgKGMpIHtcblx0XHRcdFx0Y29tbWVudCA9IG5ldyBQcmV2aWV3bWFrZXIoYywgbmV3IFRpdGxlKGN1cmFydCkudG9VcmwoKSkuZWRpdFN1bW1hcnlQcmV2aWV3KCk7XG5cdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQuY29tbWVudGhpZGRlbikge1xuXHRcdFx0XHRjb21tZW50ID0gcG9wdXBTdHJpbmcoJ3JldmRlbCcpO1xuXHRcdFx0fVxuXHRcdFx0aHRtbC5wdXNoKGA8dGQ+JHtyZWFsbHlDb250cmlicyA/ICcnIDogbWlub3J9JHtjb21tZW50fTwvdGQ+YCwgJzwvdHI+Jyk7XG5cdFx0XHRodG1sID0gW2h0bWwuam9pbignJyldO1xuXHRcdH1cblx0XHRodG1sLnB1c2goJzwvdGFibGU+Jyk7XG5cdFx0cmV0dXJuIGh0bWwuam9pbignJyk7XG5cdH07XG5cdGNvbnN0IGFkanVzdERhdGUgPSAoZCwgb2Zmc2V0KSA9PiB7XG5cdFx0Ly8gb2Zmc2V0IGlzIGluIG1pbnV0ZXNcblx0XHRjb25zdCBvID0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuXHRcdHJldHVybiBuZXcgRGF0ZSgrZCArIG8pO1xuXHR9O1xuXHQvKipcblx0ICogVGhpcyByZWxpZXMgb24gdGhlIERhdGUgcGFyc2VyIHVuZGVyc3RhbmRpbmcgZW4tVVMgZGF0ZXMsXG5cdCAqIHdoaWNoIGlzIHByZXR0eSBzYWZlIGFzc3VtcHRpb24sIGJ1dCBub3QgcGVyZmVjdC5cblx0ICpcblx0ICogQHBhcmFtIHtEYXRlfSBkYXRlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lWm9uZVxuXHQgKi9cblx0Y29uc3QgY29udmVydFRpbWVab25lID0gKGRhdGUsIHRpbWVab25lKSA9PiB7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKGRhdGUudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge3RpbWVab25lfSkpO1xuXHR9O1xuXHRjb25zdCBmb3JtYXR0ZWREYXRlVGltZSA9IChkYXRlKSA9PiB7XG5cdFx0Ly8gZmFsbGJhY2sgZm9yIElFMTEgYW5kIHVua25vd24gdGltZXpvbmVzXG5cdFx0aWYgKHVzZVRpbWVPZmZzZXQoKSkge1xuXHRcdFx0cmV0dXJuIGAke2Zvcm1hdHRlZERhdGUoZGF0ZSl9ICR7Zm9ybWF0dGVkVGltZShkYXRlKX1gO1xuXHRcdH1cblx0XHRpZiAoZ2V0TVdEYXRlRm9ybWF0KCkgPT09ICdJU08gODYwMScpIHtcblx0XHRcdGNvbnN0IGQyID0gY29udmVydFRpbWVab25lKGRhdGUsIGdldFRpbWVab25lKCkpO1xuXHRcdFx0cmV0dXJuIGAke21hcCh6ZXJvRmlsbCwgW2QyLmdldEZ1bGxZZWFyKCksIGQyLmdldE1vbnRoKCkgKyAxLCBkMi5nZXREYXRlKCldKS5qb2luKCctJyl9VCR7bWFwKHplcm9GaWxsLCBbXG5cdFx0XHRcdGQyLmdldEhvdXJzKCksXG5cdFx0XHRcdGQyLmdldE1pbnV0ZXMoKSxcblx0XHRcdFx0ZDIuZ2V0U2Vjb25kcygpLFxuXHRcdFx0XSkuam9pbignOicpfWA7XG5cdFx0fVxuXHRcdGNvbnN0IG9wdGlvbnMgPSBnZXRWYWx1ZU9mKCdwb3B1cERhdGVUaW1lRm9ybWF0dGVyT3B0aW9ucycpO1xuXHRcdG9wdGlvbnMudGltZVpvbmUgPSBnZXRUaW1lWm9uZSgpO1xuXHRcdHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKGdldExvY2FsZXMoKSwgb3B0aW9ucyk7XG5cdH07XG5cdGNvbnN0IGZvcm1hdHRlZERhdGUgPSAoZGF0ZSkgPT4ge1xuXHRcdGxldCBkMjtcblx0XHQvLyBmYWxsYmFjayBmb3IgSUUxMSBhbmQgdW5rbm93biB0aW1lem9uZXNcblx0XHRpZiAodXNlVGltZU9mZnNldCgpKSB7XG5cdFx0XHQvLyB3ZSBhZGp1c3QgdGhlIFVUQyB0aW1lLCBzbyB3ZSBwcmludCB0aGUgYWRqdXN0ZWQgVVRDLCBidXQgbm90IHJlYWxseSBVVEMgdmFsdWVzXG5cdFx0XHRkMiA9IGFkanVzdERhdGUoZGF0ZSwgZ2V0VGltZU9mZnNldCgpKTtcblx0XHRcdHJldHVybiBtYXAoemVyb0ZpbGwsIFtkMi5nZXRVVENGdWxsWWVhcigpLCBkMi5nZXRVVENNb250aCgpICsgMSwgZDIuZ2V0VVRDRGF0ZSgpXSkuam9pbignLScpO1xuXHRcdH1cblx0XHRpZiAoZ2V0TVdEYXRlRm9ybWF0KCkgPT09ICdJU08gODYwMScpIHtcblx0XHRcdGQyID0gY29udmVydFRpbWVab25lKGRhdGUsIGdldFRpbWVab25lKCkpO1xuXHRcdFx0cmV0dXJuIG1hcCh6ZXJvRmlsbCwgW2QyLmdldEZ1bGxZZWFyKCksIGQyLmdldE1vbnRoKCkgKyAxLCBkMi5nZXREYXRlKCldKS5qb2luKCctJyk7XG5cdFx0fVxuXHRcdGNvbnN0IG9wdGlvbnMgPSBnZXRWYWx1ZU9mKCdwb3B1cERhdGVGb3JtYXR0ZXJPcHRpb25zJyk7XG5cdFx0b3B0aW9ucy50aW1lWm9uZSA9IGdldFRpbWVab25lKCk7XG5cdFx0cmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKGdldExvY2FsZXMoKSwgb3B0aW9ucyk7XG5cdH07XG5cdGNvbnN0IGZvcm1hdHRlZFRpbWUgPSAoZGF0ZSkgPT4ge1xuXHRcdGxldCBkMjtcblx0XHQvLyBmYWxsYmFjayBmb3IgSUUxMSBhbmQgdW5rbm93biB0aW1lem9uZXNcblx0XHRpZiAodXNlVGltZU9mZnNldCgpKSB7XG5cdFx0XHQvLyB3ZSBhZGp1c3QgdGhlIFVUQyB0aW1lLCBzbyB3ZSBwcmludCB0aGUgYWRqdXN0ZWQgVVRDLCBidXQgbm90IHJlYWxseSBVVEMgdmFsdWVzXG5cdFx0XHRkMiA9IGFkanVzdERhdGUoZGF0ZSwgZ2V0VGltZU9mZnNldCgpKTtcblx0XHRcdHJldHVybiBtYXAoemVyb0ZpbGwsIFtkMi5nZXRVVENIb3VycygpLCBkMi5nZXRVVENNaW51dGVzKCksIGQyLmdldFVUQ1NlY29uZHMoKV0pLmpvaW4oJzonKTtcblx0XHR9XG5cdFx0aWYgKGdldE1XRGF0ZUZvcm1hdCgpID09PSAnSVNPIDg2MDEnKSB7XG5cdFx0XHRkMiA9IGNvbnZlcnRUaW1lWm9uZShkYXRlLCBnZXRUaW1lWm9uZSgpKTtcblx0XHRcdHJldHVybiBtYXAoemVyb0ZpbGwsIFtkMi5nZXRIb3VycygpLCBkMi5nZXRNaW51dGVzKCksIGQyLmdldFNlY29uZHMoKV0pLmpvaW4oJzonKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3B0aW9ucyA9IGdldFZhbHVlT2YoJ3BvcHVwVGltZUZvcm1hdHRlck9wdGlvbnMnKTtcblx0XHRvcHRpb25zLnRpbWVab25lID0gZ2V0VGltZVpvbmUoKTtcblx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoZ2V0TG9jYWxlcygpLCBvcHRpb25zKTtcblx0fTtcblx0Ly8gR2V0IHRoZSBwcm9wZXIgZ3JvdXBuYW1lcyBmb3IgdGhlIHRlY2huaWNhbGdyb3Vwc1xuXHRjb25zdCBmZXRjaFVzZXJHcm91cE5hbWVzID0gKHVzZXJpbmZvUmVzcG9uc2UpID0+IHtcblx0XHRjb25zdCBxdWVyeU9iaiA9IGdldEpzT2JqKHVzZXJpbmZvUmVzcG9uc2UpLnF1ZXJ5O1xuXHRcdGNvbnN0IHVzZXIgPSBhbnlDaGlsZChxdWVyeU9iai51c2Vycyk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSBbXTtcblx0XHRpZiAodXNlci5ncm91cHMpIHtcblx0XHRcdGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIHVzZXIuZ3JvdXBzKSB7XG5cdFx0XHRcdGlmICghWycqJywgJ3VzZXInLCAnYXV0b2NvbmZpcm1lZCddLmluY2x1ZGVzKGdyb3VwTmFtZSkpIHtcblx0XHRcdFx0XHRtZXNzYWdlcy5wdXNoKGBncm91cC0ke2dyb3VwTmFtZX0tbWVtYmVyYCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHF1ZXJ5T2JqLmdsb2JhbHVzZXJpbmZvICYmIHF1ZXJ5T2JqLmdsb2JhbHVzZXJpbmZvLmdyb3Vwcykge1xuXHRcdFx0Zm9yIChjb25zdCBncm91cE5hbWUgb2YgcXVlcnlPYmouZ2xvYmFsdXNlcmluZm8uZ3JvdXBzKSB7XG5cdFx0XHRcdG1lc3NhZ2VzLnB1c2goYGdyb3VwLSR7Z3JvdXBOYW1lfS1tZW1iZXJgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGdldE13QXBpKCkubG9hZE1lc3NhZ2VzSWZNaXNzaW5nKG1lc3NhZ2VzKTtcblx0fTtcblx0Y29uc3Qgc2hvd0FQSVByZXZpZXcgPSAocXVlcnlUeXBlLCBodG1sLCBpZCwgbmF2cG9wLCBkb3dubG9hZCkgPT4ge1xuXHRcdC8vIERKOiBkb25lXG5cdFx0bGV0IHRhcmdldCA9ICdwb3B1cFByZXZpZXcnO1xuXHRcdGNvbXBsZXRlZE5hdnBvcFRhc2sobmF2cG9wKTtcblx0XHRzd2l0Y2ggKHF1ZXJ5VHlwZSkge1xuXHRcdFx0Y2FzZSAnaW1hZ2VsaW5rcyc6XG5cdFx0XHRjYXNlICdjYXRlZ29yeSc6XG5cdFx0XHRcdHRhcmdldCA9ICdwb3B1cFBvc3RQcmV2aWV3Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VyaW5mbyc6XG5cdFx0XHRcdHRhcmdldCA9ICdwb3B1cFVzZXJEYXRhJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdyZXZpc2lvbic6XG5cdFx0XHRcdGluc2VydFByZXZpZXcoZG93bmxvYWQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHNldFBvcHVwVGlwc0FuZEhUTUwoaHRtbCwgdGFyZ2V0LCBpZCk7XG5cdH07XG5cdGNvbnN0IEFQSXJldmlzaW9uUHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzT2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBwYWdlID0gYW55Q2hpbGQoanNPYmoucXVlcnkucGFnZXMpO1xuXHRcdFx0aWYgKHBhZ2UubWlzc2luZykge1xuXHRcdFx0XHQvLyBUT0RPIHdlIG5lZWQgdG8gZml4IHRoaXMgcHJvcGVyIGxhdGVyIG9uXG5cdFx0XHRcdGRvd25sb2FkLm93bmVyID0gbnVsbDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY29udGVudCA9XG5cdFx0XHRcdHBhZ2UgJiYgcGFnZS5yZXZpc2lvbnMgJiYgcGFnZS5yZXZpc2lvbnNbMF0uY29udGVudG1vZGVsID09PSAnd2lraXRleHQnXG5cdFx0XHRcdFx0PyBwYWdlLnJldmlzaW9uc1swXS5jb250ZW50XG5cdFx0XHRcdFx0OiBudWxsO1xuXHRcdFx0aWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRkb3dubG9hZC5kYXRhID0gY29udGVudDtcblx0XHRcdFx0ZG93bmxvYWQubGFzdE1vZGlmaWVkID0gbmV3IERhdGUocGFnZS5yZXZpc2lvbnNbMF0udGltZXN0YW1wKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiAnUmV2aXNpb24gcHJldmlldyBmYWlsZWQgOignO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgQVBJYmFja2xpbmtzUHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkIC8qICwgbmF2cG9wICovKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzT2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBsaXN0ID0ganNPYmoucXVlcnkuYmFja2xpbmtzO1xuXHRcdFx0bGV0IGh0bWwgPSBbXTtcblx0XHRcdGlmICghbGlzdCkge1xuXHRcdFx0XHRyZXR1cm4gcG9wdXBTdHJpbmcoJ05vIGJhY2tsaW5rcyBmb3VuZCcpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGxpc3QpIHtcblx0XHRcdFx0Y29uc3QgdCA9IG5ldyBUaXRsZShlbGVtZW50LnRpdGxlKTtcblx0XHRcdFx0aHRtbC5wdXNoKGA8YSBocmVmPVwiJHtwZy53aWtpLnRpdGxlYmFzZX0ke3QudXJsU3RyaW5nKCl9XCI+JHt0LnRvU3RyaW5nKCkuZW50aWZ5KCl9PC9hPmApO1xuXHRcdFx0fVxuXHRcdFx0aHRtbCA9IGh0bWwuam9pbignLCAnKTtcblx0XHRcdGlmIChqc09iai5jb250aW51ZSAmJiBqc09iai5jb250aW51ZS5ibGNvbnRpbnVlKSB7XG5cdFx0XHRcdGh0bWwgKz0gcG9wdXBTdHJpbmcoJyBhbmQgbW9yZScpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGh0bWw7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gJ2JhY2tsaW5rc1ByZXZpZXdIVE1MIHdlbnQgd29ua3knO1xuXHRcdH1cblx0fTtcblx0cGcuZm4uQVBJc2hhcmVkSW1hZ2VQYWdlUHJldmlld0hUTUwgPSAob2JqKSA9PiB7XG5cdFx0bG9nKCdBUElzaGFyZWRJbWFnZVBhZ2VQcmV2aWV3SFRNTCcpO1xuXHRcdGNvbnN0IHBvcHVwaWQgPSBvYmoucmVxdWVzdGlkO1xuXHRcdGlmIChvYmoucXVlcnkgJiYgb2JqLnF1ZXJ5LnBhZ2VzKSB7XG5cdFx0XHRjb25zdCBwYWdlID0gYW55Q2hpbGQob2JqLnF1ZXJ5LnBhZ2VzKTtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPVxuXHRcdFx0XHRwYWdlICYmIHBhZ2UucmV2aXNpb25zICYmIHBhZ2UucmV2aXNpb25zWzBdLmNvbnRlbnRtb2RlbCA9PT0gJ3dpa2l0ZXh0J1xuXHRcdFx0XHRcdD8gcGFnZS5yZXZpc2lvbnNbMF0uY29udGVudFxuXHRcdFx0XHRcdDogbnVsbDtcblx0XHRcdGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycgJiYgcGcgJiYgcGcuY3VycmVudCAmJiBwZy5jdXJyZW50LmxpbmsgJiYgcGcuY3VycmVudC5saW5rLm5hdnBvcHVwKSB7XG5cdFx0XHRcdC8qIE5vdCBlbnRpcmVseSBzYWZlLCBidXQgdGhlIGJlc3Qgd2UgY2FuIGRvICovXG5cdFx0XHRcdGNvbnN0IHAgPSBuZXcgUHJldmlld21ha2VyKGNvbnRlbnQsIHBnLmN1cnJlbnQubGluay5uYXZwb3B1cC5hcnRpY2xlLCBwZy5jdXJyZW50LmxpbmsubmF2cG9wdXApO1xuXHRcdFx0XHRwLm1ha2VQcmV2aWV3KCk7XG5cdFx0XHRcdHNldFBvcHVwSFRNTChwLmh0bWwsICdwb3B1cFNlY29uZFByZXZpZXcnLCBwb3B1cGlkKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGNvbnN0IEFQSWltYWdlcGFnZVByZXZpZXdIVE1MID0gKGFydGljbGUsIGRvd25sb2FkLCBuYXZwb3ApID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QganNPYmogPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKTtcblx0XHRcdGNvbnN0IHBhZ2UgPSBhbnlDaGlsZChqc09iai5xdWVyeS5wYWdlcyk7XG5cdFx0XHRjb25zdCBjb250ZW50ID1cblx0XHRcdFx0cGFnZSAmJiBwYWdlLnJldmlzaW9ucyAmJiBwYWdlLnJldmlzaW9uc1swXS5jb250ZW50bW9kZWwgPT09ICd3aWtpdGV4dCdcblx0XHRcdFx0XHQ/IHBhZ2UucmV2aXNpb25zWzBdLmNvbnRlbnRcblx0XHRcdFx0XHQ6IG51bGw7XG5cdFx0XHRsZXQgcmV0ID0gJyc7XG5cdFx0XHRsZXQgYWx0ID0gJyc7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRbe2FsdH1dID0gbmF2cG9wLnBhcmVudEFuY2hvci5jaGlsZE5vZGVzO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8qIGVtcHR5ICovXG5cdFx0XHR9XG5cdFx0XHRpZiAoYWx0KSB7XG5cdFx0XHRcdHJldCA9IGAke3JldH08aHI+PGI+JHtwb3B1cFN0cmluZygnQWx0IHRleHQ6Jyl9PC9iPiAke3BnLmVzY2FwZVF1b3Rlc0hUTUwoYWx0KX1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRjb25zdCBwID0gcHJlcFByZXZpZXdtYWtlcihjb250ZW50LCBhcnRpY2xlLCBuYXZwb3ApO1xuXHRcdFx0XHRwLm1ha2VQcmV2aWV3KCk7XG5cdFx0XHRcdGlmIChwLmh0bWwpIHtcblx0XHRcdFx0XHRyZXQgKz0gYDxocj4ke3AuaHRtbH1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFN1bW1hcnlEYXRhJykpIHtcblx0XHRcdFx0XHRjb25zdCBpbmZvID0gZ2V0UGFnZUluZm8oY29udGVudCwgZG93bmxvYWQpO1xuXHRcdFx0XHRcdGxvZyhpbmZvKTtcblx0XHRcdFx0XHRzZXRQb3B1cFRyYWlsZXIoaW5mbywgbmF2cG9wLmlkTnVtYmVyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHBhZ2UgJiYgcGFnZS5pbWFnZXJlcG9zaXRvcnkgPT09ICdzaGFyZWQnKSB7XG5cdFx0XHRcdGNvbnN0IGFydCA9IG5ldyBUaXRsZShhcnRpY2xlKTtcblx0XHRcdFx0Y29uc3QgZW5jYXJ0ID0gZW5jb2RlVVJJQ29tcG9uZW50KGBGaWxlOiR7YXJ0LnN0cmlwTmFtZXNwYWNlKCl9YCk7XG5cdFx0XHRcdGNvbnN0IHNoYXJlZF91cmwgPVxuXHRcdFx0XHRcdGAke3BnLndpa2kuYXBpY29tbW9uc2Jhc2V9P2Zvcm1hdD1qc29uJmZvcm1hdHZlcnNpb249MmAgK1xuXHRcdFx0XHRcdCcmY2FsbGJhY2s9cGcuZm4uQVBJc2hhcmVkSW1hZ2VQYWdlUHJldmlld0hUTUwnICtcblx0XHRcdFx0XHRgJnJlcXVlc3RpZD0ke25hdnBvcC5pZE51bWJlcn0mYWN0aW9uPXF1ZXJ5JnByb3A9cmV2aXNpb25zJnJ2cHJvcD1jb250ZW50JnRpdGxlcz0ke2VuY2FydH1gO1xuXHRcdFx0XHRyZXQgPSBgJHtyZXR9PGhyPiR7cG9wdXBTdHJpbmcoJ0ltYWdlIGZyb20gQ29tbW9ucycpfTogPGEgaHJlZj1cIiR7XG5cdFx0XHRcdFx0cGcud2lraS5jb21tb25zYmFzZVxuXHRcdFx0XHR9P3RpdGxlPSR7ZW5jYXJ0fVwiPiR7cG9wdXBTdHJpbmcoJ0Rlc2NyaXB0aW9uIHBhZ2UnKX08L2E+YDtcblx0XHRcdFx0bXcubG9hZGVyLmxvYWQoc2hhcmVkX3VybCk7XG5cdFx0XHR9XG5cdFx0XHRzaG93QVBJUHJldmlldygnaW1hZ2VsaW5rcycsIEFQSWltYWdlbGlua3NQcmV2aWV3SFRNTChhcnRpY2xlLCBkb3dubG9hZCksIG5hdnBvcC5pZE51bWJlciwgZG93bmxvYWQpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiAnQVBJIGltYWdlcGFnZSBwcmV2aWV3IGZhaWxlZCA6KCc7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBBUElpbWFnZWxpbmtzUHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzb2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBsaXN0ID0ganNvYmoucXVlcnkuaW1hZ2V1c2FnZTtcblx0XHRcdGlmIChsaXN0KSB7XG5cdFx0XHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgbGlzdCkge1xuXHRcdFx0XHRcdHJldC5wdXNoKGVsZW1lbnQudGl0bGUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyZXQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBvcHVwU3RyaW5nKCdObyBpbWFnZSBsaW5rcyBmb3VuZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBgPGgyPiR7cG9wdXBTdHJpbmcoJ0ZpbGUgbGlua3MnKX08L2gyPiR7bGlua0xpc3QocmV0KX1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBvcHVwU3RyaW5nKCdObyBpbWFnZSBsaW5rcyBmb3VuZCcpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuICdJbWFnZSBsaW5rcyBwcmV2aWV3IGdlbmVyYXRpb24gZmFpbGVkIDooJztcblx0XHR9XG5cdH07XG5cdGNvbnN0IEFQSWNhdGVnb3J5UHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzb2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBsaXN0ID0ganNvYmoucXVlcnkuY2F0ZWdvcnltZW1iZXJzO1xuXHRcdFx0bGV0IHJldCA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGxpc3QpIHtcblx0XHRcdFx0cmV0LnB1c2goZWxlbWVudC50aXRsZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmV0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gcG9wdXBTdHJpbmcoJ0VtcHR5IGNhdGVnb3J5Jyk7XG5cdFx0XHR9XG5cdFx0XHRyZXQgPSBgPGgyPiR7dHByaW50ZignQ2F0ZWdvcnkgbWVtYmVycyAoJXMgc2hvd24pJywgW3JldC5sZW5ndGhdKX08L2gyPiR7bGlua0xpc3QocmV0KX1gO1xuXHRcdFx0aWYgKGpzb2JqLmNvbnRpbnVlICYmIGpzb2JqLmNvbnRpbnVlLmNtY29udGludWUpIHtcblx0XHRcdFx0cmV0ICs9IHBvcHVwU3RyaW5nKCcgYW5kIG1vcmUnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gJ0NhdGVnb3J5IHByZXZpZXcgZmFpbGVkIDooJztcblx0XHR9XG5cdH07XG5cdGNvbnN0IEFQSXVzZXJJbmZvUHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkKSA9PiB7XG5cdFx0bGV0IHJldCA9IFtdO1xuXHRcdGxldCBxdWVyeW9iaiA9IHt9O1xuXHRcdHRyeSB7XG5cdFx0XHRxdWVyeW9iaiA9IGdldEpzT2JqKGRvd25sb2FkLmRhdGEpLnF1ZXJ5O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuICdVc2VyaW5mbyBwcmV2aWV3IGZhaWxlZCA6KCc7XG5cdFx0fVxuXHRcdGNvbnN0IHVzZXIgPSBhbnlDaGlsZChxdWVyeW9iai51c2Vycyk7XG5cdFx0aWYgKHVzZXIpIHtcblx0XHRcdGNvbnN0IHtnbG9iYWx1c2VyaW5mb30gPSBxdWVyeW9iajtcblx0XHRcdGlmICh1c2VyLmludmFsaWQgPT09ICcnKSB7XG5cdFx0XHRcdHJldC5wdXNoKHBvcHVwU3RyaW5nKCdJbnZhbGlkIHVzZXInKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHVzZXIubWlzc2luZyA9PT0gJycpIHtcblx0XHRcdFx0cmV0LnB1c2gocG9wdXBTdHJpbmcoJ05vdCBhIHJlZ2lzdGVyZWQgdXNlcm5hbWUnKSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodXNlci5ibG9ja2VkYnkpIHtcblx0XHRcdFx0aWYgKHVzZXIuYmxvY2twYXJ0aWFsKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goYDxiPiR7cG9wdXBTdHJpbmcoJ0hhcyBibG9ja3MnKX08L2I+YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goYDxiPiR7cG9wdXBTdHJpbmcoJ0JMT0NLRUQnKX08L2I+YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChnbG9iYWx1c2VyaW5mbyAmJiAoJ2xvY2tlZCcgaW4gZ2xvYmFsdXNlcmluZm8gfHwgJ2hpZGRlbicgaW4gZ2xvYmFsdXNlcmluZm8pKSB7XG5cdFx0XHRcdGxldCBsb2NrZWRTdWxBY2NvdW50SXNBdHRhY2hlZFRvVGhpcyA9IHRydWU7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBnbG9iYWx1c2VyaW5mby51bmF0dGFjaGVkICYmIGkgPCBnbG9iYWx1c2VyaW5mby51bmF0dGFjaGVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKGdsb2JhbHVzZXJpbmZvLnVuYXR0YWNoZWRbaV0ud2lraSA9PT0gbXcuY29uZmlnLmdldCgnd2dEQm5hbWUnKSkge1xuXHRcdFx0XHRcdFx0bG9ja2VkU3VsQWNjb3VudElzQXR0YWNoZWRUb1RoaXMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobG9ja2VkU3VsQWNjb3VudElzQXR0YWNoZWRUb1RoaXMpIHtcblx0XHRcdFx0XHRpZiAoJ2xvY2tlZCcgaW4gZ2xvYmFsdXNlcmluZm8pIHtcblx0XHRcdFx0XHRcdHJldC5wdXNoKGA8Yj48aT4ke3BvcHVwU3RyaW5nKCdMT0NLRUQnKX08L2k+PC9iPmApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoJ2hpZGRlbicgaW4gZ2xvYmFsdXNlcmluZm8pIHtcblx0XHRcdFx0XHRcdHJldC5wdXNoKGA8Yj48aT4ke3BvcHVwU3RyaW5nKCdISURERU4nKX08L2k+PC9iPmApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwU2hvd0dlbmRlcicpICYmIHVzZXIuZ2VuZGVyKSB7XG5cdFx0XHRcdHN3aXRjaCAodXNlci5nZW5kZXIpIHtcblx0XHRcdFx0XHRjYXNlICdtYWxlJzpcblx0XHRcdFx0XHRcdHJldC5wdXNoKGAke3BvcHVwU3RyaW5nKCdoZS9oaW0nKX0gwrcgYCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmZW1hbGUnOlxuXHRcdFx0XHRcdFx0cmV0LnB1c2goYCR7cG9wdXBTdHJpbmcoJ3NoZS9oZXInKX0gwrcgYCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHVzZXIuZ3JvdXBzKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIHVzZXIuZ3JvdXBzKSB7XG5cdFx0XHRcdFx0aWYgKCFbJyonLCAndXNlcicsICdhdXRvY29uZmlybWVkJ10uaW5jbHVkZXMoZ3JvdXBOYW1lKSkge1xuXHRcdFx0XHRcdFx0Ly8gTWVzc2FnZXMgdGhhdCBjYW4gYmUgdXNlZCBoZXJlOlxuXHRcdFx0XHRcdFx0Ly8gKiBzZWUgW1tTcGVjaWFsOlByZWZpeEluZGV4L01lZGlhV2lraTpHcm91cC1dXVxuXHRcdFx0XHRcdFx0Ly8gKiBmb3IgbW9yZSBpbmZvcm1hdGlvblxuXHRcdFx0XHRcdFx0cmV0LnB1c2gocGcuZXNjYXBlUXVvdGVzSFRNTChtdy5tZXNzYWdlKGBncm91cC0ke2dyb3VwTmFtZX0tbWVtYmVyYCwgdXNlci5nZW5kZXIpLnRleHQoKSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGdsb2JhbHVzZXJpbmZvICYmIGdsb2JhbHVzZXJpbmZvLmdyb3Vwcykge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGdyb3VwTmFtZSBvZiBnbG9iYWx1c2VyaW5mby5ncm91cHMpIHtcblx0XHRcdFx0XHRyZXQucHVzaChcblx0XHRcdFx0XHRcdC8vIE1lc3NhZ2VzIHRoYXQgY2FuIGJlIHVzZWQgaGVyZTpcblx0XHRcdFx0XHRcdC8vICogc2VlIFtbU3BlY2lhbDpQcmVmaXhJbmRleC9NZWRpYVdpa2k6R3JvdXAtXV1cblx0XHRcdFx0XHRcdC8vICogZm9yIG1vcmUgaW5mb3JtYXRpb25cblx0XHRcdFx0XHRcdGA8aT4ke3BnLmVzY2FwZVF1b3Rlc0hUTUwobXcubWVzc2FnZShgZ3JvdXAtJHtncm91cE5hbWV9LW1lbWJlcmAsIHVzZXIuZ2VuZGVyKS50ZXh0KCkpfTwvaT5gXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHVzZXIucmVnaXN0cmF0aW9uKSB7XG5cdFx0XHRcdHJldC5wdXNoKFxuXHRcdFx0XHRcdHBnLmVzY2FwZVF1b3Rlc0hUTUwoXG5cdFx0XHRcdFx0XHQodXNlci5lZGl0Y291bnQgPz8gJzAnKSArXG5cdFx0XHRcdFx0XHRcdHBvcHVwU3RyaW5nKCcgZWRpdHMgc2luY2U6ICcpICtcblx0XHRcdFx0XHRcdFx0KHVzZXIucmVnaXN0cmF0aW9uID8gZm9ybWF0dGVkRGF0ZShuZXcgRGF0ZSh1c2VyLnJlZ2lzdHJhdGlvbikpIDogJycpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAocXVlcnlvYmoudXNlcmNvbnRyaWJzICYmIHF1ZXJ5b2JqLnVzZXJjb250cmlicy5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXQucHVzaChwb3B1cFN0cmluZygnbGFzdCBlZGl0IG9uICcpICsgZm9ybWF0dGVkRGF0ZShuZXcgRGF0ZShxdWVyeW9iai51c2VyY29udHJpYnNbMF0udGltZXN0YW1wKSkpO1xuXHRcdH1cblx0XHRpZiAocXVlcnlvYmouYmxvY2tzKSB7XG5cdFx0XHRyZXQucHVzaChwb3B1cFN0cmluZygnSVAgdXNlcicpKTsgLy8gd2Ugb25seSByZXF1ZXN0IGxpc3Q9YmxvY2tzIGZvciBJUHNcblx0XHRcdGZvciAobGV0IGwgPSAwOyBsIDwgcXVlcnlvYmouYmxvY2tzLmxlbmd0aDsgbCsrKSB7XG5cdFx0XHRcdGxldCByYnN0ciA9IHF1ZXJ5b2JqLmJsb2Nrc1tsXS5yYW5nZXN0YXJ0ID09PSBxdWVyeW9iai5ibG9ja3NbbF0ucmFuZ2VlbmQgPyAnQkxPQ0snIDogJ1JBTkdFQkxPQ0snO1xuXHRcdFx0XHRyYnN0ciA9IEFycmF5LmlzQXJyYXkocXVlcnlvYmouYmxvY2tzW2xdLnJlc3RyaWN0aW9ucykgPyBgJHtyYnN0cn1FRGAgOiBgSGFzICR7cmJzdHIudG9Mb3dlckNhc2UoKX1zYDtcblx0XHRcdFx0cmV0LnB1c2goYDxiPiR7cG9wdXBTdHJpbmcocmJzdHIpfTwvYj5gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gaWYgYW55IGVsZW1lbnQgb2YgcmV0IGVuZHMgd2l0aCAnIMK3ICcsIG1lcmdlIGl0IHdpdGggdGhlIG5leHQgZWxlbWVudCB0byBhdm9pZFxuXHRcdC8vIHRoZSAuam9pbignLCAnKSBjYWxsIGluc2VydGluZyBhIGNvbW1hIGFmdGVyIGl0XG5cdFx0Zm9yIChsZXQgbSA9IDA7IG0gPCByZXQubGVuZ3RoIC0gMTsgbSsrKSB7XG5cdFx0XHRpZiAocmV0W21dLmxlbmd0aCA+IDMgJiYgcmV0W21dLnNsaWNlKE1hdGgubWF4KDAsIHJldFttXS5sZW5ndGggLSAzKSkgPT09ICcgwrcgJykge1xuXHRcdFx0XHRyZXRbbV0gKz0gcmV0W20gKyAxXTtcblx0XHRcdFx0cmV0LnNwbGljZShtICsgMSwgMSk7IC8vIGRlbGV0ZSBlbGVtZW50IGF0IGluZGV4IG0rMVxuXHRcdFx0XHRtLS07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldCA9IGA8aHI+JHtyZXQuam9pbignLCAnKX1gO1xuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IEFQSWNvbnRyaWJzUHJldmlld0hUTUwgPSAoYXJ0aWNsZSwgZG93bmxvYWQsIG5hdnBvcCkgPT4ge1xuXHRcdHJldHVybiBBUEloaXN0b3J5UHJldmlld0hUTUwoYXJ0aWNsZSwgZG93bmxvYWQsIG5hdnBvcCwgdHJ1ZSk7XG5cdH07XG5cdGNvbnN0IEFQSWhpc3RvcnlQcmV2aWV3SFRNTCA9IChhcnRpY2xlLCBkb3dubG9hZCwgX25hdnBvcCwgcmVhbGx5Q29udHJpYnMpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QganNvYmogPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKTtcblx0XHRcdGxldCBlZGl0cyA9IFtdO1xuXHRcdFx0ZWRpdHMgPSByZWFsbHlDb250cmlicyA/IGpzb2JqLnF1ZXJ5LnVzZXJjb250cmlicyA6IGFueUNoaWxkKGpzb2JqLnF1ZXJ5LnBhZ2VzKS5yZXZpc2lvbnM7XG5cdFx0XHRjb25zdCByZXQgPSBlZGl0UHJldmlld1RhYmxlKGFydGljbGUsIGVkaXRzLCByZWFsbHlDb250cmlicyk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuICdIaXN0b3J5IHByZXZpZXcgZmFpbGVkIDotKCc7XG5cdFx0fVxuXHR9O1xuXHQvLyBFTkRGSUxFOiBxdWVyeXByZXZpZXcuanNcblx0Ly8gU1RBUlRGSUxFOiBkZWJ1Zy5qc1xuXHQvLyBEZWJ1Z2dpbmcgZnVuY3Rpb25zXG5cdGNvbnN0IHNldHVwRGVidWdnaW5nID0gKCkgPT4ge1xuXHRcdGlmICh3aW5kb3cucG9wdXBEZWJ1Zykge1xuXHRcdFx0Ly8gcG9wdXBEZWJ1ZyBpcyBzZXQgZnJvbSAudmVyc2lvblxuXHRcdFx0d2luZG93LmxvZyA9ICh4KSA9PiB7XG5cdFx0XHRcdC8vIGlmIChnIE1zZyAhPT0gJycpIHsgZ01zZyArPSAnXFxuJzsgZ01zZys9dGltZSgpICsgJyAnICsgeDsgfVxuXHRcdFx0XHRjb25zb2xlLmxvZyh4KTtcblx0XHRcdH07XG5cdFx0XHR3aW5kb3cuZXJybG9nID0gKHgpID0+IHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihgW1BvcHVwc10gJHt4fWApO1xuXHRcdFx0fTtcblx0XHRcdGxvZygnSW5pdGlhbGl6aW5nIGxvZ2dlcicpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aW5kb3cubG9nID0gKCkgPT4ge307XG5cdFx0XHR3aW5kb3cuZXJybG9nID0gKCkgPT4ge307XG5cdFx0fVxuXHR9O1xuXHQvLyBFTkRGSUxFOiBkZWJ1Zy5qc1xuXHQvLyBTVEFSVEZJTEU6IGltYWdlcy5qc1xuXHQvLyBsb2FkIGltYWdlIG9mIHR5cGUgVGl0bGUuXG5cdGNvbnN0IGxvYWRJbWFnZSA9IChpbWFnZSwgbmF2cG9wKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpbWFnZS5zdHJpcE5hbWVzcGFjZSAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkoJ2xvYWRJbWFnZXMgYmFkJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHR9XG5cdFx0Ly8gQVBJIGNhbGwgdG8gcmV0cmlldmUgaW1hZ2UgaW5mby5cblx0XHRpZiAoIWdldFZhbHVlT2YoJ3BvcHVwSW1hZ2VzJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKCFpc1ZhbGlkSW1hZ2VOYW1lKGltYWdlLnRvU3RyaW5nKCkpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IGFydCA9IGltYWdlLnVybFN0cmluZygpO1xuXHRcdGxldCB1cmwgPSBgJHtwZy53aWtpLmFwaXdpa2liYXNlfT9mb3JtYXQ9anNvbiZmb3JtYXR2ZXJzaW9uPTImYWN0aW9uPXF1ZXJ5YDtcblx0XHR1cmwgKz0gYCZwcm9wPWltYWdlaW5mbyZpaXByb3A9dXJsfG1pbWUmaWl1cmx3aWR0aD0ke2dldFZhbHVlT2YoJ3BvcHVwSW1hZ2VTaXplTGFyZ2UnKX1gO1xuXHRcdHVybCArPSBgJnRpdGxlcz0ke2FydH1gO1xuXHRcdHBlbmRpbmdOYXZwb3BUYXNrKG5hdnBvcCk7XG5cdFx0Y29uc3QgY2FsbGJhY2sgPSAoZCkgPT4ge1xuXHRcdFx0cG9wdXBzSW5zZXJ0SW1hZ2UobmF2cG9wLmlkTnVtYmVyLCBuYXZwb3AsIGQpO1xuXHRcdH07XG5cdFx0Y29uc3QgZ28gPSAoKSA9PiB7XG5cdFx0XHRnZXRQYWdlV2l0aENhY2hpbmcodXJsLCBjYWxsYmFjaywgbmF2cG9wKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdFx0aWYgKG5hdnBvcC52aXNpYmxlIHx8ICFnZXRWYWx1ZU9mKCdwb3B1cExhenlEb3dubG9hZHMnKSkge1xuXHRcdFx0Z28oKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2cG9wLmFkZEhvb2soZ28sICd1bmhpZGUnLCAnYWZ0ZXInLCAnRE9XTkxPQURfSU1BR0VfUVVFUllfREFUQScpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcG9wdXBzSW5zZXJ0SW1hZ2UgPSAoaWQsIF9uYXZwb3AsIGRvd25sb2FkKSA9PiB7XG5cdFx0bG9nKCdwb3B1cHNJbnNlcnRJbWFnZScpO1xuXHRcdGxldCBpbWFnZWluZm87XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzT2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBpbWFnZXBhZ2UgPSBhbnlDaGlsZChqc09iai5xdWVyeS5wYWdlcyk7XG5cdFx0XHRpZiAoaW1hZ2VwYWdlLmltYWdlaW5mbyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdFtpbWFnZWluZm9dID0gaW1hZ2VwYWdlLmltYWdlaW5mbztcblx0XHR9IGNhdGNoIHtcblx0XHRcdGxvZygncG9wdXBzSW5zZXJ0SW1hZ2UgZmFpbGVkIDooJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHBvcHVwSW1hZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjcG9wdXBJbWcke2lkfWApO1xuXHRcdGlmICghcG9wdXBJbWFnZSkge1xuXHRcdFx0bG9nKCdjb3VsZCBub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGltYWdlJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHBvcHVwSW1hZ2Uud2lkdGggPSBnZXRWYWx1ZU9mKCdwb3B1cEltYWdlU2l6ZScpO1xuXHRcdHBvcHVwSW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xuXHRcdC8vIFNldCB0aGUgc291cmNlIGZvciB0aGUgaW1hZ2UuXG5cdFx0aWYgKGltYWdlaW5mby50aHVtYnVybCkge1xuXHRcdFx0cG9wdXBJbWFnZS5zcmMgPSBpbWFnZWluZm8udGh1bWJ1cmw7XG5cdFx0fSBlbHNlIGlmIChpbWFnZWluZm8ubWltZS5pbmRleE9mKCdpbWFnZScpID09PSAwKSB7XG5cdFx0XHRwb3B1cEltYWdlLnNyYyA9IGltYWdlaW5mby51cmw7XG5cdFx0XHRsb2coJ2EgdGh1bWIgY291bGQgbm90IGJlIGZvdW5kLCB1c2luZyBvcmlnaW5hbCBpbWFnZScpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb2coXCJmdWxsc2l6ZSBpbWFnZXRodW1iLCBidXQgbm90IHN1cmUgaWYgaXQncyBhbiBpbWFnZVwiKTtcblx0XHR9XG5cdFx0Y29uc3QgYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNwb3B1cEltYWdlTGluayR7aWR9YCk7XG5cdFx0aWYgKGEgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHQvLyBEZXRlcm1pbmUgdGhlIGFjdGlvbiBvZiB0aGUgc3Vycm91ZGluZyBpbWFnZWxpbmsuXG5cdFx0c3dpdGNoIChnZXRWYWx1ZU9mKCdwb3B1cFRodW1iQWN0aW9uJykpIHtcblx0XHRcdGNhc2UgJ2ltYWdlcGFnZSc6XG5cdFx0XHRcdGlmIChwZy5jdXJyZW50LmFydGljbGUubmFtZXNwYWNlSWQoKSAhPT0gcGcubnNJbWFnZUlkKSB7XG5cdFx0XHRcdFx0YS5ocmVmID0gaW1hZ2VpbmZvLmRlc2NyaXB0aW9udXJsO1xuXHRcdFx0XHRcdC8vIEZJWE1FOiB1bnJlbGlhYmxlIHBnLmlkTnVtYmVyXG5cdFx0XHRcdFx0cG9wVGlwc1Nvb25GbihgcG9wdXBJbWFnZSR7aWR9YCkoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnc2l6ZXRvZ2dsZSc6XG5cdFx0XHRcdGEub25jbGljayA9IHRvZ2dsZVNpemU7XG5cdFx0XHRcdGEudGl0bGUgPSBwb3B1cFN0cmluZygnVG9nZ2xlIGltYWdlIHNpemUnKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0Y2FzZSAnbGlua2Z1bGwnOlxuXHRcdFx0XHRhLmhyZWYgPSBpbWFnZWluZm8udXJsO1xuXHRcdFx0XHRhLnRpdGxlID0gcG9wdXBTdHJpbmcoJ09wZW4gZnVsbC1zaXplIGltYWdlJyk7XG5cdFx0fVxuXHR9O1xuXHQvLyBUb2dnbGVzIHRoZSBpbWFnZSBiZXR3ZWVuIGlubGluZSBzbWFsbCBhbmQgbmF2cG9wIGZ1bGx3aWR0aC5cblx0Ly8gSXQncyB0aGUgc2FtZSBpbWFnZSwgbm8gYWN0dWFsIHNpemVjaGFuZ2Ugb2NjdXJzLCBvbmx5IGRpc3BsYXkgd2lkdGguXG5cdGNvbnN0IHRvZ2dsZVNpemUgPSBmdW5jdGlvbiB0b2dnbGVTaXplKCkge1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdGlmICghc2VsZikge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkoJ3NlbGYgaXMgbnVsbCA6LycsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnZXJyb3InfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGltZyA9IHNlbGYuZmlyc3RDaGlsZDtcblx0XHRpZiAoIWltZykge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkoJ2ltZyBpcyBudWxsIDovJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW1nLnN0eWxlLndpZHRoID0gIWltZy5zdHlsZS53aWR0aCB8fCBpbWcuc3R5bGUud2lkdGggPT09ICcnID8gJzEwMCUnIDogJyc7XG5cdH07XG5cdC8vIFJldHVybnMgb25lIHRpdGxlIG9mIGFuIGltYWdlIGZyb20gd2lraVRleHQuXG5cdGNvbnN0IGdldFZhbGlkSW1hZ2VGcm9tV2lraVRleHQgPSAod2lraVRleHQpID0+IHtcblx0XHQvLyBuYiBpbiBwZy5yZS5pbWFnZSB3ZSdyZSBpbnRlcmVzdGVkIGluIHRoZSBzZWNvbmQgYnJhY2tldGVkIGV4cHJlc3Npb25cblx0XHQvLyB0aGlzIG1heSBjaGFuZ2UgaWYgdGhlIHJlZ2V4IGNoYW5nZXMgOi0oXG5cdFx0Ly8gbGV0IG1hdGNoPXBnLnJlLmltYWdlLmV4ZWMod2lraVRleHQpO1xuXHRcdGxldCBtYXRjaGVkO1xuXHRcdGxldCBtYXRjaDtcblx0XHQvLyBzdHJpcCBodG1sIGNvbW1lbnRzLCB1c2VkIGJ5IGV2aWwgYm90cyA6LShcblx0XHRjb25zdCB0ID0gcmVtb3ZlTWF0Y2hlc1VubGVzcyh3aWtpVGV4dCwgLyg8IS0tW1xcU1xcc10qPy0tPikvLCAxLCAvXjwhLS1bXltdKnBvcHVwL2kpO1xuXHRcdHdoaWxlICgobWF0Y2ggPSBwZy5yZS5pbWFnZS5leGVjKHQpKSAhPT0gbnVsbCkge1xuXHRcdFx0Ly8gbm93IGZpbmQgYSBzYW5lIGltYWdlIG5hbWUgLSBleGNsdWRlIHRlbXBsYXRlcyBieSBzZWVraW5nIHtcblx0XHRcdGNvbnN0IG0gPSBtYXRjaFsyXSB8fCBtYXRjaFs2XTtcblx0XHRcdGlmIChpc1ZhbGlkSW1hZ2VOYW1lKG0pKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0cGcucmUuaW1hZ2UubGFzdEluZGV4ID0gMDtcblx0XHRpZiAoIW1hdGNoZWQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7bXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbcGcubnNJbWFnZUlkXX06JHt1cGNhc2VGaXJzdChtYXRjaGVkKX1gO1xuXHR9O1xuXHRjb25zdCByZW1vdmVNYXRjaGVzVW5sZXNzID0gKHN0ciwgcmUxLCBwYXJlbmNvdW50LCByZTIpID0+IHtcblx0XHRjb25zdCBzcGxpdCA9IHN0ci5zcGxpdChyZTEpO1xuXHRcdGNvbnN0IGMgPSBwYXJlbmNvdW50ICsgMTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAoaSAlIGMgPT09IDAgfHwgcmUyLnRlc3Qoc3BsaXRbaV0pKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0c3BsaXRbaV0gPSAnJztcblx0XHR9XG5cdFx0cmV0dXJuIHNwbGl0LmpvaW4oJycpO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBpbWFnZXMuanNcblx0Ly8gU1RBUlRGSUxFOiBuYW1lc3BhY2VzLmpzXG5cdC8vIFNldCB1cCBuYW1lc3BhY2VzIGFuZCBvdGhlciBub24tc3RyaW5ncy5qcyBsb2NhbGl6YXRpb25cblx0Ly8gKGN1cnJlbnRseSB0aGF0IG1lYW5zIHJlZGlycyB0b28pXG5cdGNvbnN0IHNldE5hbWVzcGFjZXMgPSAoKSA9PiB7XG5cdFx0cGcubnNTcGVjaWFsSWQgPSAtMTtcblx0XHRwZy5uc01haW5zcGFjZUlkID0gMDtcblx0XHRwZy5uc0ltYWdlSWQgPSA2O1xuXHRcdHBnLm5zVXNlcklkID0gMjtcblx0XHRwZy5uc1VzZXJ0YWxrSWQgPSAzO1xuXHRcdHBnLm5zQ2F0ZWdvcnlJZCA9IDE0O1xuXHRcdHBnLm5zVGVtcGxhdGVJZCA9IDEwO1xuXHR9O1xuXHRjb25zdCBzZXRSZWRpcnMgPSAoKSA9PiB7XG5cdFx0Y29uc3QgciA9ICdyZWRpcmVjdCc7XG5cdFx0Y29uc3QgUiA9ICdSRURJUkVDVCc7XG5cdFx0Y29uc3QgcmVkaXJMaXN0cyA9IHtcblx0XHRcdGFyOiBbUiwgJ9iq2K3ZiNmK2YQnXSxcblx0XHRcdGJlOiBbciwgJ9C/0LXRgNCw0L3QsNC60ZbRgNCw0LLQsNC90YzQvdC1J10sXG5cdFx0XHRiZzogW3IsICfQv9GA0LXQvdCw0YHQvtGH0LLQsNC90LUnLCAn0LLQuNC2J10sXG5cdFx0XHRiczogW3IsICdQcmV1c21qZXJpJywgJ3ByZXVzbWplcmknLCAnUFJFVVNNSkVSSSddLFxuXHRcdFx0Ym46IFtSLCAn4Kaq4KeB4Kao4Kaw4KeN4Kao4Ka/4Kaw4KeN4Kam4KeH4Ka2J10sXG5cdFx0XHRjczogW1IsICdQxZhFU03EmlJVSiddLFxuXHRcdFx0Y3k6IFtyLCAnYWlsLWN5ZmVpcmlvJ10sXG5cdFx0XHRkZTogW1IsICdXRUlURVJMRUlUVU5HJ10sXG5cdFx0XHRlbDogW1IsICfOkc6dzpHOms6RzqTOlc6lzpjOpc6dzqPOlyddLFxuXHRcdFx0ZW86IFtSLCAnQUxJRElSRUtUVScsICdBTElESVJFS1RJJ10sXG5cdFx0XHRlczogW1IsICdSRURJUkVDQ0nDk04nXSxcblx0XHRcdGV0OiBbciwgJ3N1dW5hJ10sXG5cdFx0XHRnYTogW3IsICdhdGhzaGVvbGFkaCddLFxuXHRcdFx0Z2w6IFtyLCAnUkVESVJFQ0NJw5NOJywgJ1JFRElSRUNJT05BTUVOVE8nXSxcblx0XHRcdGhlOiBbUiwgJ9eU16TXoNeZ15QnXSxcblx0XHRcdGh1OiBbUiwgJ8OBVElSw4FOWcONVMOBUyddLFxuXHRcdFx0aXM6IFtyLCAndGlsdsOtc3VuJywgJ1RJTFbDjVNVTiddLFxuXHRcdFx0aXQ6IFtSLCAnUklOVklBJywgJ1JpbnZpYSddLFxuXHRcdFx0amE6IFtSLCAn6Lui6YCBJ10sXG5cdFx0XHRtazogW3IsICfQv9GA0LXQvdCw0YHQvtGH0YPQstCw0ZrQtScsICfQstC40LTQuCddLFxuXHRcdFx0bmRzOiBbciwgJ3dpZWRlcmxlaWRlbiddLFxuXHRcdFx0J25kcy1ubCc6IFtSLCAnREVVUlZFUldJRVpJTkcnLCAnRFVVUlZFUldJRVpJTkcnXSxcblx0XHRcdG5sOiBbUiwgJ0RPT1JWRVJXSUpaSU5HJ10sXG5cdFx0XHRubjogW3IsICdvbWRpcmlnZXInXSxcblx0XHRcdHBsOiBbUiwgJ1BBVFJaJywgJ1BSWkVLSUVSVUonLCAnVEFNJ10sXG5cdFx0XHRwdDogW1IsICdyZWRpciddLFxuXHRcdFx0cnU6IFtSLCAn0J/QldCg0JXQndCQ0J/QoNCQ0JLQm9CV0J3QmNCVJywgJ9Cf0JXQoNCV0J3QkNCf0KAnXSxcblx0XHRcdHNrOiBbciwgJ3ByZXNtZXJ1aiddLFxuXHRcdFx0c3I6IFtyLCAn0J/RgNC10YPRgdC80LXRgNC4JywgJ9C/0YDQtdGD0YHQvNC10YDQuCcsICfQn9Cg0JXQo9Ch0JzQldCg0JgnLCAnUHJldXNtZXJpJywgJ3ByZXVzbWVyaScsICdQUkVVU01FUkknXSxcblx0XHRcdHR0OiBbUiwgJ3nDvG7DpGx0w7wnLCAn0L/QtdGA0LXQvdCw0L/RgNCw0LLQu9C10L3QuNC1JywgJ9C/0LXRgNC10L3QsNC/0YAnXSxcblx0XHRcdHVrOiBbUiwgJ9Cf0JXQoNCV0J3QkNCf0KDQkNCS0JvQldCd0J3QrycsICfQn9CV0KDQldCd0JDQn9CgJ10sXG5cdFx0XHR2aTogW3IsICfEkeG7lWknXSxcblx0XHRcdHlpOiBbUiwgJ9eV15XXmdeZ15jXoteo16TXmdeo158nXSxcblx0XHRcdHpoOiBbUiwgJ+mHjeWumuWQkSddLCAvLyBubyBjb21tYVxuXHRcdH07XG5cdFx0Y29uc3QgcmVkaXJMaXN0ID0gcmVkaXJMaXN0c1twZy53aWtpLmxhbmddIHx8IFtyLCBSXTtcblx0XHQvLyBNZWRpYXdpa2kgaXMgdmVyeSB0b2xlcmFudCBhYm91dCB3aGF0IGNvbWVzIGFmdGVyIHRoZSAjcmVkaXJlY3QgYXQgdGhlIHN0YXJ0XG5cdFx0cGcucmUucmVkaXJlY3QgPSBuZXcgUmVnRXhwKFxuXHRcdFx0YF5cXFxccypbI10oJHtyZWRpckxpc3Quam9pbignfCcpfSkuKj9cXFxcW3syfShbXlxcXFx8XFxcXF1dKikofFteXFxcXF1dKik/XFxcXF17Mn1cXFxccyooLiopYCxcblx0XHRcdCdpJ1xuXHRcdCk7XG5cdH07XG5cdGNvbnN0IHNldEludGVyd2lraSA9ICgpID0+IHtcblx0XHRpZiAocGcud2lraS53aWtpbWVkaWEpIHtcblx0XHRcdC8vIEZyb20ge0BsaW5rIGh0dHBzOi8vbWV0YS53aWtpbWVkaWEub3JnL3dpa2kvTGlzdF9vZl9XaWtpcGVkaWFzfVxuXHRcdFx0Ly8ge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93L2FwaS5waHA/YWN0aW9uPXNpdGVtYXRyaXgmZm9ybWF0PWpzb24mc210eXBlPWxhbmd1YWdlJnNtbGFuZ3Byb3A9Y29kZSZmb3JtYXR2ZXJzaW9uPTJ9XG5cdFx0XHRwZy53aWtpLmludGVyd2lraSA9XG5cdFx0XHRcdCdhYXxhYnxhY2V8YWZ8YWt8YWxzfGFtfGFufGFuZ3xhcnxhcmN8YXJ6fGFzfGFzdHxhdnxheXxhenxiYXxiYXJ8YmF0LXNtZ3xiY2x8YmV8YmUteC1vbGR8Ymd8Ymh8Yml8YmpufGJtfGJufGJvfGJweXxicnxic3xidWd8YnhyfGNhfGNiay16YW18Y2RvfGNlfGNlYnxjaHxjaG98Y2hyfGNoeXxja2J8Y298Y3J8Y3JofGNzfGNzYnxjdXxjdnxjeXxkYXxkZXxkaXF8ZHNifGR2fGR6fGVlfGVsfGVtbHxlbnxlb3xlc3xldHxldXxleHR8ZmF8ZmZ8Zml8Zml1LXZyb3xmanxmb3xmcnxmcnB8ZnJyfGZ1cnxmeXxnYXxnYWd8Z2FufGdkfGdsfGdsa3xnbnxnb3R8Z3V8Z3Z8aGF8aGFrfGhhd3xoZXxoaXxoaWZ8aG98aHJ8aHNifGh0fGh1fGh5fGh6fGlhfGlkfGllfGlnfGlpfGlrfGlsb3xpb3xpc3xpdHxpdXxqYXxqYm98anZ8a2F8a2FhfGthYnxrYmR8a2d8a2l8a2p8a2t8a2x8a218a258a298a29pfGtyfGtyY3xrc3xrc2h8a3V8a3Z8a3d8a3l8bGF8bGFkfGxifGxiZXxsZ3xsaXxsaWp8bG1vfGxufGxvfGx0fGx0Z3xsdnxtYXAtYm1zfG1kZnxtZ3xtaHxtaHJ8bWl8bWt8bWx8bW58bW98bXJ8bXJqfG1zfG10fG11c3xtd2x8bXl8bXl2fG16bnxuYXxuYWh8bmFwfG5kc3xuZHMtbmx8bmV8bmV3fG5nfG5sfG5ufG5vfG5vdnxucm18bnZ8bnl8b2N8b218b3J8b3N8cGF8cGFnfHBhbXxwYXB8cGNkfHBkY3xwZmx8cGl8cGlofHBsfHBtc3xwbmJ8cG50fHBzfHB0fHF1fHJtfHJteXxybnxyb3xyb2EtcnVwfHJvYS10YXJhfHJ1fHJ1ZXxyd3xzYXxzYWh8c2N8c2NufHNjb3xzZHxzZXxzZ3xzaHxzaXxzaW1wbGV8c2t8c2x8c218c258c298c3F8c3J8c3JufHNzfHN0fHN0cXxzdXxzdnxzd3xzemx8dGF8dGV8dGV0fHRnfHRofHRpfHRrfHRsfHRufHRvfHRwaXx0cnx0c3x0dHx0dW18dHd8dHl8dWRtfHVnfHVrfHVyfHV6fHZlfHZlY3x2aXx2bHN8dm98d2F8d2FyfHdvfHd1dXx4YWx8eGh8eWl8eW98emF8emVhfHpofHpoLWNsYXNzaWNhbHx6aC1taW4tbmFufHpoLXl1ZXx6dSc7XG5cdFx0XHRwZy5yZS5pbnRlcndpa2kgPSBuZXcgUmVnRXhwKGBeJHtwZy53aWtpLmludGVyd2lraX06YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBnLndpa2kuaW50ZXJ3aWtpID0gbnVsbDtcblx0XHRcdHBnLnJlLmludGVyd2lraSA9IC9eJC87XG5cdFx0fVxuXHR9O1xuXHQvLyByZXR1cm4gYSByZWdleHAgcGF0dGVybiBtYXRjaGluZyBhbGwgdmFyaWFudHMgdG8gd3JpdGUgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHRjb25zdCBuc1JlID0gKG5hbWVzcGFjZUlkKSA9PiB7XG5cdFx0Y29uc3QgaW1hZ2VOYW1lc3BhY2VWYXJpYW50cyA9IFtdO1xuXHRcdGZvciAoY29uc3QgW19sb2NhbGl6ZWROYW1lc3BhY2VMYywgX25hbWVzcGFjZUlkXSBvZiBPYmplY3QuZW50cmllcyhtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZUlkcycpKSkge1xuXHRcdFx0aWYgKF9uYW1lc3BhY2VJZCAhPT0gbmFtZXNwYWNlSWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBsb2NhbGl6ZWROYW1lc3BhY2VMYyA9IHVwY2FzZUZpcnN0KF9sb2NhbGl6ZWROYW1lc3BhY2VMYyk7XG5cdFx0XHRpbWFnZU5hbWVzcGFjZVZhcmlhbnRzLnB1c2goXG5cdFx0XHRcdG13LnV0aWwuZXNjYXBlUmVnRXhwKGxvY2FsaXplZE5hbWVzcGFjZUxjKS5zcGxpdCgnICcpLmpvaW4oJ1sgX10nKSxcblx0XHRcdFx0bXcudXRpbC5lc2NhcGVSZWdFeHAoZW5jb2RlVVJJKGxvY2FsaXplZE5hbWVzcGFjZUxjKSlcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBgKD86JHtpbWFnZU5hbWVzcGFjZVZhcmlhbnRzLmpvaW4oJ3wnKX0pYDtcblx0fTtcblx0Y29uc3QgbnNSZUltYWdlID0gKCkgPT4ge1xuXHRcdHJldHVybiBuc1JlKHBnLm5zSW1hZ2VJZCk7XG5cdH07XG5cdC8vIEVOREZJTEU6IG5hbWVzcGFjZXMuanNcblx0Ly8gU1RBUlRGSUxFOiBzZWxwb3AuanNcblx0Y29uc3QgZ2V0RWRpdGJveFNlbGVjdGlvbiA9ICgpID0+IHtcblx0XHQvLyBzZWUge0BsaW5rIGh0dHA6Ly93d3cud2ViZ3VydXNmb3J1bS5jb20vOC8xMi8wfVxuXHRcdGxldCBlZGl0Ym94O1xuXHRcdHRyeSB7XG5cdFx0XHRlZGl0Ym94ID0gZG9jdW1lbnQuZWRpdGZvcm0ud3BUZXh0Ym94MTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gSUUsIE9wZXJhXG5cdFx0aWYgKGRvY3VtZW50LnNlbGVjdGlvbikge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnRleHQ7XG5cdFx0fVxuXHRcdC8vIE1vemlsbGFcblx0XHRjb25zdCBzZWxTdGFydCA9IGVkaXRib3guc2VsZWN0aW9uU3RhcnQ7XG5cdFx0Y29uc3Qgc2VsRW5kID0gZWRpdGJveC5zZWxlY3Rpb25FbmQ7XG5cdFx0cmV0dXJuIGVkaXRib3gudmFsdWUuc3Vic3RyaW5nKHNlbFN0YXJ0LCBzZWxFbmQpO1xuXHR9O1xuXHRjb25zdCBkb1NlbGVjdGlvblBvcHVwID0gKCkgPT4ge1xuXHRcdC8vIHBvcHVwIGlmIHRoZSBzZWxlY3Rpb24gbG9va3MgbGlrZSBbW2Zvb3xhbnl0aGluZyBhZnRlcndhcmRzIGF0IGFsbFxuXHRcdC8vIG9yIFtbZm9vfGJhcl1ddGV4dCB3aXRob3V0ICddXSdcblx0XHQvLyBvciBbW2Zvb3xiYXJdXVxuXHRcdGNvbnN0IHNlbCA9IGdldEVkaXRib3hTZWxlY3Rpb24oKTtcblx0XHRjb25zdCBvcGVuID0gc2VsLmluZGV4T2YoJ1tbJyk7XG5cdFx0Y29uc3QgcGlwZSA9IHNlbC5pbmRleE9mKCd8Jyk7XG5cdFx0Y29uc3QgY2xvc2UgPSBzZWwuaW5kZXhPZignXV0nKTtcblx0XHRpZiAob3BlbiA9PT0gLTEgfHwgKHBpcGUgPT09IC0xICYmIGNsb3NlID09PSAtMSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKChwaXBlICE9PSAtMSAmJiBvcGVuID4gcGlwZSkgfHwgKGNsb3NlICE9PSAtMSAmJiBvcGVuID4gY2xvc2UpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGFydGljbGUgPSBuZXcgVGl0bGUoc2VsLnN1YnN0cmluZyhvcGVuICsgMiwgcGlwZSA8IDAgPyBjbG9zZSA6IHBpcGUpKTtcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBPbkVkaXRTZWxlY3Rpb24nKSA9PT0gJ2JveHByZXZpZXcnKSB7XG5cdFx0XHRyZXR1cm4gZG9TZXBhcmF0ZVNlbGVjdGlvblBvcHVwKHNlbCwgYXJ0aWNsZSk7XG5cdFx0fVxuXHRcdGlmIChjbG9zZSA+IDAgJiYgc2VsLnNsaWNlKE1hdGgubWF4KDAsIGNsb3NlICsgMikpLmluY2x1ZGVzKCdbWycpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0YS5ocmVmID0gcGcud2lraS50aXRsZWJhc2UgKyBhcnRpY2xlLnVybFN0cmluZygpO1xuXHRcdG1vdXNlT3Zlcldpa2lMaW5rMihhKTtcblx0XHRpZiAoYS5uYXZwb3B1cCkge1xuXHRcdFx0YS5uYXZwb3B1cC5hZGRIb29rKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0cnVuU3RvcFBvcHVwVGltZXIoYS5uYXZwb3B1cCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd1bmhpZGUnLFxuXHRcdFx0XHQnYWZ0ZXInXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZG9TZXBhcmF0ZVNlbGVjdGlvblBvcHVwID0gKHN0ciwgYXJ0aWNsZSkgPT4ge1xuXHRcdGxldCBkaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VsZWN0aW9uUHJldmlldycpO1xuXHRcdGlmICghZGl2KSB7XG5cdFx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdGRpdi5pZCA9ICdzZWxlY3Rpb25QcmV2aWV3Jztcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGJveCA9IGRvY3VtZW50LmVkaXRmb3JtLndwVGV4dGJveDE7XG5cdFx0XHRcdGJveC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGJveCk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBwID0gcHJlcFByZXZpZXdtYWtlcihzdHIsIGFydGljbGUsIG5ld05hdnBvcHVwKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSwgYXJ0aWNsZSkpO1xuXHRcdHAubWFrZVByZXZpZXcoKTtcblx0XHRpZiAocC5odG1sKSB7XG5cdFx0XHRkaXYuaW5uZXJIVE1MID0gcC5odG1sO1xuXHRcdH1cblx0XHRkaXYucmFuU2V0dXBUb29sdGlwc0FscmVhZHkgPSBmYWxzZTtcblx0XHRwb3BUaXBzU29vbkZuKCdzZWxlY3Rpb25QcmV2aWV3JykoKTtcblx0fTtcblx0Ly8gRU5ERklMRTogc2VscG9wLmpzXG5cdC8vIFNUQVJURklMRTogbmF2cG9wdXAuanNcblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXcgIERlZmluZXMgdHdvIGNsYXNzZXM6IHtAc291cmNlIE5hdnBvcHVwfSBhbmQge0Bzb3VyY2UgTW91c2V0cmFja2VyfS5cblx0ICpcblx0ICogPGNvZGU+TmF2cG9wdXA8L2NvZGU+IGRlc2NyaWJlcyBwb3B1cHM6IHdoZW4gdGhleSBhcHBlYXIsIHdoZXJlLCB3aGF0XG5cdCAqIHRoZXkgbG9vayBsaWtlIGFuZCBzbyBvbi5cblx0ICpcblx0ICogPGNvZGU+TW91c2V0cmFja2VyPC9jb2RlPiBcImNhcHR1cmVzXCIgdGhlIG1vdXNlIHVzaW5nXG5cdCAqIDxjb2RlPmRvY3VtZW50Lm9ubW91c2Vtb3ZlPC9jb2RlPi5cblx0ICovXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IE1vdXNldHJhY2tlci5cblx0ICpcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBjbGFzcyBUaGUgTW91c2V0cmFja2VyIGNsYXNzLiBUaGlzIG1vbml0b3JzIG1vdXNlIG1vdmVtZW50cyBhbmQgbWFuYWdlcyBhc3NvY2lhdGVkIGhvb2tzLlxuXHQgKi9cblx0Y2xhc3MgTW91c2V0cmFja2VyIHtcblx0XHRjb25zdHJ1Y3RvcigpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSW50ZXJ2YWwgdG8gcmVndWxhcmx5IHJ1biB0aGUgaG9va3MgYW55d2F5LCBpbiBtaWxsaXNlY29uZHMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgSW50ZWdlclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmxvb3BEZWxheSA9IDQwMDtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGltZXIgZm9yIHRoZSBsb29wLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIFRpbWVyXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudGltZXIgPSBudWxsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBGbGFnIC0gYXJlIHdlIHN3aXRjaGVkIG9uP1xuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIEJvb2xlYW5cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogRmxhZyAtIGFyZSB3ZSBwcm9iYWJseSBpbmFjY3VyYXRlLCBpLmUuIG5vdCByZWZsZWN0aW5nIHRoZSBhY3R1YWwgbW91c2UgcG9zaXRpb24/XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuZGlydHkgPSB0cnVlO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBBcnJheSBvZiBob29rIGZ1bmN0aW9ucy5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICogQHR5cGUgQXJyYXlcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5ob29rcyA9IFtdO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBBZGRzIGEgaG9vaywgdG8gYmUgY2FsbGVkIHdoZW4gd2UgZ2V0IGV2ZW50cy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGYgQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgYXNcblx0XHQgKiA8Y29kZT5mKHgseSk8L2NvZGU+LiBJdCBzaG91bGQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gaXRcblx0XHQgKiB3YW50cyB0byBiZSByZW1vdmVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS5cblx0XHQgKi9cblx0XHRhZGRIb29rKGYpIHtcblx0XHRcdHRoaXMuaG9va3MucHVzaChmKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUnVucyBob29rcywgcGFzc2luZyB0aGVtIHRoZSB4XG5cdFx0ICogYW5kIHkgY29vcmRzIG9mIHRoZSBtb3VzZS4gIEhvb2sgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHRydWUgYXJlXG5cdFx0ICogcGFzc2VkIHRvIHtAc291cmNlIE1vdXNldHJhY2tlciNyZW1vdmVIb29rc30gZm9yIHJlbW92YWwuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHJ1bkhvb2tzKCkge1xuXHRcdFx0aWYgKCF0aGlzLmhvb2tzIHx8IHRoaXMuaG9va3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIGxvZygnTW91c2V0cmFja2VyLnJ1bkhvb2tzOyB3ZSBnb3Qgc29tZSBob29rcyB0byBydW4nKTtcblx0XHRcdGxldCByZW1vdmUgPSBmYWxzZTtcblx0XHRcdGNvbnN0IHJlbW92ZU9iaiA9IHt9O1xuXHRcdFx0Ly8gdGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgYSBMT1QgLVxuXHRcdFx0Ly8gcHJlLWNhY2hlIHNvbWUgdmFyaWFibGVzXG5cdFx0XHRjb25zdCB7eH0gPSB0aGlzO1xuXHRcdFx0Y29uc3Qge3l9ID0gdGhpcztcblx0XHRcdGNvbnN0IGxlbiA9IHRoaXMuaG9va3MubGVuZ3RoO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuXHRcdFx0XHQvLyB+IHJ1biB0aGUgaG9vayBmdW5jdGlvbiwgYW5kIHJlbW92ZSBpdCBpZiBpdCByZXR1cm5zIHRydWVcblx0XHRcdFx0aWYgKHRoaXMuaG9va3NbaV0oeCwgeSkgPT09IHRydWUpIHtcblx0XHRcdFx0XHRyZW1vdmUgPSB0cnVlO1xuXHRcdFx0XHRcdHJlbW92ZU9ialtpXSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChyZW1vdmUpIHtcblx0XHRcdFx0dGhpcy5yZW1vdmVIb29rcyhyZW1vdmVPYmopO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBSZW1vdmVzIGhvb2tzLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gcmVtb3ZlT2JqIEFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSB0aGUgaW5kZXhcblx0XHQgKiBudW1iZXJzIG9mIGZ1bmN0aW9ucyBmb3IgcmVtb3ZhbCwgd2l0aCB2YWx1ZXMgdGhhdCBldmFsdWF0ZSB0byB0cnVlXG5cdFx0ICovXG5cdFx0cmVtb3ZlSG9va3MocmVtb3ZlT2JqKSB7XG5cdFx0XHRjb25zdCBuZXdIb29rcyA9IFtdO1xuXHRcdFx0Y29uc3QgbGVuID0gdGhpcy5ob29rcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRcdGlmICghcmVtb3ZlT2JqW2ldKSB7XG5cdFx0XHRcdFx0bmV3SG9va3MucHVzaCh0aGlzLmhvb2tzW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5ob29rcyA9IG5ld0hvb2tzO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBFdmVudCBsaXN0ZW5lciBmb3IgbW91c2Ugd2lnZ2xlcy5cblx0XHQgKiBXZSBzaW1wbHkgZ3JhYiB0aGUgZXZlbnQsIHNldCB4IGFuZCB5IGFuZCBydW4gdGhlIGhvb2tzLlxuXHRcdCAqIFRoaXMgbWFrZXMgdGhlIGNwdSBhbGwgaG90IGFuZCBib3RoZXJlZCA6LShcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZSBNb3VzZW1vdmUgZXZlbnRcblx0XHQgKi9cblx0XHR0cmFjayhlKSB7XG5cdFx0XHQvLyB+IEFwcGFyZW50bHkgdGhpcyBpcyBuZWVkZWQgaW4gSUUuXG5cdFx0XHRlIHx8PSB3aW5kb3cuZXZlbnQ7XG5cdFx0XHRsZXQgeDtcblx0XHRcdGxldCB5O1xuXHRcdFx0aWYgKGUpIHtcblx0XHRcdFx0aWYgKGUucGFnZVgpIHtcblx0XHRcdFx0XHR4ID0gZS5wYWdlWDtcblx0XHRcdFx0XHR5ID0gZS5wYWdlWTtcblx0XHRcdFx0fSBlbHNlIGlmIChlLmNsaWVudFggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsZXQgbGVmdDtcblx0XHRcdFx0XHRsZXQgdG9wO1xuXHRcdFx0XHRcdGNvbnN0IGRvY0VsdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0XHRcdFx0XHRpZiAoZG9jRWx0KSB7XG5cdFx0XHRcdFx0XHRsZWZ0ID0gZG9jRWx0LnNjcm9sbExlZnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxlZnQgfHw9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LnNjcm9sbExlZnQgfHwgMDtcblx0XHRcdFx0XHRpZiAoZG9jRWx0KSB7XG5cdFx0XHRcdFx0XHR0b3AgPSBkb2NFbHQuc2Nyb2xsVG9wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0b3AgfHw9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuc2Nyb2xsVG9wIHx8IDA7XG5cdFx0XHRcdFx0eCA9IGUuY2xpZW50WCArIGxlZnQ7XG5cdFx0XHRcdFx0eSA9IGUuY2xpZW50WSArIHRvcDtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBTZXRzIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIHN0b3JlZCBhbmQgdGFrZXMgYXBwcm9wcmlhdGUgYWN0aW9uLFxuXHRcdCAqIHJ1bm5pbmcgaG9va3MgYXMgYXBwcm9wcmlhdGUuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0ludGVnZXJ9IHgsIHkgU2NyZWVuIGNvb3JkaW5hdGVzIHRvIHNldFxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB4XG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHlcblx0XHQgKi9cblx0XHRzZXRQb3NpdGlvbih4LCB5KSB7XG5cdFx0XHR0aGlzLnggPSB4O1xuXHRcdFx0dGhpcy55ID0geTtcblx0XHRcdGlmICh0aGlzLmRpcnR5IHx8IHRoaXMuaG9va3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHRoaXMuZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLmxhc3RIb29rX3ggIT09ICdudW1iZXInKSB7XG5cdFx0XHRcdHRoaXMubGFzdEhvb2tfeCA9IC0xMDA7XG5cdFx0XHRcdHRoaXMubGFzdEhvb2tfeSA9IC0xMDA7XG5cdFx0XHR9XG5cdFx0XHRsZXQgZGlmZiA9ICh0aGlzLmxhc3RIb29rX3ggLSB4KSAqICh0aGlzLmxhc3RIb29rX3kgLSB5KTtcblx0XHRcdGRpZmYgPSBkaWZmID49IDAgPyBkaWZmIDogLWRpZmY7XG5cdFx0XHRpZiAoZGlmZiA+IDEpIHtcblx0XHRcdFx0dGhpcy5sYXN0SG9va194ID0geDtcblx0XHRcdFx0dGhpcy5sYXN0SG9va195ID0geTtcblx0XHRcdFx0aWYgKHRoaXMuZGlydHkpIHtcblx0XHRcdFx0XHR0aGlzLmRpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5ydW5Ib29rcygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFNldHMgdGhpbmdzIGluIG1vdGlvbiwgdW5sZXNzIHRoZXkgYXJlIGFscmVhZHkgdGhhdCBpcywgcmVnaXN0ZXJpbmcgYW4gZXZlbnQgbGlzdGVuZXIgb25cblx0XHQgKiA8Y29kZT5kb2N1bWVudC5vbm1vdXNlbW92ZTwvY29kZT4uIEEgaGFsZi1oZWFydGVkIGF0dGVtcHQgaXMgbWFkZSB0byBwcmVzZXJ2ZSB0aGUgb2xkIGV2ZW50XG5cdFx0ICogbGlzdGVuZXIgaWYgdGhlcmUgaXMgb25lLlxuXHRcdCAqL1xuXHRcdGVuYWJsZSgpIHtcblx0XHRcdGlmICh0aGlzLmFjdGl2ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdFx0XHQvLyB+IFNhdmUgdGhlIGN1cnJlbnQgbGlzdGVuZXIgZm9yIG1vdXNlbW92ZSBldmVudHMuIFRoaXMgaXNuJ3QgdG9vXG5cdFx0XHQvLyB+IHJvYnVzdCwgb2YgY291cnNlLlxuXHRcdFx0dGhpcy5zYXZlZExpc3RlbmVyID0gZG9jdW1lbnQub25tb3VzZW1vdmU7XG5cdFx0XHQvLyB+IEdvdHRhIHNhdmUgQHR0e3RoaXN9IGFnYWluIGZvciB0aGUgY2xvc3VyZSwgYW5kIHVzZSBhcHBseSBmb3Jcblx0XHRcdC8vIH4gdGhlIG1lbWJlciBmdW5jdGlvbi5cblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0ZG9jdW1lbnQub25tb3VzZW1vdmUgPSAoZSkgPT4ge1xuXHRcdFx0XHRzZWxmLnRyYWNrKGUpO1xuXHRcdFx0fTtcblx0XHRcdGlmICh0aGlzLmxvb3BEZWxheSkge1xuXHRcdFx0XHR0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0XHRcdC8vIGxvZygnbG9vcCBkZWxheSBpbiBtb3VzZXRyYWNrZXIgaXMgd29ya2luZycpO1xuXHRcdFx0XHRcdHNlbGYucnVuSG9va3MoKTtcblx0XHRcdFx0fSwgdGhpcy5sb29wRGVsYXkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBEaXNhYmxlcyB0aGUgdHJhY2tlciwgcmVtb3ZpbmcgdGhlIGV2ZW50IGxpc3RlbmVyLlxuXHRcdCAqL1xuXHRcdGRpc2FibGUoKSB7XG5cdFx0XHRpZiAoIXRoaXMuYWN0aXZlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgdGhpcy5zYXZlZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gdGhpcy5zYXZlZExpc3RlbmVyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIGRvY3VtZW50Lm9ubW91c2Vtb3ZlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMudGltZXIpIHtcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IE5hdnBvcHVwLlxuXHQgKiBHZXRzIGEgVUlEIGZvciB0aGUgcG9wdXAgYW5kXG5cdCAqXG5cdCAqIEBwYXJhbSBpbml0IENvbnRydWN0b3Igb2JqZWN0LiBJZiA8Y29kZT5pbml0LmRyYWdnYWJsZTwvY29kZT4gaXMgdHJ1ZSBvciBhYnNlbnQsIHRoZSBwb3B1cCBiZWNvbWVzIGRyYWdnYWJsZS5cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBjbGFzcyBUaGUgTmF2cG9wdXAgY2xhc3MuIFRoaXMgZ2VuZXJhdGVzIHBvcHVwIGhpbnRzLCBhbmQgZG9lcyBzb21lIG1hbmFnZW1lbnQgb2YgdGhlbS5cblx0ICovXG5cdGNsYXNzIE5hdnBvcHVwIHtcblx0XHRjb25zdHJ1Y3RvcigpIHtcblx0XHRcdC8vIG13Lm5vdGlmeSgnbmV3IE5hdnBvcHVwKGluaXQpJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICd3YXJuJ30pO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBVSUQgZm9yIGVhY2ggTmF2cG9wdXAgaW5zdGFuY2UuXG5cdFx0XHQgKiBSZWFkLW9ubHkuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgaW50ZWdlclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnVpZCA9IE5hdnBvcHVwLnVpZCsrO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZWFkLW9ubHkgZmxhZyBmb3IgY3VycmVudCB2aXNpYmlsaXR5IG9mIHRoZSBwb3B1cC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBib29sZWFuXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnZpc2libGUgPSBmYWxzZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogRmxhZyB0byBiZSBzZXQgd2hlbiB3ZSB3YW50IHRvIGNhbmNlbCBhIHByZXZpb3VzIHJlcXVlc3QgdG9cblx0XHRcdCAqIHNob3cgdGhlIHBvcHVwIGluIGEgbGl0dGxlIHdoaWxlLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAdHlwZSBib29sZWFuXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMubm9zaG93ID0gZmFsc2U7XG5cdFx0XHQvKipcblx0XHRcdCAqIENhdGVnb3Jpc2VkIGxpc3Qgb2YgaG9va3MuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHNlZSAjcnVuSG9va3Ncblx0XHRcdCAqIEBzZWUgI2FkZEhvb2tcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAdHlwZSBPYmplY3Rcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5ob29rcyA9IHtcblx0XHRcdFx0Y3JlYXRlOiBbXSxcblx0XHRcdFx0dW5oaWRlOiBbXSxcblx0XHRcdFx0aGlkZTogW10sXG5cdFx0XHR9O1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBsaXN0IG9mIHVuaXF1ZSBJRHMgb2YgaG9vayBmdW5jdGlvbnMsIHRvIGF2b2lkIGR1cGxpY2F0ZXNcblx0XHRcdCAqXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmhvb2tJZHMgPSB7fTtcblx0XHRcdC8qKlxuXHRcdFx0ICogTGlzdCBvZiBkb3dubG9hZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3B1cC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICogQHR5cGUgQXJyYXlcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5kb3dubG9hZHMgPSBbXTtcblx0XHRcdC8qKlxuXHRcdFx0ICogTnVtYmVyIG9mIHVuY29tcGxldGVkIGRvd25sb2Fkcy5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBpbnRlZ2VyXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMucGVuZGluZyA9IG51bGw7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRvbGVyYW5jZSBpbiBwaXhlbHMgd2hlbiBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbW91c2UgaGFzIGxlZnQgdGhlIHBvcHVwLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIGludGVnZXJcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5mdXp6ID0gNTtcblx0XHRcdC8qKlxuXHRcdFx0ICogRmxhZyB0byB0b2dnbGUgcnVubmluZyB7QHNvdXJjZSAjbGltaXRIb3Jpem9udGFsUG9zaXRpb259IHRvIHJlZ3VsYXRlIHRoZSBwb3B1cCdzIHBvc2l0aW9uLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIGJvb2xlYW5cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5jb25zdHJhaW5lZCA9IHRydWU7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBwb3B1cCB3aWR0aCBpbiBwaXhlbHMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqIEB0eXBlIGludGVnZXJcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy53aWR0aCA9IDA7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBwb3B1cCB3aWR0aCBpbiBwaXhlbHMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqIEB0eXBlIGludGVnZXJcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5oZWlnaHQgPSAwO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgbWFpbiBjb250ZW50IERJViBlbGVtZW50LlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIEhUTUxEaXZFbGVtZW50XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMubWFpbkRpdiA9IG51bGw7XG5cdFx0XHR0aGlzLmNyZWF0ZU1haW5EaXYoKTtcblx0XHRcdC8vXHRpZiAoIWluaXQgfHwgdHlwZW9mIGluaXQucG9wdXBzX2RyYWdnYWJsZT09J3VuZGVmaW5lZCcgfHwgaW5pdC5wb3B1cHNfZHJhZ2dhYmxlKSB7XG5cdFx0XHQvL1x0XHR0aGlzLm1ha2VEcmFnZ2FibGUodHJ1ZSk7XG5cdFx0XHQvL1x0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBSZXRyaWV2ZXMgdGhlIHtAc291cmNlICN2aXNpYmxlfSBhdHRyaWJ1dGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgcG9wdXAgaXMgY3VycmVudGx5IHZpc2libGUuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBib29sZWFuXG5cdFx0ICovXG5cdFx0aXNWaXNpYmxlKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMudmlzaWJsZTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUmVwb3NpdGlvbnMgcG9wdXAgdXNpbmcgQ1NTIHN0eWxlLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge2ludGVnZXJ9IHggeC1jb29yZGluYXRlIChweClcblx0XHQgKiBAcGFyYW0ge2ludGVnZXJ9IHkgeS1jb29yZGluYXRlIChweClcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IG5vTGltaXRIb3IgRG9uJ3QgY2FsbCB7QHNvdXJjZSAjbGltaXRIb3Jpem9udGFsUG9zaXRpb259XG5cdFx0ICovXG5cdFx0cmVwb3NpdGlvbih4LCB5LCBub0xpbWl0SG9yKSB7XG5cdFx0XHRsb2coYHJlcG9zaXRpb24oJHt4fSwke3l9LCR7bm9MaW1pdEhvcn0pYCk7XG5cdFx0XHRpZiAoeCAhPT0gdW5kZWZpbmVkICYmIHggIT09IG51bGwpIHtcblx0XHRcdFx0dGhpcy5sZWZ0ID0geDtcblx0XHRcdH1cblx0XHRcdGlmICh5ICE9PSB1bmRlZmluZWQgJiYgeSAhPT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLnRvcCA9IHk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy50b3AgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLm1haW5EaXYuc3R5bGUubGVmdCA9IGAke3RoaXMubGVmdH1weGA7XG5cdFx0XHRcdHRoaXMubWFpbkRpdi5zdHlsZS50b3AgPSBgJHt0aGlzLnRvcH1weGA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW5vTGltaXRIb3IpIHtcblx0XHRcdFx0dGhpcy5saW1pdEhvcml6b250YWxQb3NpdGlvbigpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBQcmV2ZW50cyBwb3B1cHMgZnJvbSBiZWluZyBpbiBzaWxseSBsb2NhdGlvbnMuIEhvcGVmdWxseS5cblx0XHQgKiBTaG91bGQgbm90IGJlIHJ1biBpZiB7QHNvdXJjZSAjY29uc3RyYWluZWR9IGlzIHRydWUuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGxpbWl0SG9yaXpvbnRhbFBvc2l0aW9uKCkge1xuXHRcdFx0aWYgKCF0aGlzLmNvbnN0cmFpbmVkIHx8IHRoaXMudG9vV2lkZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnVwZGF0ZURpbWVuc2lvbnMoKTtcblx0XHRcdGNvbnN0IHggPSB0aGlzLmxlZnQ7XG5cdFx0XHRjb25zdCB3ID0gdGhpcy53aWR0aDtcblx0XHRcdGNvbnN0IGNXaWR0aCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jbGllbnRXaWR0aDtcblx0XHRcdC8vXHRsb2coJ2xpbWl0SG9yaXpvbnRhbFBvc2l0aW9uOiB4PScreCtcblx0XHRcdC8vXHRcdFx0JywgdGhpcy5sZWZ0PScgKyB0aGlzLmxlZnQgK1xuXHRcdFx0Ly9cdFx0XHQnLCB0aGlzLndpZHRoPScgKyB0aGlzLndpZHRoICtcblx0XHRcdC8vXHRcdFx0JywgY1dpZHRoPScgKyBjV2lkdGgpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR4ICsgdyA+PSBjV2lkdGggfHxcblx0XHRcdFx0KHggPiAwICYmXG5cdFx0XHRcdFx0dGhpcy5tYXhXaWR0aCAmJlxuXHRcdFx0XHRcdHRoaXMud2lkdGggPCB0aGlzLm1heFdpZHRoICYmXG5cdFx0XHRcdFx0dGhpcy5oZWlnaHQgPiB0aGlzLndpZHRoICYmXG5cdFx0XHRcdFx0eCA+IGNXaWR0aCAtIHRoaXMubWF4V2lkdGgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIHZlcnkgbmFzdHkgaGFjay4gVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSFcblx0XHRcdFx0Ly8gV2UgZmluZCB0aGUgXCJuYXR1cmFsXCIgd2lkdGggb2YgdGhlIGRpdiBieSBwb3NpdGlvbmluZyBpdCBhdCB0aGUgZmFyIGxlZnRcblx0XHRcdFx0Ly8gdGhlbiByZXNldCBpdCBzbyB0aGF0IGl0IHNob3VsZCBiZSBmbHVzaCByaWdodCAod2VsbCwgbmVhcmx5KVxuXHRcdFx0XHR0aGlzLm1haW5EaXYuc3R5bGUubGVmdCA9ICctMTAwMDBweCc7XG5cdFx0XHRcdHRoaXMubWFpbkRpdi5zdHlsZS53aWR0aCA9IGAke3RoaXMubWF4V2lkdGh9cHhgO1xuXHRcdFx0XHRjb25zdCBuYXR1cmFsV2lkdGggPSBOdW1iZXIucGFyc2VJbnQodGhpcy5tYWluRGl2Lm9mZnNldFdpZHRoLCAxMCk7XG5cdFx0XHRcdGxldCBuZXdMZWZ0ID0gY1dpZHRoIC0gbmF0dXJhbFdpZHRoIC0gMTtcblx0XHRcdFx0aWYgKG5ld0xlZnQgPCAwKSB7XG5cdFx0XHRcdFx0bmV3TGVmdCA9IDA7XG5cdFx0XHRcdFx0dGhpcy50b29XaWRlID0gdHJ1ZTtcblx0XHRcdFx0fSAvLyBzdGlsbCB1bnN0YWJsZSBmb3IgcmVhbGx5IHdpZGUgcG9wdXBzP1xuXHRcdFx0XHRsb2coXG5cdFx0XHRcdFx0YGxpbWl0SG9yaXpvbnRhbFBvc2l0aW9uOiBtb3ZpbmcgdG8gKCR7bmV3TGVmdH0sJHt0aGlzLnRvcH0pO2AgK1xuXHRcdFx0XHRcdFx0YCBuYXR1cmFsV2lkdGg9JHtuYXR1cmFsV2lkdGh9LCBjbGllbnRXaWR0aD0ke2NXaWR0aH1gXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoaXMucmVwb3NpdGlvbihuZXdMZWZ0LCBudWxsLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQnJpbmdzIHBvcHVwIHRvIHRoZSB0b3Agb2YgdGhlIHotb3JkZXIuXG5cdFx0ICogV2UgaW5jcmVtZW50IHRoZSB7QHNvdXJjZSAjaGlnaGVzdH0gcHJvcGVydHkgb2YgdGhlIGNvbnRydWN0b3IgaGVyZS5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0cmFpc2UoKSB7XG5cdFx0XHR0aGlzLm1haW5EaXYuc3R5bGUuekluZGV4ID0gTmF2cG9wdXAuaGlnaGVzdCArIDE7XG5cdFx0XHQrK05hdnBvcHVwLmhpZ2hlc3Q7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFNob3dzIHRoZSBwb3B1cCBwcm92aWRlZCB7QHNvdXJjZSAjbm9zaG93fSBpcyBub3QgdHJ1ZS5cblx0XHQgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiwgYnJpbmdzIHRoZSBwb3B1cCB0byB0aGUgdG9wIG9mIHRoZSB6LW9yZGVyIGFuZCB1bmhpZGVzIGl0LlxuXHRcdCAqL1xuXHRcdHNob3coKSB7XG5cdFx0XHQvLyBkb2N1bWVudC50aXRsZSs9J3MnO1xuXHRcdFx0aWYgKHRoaXMubm9zaG93KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIGRvY3VtZW50LnRpdGxlKz0ndCc7XG5cdFx0XHR0aGlzLnJlcG9zaXRpb24oKTtcblx0XHRcdHRoaXMucmFpc2UoKTtcblx0XHRcdHRoaXMudW5oaWRlKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIENoZWNrcyB0byBzZWUgaWYgdGhlIG1vdXNlIHBvaW50ZXIgaGFzXG5cdFx0ICogc3RhYmlsaXNlZCAoY2hlY2tpbmcgZXZlcnkgPGNvZGU+dGltZTwvY29kZT4vMiBtaWxsaXNlY29uZHMpIGFuZCBydW5zIHRoZVxuXHRcdCAqIHtAc291cmNlICNzaG93fSBtZXRob2QgaWYgaXQgaGFzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lIFRoZSBtaW5pbXVtIHRpbWUgKG1zKSBiZWZvcmUgdGhlIHBvcHVwIG1heSBiZSBzaG93bi5cblx0XHQgKi9cblx0XHRzaG93U29vbklmU3RhYmxlKHRpbWUpIHtcblx0XHRcdGxvZyhgc2hvd1Nvb25JZlN0YWJsZSwgdGltZT0ke3RpbWV9YCk7XG5cdFx0XHRpZiAodGhpcy52aXNpYmxlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMubm9zaG93ID0gZmFsc2U7XG5cdFx0XHQvLyB+IGluaXRpYWxpemUgdGhlc2UgdmFyaWFibGVzIHNvIHRoYXQgd2UgbmV2ZXIgcnVuIEB0dHtzaG93fSBhZnRlclxuXHRcdFx0Ly8gfiBqdXN0IGhhbGYgdGhlIHRpbWVcblx0XHRcdHRoaXMuc3RhYmxlX3ggPSAtMWU0O1xuXHRcdFx0dGhpcy5zdGFibGVfeSA9IC0xZTQ7XG5cdFx0XHRjb25zdCBzdGFibGVTaG93ID0gKCkgPT4ge1xuXHRcdFx0XHRsb2coJ3N0YWJsZVNob3cgY2FsbGVkJyk7XG5cdFx0XHRcdGNvbnN0IG5ld194ID0gTmF2cG9wdXAudHJhY2tlci54O1xuXHRcdFx0XHRjb25zdCBuZXdfeSA9IE5hdnBvcHVwLnRyYWNrZXIueTtcblx0XHRcdFx0Y29uc3QgZHggPSBzZWxmLnN0YWJsZV94IC0gbmV3X3g7XG5cdFx0XHRcdGNvbnN0IGR5ID0gc2VsZi5zdGFibGVfeSAtIG5ld195O1xuXHRcdFx0XHRjb25zdCBmdXp6MiA9IDA7IC8vIHNhdmVkVGhpcy5mdXp6ICogc2F2ZWRUaGlzLmZ1eno7XG5cdFx0XHRcdC8vIGRvY3VtZW50LnRpdGxlICs9ICdbJyArIFtzYXZlZFRoaXMuc3RhYmxlX3gsbmV3X3gsIHNhdmVkVGhpcy5zdGFibGVfeSxuZXdfeSwgZHgsIGR5LCBmdXp6Ml0uam9pbignLCcpICsgJ10gJztcblx0XHRcdFx0aWYgKGR4ICogZHggPD0gZnV6ejIgJiYgZHkgKiBkeSA8PSBmdXp6Mikge1xuXHRcdFx0XHRcdGxvZygnbW91c2UgaXMgc3RhYmxlJyk7XG5cdFx0XHRcdFx0Y2xlYXJJbnRlcnZhbChzZWxmLnNob3dTb29uU3RhYmxlVGltZXIpO1xuXHRcdFx0XHRcdHNlbGYucmVwb3NpdGlvbihuZXdfeCArIDIsIG5ld195ICsgMik7XG5cdFx0XHRcdFx0c2VsZi5zaG93KCk7XG5cdFx0XHRcdFx0c2VsZi5saW1pdEhvcml6b250YWxQb3NpdGlvbigpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRzZWxmLnN0YWJsZV94ID0gbmV3X3g7XG5cdFx0XHRcdHNlbGYuc3RhYmxlX3kgPSBuZXdfeTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdHRoaXMuc2hvd1Nvb25TdGFibGVUaW1lciA9IHNldEludGVydmFsKHN0YWJsZVNob3csIHRpbWUgLyAyKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogU2V0cyB0aGUge0Bzb3VyY2UgI25vc2hvd30gZmxhZyBhbmQgaGlkZXMgdGhlIHBvcHVwLiBUaGlzIHNob3VsZCBiZSBjYWxsZWRcblx0XHQgKiB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGxpbmsgYmVmb3JlXG5cdFx0ICogKG9yIGFmdGVyKSBpdCdzIGFjdHVhbGx5IGJlZW4gZGlzcGxheWVkLlxuXHRcdCAqL1xuXHRcdGJhbmlzaCgpIHtcblx0XHRcdGxvZygnYmFuaXNoIGNhbGxlZCcpO1xuXHRcdFx0Ly8gaGlkZSBhbmQgcHJldmVudCBzaG93aW5nIHdpdGggc2hvd1Nvb24gaW4gdGhlIGZ1dHVyZVxuXHRcdFx0dGhpcy5ub3Nob3cgPSB0cnVlO1xuXHRcdFx0aWYgKHRoaXMuc2hvd1Nvb25TdGFibGVUaW1lcikge1xuXHRcdFx0XHRsb2coJ2NsZWFyaW5nIHNob3dTb29uU3RhYmxlVGltZXInKTtcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLnNob3dTb29uU3RhYmxlVGltZXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5oaWRlKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFJ1bnMgaG9va3MgYWRkZWQgd2l0aCB7QHNvdXJjZSAjYWRkSG9va30uXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IG5hbWUgb2YgdGhlIHtAc291cmNlICNob29rc30gYXJyYXkgLSBvbmUgb2YgJ2NyZWF0ZScsICd1bmhpZGUnLCAnaGlkZSdcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gd2hlbiBDb250cm9scyBleGFjdGx5IHdoZW4gdGhlIGhvb2sgaXMgcnVuOiBlaXRoZXIgJ2JlZm9yZScgb3IgJ2FmdGVyJ1xuXHRcdCAqL1xuXHRcdHJ1bkhvb2tzKGtleSwgd2hlbikge1xuXHRcdFx0aWYgKCF0aGlzLmhvb2tzW2tleV0pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qga2V5SG9va3MgPSB0aGlzLmhvb2tzW2tleV07XG5cdFx0XHRjb25zdCBsZW4gPSBrZXlIb29rcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRcdGlmIChrZXlIb29rc1tpXSAmJiBrZXlIb29rc1tpXS53aGVuID09PSB3aGVuICYmIFJlZmxlY3QuYXBwbHkoa2V5SG9va3NbaV0uaG9vaywgdGhpcywgW10pKSB7XG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHRoZSBob29rXG5cdFx0XHRcdFx0aWYgKGtleUhvb2tzW2ldLmhvb2tJZCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaG9va0lkc1trZXlIb29rc1tpXS5ob29rSWRdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRrZXlIb29rc1tpXSA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQWRkcyBhIGhvb2sgdG8gdGhlIHBvcHVwLiBIb29rIGZ1bmN0aW9ucyBhcmUgcnVuIHdpdGggPGNvZGU+dGhpczwvY29kZT4gc2V0IHRvIHJlZmVyIHRvIHRoZVxuXHRcdCAqIE5hdnBvcHVwIGluc3RhbmNlLCBhbmQgbm8gYXJndW1lbnRzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gaG9vayBUaGUgaG9vayBmdW5jdGlvbi4gRnVuY3Rpb25zIHRoYXQgcmV0dXJuIHRydWUgYXJlIGRlbGV0ZWQuXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBLZXkgbmFtZSBvZiB0aGUge0Bzb3VyY2UgI2hvb2tzfSBhcnJheSAtIG9uZSBvZiAnY3JlYXRlJywgJ3VuaGlkZScsICdoaWRlJ1xuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB3aGVuIENvbnRyb2xzIGV4YWN0bHkgd2hlbiB0aGUgaG9vayBpcyBydW46IGVpdGhlciAnYmVmb3JlJyBvciAnYWZ0ZXInXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHVpZCBBIHRydXRoeSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGhvb2sgZnVuY3Rpb247IGlmIGl0IG1hdGNoZXMgYW5vdGhlciBob29rXG5cdFx0ICogaW4gdGhpcyBwb3NpdGlvbiwgaXQgd29uJ3QgYmUgYWRkZWQgYWdhaW4uXG5cdFx0ICovXG5cdFx0YWRkSG9vayhob29rLCBrZXksIHdoZW4sIHVpZCkge1xuXHRcdFx0d2hlbiB8fD0gJ2FmdGVyJztcblx0XHRcdGlmICghdGhpcy5ob29rc1trZXldKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIGlmIHVpZCBpcyBzcGVjaWZpZWQsIGRvbid0IGFkZCBkdXBsaWNhdGVzXG5cdFx0XHRsZXQgaG9va0lkO1xuXHRcdFx0aWYgKHVpZCkge1xuXHRcdFx0XHRob29rSWQgPSBba2V5LCB3aGVuLCB1aWRdLmpvaW4oJ3wnKTtcblx0XHRcdFx0aWYgKHRoaXMuaG9va0lkc1tob29rSWRdKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuaG9va0lkc1tob29rSWRdID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuaG9va3Nba2V5XS5wdXNoKHtcblx0XHRcdFx0aG9vayxcblx0XHRcdFx0d2hlbixcblx0XHRcdFx0aG9va0lkLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIENyZWF0ZXMgdGhlIG1haW4gRElWIGVsZW1lbnQsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgYWN0dWFsIHBvcHVwIGNvbnRlbnQuXG5cdFx0ICogUnVucyBob29rcyB3aXRoIGtleSAnY3JlYXRlJy5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Y3JlYXRlTWFpbkRpdigpIHtcblx0XHRcdGlmICh0aGlzLm1haW5EaXYpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5ydW5Ib29rcygnY3JlYXRlJywgJ2JlZm9yZScpO1xuXHRcdFx0Y29uc3QgbWFpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0XHRtYWluRGl2Lm9uY2xpY2sgPSAoZSkgPT4ge1xuXHRcdFx0XHRzZWxmLm9uY2xpY2tMaXN0ZW5lcihlKTtcblx0XHRcdH07XG5cdFx0XHRtYWluRGl2LmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lID8/ICduYXZwb3B1cF9tYWluZGl2Jztcblx0XHRcdG1haW5EaXYuaWQgPSBtYWluRGl2LmNsYXNzTmFtZSArIHRoaXMudWlkO1xuXHRcdFx0bWFpbkRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRtYWluRGl2LnN0eWxlLm1pbldpZHRoID0gJzM1MHB4Jztcblx0XHRcdG1haW5EaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdG1haW5EaXYuY2xhc3NOYW1lID0gJ25hdnBvcHVwJztcblx0XHRcdC8vIGVhc3kgYWNjZXNzIHRvIGphdmFzY3JpcHQgb2JqZWN0IHRocm91Z2ggRE9NIGZ1bmN0aW9uc1xuXHRcdFx0bWFpbkRpdi5uYXZwb3B1cCA9IHRoaXM7XG5cdFx0XHR0aGlzLm1haW5EaXYgPSBtYWluRGl2O1xuXHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmFwcGVuZChtYWluRGl2KTtcblx0XHRcdHRoaXMucnVuSG9va3MoJ2NyZWF0ZScsICdhZnRlcicpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBDYWxscyB0aGUge0Bzb3VyY2UgI3JhaXNlfSBtZXRob2QuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG9uY2xpY2tMaXN0ZW5lcigpIHtcblx0XHRcdHRoaXMucmFpc2UoKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogTWFrZXMgdGhlIHBvcHVwIGRyYWdnYWJsZSwgdXNpbmcgYSB7QHNvdXJjZSBEcmFnfSBvYmplY3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gaGFuZGxlTmFtZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0bWFrZURyYWdnYWJsZShoYW5kbGVOYW1lKSB7XG5cdFx0XHRpZiAoIXRoaXMubWFpbkRpdikge1xuXHRcdFx0XHR0aGlzLmNyZWF0ZU1haW5EaXYoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGRyYWcgPSBuZXcgRHJhZygpO1xuXHRcdFx0aWYgKCFoYW5kbGVOYW1lKSB7XG5cdFx0XHRcdGRyYWcuc3RhcnRDb25kaXRpb24gPSAoZSkgPT4ge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRpZiAoIWUuc2hpZnRLZXkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGxldCBkcmFnSGFuZGxlO1xuXHRcdFx0aWYgKGhhbmRsZU5hbWUpIHtcblx0XHRcdFx0ZHJhZ0hhbmRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2hhbmRsZU5hbWV9YCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWRyYWdIYW5kbGUpIHtcblx0XHRcdFx0ZHJhZ0hhbmRsZSA9IHRoaXMubWFpbkRpdjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0ZHJhZy5lbmRIb29rID0gKHgsIHkpID0+IHtcblx0XHRcdFx0TmF2cG9wdXAudHJhY2tlci5kaXJ0eSA9IHRydWU7XG5cdFx0XHRcdHNlbGYucmVwb3NpdGlvbih4LCB5KTtcblx0XHRcdH07XG5cdFx0XHRkcmFnLmluaXQoZHJhZ0hhbmRsZSwgdGhpcy5tYWluRGl2KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogSGlkZXMgdGhlIHBvcHVwIHVzaW5nIENTUy4gUnVucyBob29rcyB3aXRoIGtleSAnaGlkZScuXG5cdFx0ICogU2V0cyB7QHNvdXJjZSAjdmlzaWJsZX0gYXBwcm9wcmlhdGVseS5cblx0XHQgKiB7QHNvdXJjZSAjYmFuaXNofSBzaG91bGQgYmUgY2FsbGVkIGV4dGVybmFsbHkgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0aGlkZSgpIHtcblx0XHRcdHRoaXMucnVuSG9va3MoJ2hpZGUnLCAnYmVmb3JlJyk7XG5cdFx0XHR0aGlzLmFib3J0RG93bmxvYWRzKCk7XG5cdFx0XHRpZiAodGhpcy52aXNpYmxlICE9PSB1bmRlZmluZWQgJiYgdGhpcy52aXNpYmxlKSB7XG5cdFx0XHRcdHRoaXMubWFpbkRpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0XHR0aGlzLnZpc2libGUgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMucnVuSG9va3MoJ2hpZGUnLCAnYWZ0ZXInKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogU2hvd3MgdGhlIHBvcHVwIHVzaW5nIENTUy4gUnVucyBob29rcyB3aXRoIGtleSAndW5oaWRlJy5cblx0XHQgKiBTZXRzIHtAc291cmNlICN2aXNpYmxlfSBhcHByb3ByaWF0ZWx5LiAgIHtAc291cmNlICNzaG93fSBzaG91bGQgYmUgY2FsbGVkIGV4dGVybmFsbHkgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dW5oaWRlKCkge1xuXHRcdFx0dGhpcy5ydW5Ib29rcygndW5oaWRlJywgJ2JlZm9yZScpO1xuXHRcdFx0aWYgKHRoaXMudmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmICF0aGlzLnZpc2libGUpIHtcblx0XHRcdFx0dGhpcy5tYWluRGl2LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcblx0XHRcdFx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHRoaXMucnVuSG9va3MoJ3VuaGlkZScsICdhZnRlcicpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBTZXRzIHRoZSA8Y29kZT5pbm5lckhUTUw8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgbWFpbiBkaXYgY29udGFpbmluZyB0aGUgcG9wdXAgY29udGVudC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIFRoZSBIVE1MIHRvIHNldC5cblx0XHQgKi9cblx0XHRzZXRJbm5lckhUTUwoaHRtbCkge1xuXHRcdFx0dGhpcy5tYWluRGl2LmlubmVySFRNTCA9IGh0bWw7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZXMgdGhlIHtAc291cmNlICN3aWR0aH0gYW5kIHtAc291cmNlICNoZWlnaHR9IGF0dHJpYnV0ZXMgd2l0aCB0aGUgQ1NTIHByb3BlcnRpZXMuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHVwZGF0ZURpbWVuc2lvbnMoKSB7XG5cdFx0XHR0aGlzLndpZHRoID0gTnVtYmVyLnBhcnNlSW50KHRoaXMubWFpbkRpdi5vZmZzZXRXaWR0aCwgMTApO1xuXHRcdFx0dGhpcy5oZWlnaHQgPSBOdW1iZXIucGFyc2VJbnQodGhpcy5tYWluRGl2Lm9mZnNldEhlaWdodCwgMTApO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBDaGVja3MgaWYgdGhlIHBvaW50ICh4LHkpIGlzIHdpdGhpbiB7QHNvdXJjZSAjZnV6en0gb2YgdGhlXG5cdFx0ICoge0Bzb3VyY2UgI21haW5EaXZ9LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSB4IHgtY29vcmRpbmF0ZSAocHgpXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSB5IHktY29vcmRpbmF0ZSAocHgpXG5cdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdCAqL1xuXHRcdGlzV2l0aGluKHgsIHkpIHtcblx0XHRcdC8vIH4gSWYgd2UncmUgbm90IGV2ZW4gdmlzaWJsZSwgbm8gcG9pbnQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXNcblx0XHRcdC8vIH4gYmVpbmcgd2l0aGluIHRoZSBwb3B1cC5cblx0XHRcdGlmICghdGhpcy52aXNpYmxlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMudXBkYXRlRGltZW5zaW9ucygpO1xuXHRcdFx0Y29uc3QgZnV6eiA9IHRoaXMuZnV6eiB8fCAwO1xuXHRcdFx0Ly8gfiBVc2UgYSBzaW1wbGUgYm94IG1ldHJpYyBoZXJlLlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0eCArIGZ1enogPj0gdGhpcy5sZWZ0ICYmXG5cdFx0XHRcdHggLSBmdXp6IDw9IHRoaXMubGVmdCArIHRoaXMud2lkdGggJiZcblx0XHRcdFx0eSArIGZ1enogPj0gdGhpcy50b3AgJiZcblx0XHRcdFx0eSAtIGZ1enogPD0gdGhpcy50b3AgKyB0aGlzLmhlaWdodFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQWRkcyBhIGRvd25sb2FkIHRvIHtAc291cmNlICNkb3dubG9hZHN9LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtEb3dubG9hZGVyfSBkb3dubG9hZFxuXHRcdCAqL1xuXHRcdGFkZERvd25sb2FkKGRvd25sb2FkKSB7XG5cdFx0XHRpZiAoIWRvd25sb2FkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuZG93bmxvYWRzLnB1c2goZG93bmxvYWQpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBBYm9ydHMgdGhlIGRvd25sb2FkcyBsaXN0ZWQgaW4ge0Bzb3VyY2UgI2Rvd25sb2Fkc30uXG5cdFx0ICpcblx0XHQgKiBAc2VlIERvd25sb2FkZXIjYWJvcnRcblx0XHQgKi9cblx0XHRhYm9ydERvd25sb2FkcygpIHtcblx0XHRcdGZvciAoY29uc3QgZCBvZiB0aGlzLmRvd25sb2Fkcykge1xuXHRcdFx0XHRpZiAoZCAmJiBkLmFib3J0KSB7XG5cdFx0XHRcdFx0ZC5hYm9ydCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmRvd25sb2FkcyA9IFtdO1xuXHRcdH1cblx0fVxuXHQvKipcblx0ICogQSBVSUQgZm9yIGVhY2ggTmF2cG9wdXAuIFRoaXMgY29uc3RydWN0b3IgcHJvcGVydHkgaXMganVzdCBhIGNvdW50ZXIuXG5cdCAqXG5cdCAqIEB0eXBlIGludGVnZXJcblx0ICogQHByaXZhdGVcblx0ICovXG5cdE5hdnBvcHVwLnVpZCA9IDA7XG5cdC8qKlxuXHQgKiBDb3VudGVyIGluZGljYXRpbmcgdGhlIHotb3JkZXIgb2YgdGhlIFwiaGlnaGVzdFwiIHBvcHVwLlxuXHQgKiBXZSBzdGFydCB0aGUgei1pbmRleCBhdCAxMDAwIHNvIHRoYXQgcG9wdXBzIGFyZSBhYm92ZSBldmVyeXRoaW5nXG5cdCAqIGVsc2Ugb24gdGhlIHNjcmVlbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHR5cGUgaW50ZWdlclxuXHQgKi9cblx0TmF2cG9wdXAuaGlnaGVzdCA9IDEwMDA7XG5cdC8qKlxuXHQgKiBBIHtAc291cmNlIE1vdXNldHJhY2tlcn0gaW5zdGFuY2Ugd2hpY2ggaXMgYSBwcm9wZXJ0eSBvZiB0aGUgY29uc3RydWN0b3IgKHBzZXVkby1nbG9iYWwpLlxuXHQgKi9cblx0TmF2cG9wdXAudHJhY2tlciA9IG5ldyBNb3VzZXRyYWNrZXIoKTtcblx0Ly8gRU5ERklMRTogbmF2cG9wdXAuanNcblx0Ly8gU1RBUlRGSUxFOiBkaWZmLmpzXG5cdC8qKlxuXHQgKiBKYXZhc2NyaXB0IERpZmYgQWxnb3JpdGhtIEJ5IEpvaG4gUmVzaWcgKGh0dHA6Ly9lam9obi5vcmcvKSBhbmQgTHVwaW5cblx0ICpcblx0ICogTW9yZSBJbmZvOiBodHRwOi8vZWpvaG4ub3JnL3Byb2plY3RzL2phdmFzY3JpcHQtZGlmZi1hbGdvcml0aG0vXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nW119IHhcblx0ICovXG5cdGNvbnN0IGRlbEZtdCA9ICh4KSA9PiB7XG5cdFx0aWYgKHgubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHRcdHJldHVybiBgPGRlbCBjbGFzcz0ncG9wdXBEaWZmJz4ke3guam9pbignJyl9PC9kZWw+YDtcblx0fTtcblx0Y29uc3QgaW5zRm10ID0gKHgpID0+IHtcblx0XHRpZiAoeC5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cdFx0cmV0dXJuIGA8aW5zIGNsYXNzPSdwb3B1cERpZmYnPiR7eC5qb2luKCcnKX08L2lucz5gO1xuXHR9O1xuXHRjb25zdCBjb3VudENyb3NzaW5ncyA9IChhLCBiLCBpLCBlamVjdCkgPT4ge1xuXHRcdC8vIGNvdW50IHRoZSBjcm9zc2luZ3Mgb24gdGhlIGVkZ2Ugc3RhcnRpbmcgYXQgYltpXVxuXHRcdGlmICghYltpXS5yb3cgJiYgYltpXS5yb3cgIT09IDApIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cdFx0bGV0IGNvdW50ID0gMDtcblx0XHRmb3IgKGNvbnN0IFtqLCBlbGVtZW50XSBvZiBhLmVudHJpZXMoKSkge1xuXHRcdFx0aWYgKCFlbGVtZW50LnJvdyAmJiBlbGVtZW50LnJvdyAhPT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICgoaiAtIGJbaV0ucm93KSAqIChpIC0gZWxlbWVudC5yb3cpID4gMCkge1xuXHRcdFx0XHRpZiAoZWplY3QpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY291bnQ7XG5cdH07XG5cdGNvbnN0IHNob3J0ZW5EaWZmU3RyaW5nID0gZnVuY3Rpb24gc2hvcnRlbkRpZmZTdHJpbmcoc3RyLCBjb250ZXh0KSB7XG5cdFx0Y29uc3QgcmUgPSAvKDxkZWxbXFxTXFxzXSo/PFxcL2RlbD58PGluc1tcXFNcXHNdKj88XFwvaW5zPikvO1xuXHRcdGNvbnN0IHNwbGl0dGVkID0gc3RyLnNwbGl0KHJlKTtcblx0XHRsZXQgcmV0ID0gWycnXTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0dGVkLmxlbmd0aDsgaSArPSAyKSB7XG5cdFx0XHRpZiAoc3BsaXR0ZWRbaV0ubGVuZ3RoIDwgMiAqIGNvbnRleHQpIHtcblx0XHRcdFx0cmV0W3JldC5sZW5ndGggLSAxXSArPSBzcGxpdHRlZFtpXTtcblx0XHRcdFx0aWYgKGkgKyAxIDwgc3BsaXR0ZWQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0W3JldC5sZW5ndGggLSAxXSArPSBzcGxpdHRlZFtpICsgMV07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRyZXRbcmV0Lmxlbmd0aCAtIDFdICs9IHNwbGl0dGVkW2ldLnNsaWNlKDAsIE1hdGgubWF4KDAsIGNvbnRleHQpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaSArIDEgPCBzcGxpdHRlZC5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXQucHVzaChzcGxpdHRlZFtpXS5zbGljZShNYXRoLm1heCgwLCBzcGxpdHRlZFtpXS5sZW5ndGggLSBjb250ZXh0KSkgKyBzcGxpdHRlZFtpICsgMV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlIChyZXQubGVuZ3RoID4gMCAmJiAhcmV0WzBdKSB7XG5cdFx0XHRyZXQgPSByZXQuc2xpY2UoMSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IGRpZmZTdHJpbmcgPSAobywgbikgPT4ge1xuXHRcdC8vICBXZSBuZWVkIHRvIHNwbGl0IHRoZSBzdHJpbmdzIG8gYW5kIG4gZmlyc3QsIGFuZCBlbnRpZnkoKSB0aGUgcGFydHNcblx0XHQvLyAgaW5kaXZpZHVhbGx5LCBzbyB0aGF0IHRoZSBIVE1MIGVudGl0aWVzIGFyZSBuZXZlciBjdXQgYXBhcnQuIChBeGVsQm9sZHQpXG5cdFx0bGV0IGk7XG5cdFx0Y29uc3Qgb1NwbGl0dGVkID0gby5zcGxpdCgvXFxiLyk7XG5cdFx0Y29uc3QgblNwbGl0dGVkID0gbi5zcGxpdCgvXFxiLyk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IG9TcGxpdHRlZC5sZW5ndGg7ICsraSkge1xuXHRcdFx0b1NwbGl0dGVkW2ldID0gb1NwbGl0dGVkW2ldLmVudGlmeSgpO1xuXHRcdH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgblNwbGl0dGVkLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRuU3BsaXR0ZWRbaV0gPSBuU3BsaXR0ZWRbaV0uZW50aWZ5KCk7XG5cdFx0fVxuXHRcdGNvbnN0IG91dCA9IGRpZmYob1NwbGl0dGVkLCBuU3BsaXR0ZWQpO1xuXHRcdGxldCBzdHIgPSAnJztcblx0XHRsZXQgYWNjID0gW107IC8vIGFjY3VtdWxhdG9yIGZvciBwcmV0dGllciBvdXRwdXRcblxuXHRcdC8vIGNyb3NzaW5nIHBhaXJpbmdzIC0tIGVnICdBIEInIHZzICdCIEEnIC0tIGNhdXNlIHByb2JsZW1zLCBzbyBsZXQncyBpcm9uIHRoZW0gb3V0XG5cdFx0Ly8gdGhpcyBkb2Vzbid0IGFsd2F5cyBkbyB0aGluZ3Mgb3B0aW1hbGx5IGJ1dCBpdCBzaG91bGQgYmUgZmFzdCBlbm91Z2hcblx0XHRsZXQgbWF4T3V0cHV0UGFpciA9IDA7XG5cdFx0Zm9yIChpID0gMDsgaSA8IG91dC5uLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAob3V0Lm5baV0ucGFpcmVkKSB7XG5cdFx0XHRcdGlmIChtYXhPdXRwdXRQYWlyID4gb3V0Lm5baV0ucm93KSB7XG5cdFx0XHRcdFx0Ly8gdGFuZ2xlIC0gZGVsZXRlIHBhaXJpbmdcblx0XHRcdFx0XHRvdXQub1tvdXQubltpXS5yb3ddID0gb3V0Lm9bb3V0Lm5baV0ucm93XS50ZXh0O1xuXHRcdFx0XHRcdG91dC5uW2ldID0gb3V0Lm5baV0udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobWF4T3V0cHV0UGFpciA8IG91dC5uW2ldLnJvdykge1xuXHRcdFx0XHRcdG1heE91dHB1dFBhaXIgPSBvdXQubltpXS5yb3c7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gb3V0cHV0IHRoZSBzdHVmZiBwcmVjZWRpbmcgdGhlIGZpcnN0IHBhaXJlZCBvbGQgbGluZVxuXHRcdGZvciAoaSA9IDA7IGkgPCBvdXQuby5sZW5ndGggJiYgIW91dC5vW2ldLnBhaXJlZDsgKytpKSB7XG5cdFx0XHRhY2MucHVzaChvdXQub1tpXSk7XG5cdFx0fVxuXHRcdHN0ciArPSBkZWxGbXQoYWNjKTtcblx0XHRhY2MgPSBbXTtcblx0XHQvLyBtYWluIGxvb3Bcblx0XHRmb3IgKGkgPSAwOyBpIDwgb3V0Lm4ubGVuZ3RoOyArK2kpIHtcblx0XHRcdC8vIG91dHB1dCB1bnBhaXJlZCBuZXcgXCJsaW5lc1wiXG5cdFx0XHR3aGlsZSAoaSA8IG91dC5uLmxlbmd0aCAmJiAhb3V0Lm5baV0ucGFpcmVkKSB7XG5cdFx0XHRcdGFjYy5wdXNoKG91dC5uW2krK10pO1xuXHRcdFx0fVxuXHRcdFx0c3RyICs9IGluc0ZtdChhY2MpO1xuXHRcdFx0YWNjID0gW107XG5cdFx0XHRpZiAoaSA8IG91dC5uLmxlbmd0aCkge1xuXHRcdFx0XHQvLyB0aGlzIG5ldyBcImxpbmVcIiBpcyBwYWlyZWQgd2l0aCB0aGUgKG91dC5uW2ldLnJvdyl0aCBvbGQgXCJsaW5lXCJcblx0XHRcdFx0c3RyICs9IG91dC5uW2ldLnRleHQ7XG5cdFx0XHRcdC8vIG91dHB1dCB1bnBhaXJlZCBvbGQgcm93cyBzdGFydGluZyBhZnRlciB0aGlzIG5ldyBsaW5lJ3MgcGFydG5lclxuXHRcdFx0XHRsZXQgbSA9IG91dC5uW2ldLnJvdyArIDE7XG5cdFx0XHRcdHdoaWxlIChtIDwgb3V0Lm8ubGVuZ3RoICYmICFvdXQub1ttXS5wYWlyZWQpIHtcblx0XHRcdFx0XHRhY2MucHVzaChvdXQub1ttKytdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdHIgKz0gZGVsRm10KGFjYyk7XG5cdFx0XHRcdGFjYyA9IFtdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc3RyO1xuXHR9O1xuXHQvLyBzZWUge0BsaW5rIGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZTpHbG9iYWxfT2JqZWN0czpPYmplY3R9XG5cdC8vIEZJWE1FOiB1c2Ugb2JqLmhhc093blByb3BlcnR5IGluc3RlYWQgb2YgdGhpcyBrbHVkZ2UhXG5cdGNvbnN0IGpzUmVzZXJ2ZWRQcm9wZXJ0aWVzID0gbmV3IFJlZ0V4cChcblx0XHQnXihjb25zdHJ1Y3Rvcnxwcm90b3R5cGV8X18oKGRlZmluZXxsb29rdXApW0dTXWV0dGVyKV9fJyArXG5cdFx0XHQnfGV2YWx8aGFzT3duUHJvcGVydHl8cHJvcGVydHlJc0VudW1lcmFibGUnICtcblx0XHRcdCd8dG8oU291cmNlfFN0cmluZ3xMb2NhbGVTdHJpbmcpfCh1bik/d2F0Y2h8dmFsdWVPZikkJ1xuXHQpO1xuXHRjb25zdCBkaWZmQnVnQWxlcnQgPSBmdW5jdGlvbiBkaWZmQnVnQWxlcnQod29yZCkge1xuXHRcdGlmICghZGlmZkJ1Z0FsZXJ0Lmxpc3Rbd29yZF0pIHtcblx0XHRcdGRpZmZCdWdBbGVydC5saXN0W3dvcmRdID0gMTtcblx0XHRcdHZvaWQgbXcubm90aWZ5KGBCYWQgd29yZDogJHt3b3JkfVxcblxcblBsZWFzZSByZXBvcnQgdGhpcyBidWcuYCwge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHR9XG5cdH07XG5cdGRpZmZCdWdBbGVydC5saXN0ID0ge307XG5cdGNvbnN0IG1ha2VEaWZmSGFzaHRhYmxlID0gKHNyYykgPT4ge1xuXHRcdGNvbnN0IHJldCA9IHt9O1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoanNSZXNlcnZlZFByb3BlcnRpZXMudGVzdChzcmNbaV0pKSB7XG5cdFx0XHRcdHNyY1tpXSArPSAnPCEtLSAtLT4nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFyZXRbc3JjW2ldXSkge1xuXHRcdFx0XHRyZXRbc3JjW2ldXSA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0W3NyY1tpXV0ucHVzaChpKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRkaWZmQnVnQWxlcnQoc3JjW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgZGlmZiA9IChvLCBuKSA9PiB7XG5cdFx0Ly8gcGFzcyAxOiBtYWtlIGhhc2h0YWJsZSBucyB3aXRoIG5ldyByb3dzIGFzIGtleXNcblx0XHRjb25zdCBucyA9IG1ha2VEaWZmSGFzaHRhYmxlKG4pO1xuXHRcdC8vIHBhc3MgMjogbWFrZSBoYXNodGFibGUgb3Mgd2l0aCBvbGQgcm93cyBhcyBrZXlzXG5cdFx0Y29uc3Qgb3MgPSBtYWtlRGlmZkhhc2h0YWJsZShvKTtcblx0XHQvLyBwYXNzIDM6IHBhaXIgdW5pcXVlIG5ldyByb3dzIGFuZCBtYXRjaGluZyB1bmlxdWUgb2xkIHJvd3Ncblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgaW4gbnMpIHtcblx0XHRcdGlmIChuc1tpXS5sZW5ndGggPT09IDEgJiYgb3NbaV0gJiYgb3NbaV0ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdG5bbnNbaV1bMF1dID0ge1xuXHRcdFx0XHRcdHRleHQ6IG5bbnNbaV1bMF1dLFxuXHRcdFx0XHRcdHJvdzogb3NbaV1bMF0sXG5cdFx0XHRcdFx0cGFpcmVkOiB0cnVlLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvW29zW2ldWzBdXSA9IHtcblx0XHRcdFx0XHR0ZXh0OiBvW29zW2ldWzBdXSxcblx0XHRcdFx0XHRyb3c6IG5zW2ldWzBdLFxuXHRcdFx0XHRcdHBhaXJlZDogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcGFzcyA0OiBwYWlyIG1hdGNoaW5nIHJvd3MgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHBhaXJlZCByb3dzIChub3QgbmVjZXNzYXJpbHkgdW5pcXVlKVxuXHRcdGZvciAoaSA9IDA7IGkgPCBuLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRuW2ldLnBhaXJlZCAmJlxuXHRcdFx0XHQhbltpICsgMV0ucGFpcmVkICYmXG5cdFx0XHRcdG5baV0ucm93ICsgMSA8IG8ubGVuZ3RoICYmXG5cdFx0XHRcdCFvW25baV0ucm93ICsgMV0ucGFpcmVkICYmXG5cdFx0XHRcdG5baSArIDFdID09PSBvW25baV0ucm93ICsgMV1cblx0XHRcdCkge1xuXHRcdFx0XHRuW2kgKyAxXSA9IHtcblx0XHRcdFx0XHR0ZXh0OiBuW2kgKyAxXSxcblx0XHRcdFx0XHRyb3c6IG5baV0ucm93ICsgMSxcblx0XHRcdFx0XHRwYWlyZWQ6IHRydWUsXG5cdFx0XHRcdH07XG5cdFx0XHRcdG9bbltpXS5yb3cgKyAxXSA9IHtcblx0XHRcdFx0XHR0ZXh0OiBvW25baV0ucm93ICsgMV0sXG5cdFx0XHRcdFx0cm93OiBpICsgMSxcblx0XHRcdFx0XHRwYWlyZWQ6IHRydWUsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHBhc3MgNTogcGFpciBtYXRjaGluZyByb3dzIGltbWVkaWF0ZWx5IHByZWNlZGluZyBwYWlyZWQgcm93cyAobm90IG5lY2Vzc2FyaWx5IHVuaXF1ZSlcblx0XHRmb3IgKGkgPSBuLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcblx0XHRcdGlmIChcblx0XHRcdFx0bltpXS5wYWlyZWQgJiZcblx0XHRcdFx0IW5baSAtIDFdLnBhaXJlZCAmJlxuXHRcdFx0XHRuW2ldLnJvdyA+IDAgJiZcblx0XHRcdFx0IW9bbltpXS5yb3cgLSAxXS5wYWlyZWQgJiZcblx0XHRcdFx0bltpIC0gMV0gPT09IG9bbltpXS5yb3cgLSAxXVxuXHRcdFx0KSB7XG5cdFx0XHRcdG5baSAtIDFdID0ge1xuXHRcdFx0XHRcdHRleHQ6IG5baSAtIDFdLFxuXHRcdFx0XHRcdHJvdzogbltpXS5yb3cgLSAxLFxuXHRcdFx0XHRcdHBhaXJlZDogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdFx0b1tuW2ldLnJvdyAtIDFdID0ge1xuXHRcdFx0XHRcdHRleHQ6IG9bbltpXS5yb3cgLSAxXSxcblx0XHRcdFx0XHRyb3c6IGkgLSAxLFxuXHRcdFx0XHRcdHBhaXJlZDogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdG8sXG5cdFx0XHRuLFxuXHRcdH07XG5cdH07XG5cdC8vIEVOREZJTEU6IGRpZmYuanNcblx0Ly8gU1RBUlRGSUxFOiBpbml0LmpzXG5cdGNvbnN0IHNldFNpdGVJbmZvID0gKCkgPT4ge1xuXHRcdGlmICh3aW5kb3cucG9wdXBMb2NhbERlYnVnKSB7XG5cdFx0XHRwZy53aWtpLmhvc3RuYW1lID0gJ2VuLndpa2lwZWRpYS5vcmcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwZy53aWtpLmhvc3RuYW1lID0gbG9jYXRpb24uaG9zdG5hbWU7IC8vIHVzZSBpbiBwcmVmZXJlbmNlIHRvIGxvY2F0aW9uLmhvc3RuYW1lIGZvciBmbGV4aWJpbGl0eSAoPylcblx0XHR9XG5cdFx0cGcud2lraS53aWtpbWVkaWEgPVxuXHRcdFx0Lyh3aWtpKFttcF1lZGlhfHNvdXJjZXxib29rc3xuZXdzfHF1b3RlfHZlcnNpdHl8c3BlY2llc3x2b3lhZ2V8ZGF0YSl8bWV0YXdpa2l8d2lrdGlvbmFyeXxtZWRpYXdpa2kpXFwub3JnLy50ZXN0KFxuXHRcdFx0XHRwZy53aWtpLmhvc3RuYW1lXG5cdFx0XHQpO1xuXHRcdHBnLndpa2kud2lraWEgPSAvXFwud2lraWFcXC5jb20kL2kudGVzdChwZy53aWtpLmhvc3RuYW1lKTtcblx0XHRwZy53aWtpLmlzTG9jYWwgPSBwZy53aWtpLmhvc3RuYW1lLnN0YXJ0c1dpdGgoJ2xvY2FsaG9zdCcpO1xuXHRcdHBnLndpa2kuY29tbW9ucyA9XG5cdFx0XHRwZy53aWtpLndpa2ltZWRpYSAmJiBwZy53aWtpLmhvc3RuYW1lICE9PSAnY29tbW9ucy53aWtpbWVkaWEub3JnJyA/ICdjb21tb25zLndpa2ltZWRpYS5vcmcnIDogbnVsbDtcblx0XHRwZy53aWtpLmxhbmcgPSBtdy5jb25maWcuZ2V0KCd3Z0NvbnRlbnRMYW5ndWFnZScpO1xuXHRcdGNvbnN0IHBvcnQgPSBsb2NhdGlvbi5wb3J0ID8gYDoke2xvY2F0aW9uLnBvcnR9YCA6ICcnO1xuXHRcdHBnLndpa2kuc2l0ZWJhc2UgPSBwZy53aWtpLmhvc3RuYW1lICsgcG9ydDtcblx0fTtcblx0Y29uc3Qgc2V0VXNlckluZm8gPSAoKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0bGlzdDogJ3VzZXJzJyxcblx0XHRcdHVzdXNlcnM6IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSxcblx0XHRcdHVzcHJvcDogJ3JpZ2h0cycsXG5cdFx0fTtcblx0XHRwZy51c2VyLmNhblJldmlldyA9IGZhbHNlO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFJldmlldycpKSB7XG5cdFx0XHRnZXRNd0FwaSgpXG5cdFx0XHRcdC5nZXQocGFyYW1zKVxuXHRcdFx0XHQuZG9uZSgoZGF0YSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IFt7cmlnaHRzfV0gPSBkYXRhLnF1ZXJ5LnVzZXJzO1xuXHRcdFx0XHRcdHBnLnVzZXIuY2FuUmV2aWV3ID0gcmlnaHRzLmluY2x1ZGVzKCdyZXZpZXcnKTsgLy8gVE9ETzogU2hvdWxkIGl0IGJlIGEgZ2V0VmFsdWVPZignUmV2aWV3UmlnaHQnKSA/XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZmV0Y2hTcGVjaWFsUGFnZU5hbWVzID0gKCkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdGZvcm1hdDogJ2pzb24nLFxuXHRcdFx0Zm9ybWF0dmVyc2lvbjogJzInLFxuXHRcdFx0bWF4YWdlOiAzNjAwLFxuXHRcdFx0bWV0YTogJ3NpdGVpbmZvJyxcblx0XHRcdHNpcHJvcDogJ3NwZWNpYWxwYWdlYWxpYXNlcycsXG5cdFx0XHQvLyBjYWNoZSBmb3IgYW4gaG91clxuXHRcdFx0dXNlbGFuZzogJ2NvbnRlbnQnLFxuXHRcdH07XG5cdFx0cmV0dXJuIGdldE13QXBpKClcblx0XHRcdC5nZXQocGFyYW1zKVxuXHRcdFx0LnRoZW4oKGRhdGEpID0+IHtcblx0XHRcdFx0cGcud2lraS5zcGVjaWFscGFnZWFsaWFzZXMgPSBkYXRhLnF1ZXJ5LnNwZWNpYWxwYWdlYWxpYXNlcztcblx0XHRcdH0pO1xuXHR9O1xuXHRjb25zdCBzZXRUaXRsZUJhc2UgPSAoKSA9PiB7XG5cdFx0Y29uc3QgcHJvdG9jb2wgPSB3aW5kb3cucG9wdXBMb2NhbERlYnVnID8gJ2h0dHA6JyA6IGxvY2F0aW9uLnByb3RvY29sO1xuXHRcdHBnLndpa2kuYXJ0aWNsZVBhdGggPSBtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVQYXRoJykucmVwbGFjZSgvXFwvXFwkMS8sICcnKTsgLy8gYXMgaW4gaHR0cDovL3NvbWUudGhpbmcuY29tL3dpa2kvQXJ0aWNsZVxuXHRcdHBnLndpa2kuYm90SW50ZXJmYWNlUGF0aCA9IG13LmNvbmZpZy5nZXQoJ3dnU2NyaXB0Jyk7XG5cdFx0cGcud2lraS5BUElQYXRoID0gYCR7bXcuY29uZmlnLmdldCgnd2dTY3JpcHRQYXRoJyl9L2FwaS5waHBgO1xuXHRcdC8vIGRlZmF1bHQgbWVkaWF3aWtpIHNldHRpbmcgaXMgcGF0aHMgbGlrZSBodHRwOi8vc29tZS50aGluZy5jb20vYXJ0aWNsZVBhdGgvaW5kZXgucGhwP3RpdGxlPWZvb1xuXHRcdGNvbnN0IHRpdGxldGFpbCA9IGAke3BnLndpa2kuYm90SW50ZXJmYWNlUGF0aH0/dGl0bGU9YDtcblx0XHQvLyBsZXQgdGl0bGV0YWlsMiA9IGpvaW5QYXRoKFtwZy53aWtpLmJvdEludGVyZmFjZVBhdGgsICd3aWtpLnBodG1sP3RpdGxlPSddKTtcblx0XHQvLyBvdGhlciBzaXRlcyBtYXkgbmVlZCB0byBhZGQgY29kZSBoZXJlIHRvIHNldCB0aXRsZXRhaWwgZGVwZW5kaW5nIG9uIGhvdyB0aGVpciB1cmxzIHdvcmtcblx0XHRwZy53aWtpLnRpdGxlYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLnNpdGViYXNlfSR7dGl0bGV0YWlsfWA7XG5cdFx0Ly8gcGcud2lraS50aXRsZWJhc2UyICA9IHByb3RvY29sICsgJy8vJyArIGpvaW5QYXRoKFtwZy53aWtpLnNpdGViYXNlLCB0aXRsZXRhaWwyXSk7XG5cdFx0cGcud2lraS53aWtpYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLnNpdGViYXNlfSR7cGcud2lraS5ib3RJbnRlcmZhY2VQYXRofWA7XG5cdFx0cGcud2lraS5hcGl3aWtpYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLnNpdGViYXNlfSR7cGcud2lraS5BUElQYXRofWA7XG5cdFx0cGcud2lraS5hcnRpY2xlYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLnNpdGViYXNlfSR7cGcud2lraS5hcnRpY2xlUGF0aH1gO1xuXHRcdHBnLndpa2kuY29tbW9uc2Jhc2UgPSBgJHtwcm90b2NvbH0vLyR7cGcud2lraS5jb21tb25zfSR7cGcud2lraS5ib3RJbnRlcmZhY2VQYXRofWA7XG5cdFx0cGcud2lraS5hcGljb21tb25zYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLmNvbW1vbnN9JHtwZy53aWtpLkFQSVBhdGh9YDtcblx0XHRwZy5yZS5iYXNlbmFtZXMgPSBuZXcgUmVnRXhwKGBeKCR7bWFwKGxpdGVyYWxpemVSZWdleCwgW3BnLndpa2kudGl0bGViYXNlLCBwZy53aWtpLmFydGljbGViYXNlXSkuam9pbignfCcpfSlgKTtcblx0fTtcblx0Ly8gR2xvYmFsIHJlZ2V4cHNcblx0Y29uc3Qgc2V0TWFpblJlZ2V4ID0gKCkgPT4ge1xuXHRcdGNvbnN0IHJlU3RhcnQgPSAnW146XSo6Ly8nO1xuXHRcdGxldCBwcmVUaXRsZXMgPSBgJHtsaXRlcmFsaXplUmVnZXgobXcuY29uZmlnLmdldCgnd2dTY3JpcHRQYXRoJykpfS8oPzppbmRleFsuXXBocHx3aWtpWy5dcGh0bWwpWz9ddGl0bGU9YDtcblx0XHRwcmVUaXRsZXMgKz0gYHwke2xpdGVyYWxpemVSZWdleChgJHtwZy53aWtpLmFydGljbGVQYXRofS9gKX1gO1xuXHRcdGNvbnN0IHJlRW5kID0gYCgke3ByZVRpdGxlc30pKFteJj8jXSopW14jXSooPzojKC4rKSk/YDtcblx0XHRwZy5yZS5tYWluID0gbmV3IFJlZ0V4cChyZVN0YXJ0ICsgbGl0ZXJhbGl6ZVJlZ2V4KHBnLndpa2kuc2l0ZWJhc2UpICsgcmVFbmQpO1xuXHR9O1xuXHRjb25zdCBidWlsZFNwZWNpYWxQYWdlR3JvdXAgPSAoc3BlY2lhbFBhZ2VPYmopID0+IHtcblx0XHRjb25zdCB2YXJpYW50cyA9IFtdO1xuXHRcdHZhcmlhbnRzLnB1c2goXG5cdFx0XHRtdy51dGlsLmVzY2FwZVJlZ0V4cChzcGVjaWFsUGFnZU9iai5yZWFsbmFtZSksXG5cdFx0XHRtdy51dGlsLmVzY2FwZVJlZ0V4cChlbmNvZGVVUkkoc3BlY2lhbFBhZ2VPYmoucmVhbG5hbWUpKVxuXHRcdCk7XG5cdFx0Zm9yIChjb25zdCBhbGlhcyBvZiBzcGVjaWFsUGFnZU9iai5hbGlhc2VzKSB7XG5cdFx0XHR2YXJpYW50cy5wdXNoKG13LnV0aWwuZXNjYXBlUmVnRXhwKGFsaWFzKSwgbXcudXRpbC5lc2NhcGVSZWdFeHAoZW5jb2RlVVJJKGFsaWFzKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFudHMuam9pbignfCcpO1xuXHR9O1xuXHRjb25zdCBzZXRSZWdleHBzID0gKCkgPT4ge1xuXHRcdHNldE1haW5SZWdleCgpO1xuXHRcdGNvbnN0IHNwID0gbnNSZShwZy5uc1NwZWNpYWxJZCk7XG5cdFx0cGcucmUudXJsTm9Qb3B1cCA9IG5ldyBSZWdFeHAoYCgodGl0bGU9fC8pJHtzcH0oPzolM0F8Oil8c2VjdGlvbj1bMC05XXxeIyQpYCk7XG5cdFx0Zm9yIChjb25zdCBzcGVjaWFscGFnZSBvZiBwZy53aWtpLnNwZWNpYWxwYWdlYWxpYXNlcykge1xuXHRcdFx0c3dpdGNoIChzcGVjaWFscGFnZS5yZWFsbmFtZSkge1xuXHRcdFx0XHRjYXNlICdDb250cmlidXRpb25zJzpcblx0XHRcdFx0XHRwZy5yZS5jb250cmlicyA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRgKHRpdGxlPXwvKSR7c3B9KD86JTNBfDopKD86JHtidWlsZFNwZWNpYWxQYWdlR3JvdXAoc3BlY2lhbHBhZ2UpfSlgICtcblx0XHRcdFx0XHRcdFx0YCgmdGFyZ2V0PXwvfC8ke25zUmUocGcubnNVc2VySWQpfTopKC4qKWAsXG5cdFx0XHRcdFx0XHQnaSdcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdEaWZmJzpcblx0XHRcdFx0XHRwZy5yZS5zcGVjaWFsZGlmZiA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRgLyR7c3B9KD86JTNBfDopKD86JHtidWlsZFNwZWNpYWxQYWdlR3JvdXAoc3BlY2lhbHBhZ2UpfSkvKFtePyNdKilgLFxuXHRcdFx0XHRcdFx0J2knXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnRW1haWx1c2VyJzpcblx0XHRcdFx0XHRwZy5yZS5lbWFpbCA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRgKHRpdGxlPXwvKSR7c3B9KD86JTNBfDopKD86JHtidWlsZFNwZWNpYWxQYWdlR3JvdXAoc3BlY2lhbHBhZ2UpfSlgICtcblx0XHRcdFx0XHRcdFx0YCgmdGFyZ2V0PXwvfC8oPzoke25zUmUocGcubnNVc2VySWQpfTopPykoLiopYCxcblx0XHRcdFx0XHRcdCdpJ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1doYXRsaW5rc2hlcmUnOlxuXHRcdFx0XHRcdHBnLnJlLmJhY2tsaW5rcyA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRgKHRpdGxlPXwvKSR7c3B9KD86JTNBfDopKD86JHtidWlsZFNwZWNpYWxQYWdlR3JvdXAoc3BlY2lhbHBhZ2UpfSkoJnRhcmdldD18LykoW14mXSopYCxcblx0XHRcdFx0XHRcdCdpJ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGltID0gbnNSZUltYWdlKCk7XG5cdFx0Ly8gbm90ZTogdHJpZXMgdG8gZ2V0IGltYWdlcyBpbiBpbmZvYm94IHRlbXBsYXRlcyB0b28sIGUuZy4gbW92aWUgcGFnZXMsIGFsYnVtIHBhZ2VzIGV0Y1xuXHRcdC8vXHRcdFx0XHRcdCAgKF58XFxbXFxbKWltYWdlOiAqKFtefFxcXV0qW158XFxdIF0pICpcblx0XHQvL1x0XHRcdFx0XHQgIChefFxcW1xcWylpbWFnZTogKihbXnxcXF1dKltefFxcXSBdKShbXjAtOVxcXV0qKFswLTldKykgKnB4KT9cblx0XHQvL1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkNCA9IDEyMCBhcyBpbiAxMjBweFxuXHRcdHBnLnJlLmltYWdlID0gbmV3IFJlZ0V4cChcblx0XHRcdGAoXnxcXFxcW1xcXFxbKSR7aW19OiAqKFtefFxcXFxdXSpbXnxcXFxcXSBdKWAgK1xuXHRcdFx0XHQnKFteMC05XFxcXF1dKihbMC05XSspICpweCk/fCg/OlxcXFxuICpbfF0/fFt8XSkgKicgK1xuXHRcdFx0XHRgKCR7Z2V0VmFsdWVPZigncG9wdXBJbWFnZVZhcnNSZWdleHAnKX0pYCArXG5cdFx0XHRcdGAgKj0gKig/OlxcXFxbXFxcXFsgKik/KD86JHtpbX06KT9gICtcblx0XHRcdFx0JyhbXnxdKj8pKD86XFxcXF1cXFxcXSk/ICpbfF0/ICpcXFxcbicsXG5cdFx0XHQnaW1nJ1xuXHRcdCk7XG5cdFx0cGcucmUuaW1hZ2VCcmFja2V0Q291bnQgPSA2O1xuXHRcdHBnLnJlLmNhdGVnb3J5ID0gbmV3IFJlZ0V4cChgXFxcXFtcXFxcWyR7bnNSZShwZy5uc0NhdGVnb3J5SWQpfTogKihbXnxcXFxcXV0qW158XFxcXF0gXSkgKmAsICdpJyk7XG5cdFx0cGcucmUuY2F0ZWdvcnlCcmFja2V0Q291bnQgPSAxO1xuXHRcdC8vIElQdjYgfCBJUHY0XG5cdFx0cGcucmUuaXBVc2VyID1cblx0XHRcdC9eKD86Oig/Ojp8KD86OltcXGRBLUZhLWZdezEsNH0pezEsN30pfFtcXGRBLUZhLWZdezEsNH0oPzo6W1xcZEEtRmEtZl17MSw0fSl7MCw2fTo6fFtcXGRBLUZhLWZdezEsNH0oPzo6W1xcZEEtRmEtZl17MSw0fSl7N30pfCgoKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKVxcLil7M30oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKSQvO1xuXHRcdHBnLnJlLnN0dWIgPSBuZXcgUmVnRXhwKGdldFZhbHVlT2YoJ3BvcHVwU3R1YlJlZ2V4cCcpLCAnaW0nKTtcblx0XHRwZy5yZS5kaXNhbWJpZyA9IG5ldyBSZWdFeHAoZ2V0VmFsdWVPZigncG9wdXBEYWJSZWdleHAnKSwgJ2ltJyk7XG5cdFx0Ly8gRklYTUUgcmVwbGFjZSB3aXRoIGdlbmVyYWwgcGFyYW1ldGVyIHBhcnNpbmcgZnVuY3Rpb24sIHRoaXMgaXMgZGFmdFxuXHRcdHBnLnJlLm9sZGlkID0gL1smP11vbGRpZD0oW14mXSopLztcblx0XHRwZy5yZS5kaWZmID0gL1smP11kaWZmPShbXiZdKikvO1xuXHR9O1xuXHQvLyBtaXNjZWxsYW55XG5cdGNvbnN0IHNldHVwQ2FjaGUgPSAoKSA9PiB7XG5cdFx0Ly8gcGFnZSBjYWNoaW5nXG5cdFx0cGcuY2FjaGUucGFnZXMgPSBbXTtcblx0fTtcblx0Y29uc3Qgc2V0TWlzYyA9ICgpID0+IHtcblx0XHRwZy5jdXJyZW50LmxpbmsgPSBudWxsO1xuXHRcdHBnLmN1cnJlbnQubGlua3MgPSBbXTtcblx0XHRwZy5jdXJyZW50LmxpbmtzSGFzaCA9IHt9O1xuXHRcdHNldHVwQ2FjaGUoKTtcblx0XHRwZy50aW1lci5jaGVja1BvcHVwUG9zaXRpb24gPSBudWxsO1xuXHRcdHBnLmNvdW50ZXIubG9vcCA9IDA7XG5cdFx0Ly8gaWRzIGNoYW5nZSB3aXRoIGVhY2ggcG9wdXA6IHBvcHVwSW1hZ2UwLCBwb3B1cEltYWdlMSBldGNcblx0XHRwZy5pZE51bWJlciA9IDA7XG5cdFx0Ly8gZm9yIG15RGVjb2RlVVJJXG5cdFx0cGcubWlzYy5kZWNvZGVFeHRyYXMgPSBbXG5cdFx0XHR7ZnJvbTogJyUyQycsIHRvOiAnLCd9LFxuXHRcdFx0e2Zyb206ICdfJywgdG86ICcgJ30sXG5cdFx0XHR7ZnJvbTogJyUyNCcsIHRvOiAnJCd9LFxuXHRcdFx0e2Zyb206ICclMjYnLCB0bzogJyYnfSwgLy8gbm8gLFxuXHRcdF07XG5cdH07XG5cdGNvbnN0IGdldE13QXBpID0gKCkgPT4ge1xuXHRcdGlmICghcGcuYXBpLmNsaWVudCkge1xuXHRcdFx0cGcuYXBpLnVzZXJBZ2VudCA9ICdOYXZpZ2F0aW9uIHBvcHVwcy8xLjAnO1xuXHRcdFx0cGcuYXBpLmNsaWVudCA9IGFwaTtcblx0XHR9XG5cdFx0cmV0dXJuIHBnLmFwaS5jbGllbnQ7XG5cdH07XG5cdC8vIFdlIG5lZWQgYSBjYWxsYmFjayBzaW5jZSB0aGlzIG1pZ2h0IGVuZCB1cCBhc3luY2hyb25vdXMgYmVjYXVzZSBvZlxuXHQvLyB0aGUgbXcubG9hZGVyLnVzaW5nKCkgY2FsbC5cblx0Y29uc3Qgc2V0dXBQb3B1cHMgPSBmdW5jdGlvbiBzZXR1cFBvcHVwcyhjYWxsYmFjaykge1xuXHRcdGlmIChzZXR1cFBvcHVwcy5jb21wbGV0ZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gVGhlc2UgZGVwZW5kZW5jaWVzIHNob3VsZCBhbHNlIGJlIGVuZm9yY2VkIGZyb20gdGhlIGdhZGdldCxcblx0XHQvLyBidXQgbm90IGV2ZXJ5b25lIGxvYWRzIHRoaXMgYXMgYSBnYWRnZXQsIHNvIGRvdWJsZSBjaGVja1xuXHRcdGZldGNoU3BlY2lhbFBhZ2VOYW1lcygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Ly8gTkIgdHJhbnNsYXRhYmxlIHN0cmluZ3Mgc2hvdWxkIGJlIHNldCB1cCBmaXJzdCAoc3RyaW5ncy5qcylcblx0XHRcdC8vIGJhc2ljc1xuXHRcdFx0c2V0dXBEZWJ1Z2dpbmcoKTtcblx0XHRcdHNldFNpdGVJbmZvKCk7XG5cdFx0XHRzZXRUaXRsZUJhc2UoKTtcblx0XHRcdHNldE9wdGlvbnMoKTsgLy8gc2VlIG9wdGlvbnMuanNcblx0XHRcdHNldFVzZXJJbmZvKCk7XG5cdFx0XHQvLyBuYW1lc3BhY2VzIGV0Y1xuXHRcdFx0c2V0TmFtZXNwYWNlcygpO1xuXHRcdFx0c2V0SW50ZXJ3aWtpKCk7XG5cdFx0XHQvLyByZWdleHBzXG5cdFx0XHRzZXRSZWdleHBzKCk7XG5cdFx0XHRzZXRSZWRpcnMoKTtcblx0XHRcdC8vIG90aGVyIHN0dWZmXG5cdFx0XHRzZXRNaXNjKCk7XG5cdFx0XHRzZXR1cExpdmVQcmV2aWV3KCk7XG5cdFx0XHQvLyBtYWluIGRlYWwgaGVyZVxuXHRcdFx0c2V0dXBUb29sdGlwcygpO1xuXHRcdFx0bG9nKCdJbiBzZXR1cFBvcHVwcygpLCBqdXN0IGNhbGxlZCBzZXR1cFRvb2x0aXBzKCknKTtcblx0XHRcdE5hdnBvcHVwLnRyYWNrZXIuZW5hYmxlKCk7XG5cdFx0XHRzZXR1cFBvcHVwcy5jb21wbGV0ZWQgPSB0cnVlO1xuXHRcdFx0aWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBpbml0LmpzXG5cdC8vIFNUQVJURklMRTogbmF2bGlua3MuanNcblx0Ly8gbmF2bGlua3MuLi4gbGV0IHRoZSBmdW4gYmVnaW5cblx0Ly9cblx0Y29uc3QgZGVmYXVsdE5hdmxpbmtTcGVjID0gKCkgPT4ge1xuXHRcdGxldCBzdHIgPSAnJztcblx0XHRzdHIgKz0gJzxiPjw8bWFpbmxpbmt8c2hvcnRjdXQ9ID4+PC9iPic7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwTGFzdEVkaXRMaW5rJykpIHtcblx0XHRcdHN0ciArPSAnKjw8bGFzdEVkaXR8c2hvcnRjdXQ9Lz4+fDw8bGFzdENvbnRyaWI+Pnw8PHNpbmNlTWU+PmlmKG9sZGlkKXt8PDxvbGRFZGl0Pj58PDxkaWZmQ3VyPj59Jztcblx0XHR9XG5cdFx0Ly8gdXNlciBsaW5rc1xuXHRcdC8vIGNvbnRyaWJzIC0gbG9nIC0gY291bnQgLSBlbWFpbCAtIGJsb2NrXG5cdFx0Ly8gY291bnQgb25seSBpZiBhcHBsaWNhYmxlOyBibG9jayBvbmx5IGlmIHBvcHVwQWRtaW5MaW5rc1xuXHRcdHN0ciArPSAnaWYodXNlcil7PGJyPjw8Y29udHJpYnN8c2hvcnRjdXQ9Yz4+Kjw8dXNlcmxvZ3xzaG9ydGN1dD1MfGxvZz4+Jztcblx0XHRzdHIgKz0gJ2lmKGlwdXNlcil7Kjw8YXJpbj4+fWlmKHdpa2ltZWRpYSl7Kjw8Y291bnR8c2hvcnRjdXQ9Iz4+fSc7XG5cdFx0c3RyICs9ICdpZihpcHVzZXIpe31lbHNleyo8PGVtYWlsfHNob3J0Y3V0PUU+Pn1pZihhZG1pbil7Kjw8YmxvY2t8c2hvcnRjdXQ9Yj4+fDw8YmxvY2tsb2d8bG9nPj59fSc7XG5cdFx0Ly8gZWRpdGluZyBsaW5rc1xuXHRcdC8vIHRhbGtwYWdlICAgLT4gZWRpdHxuZXcgLSBoaXN0b3J5IC0gdW58d2F0Y2ggLSBhcnRpY2xlfGVkaXRcblx0XHQvLyBvdGhlciBwYWdlIC0+IGVkaXQgLSBoaXN0b3J5IC0gdW58d2F0Y2ggLSB0YWxrfGVkaXR8bmV3XG5cdFx0Y29uc3QgZWRpdHN0ciA9ICc8PGVkaXR8c2hvcnRjdXQ9ZT4+Jztcblx0XHRjb25zdCBlZGl0T2xkaWRTdHIgPSBgaWYob2xkaWQpezw8ZWRpdE9sZHxzaG9ydGN1dD1lPj58PDxyZXZlcnR8c2hvcnRjdXQ9dnxydj4+fDw8ZWRpdHxjdXI+Pn1lbHNleyR7ZWRpdHN0cn19YDtcblx0XHRjb25zdCBoaXN0b3J5c3RyID0gJzw8aGlzdG9yeXxzaG9ydGN1dD1oPj58PDxlZGl0b3JzfHNob3J0Y3V0PUV8Pj4nO1xuXHRcdGNvbnN0IHdhdGNoc3RyID0gJzw8dW53YXRjaHx1bndhdGNoU2hvcnQ+Pnw8PHdhdGNofHNob3J0Y3V0PXd8d2F0Y2hUaGluZ3k+Pic7XG5cdFx0c3RyICs9XG5cdFx0XHRgPGJyPmlmKHRhbGspeyR7ZWRpdE9sZGlkU3RyfXw8PG5ld3xzaG9ydGN1dD0rPj5gICtcblx0XHRcdGAqJHtoaXN0b3J5c3RyfSoke3dhdGNoc3RyfSpgICtcblx0XHRcdCc8Yj48PGFydGljbGV8c2hvcnRjdXQ9YT4+PC9iPnw8PGVkaXRBcnRpY2xlfGVkaXQ+PicgK1xuXHRcdFx0YH1lbHNleyR7XG5cdFx0XHRcdC8vIG5vdCBhIHRhbGsgcGFnZVxuXHRcdFx0XHRlZGl0T2xkaWRTdHJcblx0XHRcdH0qJHtoaXN0b3J5c3RyfSoke3dhdGNoc3RyfSpgICtcblx0XHRcdCc8Yj48PHRhbGt8c2hvcnRjdXQ9dD4+PC9iPnw8PGVkaXRUYWxrfGVkaXQ+Pnw8PG5ld1RhbGt8c2hvcnRjdXQ9K3xuZXc+Pn0nO1xuXHRcdC8vIG1pc2MgbGlua3Ncblx0XHRzdHIgKz0gJzxicj48PHdoYXRMaW5rc0hlcmV8c2hvcnRjdXQ9bD4+Kjw8cmVsYXRlZENoYW5nZXN8c2hvcnRjdXQ9cj4+Kjw8bW92ZXxzaG9ydGN1dD1tPj4nO1xuXHRcdC8vIGFkbWluIGxpbmtzXG5cdFx0c3RyICs9XG5cdFx0XHQnaWYoYWRtaW4pezxicj48PHVucHJvdGVjdHx1bnByb3RlY3RTaG9ydD4+fDw8cHJvdGVjdHxzaG9ydGN1dD1wPj58PDxwcm90ZWN0bG9nfGxvZz4+KicgK1xuXHRcdFx0Jzw8dW5kZWxldGV8dW5kZWxldGVTaG9ydD4+fDw8ZGVsZXRlfHNob3J0Y3V0PWQ+Pnw8PGRlbGV0ZWxvZ3xsb2c+Pn0nO1xuXHRcdHJldHVybiBzdHI7XG5cdH07XG5cdGNvbnN0IG5hdkxpbmtzSFRNTCA9IChhcnRpY2xlLCBfaGludCwgcGFyYW1zKSA9PiB7XG5cdFx0Ly8gb2xkaWQsIHJjaWQpIHtcblx0XHRjb25zdCBzdHIgPSBgPHNwYW4gY2xhc3M9XCJwb3B1cE5hdkxpbmtzXCI+JHtkZWZhdWx0TmF2bGlua1NwZWMoKX08L3NwYW4+YDtcblx0XHQvLyBCQU1cblx0XHRyZXR1cm4gbmF2bGlua1N0cmluZ1RvSFRNTChzdHIsIGFydGljbGUsIHBhcmFtcyk7XG5cdH07XG5cdGNvbnN0IGV4cGFuZENvbmRpdGlvbmFsTmF2bGlua1N0cmluZyA9IGZ1bmN0aW9uIGV4cGFuZENvbmRpdGlvbmFsTmF2bGlua1N0cmluZyhzLCBhcnRpY2xlLCB6LCByZWN1cnNpb25Db3VudCkge1xuXHRcdGNvbnN0IHtvbGRpZH0gPSB6O1xuXHRcdGNvbnN0IHtyY2lkfSA9IHo7XG5cdFx0Y29uc3Qge2RpZmZ9ID0gejtcblx0XHQvLyBuZXN0ZWQgY29uZGl0aW9uYWxzICh1cCB0byAxMCBkZWVwKSBhcmUgb2ssIGhvcGVmdWxseSEgKHdvcmsgZnJvbSB0aGUgaW5zaWRlIG91dClcblx0XHRpZiAodHlwZW9mIHJlY3Vyc2lvbkNvdW50ICE9PSB0eXBlb2YgMCkge1xuXHRcdFx0cmVjdXJzaW9uQ291bnQgPSAwO1xuXHRcdH1cblx0XHQvLyAoMVx0IGlmXHRcXFxcKFx0KDJcdDIpXHRcXFxcKVx0ICB7KDNcdDMpfSAgKDQgICBlbHNlXHQgIHsoNVx0IDUpfSAgNCkxKVxuXHRcdGNvbnN0IGNvbmRpdGlvbmFsU3BsaXRSZWdleCA9IC8oOz9cXHMqaWZcXHMqXFwoXFxzKihcXHcqKVxccypcXClcXHMqeyhbXnt9XSopfShcXHMqZWxzZVxccyp7KFtee31dKj8pfXwpKS9pO1xuXHRcdGNvbnN0IHNwbGl0dGVkID0gcy5zcGxpdChjb25kaXRpb25hbFNwbGl0UmVnZXgpO1xuXHRcdC8vICQxOiB3aG9sZSBjb25kaXRpb25hbFxuXHRcdC8vICQyOiB0ZXN0IGNvbmRpdGlvblxuXHRcdC8vICQzOiB0cnVlIGV4cGFuc2lvblxuXHRcdC8vICQ0OiBlbHNlIGNsYXVzZSAocG9zc2libHkgZW1wdHkpXG5cdFx0Ly8gJDU6IGZhbHNlIGV4cGFuc2lvbiAocG9zc2libHkgbnVsbClcblx0XHRjb25zdCBudW1QYXJlbnMgPSA1O1xuXHRcdGxldCBbcmV0XSA9IHNwbGl0dGVkO1xuXHRcdGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXR0ZWQubGVuZ3RoOyBpID0gaSArIG51bVBhcmVucyArIDEpIHtcblx0XHRcdGNvbnN0IHRlc3RTdHJpbmcgPSBzcGxpdHRlZFtpICsgMiAtIDFdO1xuXHRcdFx0Y29uc3QgdHJ1ZVN0cmluZyA9IHNwbGl0dGVkW2kgKyAzIC0gMV07XG5cdFx0XHRsZXQgZmFsc2VTdHJpbmcgPSBzcGxpdHRlZFtpICsgNSAtIDFdO1xuXHRcdFx0aWYgKGZhbHNlU3RyaW5nID09PSB1bmRlZmluZWQgfHwgIWZhbHNlU3RyaW5nKSB7XG5cdFx0XHRcdGZhbHNlU3RyaW5nID0gJyc7XG5cdFx0XHR9XG5cdFx0XHRsZXQgdGVzdFJlc3VsdDtcblx0XHRcdHN3aXRjaCAodGVzdFN0cmluZykge1xuXHRcdFx0XHRjYXNlICd1c2VyJzpcblx0XHRcdFx0XHR0ZXN0UmVzdWx0ID0gISFhcnRpY2xlLnVzZXJOYW1lKCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3RhbGsnOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSAhYXJ0aWNsZS50YWxrUGFnZSgpOyAvLyB0YWxrUGFnZSBjb252ZXJ0cyBfYXJ0aWNsZXNfIHRvIHRhbGtQYWdlc1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdhZG1pbic6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9ICEhZ2V0VmFsdWVPZigncG9wdXBBZG1pbkxpbmtzJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ29sZGlkJzpcblx0XHRcdFx0XHR0ZXN0UmVzdWx0ID0gISEob2xkaWQgIT09IHVuZGVmaW5lZCAmJiBvbGRpZCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3JjaWQnOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSAhIShyY2lkICE9PSB1bmRlZmluZWQgJiYgcmNpZCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2lwdXNlcic6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9ICEhYXJ0aWNsZS5pc0lwVXNlcigpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdtYWluc3BhY2VfZW4nOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSBpc0luTWFpbk5hbWVzcGFjZShhcnRpY2xlKSAmJiBwZy53aWtpLmhvc3RuYW1lID09PSAnZW4ud2lraXBlZGlhLm9yZyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3dpa2ltZWRpYSc6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9ICEhcGcud2lraS53aWtpbWVkaWE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2RpZmYnOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSAhIShkaWZmICE9PSB1bmRlZmluZWQgJiYgZGlmZik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHRlc3RSZXN1bHQpIHtcblx0XHRcdFx0Y2FzZSBudWxsOlxuXHRcdFx0XHRcdHJldCArPSBzcGxpdHRlZFtpXTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSB0cnVlOlxuXHRcdFx0XHRcdHJldCArPSB0cnVlU3RyaW5nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIGZhbHNlOlxuXHRcdFx0XHRcdHJldCArPSBmYWxzZVN0cmluZztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdC8vIGFwcGVuZCBub24tY29uZGl0aW9uYWwgc3RyaW5nXG5cdFx0XHRyZXQgKz0gc3BsaXR0ZWRbaSArIG51bVBhcmVuc107XG5cdFx0fVxuXHRcdGlmIChjb25kaXRpb25hbFNwbGl0UmVnZXgudGVzdChyZXQpICYmIHJlY3Vyc2lvbkNvdW50IDwgMTApIHtcblx0XHRcdHJldHVybiBleHBhbmRDb25kaXRpb25hbE5hdmxpbmtTdHJpbmcocmV0LCBhcnRpY2xlLCB6LCByZWN1cnNpb25Db3VudCArIDEpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBuYXZsaW5rU3RyaW5nVG9BcnJheSA9IChzLCBhcnRpY2xlLCBwYXJhbXMpID0+IHtcblx0XHRzID0gZXhwYW5kQ29uZGl0aW9uYWxOYXZsaW5rU3RyaW5nKHMsIGFydGljbGUsIHBhcmFtcyk7XG5cdFx0Y29uc3Qgc3BsaXR0ZWQgPSBzLnNwbGl0KC88PCguKj8pPj4vKTtcblx0XHRjb25zdCByZXQgPSBbXTtcblx0XHRmb3IgKGNvbnN0IFtpLCBlbGVtZW50XSBvZiBzcGxpdHRlZC5lbnRyaWVzKCkpIHtcblx0XHRcdGlmIChpICUgMikge1xuXHRcdFx0XHQvLyBpIG9kZCwgc28gcyBpcyBhIHRhZ1xuXHRcdFx0XHRjb25zdCB0ID0gbmV3IG5hdmxpbmtUYWcoKTtcblx0XHRcdFx0Y29uc3Qgc3MgPSBlbGVtZW50LnNwbGl0KCd8Jyk7XG5cdFx0XHRcdFt0LmlkXSA9IHNzO1xuXHRcdFx0XHRmb3IgKGxldCBqID0gMTsgaiA8IHNzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3NzID0gc3Nbal0uc3BsaXQoJz0nKTtcblx0XHRcdFx0XHRpZiAoc3NzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFssIHRbc3NzWzBdXV0gPSBzc3M7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIG5vIGFzc2lnbm1lbnQgKG5vIFwiPVwiKSwgc28gdHJlYXQgdGhpcyBhcyBhIHRpdGxlIChvdmVyd3JpdGluZyB0aGUgbGFzdCBvbmUpXG5cdFx0XHRcdFx0XHR0LnRleHQgPSBwb3B1cFN0cmluZyhzc3NbMF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0LmFydGljbGUgPSBhcnRpY2xlO1xuXHRcdFx0XHRjb25zdCB7b2xkaWR9ID0gcGFyYW1zO1xuXHRcdFx0XHRjb25zdCB7cmNpZH0gPSBwYXJhbXM7XG5cdFx0XHRcdGNvbnN0IHtkaWZmfSA9IHBhcmFtcztcblx0XHRcdFx0aWYgKG9sZGlkICE9PSB1bmRlZmluZWQgJiYgb2xkaWQgIT09IG51bGwpIHtcblx0XHRcdFx0XHR0Lm9sZGlkID0gb2xkaWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHJjaWQgIT09IHVuZGVmaW5lZCAmJiByY2lkICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0dC5yY2lkID0gcmNpZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZGlmZiAhPT0gdW5kZWZpbmVkICYmIGRpZmYgIT09IG51bGwpIHtcblx0XHRcdFx0XHR0LmRpZmYgPSBkaWZmO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghdC50ZXh0ICYmIHQuaWQgIT09ICdtYWlubGluaycpIHtcblx0XHRcdFx0XHR0LnRleHQgPSBwb3B1cFN0cmluZyh0LmlkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXQucHVzaCh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHBsYWluIEhUTUxcblx0XHRcdFx0cmV0LnB1c2goZWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IG5hdmxpbmtTdWJzdGl0dXRlSFRNTCA9IChzKSA9PiB7XG5cdFx0cmV0dXJuIHNcblx0XHRcdC5zcGxpdCgnKicpXG5cdFx0XHQuam9pbihnZXRWYWx1ZU9mKCdwb3B1cE5hdkxpbmtTZXBhcmF0b3InKSlcblx0XHRcdC5zcGxpdCgnPG1lbnVyb3c+Jylcblx0XHRcdC5qb2luKCc8bGkgY2xhc3M9XCJwb3B1cF9tZW51X3Jvd1wiPicpXG5cdFx0XHQuc3BsaXQoJzwvbWVudXJvdz4nKVxuXHRcdFx0LmpvaW4oJzwvbGk+Jylcblx0XHRcdC5zcGxpdCgnPG1lbnU+Jylcblx0XHRcdC5qb2luKCc8dWwgY2xhc3M9XCJwb3B1cF9tZW51XCI+Jylcblx0XHRcdC5zcGxpdCgnPC9tZW51PicpXG5cdFx0XHQuam9pbignPC91bD4nKTtcblx0fTtcblx0Y29uc3QgbmF2bGlua0RlcHRoID0gKG1hZ2ljLCBzKSA9PiB7XG5cdFx0cmV0dXJuIHMuc3BsaXQoYDwke21hZ2ljfT5gKS5sZW5ndGggLSBzLnNwbGl0KGA8LyR7bWFnaWN9PmApLmxlbmd0aDtcblx0fTtcblx0Ly8gbmF2bGlua1N0cmluZzogKiBiZWNvbWVzIHRoZSBzZXBhcmF0b3Jcblx0Ly9cdFx0XHRcdDw8Zm9vfGJhcj1iYXp8ZnViYXI+PiBiZWNvbWVzIGEgZm9vLWxpbmsgd2l0aCBhdHRyaWJ1dGUgYmFyPSdiYXonXG5cdC8vXHRcdFx0XHRcdFx0XHRcdFx0ICBhbmQgdmlzaWJsZSB0ZXh0ICdmdWJhcidcblx0Ly9cdFx0XHRcdGlmKHRlc3Qpey4uLn0gYW5kIGlmKHRlc3Qpey4uLn1lbHNley4uLn0gd29yayB0b28gKG5lc3RlZCBvaylcblx0Y29uc3QgbmF2bGlua1N0cmluZ1RvSFRNTCA9IChzLCBhcnRpY2xlLCBwYXJhbXMpID0+IHtcblx0XHQvLyBsaW1pdEFsZXJ0KG5hdmxpbmtTdHJpbmdUb0hUTUwsIDUsICduYXZsaW5rU3RyaW5nVG9IVE1MXFxuJyArIGFydGljbGUgKyAnXFxuJyArICh0eXBlb2YgYXJ0aWNsZSkpO1xuXHRcdGNvbnN0IHAgPSBuYXZsaW5rU3RyaW5nVG9BcnJheShzLCBhcnRpY2xlLCBwYXJhbXMpO1xuXHRcdGxldCBodG1sID0gJyc7XG5cdFx0bGV0IG1lbnVkZXB0aCA9IDA7IC8vIG5lc3RlZCBtZW51cyBub3QgY3VycmVudGx5IGFsbG93ZWQsIGJ1dCBkb2Vzbid0IGRvIGFueSBoYXJtIHRvIGNvZGUgZm9yIGl0XG5cdFx0bGV0IG1lbnVyb3dkZXB0aCA9IDA7XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIHApIHtcblx0XHRcdGlmICh0eXBlb2YgZWxlbWVudCA9PT0gdHlwZW9mICcnKSB7XG5cdFx0XHRcdGh0bWwgKz0gbmF2bGlua1N1YnN0aXR1dGVIVE1MKGVsZW1lbnQpO1xuXHRcdFx0XHRtZW51ZGVwdGggKz0gbmF2bGlua0RlcHRoKCdtZW51JywgZWxlbWVudCk7XG5cdFx0XHRcdG1lbnVyb3dkZXB0aCArPSBuYXZsaW5rRGVwdGgoJ21lbnVyb3cnLCBlbGVtZW50KTtcblx0XHRcdFx0Ly9cdFx0XHRpZiAobWVudWRlcHRoID09PSAwKSB7XG5cdFx0XHRcdC8vXHRcdFx0XHR0YWdUeXBlPSdzcGFuJztcblx0XHRcdFx0Ly9cdFx0XHR9IGVsc2UgaWYgKG1lbnVyb3dkZXB0aCA9PT0gMCkge1xuXHRcdFx0XHQvL1x0XHRcdFx0dGFnVHlwZT0nbGknO1xuXHRcdFx0XHQvL1x0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vXHRcdFx0XHR0YWdUeXBlID0gbnVsbDtcblx0XHRcdFx0Ly9cdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQudHlwZSA9PT0gJ25hdmxpbmtUYWcnKSB7XG5cdFx0XHRcdGh0bWwgKz1cblx0XHRcdFx0XHRtZW51ZGVwdGggPiAwICYmIG1lbnVyb3dkZXB0aCA9PT0gMFxuXHRcdFx0XHRcdFx0PyBgPGxpIGNsYXNzPVwicG9wdXBfbWVudV9pdGVtXCI+JHtlbGVtZW50Lmh0bWwoKX08L2xpPmBcblx0XHRcdFx0XHRcdDogZWxlbWVudC5odG1sKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBodG1sO1xuXHR9O1xuXHRjbGFzcyBuYXZsaW5rVGFnIHtcblx0XHRjb25zdHJ1Y3RvcigpIHtcblx0XHRcdHRoaXMudHlwZSA9ICduYXZsaW5rVGFnJztcblx0XHR9XG5cdFx0aHRtbCgpIHtcblx0XHRcdHRoaXMuZ2V0TmV3V2luKCk7XG5cdFx0XHR0aGlzLmdldFByaW50RnVuY3Rpb24oKTtcblx0XHRcdGxldCBodG1sID0gJyc7XG5cdFx0XHRsZXQgb3BlbmluZztcblx0XHRcdGxldCBjbG9zaW5nO1xuXHRcdFx0Y29uc3QgdGFnVHlwZSA9ICdzcGFuJztcblx0XHRcdGlmICh0YWdUeXBlKSB7XG5cdFx0XHRcdG9wZW5pbmcgPSBgPCR7dGFnVHlwZX0gY2xhc3M9XCJwb3B1cF8ke3RoaXMuaWR9XCI+YDtcblx0XHRcdFx0Y2xvc2luZyA9IGA8LyR7dGFnVHlwZX0+YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9wZW5pbmcgPSAnJztcblx0XHRcdFx0Y2xvc2luZyA9ICcnO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLnByaW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGh0bWwgPSB0aGlzLnByaW50KHRoaXMpO1xuXHRcdFx0XHRpZiAodHlwZW9mIGh0bWwgIT09IHR5cGVvZiAnJykge1xuXHRcdFx0XHRcdGh0bWwgPSAnJztcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNob3J0Y3V0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRodG1sID0gYWRkUG9wdXBTaG9ydGN1dChodG1sLCB0aGlzLnNob3J0Y3V0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXJybG9nKGBPaCBkZWFyIC0gaW52YWxpZCBwcmludCBmdW5jdGlvbiBmb3IgYSBuYXZsaW5rVGFnLCBpZD0ke3RoaXMuaWR9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3BlbmluZyArIGh0bWwgKyBjbG9zaW5nO1xuXHRcdH1cblx0XHRnZXROZXdXaW4oKSB7XG5cdFx0XHRnZXRWYWx1ZU9mKCdwb3B1cExpbmtzTmV3V2luZG93Jyk7XG5cdFx0XHRpZiAocGcub3B0aW9uLnBvcHVwTGlua3NOZXdXaW5kb3dbdGhpcy5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLm5ld1dpbiA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLm5ld1dpbiA9IHBnLm9wdGlvbi5wb3B1cExpbmtzTmV3V2luZG93W3RoaXMuaWRdO1xuXHRcdH1cblx0XHRnZXRQcmludEZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gdGhpbmsgYWJvdXQgdGhpcyBzb21lIG1vcmVcblx0XHRcdC8vIHRoaXMuaWQgYW5kIHRoaXMuYXJ0aWNsZSBzaG91bGQgYWxyZWFkeSBiZSBkZWZpbmVkXG5cdFx0XHRpZiAodHlwZW9mIHRoaXMuaWQgIT09IHR5cGVvZiAnJyB8fCB0eXBlb2YgdGhpcy5hcnRpY2xlICE9PSB0eXBlb2Yge30pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5ub1BvcHVwID0gMTtcblx0XHRcdHN3aXRjaCAodGhpcy5pZCkge1xuXHRcdFx0XHRjYXNlICdjb250cmlicyc6XG5cdFx0XHRcdGNhc2UgJ2hpc3RvcnknOlxuXHRcdFx0XHRjYXNlICd3aGF0TGlua3NIZXJlJzpcblx0XHRcdFx0Y2FzZSAndXNlclBhZ2UnOlxuXHRcdFx0XHRjYXNlICd1c2VyVGFsayc6XG5cdFx0XHRcdGNhc2UgJ3RhbGsnOlxuXHRcdFx0XHRjYXNlICdhcnRpY2xlJzpcblx0XHRcdFx0Y2FzZSAnbGFzdEVkaXQnOlxuXHRcdFx0XHRcdHRoaXMubm9Qb3B1cCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHRoaXMuaWQpIHtcblx0XHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0XHRjYXNlICdjb250cmlicyc6XG5cdFx0XHRcdGNhc2UgJ2Jsb2NrJzpcblx0XHRcdFx0Y2FzZSAndW5ibG9jayc6XG5cdFx0XHRcdGNhc2UgJ3VzZXJsb2cnOlxuXHRcdFx0XHRjYXNlICd1c2VyU3BhY2UnOlxuXHRcdFx0XHRjYXNlICdkZWxldGVkQ29udHJpYnMnOlxuXHRcdFx0XHRcdHRoaXMuYXJ0aWNsZSA9IHRoaXMuYXJ0aWNsZS51c2VyTmFtZSgpO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoICh0aGlzLmlkKSB7XG5cdFx0XHRcdGNhc2UgJ3VzZXJUYWxrJzpcblx0XHRcdFx0Y2FzZSAnbmV3VXNlclRhbGsnOlxuXHRcdFx0XHRjYXNlICdlZGl0VXNlclRhbGsnOlxuXHRcdFx0XHRjYXNlICd1c2VyUGFnZSc6XG5cdFx0XHRcdGNhc2UgJ2Jsb2NrbG9nJzpcblx0XHRcdFx0XHR0aGlzLmFydGljbGUgPSB0aGlzLmFydGljbGUudXNlck5hbWUodHJ1ZSk7XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0Y2FzZSAncGFnZWxvZyc6XG5cdFx0XHRcdGNhc2UgJ2RlbGV0ZWxvZyc6XG5cdFx0XHRcdGNhc2UgJ3Byb3RlY3Rsb2cnOlxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLm9sZGlkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuaWQgIT09ICdtYWlubGluaycpIHtcblx0XHRcdFx0Ly8gRklYTUUgYW5jaG9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lIGRpZmZlcmVudGx5IHdpdGggVGl0bGUgb2JqZWN0XG5cdFx0XHRcdHRoaXMuYXJ0aWNsZSA9IHRoaXMuYXJ0aWNsZS5yZW1vdmVBbmNob3IoKTtcblx0XHRcdFx0Ly8gaWYgKHR5cGVvZiB0aGlzLnRleHQ9PSd1bmRlZmluZWQnKSB7IHRoaXMudGV4dD1wb3B1cFN0cmluZyh0aGlzLmlkKTsgfVxuXHRcdFx0fVxuXHRcdFx0c3dpdGNoICh0aGlzLmlkKSB7XG5cdFx0XHRcdGNhc2UgJ3VuZGVsZXRlJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdVbmRlbGV0ZSc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnLyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3doYXRMaW5rc0hlcmUnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ1doYXRsaW5rc2hlcmUnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyZWxhdGVkQ2hhbmdlcyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnUmVjZW50Y2hhbmdlc2xpbmtlZCc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ21vdmUnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ01vdmVwYWdlJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnY29udHJpYnMnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0NvbnRyaWJ1dGlvbnMnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkZWxldGVkQ29udHJpYnMnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0RlbGV0ZWRjb250cmlidXRpb25zJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0VtYWlsVXNlcic7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnLyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2Jsb2NrJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdCbG9ja2lwJztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcmaXA9Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndW5ibG9jayc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnSXBibG9ja2xpc3QnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZhY3Rpb249dW5ibG9jayZpcD0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1c2VybG9nJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdMb2cnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZ1c2VyPSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2Jsb2NrbG9nJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdMb2cnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZ0eXBlPWJsb2NrJnBhZ2U9Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAncGFnZWxvZyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnTG9nJztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcmcGFnZT0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdwcm90ZWN0bG9nJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdMb2cnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZ0eXBlPXByb3RlY3QmcGFnZT0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkZWxldGVsb2cnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0xvZyc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJnR5cGU9ZGVsZXRlJnBhZ2U9Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndXNlclNwYWNlJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdQcmVmaXhJbmRleCc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJm5hbWVzcGFjZT0yJnByZWZpeD0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdzZWFyY2gnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ1NlYXJjaCc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJmZ1bGx0ZXh0PVNlYXJjaCZzZWFyY2g9Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndGhhbmsnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ1RoYW5rcyc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnLyc7XG5cdFx0XHRcdFx0dGhpcy5hcnRpY2xlLnZhbHVlID0gdGhpcy5kaWZmID09PSAncHJldicgPyB0aGlzLm9sZGlkIDogdGhpcy5kaWZmO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1bndhdGNoJzpcblx0XHRcdFx0Y2FzZSAnd2F0Y2gnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBtYWdpY1dhdGNoTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9IGAke3RoaXMuaWR9JmF1dG93YXRjaGxpc3Q9MSZhdXRvaW1wbD0ke3BvcHVwU3RyaW5nKFxuXHRcdFx0XHRcdFx0J2F1dG9lZGl0X3ZlcnNpb24nXG5cdFx0XHRcdFx0KX0mYWN0b2tlbj0ke2F1dG9DbGlja1Rva2VuKCl9YDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnaGlzdG9yeSc6XG5cdFx0XHRcdGNhc2UgJ2hpc3RvcnlmZWVkJzpcblx0XHRcdFx0Y2FzZSAndW5wcm90ZWN0Jzpcblx0XHRcdFx0Y2FzZSAncHJvdGVjdCc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gdGhpcy5pZDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZGVsZXRlJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAnZGVsZXRlJztcblx0XHRcdFx0XHRpZiAodGhpcy5hcnRpY2xlLm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zSW1hZ2VJZCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaW1nID0gdGhpcy5hcnRpY2xlLnN0cmlwTmFtZXNwYWNlKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmFjdGlvbiArPSBgJmltYWdlPSR7aW1nfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdtYXJrcGF0cm9sbGVkJzpcblx0XHRcdFx0Y2FzZSAnZWRpdCc6XG5cdFx0XHRcdFx0Ly8gZWRpdE9sZCBzaG91bGQga2VlcCB0aGUgb2xkaWQsIGJ1dCBlZGl0IHNob3VsZCBub3QuXG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMub2xkaWQ7XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0Y2FzZSAndmlldyc6XG5cdFx0XHRcdGNhc2UgJ3B1cmdlJzpcblx0XHRcdFx0Y2FzZSAncmVuZGVyJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSB0aGlzLmlkO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyYXcnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB3aWtpTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdyYXcnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICduZXcnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB3aWtpTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdlZGl0JnNlY3Rpb249bmV3Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnbWFpbmxpbmsnOlxuXHRcdFx0XHRcdGlmICh0aGlzLnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0ID0gdGhpcy5hcnRpY2xlLnRvU3RyaW5nKCkuZW50aWZ5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFNpbXBsaWZ5TWFpbkxpbmsnKSAmJiBpc0luU3RyaXBwYWJsZU5hbWVzcGFjZSh0aGlzLmFydGljbGUpKSB7XG5cdFx0XHRcdFx0XHQvLyBvbmx5IHNob3cgdGhlIC9zdWJwYWdlIHBhcnQgb2YgdGhlIHRpdGxlIHRleHRcblx0XHRcdFx0XHRcdGNvbnN0IHMgPSB0aGlzLnRleHQuc3BsaXQoJy8nKTtcblx0XHRcdFx0XHRcdHRoaXMudGV4dCA9IHMuYXQoLTEpO1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMudGV4dCA9PT0gJycgJiYgcy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMudGV4dCA9IHMuYXQoLTIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLnByaW50ID0gdGl0bGVkV2lraUxpbms7XG5cdFx0XHRcdFx0aWYgKHRoaXMudGl0bGUgPT09IHVuZGVmaW5lZCAmJiBwZy5jdXJyZW50LmxpbmsgJiYgcGcuY3VycmVudC5saW5rLmhyZWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhpcy50aXRsZSA9IHNhZmVEZWNvZGVVUkkocGcuY3VycmVudC5saW5rLm9yaWdpbmFsVGl0bGUgPz8gdGhpcy5hcnRpY2xlKTtcblx0XHRcdFx0XHRcdGlmICh0aGlzLm9sZGlkICE9PSB1bmRlZmluZWQgJiYgdGhpcy5vbGRpZCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnRpdGxlID0gdHByaW50ZignUmV2aXNpb24gJXMgb2YgJXMnLCBbdGhpcy5vbGRpZCwgdGhpcy50aXRsZV0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICd2aWV3Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndXNlclBhZ2UnOlxuXHRcdFx0XHRjYXNlICdhcnRpY2xlJzpcblx0XHRcdFx0Y2FzZSAnZWRpdEFydGljbGUnOlxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLm9sZGlkO1xuXHRcdFx0XHRcdC8vIG13Lm5vdGlmeShgJHt0aGlzLmlkfVxcbiR7dGhpcy5hcnRpY2xlfVxcbiR7dHlwZW9mIHRoaXMuYXJ0aWNsZX1gLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ3dhcm4nfSk7XG5cdFx0XHRcdFx0dGhpcy5hcnRpY2xlID0gdGhpcy5hcnRpY2xlLmFydGljbGVGcm9tVGFsa09yQXJ0aWNsZSgpO1xuXHRcdFx0XHRcdC8vIG13Lm5vdGlmeShgJHt0aGlzLmlkfVxcbiR7dGhpcy5hcnRpY2xlfVxcbiR7dHlwZW9mIHRoaXMuYXJ0aWNsZX1gLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ3dhcm4nfSk7XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gdGhpcy5pZC5pbmRleE9mKCdlZGl0JykgPT09IDAgPyAnZWRpdCcgOiAndmlldyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3VzZXJUYWxrJzpcblx0XHRcdFx0Y2FzZSAndGFsayc6XG5cdFx0XHRcdFx0dGhpcy5hcnRpY2xlID0gdGhpcy5hcnRpY2xlLnRhbGtQYWdlKCk7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMub2xkaWQ7XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ3ZpZXcnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdhcmluJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gYXJpbkxpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2NvdW50Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gZWRpdENvdW50ZXJMaW5rO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdlZGl0b3JzJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gZWRpdG9yTGlzdExpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2xhc3RFZGl0Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gdGl0bGVkRGlmZkxpbms7XG5cdFx0XHRcdFx0dGhpcy50aXRsZSA9IHBvcHVwU3RyaW5nKCdTaG93IHRoZSBsYXN0IGVkaXQnKTtcblx0XHRcdFx0XHR0aGlzLmZyb20gPSAncHJldic7XG5cdFx0XHRcdFx0dGhpcy50byA9ICdjdXInO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdvbGRFZGl0Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gdGl0bGVkRGlmZkxpbms7XG5cdFx0XHRcdFx0dGhpcy50aXRsZSA9IGAke3BvcHVwU3RyaW5nKCdTaG93IHRoZSBlZGl0IG1hZGUgdG8gZ2V0IHJldmlzaW9uJyl9ICR7dGhpcy5vbGRpZH1gO1xuXHRcdFx0XHRcdHRoaXMuZnJvbSA9ICdwcmV2Jztcblx0XHRcdFx0XHR0aGlzLnRvID0gdGhpcy5vbGRpZDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZWRpdE9sZCc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ2VkaXQnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1bmRvJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAnZWRpdCZ1bmRvPSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3JldmVydCc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ3JldmVydCc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ251bGxFZGl0Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAnbnVsbEVkaXQnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkaWZmQ3VyJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gdGl0bGVkRGlmZkxpbms7XG5cdFx0XHRcdFx0dGhpcy50aXRsZSA9IHRwcmludGYoJ1Nob3cgY2hhbmdlcyBzaW5jZSByZXZpc2lvbiAlcycsIFt0aGlzLm9sZGlkXSk7XG5cdFx0XHRcdFx0dGhpcy5mcm9tID0gdGhpcy5vbGRpZDtcblx0XHRcdFx0XHR0aGlzLnRvID0gJ2N1cic7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2VkaXRVc2VyVGFsayc6XG5cdFx0XHRcdGNhc2UgJ2VkaXRUYWxrJzpcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5vbGRpZDtcblx0XHRcdFx0XHR0aGlzLmFydGljbGUgPSB0aGlzLmFydGljbGUudGFsa1BhZ2UoKTtcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdlZGl0Jztcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ25ld1VzZXJUYWxrJzpcblx0XHRcdFx0Y2FzZSAnbmV3VGFsayc6XG5cdFx0XHRcdFx0dGhpcy5hcnRpY2xlID0gdGhpcy5hcnRpY2xlLnRhbGtQYWdlKCk7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAnZWRpdCZzZWN0aW9uPW5ldyc7XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdsYXN0Q29udHJpYic6XG5cdFx0XHRcdGNhc2UgJ3NpbmNlTWUnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBtYWdpY0hpc3RvcnlMaW5rO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd0b2dnbGVQcmV2aWV3cyc6XG5cdFx0XHRcdFx0dGhpcy50ZXh0ID0gcG9wdXBTdHJpbmcocGcub3B0aW9uLnNpbXBsZVBvcHVwcyA/ICdlbmFibGUgcHJldmlld3MnIDogJ2Rpc2FibGUgcHJldmlld3MnKTtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlICdkaXNhYmxlUG9wdXBzJzpcblx0XHRcdFx0Y2FzZSAncHVyZ2VQb3B1cHMnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBwb3B1cE1lbnVMaW5rO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYFVua25vd24gbmF2bGluayB0eXBlOiAke3RoaXMuaWR9YDtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvL1xuXHQvLyAgZW5kIG5hdmxpbmtzXG5cdC8vIEVOREZJTEU6IG5hdmxpbmtzLmpzXG5cdC8vIFNUQVJURklMRTogc2hvcnRjdXRrZXlzLmpzXG5cdGNvbnN0IHBvcHVwSGFuZGxlS2V5cHJlc3MgPSBmdW5jdGlvbiBwb3B1cEhhbmRsZUtleXByZXNzKGV2dCkge1xuXHRcdGNvbnN0IGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyB3aW5kb3cuZXZlbnQua2V5Q29kZSA6IGV2dC5rZXlDb2RlID8/IGV2dC53aGljaDtcblx0XHRpZiAoIWtleUNvZGUgfHwgIXBnLmN1cnJlbnQubGluayB8fCAhcGcuY3VycmVudC5saW5rLm5hdnBvcHVwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChrZXlDb2RlID09PSAyNykge1xuXHRcdFx0Ly8gZXNjYXBlXG5cdFx0XHRraWxsUG9wdXAoKTtcblx0XHRcdHJldHVybiBmYWxzZTsgLy8gc3dhbGxvdyBrZXlwcmVzc1xuXHRcdH1cblx0XHRjb25zdCBsZXR0ZXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChrZXlDb2RlKTtcblx0XHRjb25zdCBsaW5rcyA9IHBnLmN1cnJlbnQubGluay5uYXZwb3B1cC5tYWluRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ0EnKTtcblx0XHRsZXQgc3RhcnRMaW5rID0gMDtcblx0XHRsZXQgaTtcblx0XHRsZXQgajtcblx0XHRpZiAocG9wdXBIYW5kbGVLZXlwcmVzcy5sYXN0UG9wdXBMaW5rU2VsZWN0ZWQpIHtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHRpZiAobGlua3NbaV0gPT09IHBvcHVwSGFuZGxlS2V5cHJlc3MubGFzdFBvcHVwTGlua1NlbGVjdGVkKSB7XG5cdFx0XHRcdFx0c3RhcnRMaW5rID0gaTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGogPSAwOyBqIDwgbGlua3MubGVuZ3RoOyArK2opIHtcblx0XHRcdGkgPSAoc3RhcnRMaW5rICsgaiArIDEpICUgbGlua3MubGVuZ3RoO1xuXHRcdFx0aWYgKGxpbmtzW2ldLmdldEF0dHJpYnV0ZSgncG9wdXBrZXknKSA9PT0gbGV0dGVyKSB7XG5cdFx0XHRcdGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7XG5cdFx0XHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGlua3NbaV0uZm9jdXMoKTtcblx0XHRcdFx0cG9wdXBIYW5kbGVLZXlwcmVzcy5sYXN0UG9wdXBMaW5rU2VsZWN0ZWQgPSBsaW5rc1tpXTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBzd2FsbG93IGtleXByZXNzXG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHBhc3Mga2V5cHJlc3Mgb25cblx0XHRpZiAoZG9jdW1lbnQub2xkUG9wdXBPbmtleXByZXNzKSB7XG5cdFx0XHRyZXR1cm4gZG9jdW1lbnQub2xkUG9wdXBPbmtleXByZXNzKGV2dCk7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXHRjb25zdCBhZGRQb3B1cFNob3J0Y3V0cyA9ICgpID0+IHtcblx0XHRpZiAoZG9jdW1lbnQub25rZXlwcmVzcyAhPT0gcG9wdXBIYW5kbGVLZXlwcmVzcykge1xuXHRcdFx0ZG9jdW1lbnQub2xkUG9wdXBPbmtleXByZXNzID0gZG9jdW1lbnQub25rZXlwcmVzcztcblx0XHR9XG5cdFx0ZG9jdW1lbnQub25rZXlwcmVzcyA9IHBvcHVwSGFuZGxlS2V5cHJlc3M7XG5cdH07XG5cdGNvbnN0IHJtUG9wdXBTaG9ydGN1dHMgPSAoKSA9PiB7XG5cdFx0cG9wdXBIYW5kbGVLZXlwcmVzcy5sYXN0UG9wdXBMaW5rU2VsZWN0ZWQgPSBudWxsO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoZG9jdW1lbnQub2xkUG9wdXBPbmtleXByZXNzICYmIGRvY3VtZW50Lm9sZFBvcHVwT25rZXlwcmVzcyA9PT0gcG9wdXBIYW5kbGVLZXlwcmVzcykge1xuXHRcdFx0XHQvLyBwYW5pY1xuXHRcdFx0XHRkb2N1bWVudC5vbmtleXByZXNzID0gbnVsbDsgLy8gKCkgPT4ge307XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGRvY3VtZW50Lm9ua2V5cHJlc3MgPSBkb2N1bWVudC5vbGRQb3B1cE9ua2V5cHJlc3M7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvKiBJRSBnb2VzIGhlcmUgKi9cblx0XHR9XG5cdH07XG5cdGNvbnN0IGFkZExpbmtQcm9wZXJ0eSA9IChodG1sLCBwcm9wZXJ0eSkgPT4ge1xuXHRcdC8vIHRha2UgXCI8YSBocmVmPS4uLj4uLi48L2E+IGFuZCBhZGQgYSBwcm9wZXJ0eVxuXHRcdC8vIG5vdCBzb3BoaXN0aWNhdGVkIGF0IGFsbCwgZWFzaWx5IGJyb2tlblxuXHRcdGNvbnN0IGkgPSBodG1sLmluZGV4T2YoJz4nKTtcblx0XHRpZiAoaSA8IDApIHtcblx0XHRcdHJldHVybiBodG1sO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7aHRtbC5zbGljZSgwLCBNYXRoLm1heCgwLCBpKSl9ICR7cHJvcGVydHl9JHtodG1sLnNsaWNlKE1hdGgubWF4KDAsIGkpKX1gO1xuXHR9O1xuXHRjb25zdCBhZGRQb3B1cFNob3J0Y3V0ID0gKGh0bWwsIGtleSkgPT4ge1xuXHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBTaG9ydGN1dEtleXMnKSkge1xuXHRcdFx0cmV0dXJuIGh0bWw7XG5cdFx0fVxuXHRcdGNvbnN0IHJldCA9IGFkZExpbmtQcm9wZXJ0eShodG1sLCBgcG9wdXBrZXk9XCIke2tleX1cImApO1xuXHRcdGlmIChrZXkgPT09ICcgJykge1xuXHRcdFx0a2V5ID0gcG9wdXBTdHJpbmcoJ3NwYWNlYmFyJyk7XG5cdFx0fVxuXHRcdHJldHVybiByZXQucmVwbGFjZSgvXiguKj8pKHRpdGxlPVwiKSguKj8pKFwiLiopJC9pLCBgJDEkMiQzIFske2tleX1dJDRgKTtcblx0fTtcblx0Ly8gRU5ERklMRTogc2hvcnRjdXRrZXlzLmpzXG5cdC8vIFNUQVJURklMRTogZGlmZnByZXZpZXcuanNcblx0Ly8gbGV0cyBqdW1wIHRocm91Z2ggaG9vcHMgdG8gZmluZCB0aGUgcmV2IGlkcyB3ZSBuZWVkIHRvIHJldHJpZXZlXG5cdGNvbnN0IGxvYWREaWZmID0gKGFydGljbGUsIG9sZGlkLCBkaWZmLCBuYXZwb3ApID0+IHtcblx0XHRuYXZwb3AuZGlmZkRhdGEgPSB7XG5cdFx0XHRvbGRSZXY6IHt9LFxuXHRcdFx0bmV3UmV2OiB7fSxcblx0XHR9O1xuXHRcdGNvbnN0IGFwaSA9IGdldE13QXBpKCk7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0YWN0aW9uOiAnY29tcGFyZScsXG5cdFx0XHRwcm9wOiBbJ2lkcycsICd0aXRsZSddLFxuXHRcdH07XG5cdFx0aWYgKGFydGljbGUudGl0bGUpIHtcblx0XHRcdHBhcmFtcy5mcm9tdGl0bGUgPSBhcnRpY2xlLnRpdGxlO1xuXHRcdH1cblx0XHRzd2l0Y2ggKGRpZmYpIHtcblx0XHRcdGNhc2UgJ2N1cic6XG5cdFx0XHRcdHN3aXRjaCAob2xkaWQpIHtcblx0XHRcdFx0XHRjYXNlIG51bGw6XG5cdFx0XHRcdFx0Y2FzZSAnJzpcblx0XHRcdFx0XHRjYXNlICdwcmV2Jzpcblx0XHRcdFx0XHRcdC8vIHRoaXMgY2FuIG9ubHkgd29yayBpZiB3ZSBoYXZlIHRoZSB0aXRsZVxuXHRcdFx0XHRcdFx0Ly8gY3VyIC0+IHByZXZcblx0XHRcdFx0XHRcdHBhcmFtcy50b3JlbGF0aXZlID0gJ3ByZXYnO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHBhcmFtcy5mcm9tcmV2ID0gb2xkaWQ7XG5cdFx0XHRcdFx0XHRwYXJhbXMudG9yZWxhdGl2ZSA9ICdjdXInO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwcmV2Jzpcblx0XHRcdFx0aWYgKG9sZGlkKSB7XG5cdFx0XHRcdFx0cGFyYW1zLmZyb21yZXYgPSBvbGRpZDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXJhbXMuZnJvbXRpdGxlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhcmFtcy50b3JlbGF0aXZlID0gJ3ByZXYnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ25leHQnOlxuXHRcdFx0XHRwYXJhbXMuZnJvbXJldiA9IG9sZGlkIHx8IDA7XG5cdFx0XHRcdHBhcmFtcy50b3JlbGF0aXZlID0gJ25leHQnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHBhcmFtcy5mcm9tcmV2ID0gb2xkaWQgfHwgMDtcblx0XHRcdFx0cGFyYW1zLnRvcmV2ID0gZGlmZiB8fCAwO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0YXBpLmdldChwYXJhbXMpLnRoZW4oKGRhdGEpID0+IHtcblx0XHRcdG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aWQgPSBkYXRhLmNvbXBhcmUuZnJvbXJldmlkO1xuXHRcdFx0bmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpZCA9IGRhdGEuY29tcGFyZS50b3JldmlkO1xuXHRcdFx0YWRkUmV2aWV3TGluayhuYXZwb3AsICdwb3B1cE1pc2NUb29scycpO1xuXHRcdFx0Y29uc3QgZ28gPSAoKSA9PiB7XG5cdFx0XHRcdHBlbmRpbmdOYXZwb3BUYXNrKG5hdnBvcCk7XG5cdFx0XHRcdGxldCB1cmwgPSBgJHtwZy53aWtpLmFwaXdpa2liYXNlfT9mb3JtYXQ9anNvbiZmb3JtYXR2ZXJzaW9uPTImYWN0aW9uPXF1ZXJ5JmA7XG5cdFx0XHRcdHVybCArPSBgcmV2aWRzPSR7bmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpZH18JHtuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlkfWA7XG5cdFx0XHRcdHVybCArPSAnJnByb3A9cmV2aXNpb25zJnJ2cHJvcD1pZHN8dGltZXN0YW1wfGNvbnRlbnQnO1xuXHRcdFx0XHRnZXRQYWdlV2l0aENhY2hpbmcodXJsLCBkb25lRGlmZiwgbmF2cG9wKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7IC8vIHJlbW92ZSBob29rIG9uY2UgcnVuXG5cdFx0XHR9O1xuXHRcdFx0aWYgKG5hdnBvcC52aXNpYmxlIHx8ICFnZXRWYWx1ZU9mKCdwb3B1cExhenlEb3dubG9hZHMnKSkge1xuXHRcdFx0XHRnbygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmF2cG9wLmFkZEhvb2soZ28sICd1bmhpZGUnLCAnYmVmb3JlJywgJ0RPV05MT0FEX0RJRkZTJyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH07XG5cdC8vIFB1dCBhIFwibWFyayBwYXRyb2xsZWRcIiBsaW5rIHRvIGFuIGVsZW1lbnQgdGFyZ2V0XG5cdC8vIFRPRE86IEFsbG93IHBhdHJvbCBhIHJldmlzaW9uLCBhcyB3ZWxsIGFzIGEgZGlmZlxuXHRjb25zdCBhZGRSZXZpZXdMaW5rID0gKG5hdnBvcCwgdGFyZ2V0KSA9PiB7XG5cdFx0aWYgKCFwZy51c2VyLmNhblJldmlldykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBJZiAnbmV3UmV2JyBpcyBvbGRlciB0aGFuICdvbGRSZXYnIHRoYW4gaXQgY291bGQgYmUgY29uZnVzaW5nLCBzbyB3ZSBkbyBub3Qgc2hvdyB0aGUgcmV2aWV3IGxpbmsuXG5cdFx0aWYgKG5hdnBvcC5kaWZmRGF0YS5uZXdSZXYucmV2aWQgPD0gbmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRmb3JtYXQ6ICdqc29uJyxcblx0XHRcdGZvcm1hdHZlcnNpb246ICcyJyxcblx0XHRcdHByb3A6IFsnaW5mbycsICdmbGFnZ2VkJ10sXG5cdFx0XHRyZXZpZHM6IG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aWQsXG5cdFx0fTtcblx0XHRnZXRNd0FwaSgpXG5cdFx0XHQuZ2V0KHBhcmFtcylcblx0XHRcdC50aGVuKChkYXRhKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN0YWJsZV9yZXZpZCA9IChkYXRhLnF1ZXJ5LnBhZ2VzWzBdLmZsYWdnZWQgJiYgZGF0YS5xdWVyeS5wYWdlc1swXS5mbGFnZ2VkLnN0YWJsZV9yZXZpZCkgfHwgMDtcblx0XHRcdFx0Ly8gVGhlIGRpZmYgY2FuIGJlIHJldmlld2VkIGlmIHRoZSBvbGQgdmVyc2lvbiBpcyB0aGUgbGFzdCByZXZpZXdlZCB2ZXJzaW9uXG5cdFx0XHRcdC8vIFRPRE86IE90aGVyIHBvc3NpYmxlIGNvbmRpdGlvbnMgdGhhdCB3ZSBtYXkgd2FudCB0byBpbXBsZW1lbnQgaW5zdGVhZCBvZiB0aGlzIG9uZTpcblx0XHRcdFx0Ly8gLSBvbGQgdmVyc2lvbiBpcyBwYXRyb2xsZWQgYW5kIHRoZSBuZXcgdmVyc2lvbiBpcyBub3QgcGF0cm9sbGVkXG5cdFx0XHRcdC8vIC0gb2xkIHZlcnNpb24gaXMgcGF0cm9sbGVkIGFuZCB0aGUgbmV3IHZlcnNpb24gaXMgbW9yZSByZWNlbnQgdGhhbiB0aGUgbGFzdCByZXZpZXdlZCB2ZXJzaW9uXG5cdFx0XHRcdGlmIChzdGFibGVfcmV2aWQgPT09IG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aWQpIHtcblx0XHRcdFx0XHRjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRcdGEuaW5uZXJIVE1MID0gcG9wdXBTdHJpbmcoJ21hcmsgcGF0cm9sbGVkJyk7XG5cdFx0XHRcdFx0YS50aXRsZSA9IHBvcHVwU3RyaW5nKCdtYXJrcGF0cm9sbGVkSGludCcpO1xuXHRcdFx0XHRcdGEub25jbGljayA9ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiAncmV2aWV3Jyxcblx0XHRcdFx0XHRcdFx0Y29tbWVudDogdHByaW50ZignZGVmYXVsdHBvcHVwUmV2aWV3ZWRTdW1tYXJ5JywgW1xuXHRcdFx0XHRcdFx0XHRcdG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aWQsXG5cdFx0XHRcdFx0XHRcdFx0bmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpZCxcblx0XHRcdFx0XHRcdFx0XSksXG5cdFx0XHRcdFx0XHRcdHJldmlkOiBuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlkLFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGdldE13QXBpKClcblx0XHRcdFx0XHRcdFx0LnBvc3RXaXRoVG9rZW4oJ2NzcmYnLCBwYXJhbXMpXG5cdFx0XHRcdFx0XHRcdC5kb25lKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogVXBkYXRlIGN1cnJlbnQgcGFnZSBhbmQgb3RoZXIgYWxyZWFkeSBjb25zdHJ1Y3RlZCBwb3B1cHNcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmZhaWwoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KHBvcHVwU3RyaW5nKCdDb3VsZCBub3QgbWFya2VkIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnKSwge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGFnOiAncG9wdXBzJyxcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdlcnJvcicsXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0c2V0UG9wdXBIVE1MKGEsIHRhcmdldCwgbmF2cG9wLmlkTnVtYmVyLCBudWxsLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH07XG5cdGNvbnN0IGRvbmVEaWZmID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0aWYgKCFkb3dubG9hZC5vd25lciB8fCAhZG93bmxvYWQub3duZXIuZGlmZkRhdGEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgbmF2cG9wID0gZG93bmxvYWQub3duZXI7XG5cdFx0Y29tcGxldGVkTmF2cG9wVGFzayhuYXZwb3ApO1xuXHRcdGxldCBwYWdlcztcblx0XHRsZXQgcmV2aXNpb25zID0gW107XG5cdFx0dHJ5IHtcblx0XHRcdC8vIFByb2Nlc3MgdGhlIGRvd25sb2Fkc1xuXHRcdFx0KHtwYWdlc30gPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKS5xdWVyeSk7XG5cdFx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcblx0XHRcdFx0cmV2aXNpb25zID0gWy4uLnJldmlzaW9ucywgLi4ucGFnZS5yZXZpc2lvbnNdO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCByZXZpc2lvbiBvZiByZXZpc2lvbnMpIHtcblx0XHRcdFx0aWYgKHJldmlzaW9uLnJldmlkID09PSBuYXZwb3AuZGlmZkRhdGEub2xkUmV2LnJldmlkKSB7XG5cdFx0XHRcdFx0bmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpc2lvbiA9IHJldmlzaW9uO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJldmlzaW9uLnJldmlkID09PSBuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlkKSB7XG5cdFx0XHRcdFx0bmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpc2lvbiA9IHJldmlzaW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRlcnJsb2coJ0NvdWxkIG5vdCBnZXQgZGlmZicpO1xuXHRcdH1cblx0XHRpbnNlcnREaWZmKG5hdnBvcCk7XG5cdH07XG5cdGNvbnN0IHJtQm9yaW5nTGluZXMgPSAoYSwgYiwgY29udGV4dCkgPT4ge1xuXHRcdGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnRleHQgPSAyO1xuXHRcdH1cblx0XHQvLyB0aGlzIGlzIGZhaXJseSBzbG93Li4uIGkgdGhpbmsgaXQncyBxdWlja2VyIHRoYW4gZG9pbmcgYSB3b3JkLWJhc2VkIGRpZmYgZnJvbSB0aGUgb2ZmLCB0aG91Z2hcblx0XHRjb25zdCBhYSA9IFtdO1xuXHRcdGNvbnN0IGFhYSA9IFtdO1xuXHRcdGNvbnN0IGJiID0gW107XG5cdFx0Y29uc3QgYmJiID0gW107XG5cdFx0bGV0IGk7XG5cdFx0bGV0IGo7XG5cdFx0Ly8gZmlyc3QsIGdhdGhlciBhbGwgZGlzY29ubmVjdGVkIG5vZGVzIGluIGEgYW5kIGFsbCBjcm9zc2luZyBub2RlcyBpbiBhIGFuZCBiXG5cdFx0Zm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmICghYVtpXS5wYWlyZWQpIHtcblx0XHRcdFx0YWFbaV0gPSAxO1xuXHRcdFx0fSBlbHNlIGlmIChjb3VudENyb3NzaW5ncyhiLCBhLCBpLCB0cnVlKSkge1xuXHRcdFx0XHRhYVtpXSA9IDE7XG5cdFx0XHRcdGJiW2FbaV0ucm93XSA9IDE7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHBpY2sgdXAgcmVtYWluaW5nIGRpc2Nvbm5lY3RlZCBub2RlcyBpbiBiXG5cdFx0Zm9yIChpID0gMDsgaSA8IGIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChiYltpXSA9PT0gMSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICghYltpXS5wYWlyZWQpIHtcblx0XHRcdFx0YmJbaV0gPSAxO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBhbm90aGVyIHBhc3MgdG8gZ2F0aGVyIGNvbnRleHQ6IHdlIHdhbnQgdGhlIG5laWdoYm91cnMgb2YgaW5jbHVkZWQgbm9kZXMgd2hpY2ggYXJlIG5vdFxuXHRcdC8vIHlldCBpbmNsdWRlZCB3ZSBoYXZlIHRvIGFkZCBpbiBwYXJ0bmVycyBvZiB0aGVzZSBub2RlcywgYnV0IHdlIGRvbid0IHdhbnQgdG8gYWRkIGNvbnRleHRcblx0XHQvLyBmb3IgKnRob3NlKiBub2RlcyBpbiB0aGUgbmV4dCBwYXNzXG5cdFx0Zm9yIChpID0gMDsgaSA8IGIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChiYltpXSA9PT0gMSkge1xuXHRcdFx0XHRmb3IgKGogPSBNYXRoLm1heCgwLCBpIC0gY29udGV4dCk7IGogPCBNYXRoLm1pbihiLmxlbmd0aCwgaSArIGNvbnRleHQpOyArK2opIHtcblx0XHRcdFx0XHRpZiAoIWJiW2pdKSB7XG5cdFx0XHRcdFx0XHRiYltqXSA9IDE7XG5cdFx0XHRcdFx0XHRhYVtiW2pdLnJvd10gPSAwLjU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAoYWFbaV0gPT09IDEpIHtcblx0XHRcdFx0Zm9yIChqID0gTWF0aC5tYXgoMCwgaSAtIGNvbnRleHQpOyBqIDwgTWF0aC5taW4oYS5sZW5ndGgsIGkgKyBjb250ZXh0KTsgKytqKSB7XG5cdFx0XHRcdFx0aWYgKCFhYVtqXSkge1xuXHRcdFx0XHRcdFx0YWFbal0gPSAxO1xuXHRcdFx0XHRcdFx0YmJbYVtqXS5yb3ddID0gMC41O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgYmIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChiYltpXSA+IDApIHtcblx0XHRcdFx0Ly8gaXQncyBhIHJvdyB3ZSBuZWVkXG5cdFx0XHRcdGlmIChiW2ldLnBhaXJlZCkge1xuXHRcdFx0XHRcdGJiYi5wdXNoKGJbaV0udGV4dCk7IC8vIGpvaW5lZDsgcGFydG5lciBzaG91bGQgYmUgaW4gYWFcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRiYmIucHVzaChiW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgYWEubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChhYVtpXSA+IDApIHtcblx0XHRcdFx0Ly8gaXQncyBhIHJvdyB3ZSBuZWVkXG5cdFx0XHRcdGlmIChhW2ldLnBhaXJlZCkge1xuXHRcdFx0XHRcdGFhYS5wdXNoKGFbaV0udGV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gam9pbmVkOyBwYXJ0bmVyIHNob3VsZCBiZSBpbiBhYVxuXHRcdFx0XHRcdGFhYS5wdXNoKGFbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRhOiBhYWEsXG5cdFx0XHRiOiBiYmIsXG5cdFx0fTtcblx0fTtcblx0Y29uc3Qgc3RyaXBPdXRlckNvbW1vbkxpbmVzID0gKGEsIGIsIGNvbnRleHQpID0+IHtcblx0XHRsZXQgaSA9IDA7XG5cdFx0d2hpbGUgKGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggJiYgYVtpXSA9PT0gYltpXSkge1xuXHRcdFx0KytpO1xuXHRcdH1cblx0XHRsZXQgaiA9IGEubGVuZ3RoIC0gMTtcblx0XHRsZXQgayA9IGIubGVuZ3RoIC0gMTtcblx0XHR3aGlsZSAoaiA+PSAwICYmIGsgPj0gMCAmJiBhW2pdID09PSBiW2tdKSB7XG5cdFx0XHQtLWo7XG5cdFx0XHQtLWs7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRhOiBhLnNsaWNlKE1hdGgubWF4KDAsIGkgLSAxIC0gY29udGV4dCksIE1hdGgubWluKGEubGVuZ3RoICsgMSwgaiArIGNvbnRleHQgKyAxKSksXG5cdFx0XHRiOiBiLnNsaWNlKE1hdGgubWF4KDAsIGkgLSAxIC0gY29udGV4dCksIE1hdGgubWluKGIubGVuZ3RoICsgMSwgayArIGNvbnRleHQgKyAxKSksXG5cdFx0fTtcblx0fTtcblx0Y29uc3QgaW5zZXJ0RGlmZiA9IChuYXZwb3ApID0+IHtcblx0XHQvLyBmb3Igc3BlZWQgcmVhc29ucywgd2UgZmlyc3QgZG8gYSBsaW5lLWJhc2VkIGRpZmYsIGRpc2NhcmQgc3R1ZmYgdGhhdCBzZWVtcyBib3JpbmcsIHRoZW5cblx0XHQvLyBkbyBhIHdvcmQtYmFzZWQgZGlmZlxuXHRcdC8vIEZJWE1FOiBzb21ldGltZXMgdGhpcyBnaXZlcyBtaXNsZWFkaW5nIGRpZmZzIGFzIGRpc3RhbnQgY2h1bmtzIGFyZSBzcXVhc2hlZCB0b2dldGhlclxuXHRcdGxldCBvbGRsaW5lcyA9IG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aXNpb24uY29udGVudC5zcGxpdCgnXFxuJyk7XG5cdFx0bGV0IG5ld2xpbmVzID0gbmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpc2lvbi5jb250ZW50LnNwbGl0KCdcXG4nKTtcblx0XHRsZXQgaW5uZXIgPSBzdHJpcE91dGVyQ29tbW9uTGluZXMob2xkbGluZXMsIG5ld2xpbmVzLCBnZXRWYWx1ZU9mKCdwb3B1cERpZmZDb250ZXh0TGluZXMnKSk7XG5cdFx0b2xkbGluZXMgPSBpbm5lci5hO1xuXHRcdG5ld2xpbmVzID0gaW5uZXIuYjtcblx0XHRsZXQgdHJ1bmNhdGVkID0gZmFsc2U7XG5cdFx0Z2V0VmFsdWVPZigncG9wdXBEaWZmTWF4TGluZXMnKTtcblx0XHRpZiAob2xkbGluZXMubGVuZ3RoID4gcGcub3B0aW9uLnBvcHVwRGlmZk1heExpbmVzIHx8IG5ld2xpbmVzLmxlbmd0aCA+IHBnLm9wdGlvbi5wb3B1cERpZmZNYXhMaW5lcykge1xuXHRcdFx0Ly8gdHJ1bmNhdGVcblx0XHRcdHRydW5jYXRlZCA9IHRydWU7XG5cdFx0XHRpbm5lciA9IHN0cmlwT3V0ZXJDb21tb25MaW5lcyhcblx0XHRcdFx0b2xkbGluZXMuc2xpY2UoMCwgcGcub3B0aW9uLnBvcHVwRGlmZk1heExpbmVzKSxcblx0XHRcdFx0bmV3bGluZXMuc2xpY2UoMCwgcGcub3B0aW9uLnBvcHVwRGlmZk1heExpbmVzKSxcblx0XHRcdFx0cGcub3B0aW9uLnBvcHVwRGlmZkNvbnRleHRMaW5lc1xuXHRcdFx0KTtcblx0XHRcdG9sZGxpbmVzID0gaW5uZXIuYTtcblx0XHRcdG5ld2xpbmVzID0gaW5uZXIuYjtcblx0XHR9XG5cdFx0Y29uc3QgbGluZURpZmYgPSBkaWZmKG9sZGxpbmVzLCBuZXdsaW5lcyk7XG5cdFx0Y29uc3QgbGluZXMyID0gcm1Cb3JpbmdMaW5lcyhsaW5lRGlmZi5vLCBsaW5lRGlmZi5uKTtcblx0XHRjb25zdCBvbGRsaW5lczIgPSBsaW5lczIuYTtcblx0XHRjb25zdCBuZXdsaW5lczIgPSBsaW5lczIuYjtcblx0XHRsZXQgaHRtbCA9ICc8aHI+Jztcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBEaWZmRGF0ZXMnKSkge1xuXHRcdFx0aHRtbCArPSBkaWZmRGF0ZXNUYWJsZShuYXZwb3ApO1xuXHRcdFx0aHRtbCArPSAnPGhyPic7XG5cdFx0fVxuXHRcdGh0bWwgKz0gc2hvcnRlbkRpZmZTdHJpbmcoXG5cdFx0XHRkaWZmU3RyaW5nKG9sZGxpbmVzMi5qb2luKCdcXG4nKSwgbmV3bGluZXMyLmpvaW4oJ1xcbicpKSxcblx0XHRcdGdldFZhbHVlT2YoJ3BvcHVwRGlmZkNvbnRleHRDaGFyYWN0ZXJzJylcblx0XHQpLmpvaW4oJzxocj4nKTtcblx0XHRzZXRQb3B1cFRpcHNBbmRIVE1MKFxuXHRcdFx0aHRtbC5zcGxpdCgnXFxuJykuam9pbignPGJyPicpICtcblx0XHRcdFx0KHRydW5jYXRlZCA/IGA8aHI+PGI+JHtwb3B1cFN0cmluZygnRGlmZiB0cnVuY2F0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMnKX08L2I+YCA6ICcnKSxcblx0XHRcdCdwb3B1cFByZXZpZXcnLFxuXHRcdFx0bmF2cG9wLmlkTnVtYmVyXG5cdFx0KTtcblx0fTtcblx0Y29uc3QgZGlmZkRhdGVzVGFibGUgPSAobmF2cG9wKSA9PiB7XG5cdFx0bGV0IGh0bWwgPSAnPHRhYmxlIGNsYXNzPVwicG9wdXBfZGlmZl9kYXRlc1wiPic7XG5cdFx0aHRtbCArPSBkaWZmRGF0ZXNUYWJsZVJvdyhuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlzaW9uLCB0cHJpbnRmKCdOZXcgcmV2aXNpb24nKSk7XG5cdFx0aHRtbCArPSBkaWZmRGF0ZXNUYWJsZVJvdyhuYXZwb3AuZGlmZkRhdGEub2xkUmV2LnJldmlzaW9uLCB0cHJpbnRmKCdPbGQgcmV2aXNpb24nKSk7XG5cdFx0aHRtbCArPSAnPC90YWJsZT4nO1xuXHRcdHJldHVybiBodG1sO1xuXHR9O1xuXHRjb25zdCBkaWZmRGF0ZXNUYWJsZVJvdyA9IChyZXZpc2lvbiwgbGFiZWwpID0+IHtcblx0XHRsZXQgdHh0ID0gJyc7XG5cdFx0Y29uc3QgbGFzdE1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKHJldmlzaW9uLnRpbWVzdGFtcCk7XG5cdFx0dHh0ID0gZm9ybWF0dGVkRGF0ZVRpbWUobGFzdE1vZGlmaWVkRGF0ZSk7XG5cdFx0Y29uc3QgcmV2bGluayA9IGdlbmVyYWxMaW5rKHtcblx0XHRcdHVybDogYCR7bXcuY29uZmlnLmdldCgnd2dTY3JpcHQnKX0/b2xkaWQ9JHtyZXZpc2lvbi5yZXZpZH1gLFxuXHRcdFx0dGV4dDogbGFiZWwsXG5cdFx0XHR0aXRsZTogbGFiZWwsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHNpbXBsZVByaW50ZignPHRyPjx0ZD4lczwvdGQ+PHRkPiVzPC90ZD48L3RyPicsIFtyZXZsaW5rLCB0eHRdKTtcblx0fTtcblx0Ly8gRU5ERklMRTogZGlmZnByZXZpZXcuanNcblx0Ly8gU1RBUlRGSUxFOiBsaW5rcy5qc1xuXHQvLyBMSU5LIEdFTkVSQVRJT04gLy9cblx0Ly8gdGl0bGVkRGlmZkxpbmsgLS0+IHRpdGxlZFdpa2lMaW5rIC0tPiBnZW5lcmFsTGlua1xuXHQvLyB3aWtpTGlua1x0ICAgLS0+IHRpdGxlZFdpa2lMaW5rIC0tPiBnZW5lcmFsTGlua1xuXHQvLyBlZGl0Q291bnRlckxpbmsgLS0+IGdlbmVyYWxMaW5rXG5cdC8vIFRPRE8gTWFrZSB0aGVzZSBmdW5jdGlvbnMgcmV0dXJuIEVsZW1lbnQgb2JqZWN0cywgbm90IGp1c3QgcmF3IEhUTUwgc3RyaW5ncy5cblx0Y29uc3QgdGl0bGVkRGlmZkxpbmsgPSAobCkgPT4ge1xuXHRcdHJldHVybiB0aXRsZWRXaWtpTGluayh7XG5cdFx0XHRhcnRpY2xlOiBsLmFydGljbGUsXG5cdFx0XHRhY3Rpb246IGAke2wudG99Jm9sZGlkPSR7bC5mcm9tfWAsXG5cdFx0XHRuZXdXaW46IGwubmV3V2luLFxuXHRcdFx0bm9Qb3B1cDogbC5ub1BvcHVwLFxuXHRcdFx0dGV4dDogbC50ZXh0LFxuXHRcdFx0dGl0bGU6IGwudGl0bGUsXG5cdFx0XHQvKiBoYWNrOiBubyBvbGRpZCBoZXJlICovXG5cdFx0XHRhY3Rpb25OYW1lOiAnZGlmZicsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHdpa2lMaW5rID0gKGwpID0+IHtcblx0XHQvLyB7YXJ0aWNsZTphcnRpY2xlLCBhY3Rpb246YWN0aW9uLCB0ZXh0OnRleHQsIG9sZGlkLCBuZXdpZH0pIHtcblx0XHRpZiAoISh0eXBlb2YgbC5hcnRpY2xlID09PSB0eXBlb2Yge30gJiYgdHlwZW9mIGwuYWN0aW9uID09PSB0eXBlb2YgJycgJiYgdHlwZW9mIGwudGV4dCA9PT0gdHlwZW9mICcnKSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGlmIChsLm9sZGlkID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGwub2xkaWQgPSBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBzYXZlZE9sZGlkID0gbC5vbGRpZDtcblx0XHRpZiAoIS9eKGVkaXR8dmlld3xyZXZlcnR8cmVuZGVyKSR8XnJhdy8udGVzdChsLmFjdGlvbikpIHtcblx0XHRcdGwub2xkaWQgPSBudWxsO1xuXHRcdH1cblx0XHRsZXQgaGludCA9IHBvcHVwU3RyaW5nKGAke2wuYWN0aW9ufUhpbnRgKTsgLy8gcmV2ZXJ0SGludCBldGMgZXRjIGV0Y1xuXHRcdGNvbnN0IG9sZGlkRGF0YSA9IFtsLm9sZGlkLCBzYWZlRGVjb2RlVVJJKGwuYXJ0aWNsZSldO1xuXHRcdGxldCByZXZpc2lvblN0cmluZyA9IHRwcmludGYoJ3JldmlzaW9uICVzIG9mICVzJywgb2xkaWREYXRhKTtcblx0XHRsb2coYHJldmlzaW9uU3RyaW5nPSR7cmV2aXNpb25TdHJpbmd9YCk7XG5cdFx0c3dpdGNoIChsLmFjdGlvbikge1xuXHRcdFx0Y2FzZSAnZWRpdCZzZWN0aW9uPW5ldyc6XG5cdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygnbmV3U2VjdGlvbkhpbnQnKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlZGl0JnVuZG89Jzpcblx0XHRcdFx0aWYgKGwuZGlmZiAmJiBsLmRpZmYgIT09ICdwcmV2JyAmJiBzYXZlZE9sZGlkKSB7XG5cdFx0XHRcdFx0bC5hY3Rpb24gKz0gYCR7bC5kaWZmfSZ1bmRvYWZ0ZXI9JHtzYXZlZE9sZGlkfWA7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc2F2ZWRPbGRpZCkge1xuXHRcdFx0XHRcdGwuYWN0aW9uICs9IHNhdmVkT2xkaWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aGludCA9IHBvcHVwU3RyaW5nKCd1bmRvSGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JhdyZjdHlwZT10ZXh0L2Nzcyc6XG5cdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygncmF3SGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JldmVydCc6IHtcblx0XHRcdFx0Y29uc3QgcCA9IHBhcnNlUGFyYW1zKHBnLmN1cnJlbnQubGluay5ocmVmKTtcblx0XHRcdFx0bC5hY3Rpb24gPSBgZWRpdCZhdXRvY2xpY2s9d3BTYXZlJmFjdG9rZW49JHthdXRvQ2xpY2tUb2tlbigpfSZhdXRvaW1wbD0ke3BvcHVwU3RyaW5nKFxuXHRcdFx0XHRcdCdhdXRvZWRpdF92ZXJzaW9uJ1xuXHRcdFx0XHQpfSZhdXRvc3VtbWFyeT0ke3JldmVydFN1bW1hcnkobC5vbGRpZCwgcC5kaWZmKX1gO1xuXHRcdFx0XHRpZiAocC5kaWZmID09PSAncHJldicpIHtcblx0XHRcdFx0XHRsLmFjdGlvbiArPSAnJmRpcmVjdGlvbj1wcmV2Jztcblx0XHRcdFx0XHRyZXZpc2lvblN0cmluZyA9IHRwcmludGYoJ3RoZSByZXZpc2lvbiBwcmlvciB0byByZXZpc2lvbiAlcyBvZiAlcycsIG9sZGlkRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwUmV2ZXJ0U3VtbWFyeVByb21wdCcpKSB7XG5cdFx0XHRcdFx0bC5hY3Rpb24gKz0gJyZhdXRvc3VtbWFyeXByb21wdD10cnVlJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBNaW5vclJldmVydHMnKSkge1xuXHRcdFx0XHRcdGwuYWN0aW9uICs9ICcmYXV0b21pbm9yPXRydWUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxvZyhgcmV2aXNpb25TdHJpbmcgaXMgbm93ICR7cmV2aXNpb25TdHJpbmd9YCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnbnVsbEVkaXQnOlxuXHRcdFx0XHRsLmFjdGlvbiA9IGBlZGl0JmF1dG9jbGljaz13cFNhdmUmYWN0b2tlbj0ke2F1dG9DbGlja1Rva2VuKCl9JmF1dG9pbXBsPSR7cG9wdXBTdHJpbmcoXG5cdFx0XHRcdFx0J2F1dG9lZGl0X3ZlcnNpb24nXG5cdFx0XHRcdCl9JmF1dG9zdW1tYXJ5PW51bGxgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2hpc3RvcnlmZWVkJzpcblx0XHRcdFx0bC5hY3Rpb24gPSAnaGlzdG9yeSZmZWVkPXJzcyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWFya3BhdHJvbGxlZCc6XG5cdFx0XHRcdGwuYWN0aW9uID0gYG1hcmtwYXRyb2xsZWQmcmNpZD0ke2wucmNpZH1gO1xuXHRcdH1cblx0XHRpZiAoaGludCkge1xuXHRcdFx0aGludCA9IGwub2xkaWQgPyBzaW1wbGVQcmludGYoaGludCwgW3JldmlzaW9uU3RyaW5nXSkgOiBzaW1wbGVQcmludGYoaGludCwgW3NhZmVEZWNvZGVVUkkobC5hcnRpY2xlKV0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRoaW50ID0gc2FmZURlY29kZVVSSShgJHtsLmFydGljbGV9JmFjdGlvbj0ke2wuYWN0aW9ufWApICsgbC5vbGRpZCA/IGAmb2xkaWQ9JHtsLm9sZGlkfWAgOiAnJztcblx0XHR9XG5cdFx0cmV0dXJuIHRpdGxlZFdpa2lMaW5rKHtcblx0XHRcdGFydGljbGU6IGwuYXJ0aWNsZSxcblx0XHRcdGFjdGlvbjogbC5hY3Rpb24sXG5cdFx0XHR0ZXh0OiBsLnRleHQsXG5cdFx0XHRuZXdXaW46IGwubmV3V2luLFxuXHRcdFx0dGl0bGU6IGhpbnQsXG5cdFx0XHRvbGRpZDogbC5vbGRpZCxcblx0XHRcdG5vUG9wdXA6IGwubm9Qb3B1cCxcblx0XHRcdG9uY2xpY2s6IGwub25jbGljayxcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgcmV2ZXJ0U3VtbWFyeSA9IChvbGRpZCwgZGlmZikgPT4ge1xuXHRcdGxldCByZXQgPSAnJztcblx0XHRyZXQgPVxuXHRcdFx0ZGlmZiA9PT0gJ3ByZXYnXG5cdFx0XHRcdD8gZ2V0VmFsdWVPZigncG9wdXBRdWVyaWVkUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnknKVxuXHRcdFx0XHQ6IGdldFZhbHVlT2YoJ3BvcHVwUXVlcmllZFJldmVydFN1bW1hcnknKTtcblx0XHRyZXR1cm4gYCR7cmV0fSZhdXRvcnY9JHtvbGRpZH1gO1xuXHR9O1xuXHRjb25zdCB0aXRsZWRXaWtpTGluayA9IChsKSA9PiB7XG5cdFx0Ly8gcG9zc2libGUgcHJvcGVydGllcyBvZiBhcmd1bWVudDpcblx0XHQvLyBhcnRpY2xlLCBhY3Rpb24sIHRleHQsIHRpdGxlLCBvbGRpZCwgYWN0aW9uTmFtZSwgY2xhc3NOYW1lLCBub1BvcHVwXG5cdFx0Ly8gb2xkaWQgPSBudWxsIGlzIGZpbmUgaGVyZVxuXHRcdC8vIGFydGljbGUgYW5kIGFjdGlvbiBhcmUgbWFuZGF0b3J5IGFyZ3Ncblx0XHRpZiAobC5hcnRpY2xlID09PSB1bmRlZmluZWQgfHwgbC5hY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZXJybG9nKCdnb3QgdW5kZWZpbmVkIGFydGljbGUgb3IgYWN0aW9uIGluIHRpdGxlZFdpa2lMaW5rJyk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgYmFzZSA9IHBnLndpa2kudGl0bGViYXNlICsgbC5hcnRpY2xlLnVybFN0cmluZygpO1xuXHRcdGxldCB1cmwgPSBiYXNlO1xuXHRcdGlmIChsLmFjdGlvbk5hbWUgPT09IHVuZGVmaW5lZCB8fCAhbC5hY3Rpb25OYW1lKSB7XG5cdFx0XHRsLmFjdGlvbk5hbWUgPSAnYWN0aW9uJztcblx0XHR9XG5cdFx0Ly8gbm8gbmVlZCB0byBhZGQgJmFjdGlvbj12aWV3LCBhbmQgdGhpcyBjb25mdXNlcyBhbmNob3JzXG5cdFx0aWYgKGwuYWN0aW9uICE9PSAndmlldycpIHtcblx0XHRcdHVybCA9IGAke2Jhc2V9JiR7bC5hY3Rpb25OYW1lfT0ke2wuYWN0aW9ufWA7XG5cdFx0fVxuXHRcdGlmIChsLm9sZGlkICE9PSB1bmRlZmluZWQgJiYgbC5vbGRpZCkge1xuXHRcdFx0dXJsICs9IGAmb2xkaWQ9JHtsLm9sZGlkfWA7XG5cdFx0fVxuXHRcdGxldCBjc3NDbGFzcyA9IHBnLm1pc2MuZGVmYXVsdE5hdmxpbmtDbGFzc25hbWU7XG5cdFx0aWYgKGwuY2xhc3NOYW1lICE9PSB1bmRlZmluZWQgJiYgbC5jbGFzc05hbWUpIHtcblx0XHRcdGNzc0NsYXNzID0gbC5jbGFzc05hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmwsXG5cdFx0XHRuZXdXaW46IGwubmV3V2luLFxuXHRcdFx0dGl0bGU6IGwudGl0bGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBsLnRpdGxlLFxuXHRcdFx0dGV4dDogbC50ZXh0ID09PSB1bmRlZmluZWQgPyBudWxsIDogbC50ZXh0LFxuXHRcdFx0Y2xhc3NOYW1lOiBjc3NDbGFzcyxcblx0XHRcdG5vUG9wdXA6IGwubm9Qb3B1cCxcblx0XHRcdG9uY2xpY2s6IGwub25jbGljayxcblx0XHR9KTtcblx0fTtcblx0cGcuZm4uZ2V0TGFzdENvbnRyaWIgPSAod2lraXBhZ2UsIG5ld1dpbikgPT4ge1xuXHRcdGdldEhpc3RvcnlJbmZvKHdpa2lwYWdlLCAoeCkgPT4ge1xuXHRcdFx0cHJvY2Vzc0xhc3RDb250cmliSW5mbyh4LCB7cGFnZTogd2lraXBhZ2UsIG5ld1dpbn0pO1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBwcm9jZXNzTGFzdENvbnRyaWJJbmZvID0gKGluZm8sIHN0dWZmKSA9PiB7XG5cdFx0aWYgKCFpbmZvLmVkaXRzIHx8IGluZm8uZWRpdHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSgnUG9wdXBzOiBhbiBvZGQgdGhpbmcgaGFwcGVuZWQuIFBsZWFzZSByZXRyeS4nLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ2Vycm9yJ30pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoIWluZm8uZmlyc3ROZXdFZGl0b3IpIHtcblx0XHRcdHZvaWQgbXcubm90aWZ5KFxuXHRcdFx0XHR0cHJpbnRmKCdPbmx5IGZvdW5kIG9uZSBlZGl0b3I6ICVzIG1hZGUgJXMgZWRpdHMnLCBbaW5mby5lZGl0c1swXS5lZGl0b3IsIGluZm8uZWRpdHMubGVuZ3RoXSksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICdwb3B1cHMnLFxuXHRcdFx0XHRcdHR5cGU6ICdlcnJvcicsXG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IG5ld1VybCA9IGAke3BnLndpa2kudGl0bGViYXNlICsgbmV3IFRpdGxlKHN0dWZmLnBhZ2UpLnVybFN0cmluZygpfSZkaWZmPWN1ciZvbGRpZD0ke1xuXHRcdFx0aW5mby5maXJzdE5ld0VkaXRvci5vbGRpZFxuXHRcdH1gO1xuXHRcdGRpc3BsYXlVcmwobmV3VXJsLCBzdHVmZi5uZXdXaW4pO1xuXHR9O1xuXHRwZy5mbi5nZXREaWZmU2luY2VNeUVkaXQgPSAod2lraXBhZ2UsIG5ld1dpbikgPT4ge1xuXHRcdGdldEhpc3RvcnlJbmZvKHdpa2lwYWdlLCAoeCkgPT4ge1xuXHRcdFx0cHJvY2Vzc0RpZmZTaW5jZU15RWRpdCh4LCB7cGFnZTogd2lraXBhZ2UsIG5ld1dpbn0pO1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBwcm9jZXNzRGlmZlNpbmNlTXlFZGl0ID0gKGluZm8sIHN0dWZmKSA9PiB7XG5cdFx0aWYgKCFpbmZvLmVkaXRzIHx8IGluZm8uZWRpdHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSgnUG9wdXBzOiBzb21ldGhpbmcgZmlzaHkgaGFwcGVuZWQuIFBsZWFzZSB0cnkgYWdhaW4uJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZnJpZW5kbHlOYW1lID0gc3R1ZmYucGFnZS5zcGxpdCgnXycpLmpvaW4oJyAnKTtcblx0XHRpZiAoIWluZm8ubXlMYXN0RWRpdCkge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkoXG5cdFx0XHRcdHRwcmludGYoXCJDb3VsZG4ndCBmaW5kIGFuIGVkaXQgYnkgJXNcXG5pbiB0aGUgbGFzdCAlcyBlZGl0cyB0b1xcbiVzXCIsIFtcblx0XHRcdFx0XHRpbmZvLnVzZXJOYW1lLFxuXHRcdFx0XHRcdGdldFZhbHVlT2YoJ3BvcHVwSGlzdG9yeUxpbWl0JyksXG5cdFx0XHRcdFx0ZnJpZW5kbHlOYW1lLFxuXHRcdFx0XHRdKSxcblx0XHRcdFx0e3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9XG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoaW5mby5teUxhc3RFZGl0LmluZGV4ID09PSAwKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSh0cHJpbnRmKCclcyBzZWVtcyB0byBiZSB0aGUgbGFzdCBlZGl0b3IgdG8gdGhlIHBhZ2UgJXMnLCBbaW5mby51c2VyTmFtZSwgZnJpZW5kbHlOYW1lXSksIHtcblx0XHRcdFx0dHlwZTogJ2Vycm9yJyxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBuZXdVcmwgPSBgJHtwZy53aWtpLnRpdGxlYmFzZSArIG5ldyBUaXRsZShzdHVmZi5wYWdlKS51cmxTdHJpbmcoKX0mZGlmZj1jdXImb2xkaWQ9JHtcblx0XHRcdGluZm8ubXlMYXN0RWRpdC5vbGRpZFxuXHRcdH1gO1xuXHRcdGRpc3BsYXlVcmwobmV3VXJsLCBzdHVmZi5uZXdXaW4pO1xuXHR9O1xuXHRjb25zdCBkaXNwbGF5VXJsID0gKHVybCwgbmV3V2luKSA9PiB7XG5cdFx0aWYgKG5ld1dpbikge1xuXHRcdFx0d2luZG93Lm9wZW4odXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZG9jdW1lbnQubG9jYXRpb24gPSB1cmw7XG5cdFx0fVxuXHR9O1xuXHRwZy5mbi5wdXJnZVBvcHVwcyA9ICgpID0+IHtcblx0XHRwcm9jZXNzQWxsUG9wdXBzKHRydWUpO1xuXHRcdHNldHVwQ2FjaGUoKTsgLy8gZGVsZXRlcyBhbGwgY2FjaGVkIGl0ZW1zIChub3QgYnJvd3NlciBjYWNoZWQsIHRob3VnaC4uLilcblx0XHRwZy5vcHRpb24gPSB7fTtcblx0XHRhYm9ydEFsbERvd25sb2FkcygpO1xuXHR9O1xuXHRjb25zdCBwcm9jZXNzQWxsUG9wdXBzID0gKG51bGxpZnksIGJhbmlzaCkgPT4ge1xuXHRcdGZvciAobGV0IGkgPSAwOyBwZy5jdXJyZW50LmxpbmtzICYmIGkgPCBwZy5jdXJyZW50LmxpbmtzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAoIXBnLmN1cnJlbnQubGlua3NbaV0ubmF2cG9wdXApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAobnVsbGlmeSB8fCBiYW5pc2gpIHtcblx0XHRcdFx0cGcuY3VycmVudC5saW5rc1tpXS5uYXZwb3B1cC5iYW5pc2goKTtcblx0XHRcdH1cblx0XHRcdHBnLmN1cnJlbnQubGlua3NbaV0uc2ltcGxlTm9Nb3JlID0gZmFsc2U7XG5cdFx0XHRpZiAobnVsbGlmeSkge1xuXHRcdFx0XHRwZy5jdXJyZW50LmxpbmtzW2ldLm5hdnBvcHVwID0gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHBnLmZuLmRpc2FibGVQb3B1cHMgPSAoKSA9PiB7XG5cdFx0cHJvY2Vzc0FsbFBvcHVwcyhmYWxzZSwgdHJ1ZSk7XG5cdFx0c2V0dXBUb29sdGlwcyhudWxsLCB0cnVlKTtcblx0fTtcblx0cGcuZm4udG9nZ2xlUHJldmlld3MgPSAoKSA9PiB7XG5cdFx0cHJvY2Vzc0FsbFBvcHVwcyh0cnVlLCB0cnVlKTtcblx0XHRwZy5vcHRpb24uc2ltcGxlUG9wdXBzID0gIXBnLm9wdGlvbi5zaW1wbGVQb3B1cHM7XG5cdFx0YWJvcnRBbGxEb3dubG9hZHMoKTtcblx0fTtcblx0Y29uc3QgbWFnaWNXYXRjaExpbmsgPSBmdW5jdGlvbiBtYWdpY1dhdGNoTGluayhsKSB7XG5cdFx0Ly8gWXVjayEhIFdvdWxkIHJlcXVpcmUgYSB0aG9yb3VnaCByZWRlc2lnbiB0byBhZGQgdGhpcyBhcyBhIGNsaWNrIGV2ZW50IHRob3VnaCAuLi5cblx0XHRsLm9uY2xpY2sgPSBzaW1wbGVQcmludGYoXCJwZy5mbi5tb2RpZnlXYXRjaGxpc3QoJyVzJywnJXMnKTtyZXR1cm4gZmFsc2U7XCIsIFtcblx0XHRcdGwuYXJ0aWNsZS50b1N0cmluZyh0cnVlKS5zcGxpdCgnXFxcXCcpLmpvaW4oJ1xcXFxcXFxcJykuc3BsaXQoXCInXCIpLmpvaW4oXCJcXFxcJ1wiKSxcblx0XHRcdHRoaXMuaWQsXG5cdFx0XSk7XG5cdFx0cmV0dXJuIHdpa2lMaW5rKGwpO1xuXHR9O1xuXHRwZy5mbi5tb2RpZnlXYXRjaGxpc3QgPSBhc3luYyAodGl0bGUsIGFjdGlvbikgPT4ge1xuXHRcdGNvbnN0IHJlcURhdGEgPSB7XG5cdFx0XHRhY3Rpb246ICd3YXRjaCcsXG5cdFx0XHRmb3JtYXR2ZXJzaW9uOiAnMicsXG5cdFx0XHR0aXRsZXM6IHRpdGxlLFxuXHRcdFx0dXNlbGFuZzogbXcuY29uZmlnLmdldCgnd2dVc2VyTGFuZ3VhZ2UnKSxcblx0XHR9O1xuXHRcdGlmIChhY3Rpb24gPT09ICd1bndhdGNoJykge1xuXHRcdFx0cmVxRGF0YS51bndhdGNoID0gdHJ1ZTtcblx0XHR9XG5cdFx0Ly8gTG9hZCB0aGUgQWRkZWR3YXRjaHRleHQgb3IgUmVtb3ZlZHdhdGNodGV4dCBtZXNzYWdlIGFuZCBzaG93IGl0XG5cdFx0Y29uc3QgbXdUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRpdGxlKTtcblx0XHRsZXQgbWVzc2FnZU5hbWU7XG5cdFx0aWYgKG13VGl0bGUgJiYgbXdUaXRsZS5nZXROYW1lc3BhY2VJZCgpID4gMCAmJiBtd1RpdGxlLmdldE5hbWVzcGFjZUlkKCkgJSAyID09PSAxKSB7XG5cdFx0XHRtZXNzYWdlTmFtZSA9IGFjdGlvbiA9PT0gJ3dhdGNoJyA/ICdhZGRlZHdhdGNodGV4dC10YWxrJyA6ICdyZW1vdmVkd2F0Y2h0ZXh0LXRhbGsnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZXNzYWdlTmFtZSA9IGFjdGlvbiA9PT0gJ3dhdGNoJyA/ICdhZGRlZHdhdGNodGV4dCcgOiAncmVtb3ZlZHdhdGNodGV4dCc7XG5cdFx0fVxuXHRcdGF3YWl0IGdldE13QXBpKCkucG9zdFdpdGhUb2tlbignd2F0Y2gnLCByZXFEYXRhKTtcblx0XHRhd2FpdCBnZXRNd0FwaSgpLmxvYWRNZXNzYWdlc0lmTWlzc2luZyhbbWVzc2FnZU5hbWVdKTtcblx0XHQvLyBNZXNzYWdlcyB0aGF0IGNhbiBiZSB1c2VkIGhlcmU6XG5cdFx0Ly8gKiBzZWUgc3RyaW5nLmpzXG5cdFx0Ly8gKiBmb3IgbW9yZSBpbmZvcm1hdGlvblxuXHRcdHZvaWQgbXcubm90aWZ5KG13Lm1lc3NhZ2UobWVzc2FnZU5hbWUsIHRpdGxlKS5wYXJzZURvbSgpLCB7dGFnOiAncG9wdXBzJ30pO1xuXHR9O1xuXHRjb25zdCBtYWdpY0hpc3RvcnlMaW5rID0gKGwpID0+IHtcblx0XHQvLyBGSVhNRSB1c2Ugb25jbGljayBjaGFuZ2UgaHJlZiB0cmljayB0byBzb3J0IHRoaXMgb3V0IGluc3RlYWQgb2Ygd2luZG93Lm9wZW5cblx0XHRsZXQganNVcmwgPSAnJztcblx0XHRsZXQgdGl0bGUgPSAnJztcblx0XHRsZXQgb25DbGljayA9ICcnO1xuXHRcdHN3aXRjaCAobC5pZCkge1xuXHRcdFx0Y2FzZSAnbGFzdENvbnRyaWInOlxuXHRcdFx0XHRvbkNsaWNrID0gc2ltcGxlUHJpbnRmKFwicGcuZm4uZ2V0TGFzdENvbnRyaWIoJyVzJywlcylcIiwgW1xuXHRcdFx0XHRcdGwuYXJ0aWNsZS50b1N0cmluZyh0cnVlKS5zcGxpdCgnXFxcXCcpLmpvaW4oJ1xcXFxcXFxcJykuc3BsaXQoXCInXCIpLmpvaW4oXCJcXFxcJ1wiKSxcblx0XHRcdFx0XHRsLm5ld1dpbixcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHRpdGxlID0gcG9wdXBTdHJpbmcoJ2xhc3RDb250cmliSGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NpbmNlTWUnOlxuXHRcdFx0XHRvbkNsaWNrID0gc2ltcGxlUHJpbnRmKFwicGcuZm4uZ2V0RGlmZlNpbmNlTXlFZGl0KCclcycsJXMpXCIsIFtcblx0XHRcdFx0XHRsLmFydGljbGUudG9TdHJpbmcodHJ1ZSkuc3BsaXQoJ1xcXFwnKS5qb2luKCdcXFxcXFxcXCcpLnNwbGl0KFwiJ1wiKS5qb2luKFwiXFxcXCdcIiksXG5cdFx0XHRcdFx0bC5uZXdXaW4sXG5cdFx0XHRcdF0pO1xuXHRcdFx0XHR0aXRsZSA9IHBvcHVwU3RyaW5nKCdzaW5jZU1lSGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0anNVcmwgPSBgamF2YXNjcmlwdDoke29uQ2xpY2t9YDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0b25DbGljayArPSAnO3JldHVybiBmYWxzZTsnO1xuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmw6IGpzVXJsLFxuXHRcdFx0bmV3V2luOiBmYWxzZSxcblx0XHRcdHRpdGxlLFxuXHRcdFx0dGV4dDogbC50ZXh0LFxuXHRcdFx0bm9Qb3B1cDogbC5ub1BvcHVwLFxuXHRcdFx0b25jbGljazogb25DbGljayxcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgcG9wdXBNZW51TGluayA9IChsKSA9PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNjcmlwdC11cmxcblx0XHRjb25zdCBqc1VybCA9IHNpbXBsZVByaW50ZignamF2YXNjcmlwdDpwZy5mbi4lcygpJywgW2wuaWRdKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0Y29uc3QgdGl0bGUgPSBwb3B1cFN0cmluZyhzaW1wbGVQcmludGYoJyVzSGludCcsIFtsLmlkXSkpO1xuXHRcdGNvbnN0IG9uQ2xpY2sgPSBzaW1wbGVQcmludGYoJ3BnLmZuLiVzKCk7cmV0dXJuIGZhbHNlOycsIFtsLmlkXSk7XG5cdFx0cmV0dXJuIGdlbmVyYWxOYXZMaW5rKHtcblx0XHRcdHVybDoganNVcmwsXG5cdFx0XHRuZXdXaW46IGZhbHNlLFxuXHRcdFx0dGl0bGUsXG5cdFx0XHR0ZXh0OiBsLnRleHQsXG5cdFx0XHRub1BvcHVwOiBsLm5vUG9wdXAsXG5cdFx0XHRvbmNsaWNrOiBvbkNsaWNrLFxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBzcGVjaWFsTGluayA9IChsKSA9PiB7XG5cdFx0Ly8gcHJvcGVydGllczogYXJ0aWNsZSwgc3BlY2lhbHBhZ2UsIHRleHQsIHNlcFxuXHRcdGlmIChsLnNwZWNpYWxwYWdlID09PSB1bmRlZmluZWQgfHwgIWwuc3BlY2lhbHBhZ2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBiYXNlID0gYCR7cGcud2lraS50aXRsZWJhc2UgKyBtdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1NwZWNpYWxJZF19OiR7bC5zcGVjaWFscGFnZX1gO1xuXHRcdGlmIChsLnNlcCA9PT0gdW5kZWZpbmVkIHx8IGwuc2VwID09PSBudWxsKSB7XG5cdFx0XHRsLnNlcCA9ICcmdGFyZ2V0PSc7XG5cdFx0fVxuXHRcdGxldCBhcnRpY2xlID0gbC5hcnRpY2xlLnVybFN0cmluZyh7XG5cdFx0XHRrZWVwU3BhY2VzOiBsLnNwZWNpYWxwYWdlID09PSAnU2VhcmNoJyxcblx0XHR9KTtcblx0XHRsZXQgaGludCA9IHBvcHVwU3RyaW5nKGAke2wuc3BlY2lhbHBhZ2V9SGludGApO1xuXHRcdHN3aXRjaCAobC5zcGVjaWFscGFnZSkge1xuXHRcdFx0Y2FzZSAnTG9nJzpcblx0XHRcdFx0c3dpdGNoIChsLnNlcCkge1xuXHRcdFx0XHRcdGNhc2UgJyZ1c2VyPSc6XG5cdFx0XHRcdFx0XHRoaW50ID0gcG9wdXBTdHJpbmcoJ3VzZXJMb2dIaW50Jyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICcmdHlwZT1ibG9jayZwYWdlPSc6XG5cdFx0XHRcdFx0XHRoaW50ID0gcG9wdXBTdHJpbmcoJ2Jsb2NrTG9nSGludCcpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnJnBhZ2U9Jzpcblx0XHRcdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygncGFnZUxvZ0hpbnQnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJyZ0eXBlPXByb3RlY3QmcGFnZT0nOlxuXHRcdFx0XHRcdFx0aGludCA9IHBvcHVwU3RyaW5nKCdwcm90ZWN0TG9nSGludCcpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnJnR5cGU9ZGVsZXRlJnBhZ2U9Jzpcblx0XHRcdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygnZGVsZXRlTG9nSGludCcpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGxvZyhgVW5rbm93biBsb2cgdHlwZSwgc2VwPSR7bC5zZXB9YCk7XG5cdFx0XHRcdFx0XHRoaW50ID0gJ01pc3NpbmcgaGludCAoRklYTUUpJztcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ1ByZWZpeEluZGV4Jzpcblx0XHRcdFx0YXJ0aWNsZSArPSAnLyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRoaW50ID0gaGludCA/IHNpbXBsZVByaW50ZihoaW50LCBbc2FmZURlY29kZVVSSShsLmFydGljbGUpXSkgOiBzYWZlRGVjb2RlVVJJKGAke2wuc3BlY2lhbHBhZ2V9OiR7bC5hcnRpY2xlfWApO1xuXHRcdGNvbnN0IHVybCA9IGJhc2UgKyBsLnNlcCArIGFydGljbGU7XG5cdFx0cmV0dXJuIGdlbmVyYWxOYXZMaW5rKHtcblx0XHRcdHVybCxcblx0XHRcdHRpdGxlOiBoaW50LFxuXHRcdFx0dGV4dDogbC50ZXh0LFxuXHRcdFx0bmV3V2luOiBsLm5ld1dpbixcblx0XHRcdG5vUG9wdXA6IGwubm9Qb3B1cCxcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgZ2VuZXJhbExpbmsgPSAobCkgPT4ge1xuXHRcdC8vIGwudXJsLCBsLnRleHQsIGwudGl0bGUsIGwubmV3V2luLCBsLmNsYXNzTmFtZSwgbC5ub1BvcHVwLCBsLm9uY2xpY2tcblx0XHRpZiAobC51cmwgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdC8vIG9ubHkgcXVvdGF0aW9uIG1hcmtzIGluIHRoZSB1cmwgY2FuIHNjcmV3IHVzIHVwIG5vdy4uLiBJIHRoaW5rXG5cdFx0Y29uc3QgdXJsID0gbC51cmwuc3BsaXQoJ1wiJykuam9pbignJTIyJyk7XG5cdFx0bGV0IHJldCA9IGA8YSBocmVmPVwiJHt1cmx9XCJgO1xuXHRcdGlmIChsLnRpdGxlICE9PSB1bmRlZmluZWQgJiYgbC50aXRsZSkge1xuXHRcdFx0cmV0ICs9IGAgdGl0bGU9XCIke3BnLmVzY2FwZVF1b3Rlc0hUTUwobC50aXRsZSl9XCJgO1xuXHRcdH1cblx0XHRpZiAobC5vbmNsaWNrICE9PSB1bmRlZmluZWQgJiYgbC5vbmNsaWNrKSB7XG5cdFx0XHRyZXQgKz0gYCBvbmNsaWNrPVwiJHtwZy5lc2NhcGVRdW90ZXNIVE1MKGwub25jbGljayl9XCJgO1xuXHRcdH1cblx0XHRpZiAobC5ub1BvcHVwKSB7XG5cdFx0XHRyZXQgKz0gJyBub1BvcHVwPTEnO1xuXHRcdH1cblx0XHRsZXQgbmV3V2luO1xuXHRcdGlmIChsLm5ld1dpbiA9PT0gdW5kZWZpbmVkIHx8IGwubmV3V2luID09PSBudWxsKSB7XG5cdFx0XHRuZXdXaW4gPSBnZXRWYWx1ZU9mKCdwb3B1cE5ld1dpbmRvd3MnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0KHtuZXdXaW59ID0gbCk7XG5cdFx0fVxuXHRcdGlmIChuZXdXaW4pIHtcblx0XHRcdHJldCArPSAnIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCInO1xuXHRcdH1cblx0XHRpZiAobC5jbGFzc05hbWUgIT09IHVuZGVmaW5lZCAmJiBsLmNsYXNzTmFtZSkge1xuXHRcdFx0cmV0ICs9IGAgY2xhc3M9XCIke2wuY2xhc3NOYW1lfVwiYDtcblx0XHR9XG5cdFx0cmV0ICs9ICc+Jztcblx0XHRpZiAodHlwZW9mIGwudGV4dCA9PT0gdHlwZW9mICcnKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIEhUTUwtZXNjYXBlIHRoaXMgdG8gYXZvaWQgWFNTLCBidXQgd2UgYWxzbyB3YW50IHRvXG5cdFx0XHQvLyBkaXNwbGF5IGFueSBleGlzdGluZyBIVE1MIGVudGl0aWVzIGNvcnJlY3RseSwgc28gdW5lc2NhcGUgaXQgZmlyc3QuXG5cdFx0XHQvLyBGb3IgZXhhbXBsZSwgdGhlIGRpc3BsYXkgdGV4dCBvZiB0aGUgdXNlciBwYWdlIG1lbnUgaXRlbSBpcyBkZWZpbmVkXG5cdFx0XHQvLyBhcyBcInVzZXImbmJzcDtwYWdlXCIsIHNvIHdlIG5lZWQgdG8gdW5lc2NhcGUgZmlyc3QgdG8gYXZvaWQgaXQgYmVpbmdcblx0XHRcdC8vIGVzY2FwZWQgdG8gXCJ1c2VyJmFtcDtuYnNwO3BhZ2VcIi5cblx0XHRcdHJldCArPSBwZy5lc2NhcGVRdW90ZXNIVE1MKHBnLnVuZXNjYXBlUXVvdGVzSFRNTChsLnRleHQpKTtcblx0XHR9XG5cdFx0cmV0ICs9ICc8L2E+Jztcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBhcHBlbmRQYXJhbXNUb0xpbmsgPSAobGlua3N0ciwgcGFyYW1zKSA9PiB7XG5cdFx0Y29uc3Qgc3AgPSBsaW5rc3RyLnNwbGl0KC8oaHJlZj1cIlteXCJdKz8pXCIvaSk7XG5cdFx0aWYgKHNwLmxlbmd0aCA8IDIpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRsZXQgcmV0ID0gc3Auc2hpZnQoKSArIHNwLnNoaWZ0KCk7XG5cdFx0cmV0ICs9IGAmJHtwYXJhbXN9XCJgO1xuXHRcdHJldCArPSBzcC5qb2luKCcnKTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBjaGFuZ2VMaW5rVGFyZ2V0TGluayA9ICh4KSA9PiB7XG5cdFx0Ly8gbmV3VGFyZ2V0LCB0ZXh0LCBoaW50LCBzdW1tYXJ5LCBjbGlja0J1dHRvbiwgbWlub3IsIHRpdGxlIChvcHRpb25hbCksIGFsc29DaGFuZ2VMYWJlbCB7XG5cdFx0aWYgKHgubmV3VGFyZ2V0KSB7XG5cdFx0XHRsb2coYGNoYW5nZUxpbmtUYXJnZXRMaW5rOiBuZXdUYXJnZXQ9JHt4Lm5ld1RhcmdldH1gKTtcblx0XHR9XG5cdFx0aWYgKHgub2xkVGFyZ2V0ICE9PSBkZWNvZGVVUklDb21wb25lbnQoeC5vbGRUYXJnZXQpKSB7XG5cdFx0XHRsb2coYFRoaXMgbWlnaHQgYmUgYW4gaW5wdXQgcHJvYmxlbTogJHt4Lm9sZFRhcmdldH1gKTtcblx0XHR9XG5cdFx0Ly8gRklYTUU6IGZpcnN0IGNoYXJhY3RlciBvZiBwYWdlIHRpdGxlIGFzIHdlbGwgYXMgbmFtZXNwYWNlIHNob3VsZCBiZSBjYXNlIGluc2Vuc2l0aXZlXG5cdFx0Ly8gZWcgW1s6Y2F0ZWdvcnk6WDFdXSBhbmQgW1s6Q2F0ZWdvcnk6WDFdXSBhcmUgZXF1aXZhbGVudFxuXHRcdC8vIHRoaXMnbGwgYnJlYWsgaWYgY2hhckF0KDApIGlzIG5hc3R5XG5cdFx0Y29uc3QgY0EgPSBtdy51dGlsLmVzY2FwZVJlZ0V4cCh4Lm9sZFRhcmdldCk7XG5cdFx0bGV0IGNocyA9IGNBLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuXHRcdGNocyA9IGBbJHtjaHN9JHtjaHMudG9Mb3dlckNhc2UoKX1dYDtcblx0XHRsZXQgY3VycmVudEFydGljbGVSZWdleEJpdCA9IGNocyArIGNBLnNsaWNlKDEpO1xuXHRcdGN1cnJlbnRBcnRpY2xlUmVnZXhCaXQgPSBjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0XG5cdFx0XHQuc3BsaXQoL1sgX10rfCUyMC9nKVxuXHRcdFx0LmpvaW4oJyg/OltfIF0rfCUyMCknKVxuXHRcdFx0LnNwbGl0KCdcXFxcKCcpXG5cdFx0XHQuam9pbignKD86JTI4fFxcXFwoKScpXG5cdFx0XHQuc3BsaXQoJ1xcXFwpJylcblx0XHRcdC5qb2luKCcoPzolMjl8XFxcXCkpJyk7IC8vIHdoeSBkb2VzIHRoaXMgbmVlZCB0byBtYXRjaCBlbmNvZGVkIHN0cmluZ3MgPyBsaW5rcyBpbiB0aGUgZG9jdW1lbnQgP1xuXG5cdFx0Ly8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2Ugc2hvdWxkIGJlIGlnbm9yZWQsIGFuZCBhbmNob3IgYml0cyBvcHRpb25hbDpcblx0XHRjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0ID0gYFxcXFxzKigke2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9KD86I1teXFxcXFtcXFxcfF0qKT8pXFxcXHMqYDtcblx0XHQvLyBlLmcuIENvbXB1dGVyIChhcmNoYWljKSAtPiBcXHMqKFtDY11vbXB1dGVyW18gXSg/OiUyNTI4fFxcKClhcmNoYWljKD86JTI1Mjh8XFwpKSlcXHMqXG5cdFx0Ly8gYXV0b2VkaXQ9c35cXFtcXFsoW0NjXWFkKVxcXVxcXX5bW0NvbXB1dGVyLWFpZGVkJTIwZGVzaWdufCQxXV1+ZztzflxcW1xcWyhbQ2NdQUQpW3xdfltbQ29tcHV0ZXItYWlkZWQlMjBkZXNpZ258fmdcblx0XHRjb25zdCB0aXRsZSA9IHgudGl0bGUgfHwgbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLnNwbGl0KCdfJykuam9pbignICcpO1xuXHRcdGNvbnN0IGxrID0gdGl0bGVkV2lraUxpbmsoe1xuXHRcdFx0YXJ0aWNsZTogbmV3IFRpdGxlKHRpdGxlKSxcblx0XHRcdG5ld1dpbjogeC5uZXdXaW4sXG5cdFx0XHRhY3Rpb246ICdlZGl0Jyxcblx0XHRcdHRleHQ6IHgudGV4dCxcblx0XHRcdHRpdGxlOiB4LmhpbnQsXG5cdFx0XHRjbGFzc05hbWU6ICdwb3B1cF9jaGFuZ2VfdGl0bGVfbGluaycsXG5cdFx0fSk7XG5cdFx0bGV0IGNtZCA9ICcnO1xuXHRcdGlmICh4Lm5ld1RhcmdldCkge1xuXHRcdFx0Ly8gZXNjYXBlICcmJyBhbmQgb3RoZXIgbmFzdGllc1xuXHRcdFx0Y29uc3QgdCA9IHgubmV3VGFyZ2V0O1xuXHRcdFx0Y29uc3QgcyA9IG13LnV0aWwuZXNjYXBlUmVnRXhwKHgubmV3VGFyZ2V0KTtcblx0XHRcdGlmICh4LmFsc29DaGFuZ2VMYWJlbCkge1xuXHRcdFx0XHRjbWQgKz0gYHN+XFxcXFtcXFxcWyR7Y3VycmVudEFydGljbGVSZWdleEJpdH1cXFxcXVxcXFxdfltbJHt0fV1dfmc7YDtcblx0XHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9W3xdfltbJHt0fXx+ZztgO1xuXHRcdFx0XHRjbWQgKz0gYHN+XFxcXFtcXFxcWyR7c31cXFxcfCR7c31cXFxcXVxcXFxdfltbJHt0fV1dfmdgO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9XFxcXF1cXFxcXX5bWyR7dH18JDFdXX5nO2A7XG5cdFx0XHRcdGNtZCArPSBgc35cXFxcW1xcXFxbJHtjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0fVt8XX5bWyR7dH18fmc7YDtcblx0XHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske3N9XFxcXHwke3N9XFxcXF1cXFxcXX5bWyR7dH1dXX5nYDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9XFxcXF1cXFxcXX4kMX5nO2A7XG5cdFx0XHRjbWQgKz0gYHN+XFxcXFtcXFxcWyR7Y3VycmVudEFydGljbGVSZWdleEJpdH1bfF0oLio/KVxcXFxdXFxcXF1+JDJ+Z2A7XG5cdFx0fVxuXHRcdC8vIEJ1aWxkIHF1ZXJ5XG5cdFx0Y21kID0gYGF1dG9lZGl0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNtZCl9YDtcblx0XHRjbWQgKz0gYCZhdXRvY2xpY2s9JHtlbmNvZGVVUklDb21wb25lbnQoeC5jbGlja0J1dHRvbil9JmFjdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQoYXV0b0NsaWNrVG9rZW4oKSl9YDtcblx0XHRjbWQgKz0geC5taW5vciA9PT0gbnVsbCA/ICcnIDogYCZhdXRvbWlub3I9JHtlbmNvZGVVUklDb21wb25lbnQoeC5taW5vcil9YDtcblx0XHRjbWQgKz0geC53YXRjaCA9PT0gbnVsbCA/ICcnIDogYCZhdXRvd2F0Y2g9JHtlbmNvZGVVUklDb21wb25lbnQoeC53YXRjaCl9YDtcblx0XHRjbWQgKz0gYCZhdXRvc3VtbWFyeT0ke2VuY29kZVVSSUNvbXBvbmVudCh4LnN1bW1hcnkpfWA7XG5cdFx0Y21kICs9IGAmYXV0b2ltcGw9JHtlbmNvZGVVUklDb21wb25lbnQocG9wdXBTdHJpbmcoJ2F1dG9lZGl0X3ZlcnNpb24nKSl9YDtcblx0XHRyZXR1cm4gYXBwZW5kUGFyYW1zVG9MaW5rKGxrLCBjbWQpO1xuXHR9O1xuXHRjb25zdCByZWRpckxpbmsgPSAocmVkaXJNYXRjaCwgYXJ0aWNsZSkgPT4ge1xuXHRcdC8vIE5CIHJlZGlyTWF0Y2ggaXMgaW4gd2lraVRleHRcblx0XHRsZXQgcmV0ID0gJyc7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwQXBwZW5kUmVkaXJOYXZMaW5rcycpICYmIGdldFZhbHVlT2YoJ3BvcHVwTmF2TGlua3MnKSkge1xuXHRcdFx0cmV0ICs9ICc8aHI+Jztcblx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cEZpeFJlZGlycycpICYmIGF1dG9FZGl0ICE9PSB1bmRlZmluZWQgJiYgYXV0b0VkaXQpIHtcblx0XHRcdFx0cmV0ICs9IHBvcHVwU3RyaW5nKCdSZWRpcmVjdHMgdG86IChGaXggJyk7XG5cdFx0XHRcdGxvZyhgcmVkaXJMaW5rOiBuZXdUYXJnZXQ9JHtyZWRpck1hdGNofWApO1xuXHRcdFx0XHRyZXQgKz0gYWRkUG9wdXBTaG9ydGN1dChcblx0XHRcdFx0XHRjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRcdFx0XHRuZXdUYXJnZXQ6IHJlZGlyTWF0Y2gsXG5cdFx0XHRcdFx0XHR0ZXh0OiBwb3B1cFN0cmluZygndGFyZ2V0JyksXG5cdFx0XHRcdFx0XHRoaW50OiBwb3B1cFN0cmluZygnRml4IHRoaXMgcmVkaXJlY3QsIGNoYW5naW5nIGp1c3QgdGhlIGxpbmsgdGFyZ2V0JyksXG5cdFx0XHRcdFx0XHRzdW1tYXJ5OiBzaW1wbGVQcmludGYoZ2V0VmFsdWVPZigncG9wdXBGaXhSZWRpcnNTdW1tYXJ5JyksIFthcnRpY2xlLnRvU3RyaW5nKCksIHJlZGlyTWF0Y2hdKSxcblx0XHRcdFx0XHRcdG9sZFRhcmdldDogYXJ0aWNsZS50b1N0cmluZygpLFxuXHRcdFx0XHRcdFx0Y2xpY2tCdXR0b246IGdldFZhbHVlT2YoJ3BvcHVwUmVkaXJBdXRvQ2xpY2snKSxcblx0XHRcdFx0XHRcdG1pbm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0d2F0Y2g6IGdldFZhbHVlT2YoJ3BvcHVwV2F0Y2hSZWRpcnJlZFBhZ2VzJyksXG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0J1InXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldCArPSBwb3B1cFN0cmluZygnIG9yICcpO1xuXHRcdFx0XHRyZXQgKz0gYWRkUG9wdXBTaG9ydGN1dChcblx0XHRcdFx0XHRjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRcdFx0XHRuZXdUYXJnZXQ6IHJlZGlyTWF0Y2gsXG5cdFx0XHRcdFx0XHR0ZXh0OiBwb3B1cFN0cmluZygndGFyZ2V0ICYgbGFiZWwnKSxcblx0XHRcdFx0XHRcdGhpbnQ6IHBvcHVwU3RyaW5nKCdGaXggdGhpcyByZWRpcmVjdCwgY2hhbmdpbmcgdGhlIGxpbmsgdGFyZ2V0IGFuZCBsYWJlbCcpLFxuXHRcdFx0XHRcdFx0c3VtbWFyeTogc2ltcGxlUHJpbnRmKGdldFZhbHVlT2YoJ3BvcHVwRml4UmVkaXJzU3VtbWFyeScpLCBbYXJ0aWNsZS50b1N0cmluZygpLCByZWRpck1hdGNoXSksXG5cdFx0XHRcdFx0XHRvbGRUYXJnZXQ6IGFydGljbGUudG9TdHJpbmcoKSxcblx0XHRcdFx0XHRcdGNsaWNrQnV0dG9uOiBnZXRWYWx1ZU9mKCdwb3B1cFJlZGlyQXV0b0NsaWNrJyksXG5cdFx0XHRcdFx0XHRtaW5vcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHdhdGNoOiBnZXRWYWx1ZU9mKCdwb3B1cFdhdGNoUmVkaXJyZWRQYWdlcycpLFxuXHRcdFx0XHRcdFx0YWxzb0NoYW5nZUxhYmVsOiB0cnVlLFxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdCdSJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXQgKz0gcG9wdXBTdHJpbmcoJyknKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldCArPSBwb3B1cFN0cmluZygnUmVkaXJlY3RzJykgKyBwb3B1cFN0cmluZygnIHRvICcpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0cmV0dXJuIGA8YnI+ICR7cG9wdXBTdHJpbmcoJ1JlZGlyZWN0cycpfSR7cG9wdXBTdHJpbmcoJyB0byAnKX0ke3RpdGxlZFdpa2lMaW5rKHtcblx0XHRcdGFydGljbGU6IG5ldyBUaXRsZSgpLmZyb21XaWtpVGV4dChyZWRpck1hdGNoKSxcblx0XHRcdGFjdGlvbjogJ3ZpZXcnIC8qIEZJWE1FOiBuZXdXaW4gKi8sXG5cdFx0XHR0ZXh0OiBzYWZlRGVjb2RlVVJJKHJlZGlyTWF0Y2gpLFxuXHRcdFx0dGl0bGU6IHBvcHVwU3RyaW5nKCdCeXBhc3MgcmVkaXJlY3QnKSxcblx0XHR9KX1gO1xuXHR9O1xuXHRjb25zdCBhcmluTGluayA9IChsKSA9PiB7XG5cdFx0aWYgKCFzYW5lTGlua0NoZWNrKGwpKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKCFsLmFydGljbGUuaXNJcFVzZXIoKSB8fCAhcGcud2lraS53aWtpbWVkaWEpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCB1TiA9IGwuYXJ0aWNsZS51c2VyTmFtZSgpO1xuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmw6IGBodHRwOi8vd3MuYXJpbi5uZXQvY2dpLWJpbi93aG9pcy5wbD9xdWVyeWlucHV0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVOKX1gLFxuXHRcdFx0bmV3V2luOiBsLm5ld1dpbixcblx0XHRcdHRpdGxlOiB0cHJpbnRmKCdMb29rIHVwICVzIGluIEFSSU4gd2hvaXMgZGF0YWJhc2UnLCBbdU5dKSxcblx0XHRcdHRleHQ6IGwudGV4dCxcblx0XHRcdG5vUG9wdXA6IDEsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHRvb2xEYk5hbWUgPSAoY29va2llU3R5bGUpID0+IHtcblx0XHRsZXQgcmV0ID0gbXcuY29uZmlnLmdldCgnd2dEQm5hbWUnKTtcblx0XHRpZiAoIWNvb2tpZVN0eWxlKSB7XG5cdFx0XHRyZXQgKz0gJ19wJztcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3Qgc2FuZUxpbmtDaGVjayA9IChsKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBsLmFydGljbGUgIT09IHR5cGVvZiB7fSB8fCB0eXBlb2YgbC50ZXh0ICE9PSB0eXBlb2YgJycpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdGNvbnN0IGVkaXRDb3VudGVyTGluayA9IChsKSA9PiB7XG5cdFx0aWYgKCFzYW5lTGlua0NoZWNrKGwpKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKCFwZy53aWtpLndpa2ltZWRpYSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IHVOID0gbC5hcnRpY2xlLnVzZXJOYW1lKCk7XG5cdFx0Y29uc3QgdG9vbCA9IGdldFZhbHVlT2YoJ3BvcHVwRWRpdENvdW50ZXJUb29sJyk7XG5cdFx0bGV0IHVybDtcblx0XHRjb25zdCBkZWZhdWx0VG9vbFVybCA9ICcvL3Rvb2xzLndtZmxhYnMub3JnL3N1cGVyY291bnQvaW5kZXgucGhwP3VzZXI9JDEmcHJvamVjdD0kMi4kMyc7XG5cdFx0c3dpdGNoICh0b29sKSB7XG5cdFx0XHRjYXNlICdjdXN0b20nOlxuXHRcdFx0XHR1cmwgPSBzaW1wbGVQcmludGYoZ2V0VmFsdWVPZigncG9wdXBFZGl0Q291bnRlclVybCcpLCBbZW5jb2RlVVJJQ29tcG9uZW50KHVOKSwgdG9vbERiTmFtZSgpXSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDoge1xuXHRcdFx0XHRjb25zdCB0aGVXaWtpID0gcGcud2lraS5ob3N0bmFtZS5zcGxpdCgnLicpO1xuXHRcdFx0XHR1cmwgPSBzaW1wbGVQcmludGYoZGVmYXVsdFRvb2xVcmwsIFtlbmNvZGVVUklDb21wb25lbnQodU4pLCB0aGVXaWtpWzBdLCB0aGVXaWtpWzFdXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmwsXG5cdFx0XHR0aXRsZTogdHByaW50ZignZWRpdENvdW50ZXJMaW5rSGludCcsIFt1Tl0pLFxuXHRcdFx0bmV3V2luOiBsLm5ld1dpbixcblx0XHRcdHRleHQ6IGwudGV4dCxcblx0XHRcdG5vUG9wdXA6IDEsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IGVkaXRvckxpc3RMaW5rID0gKGwpID0+IHtcblx0XHRpZiAoIXNhbmVMaW5rQ2hlY2sobCkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhcnRpY2xlID0gbC5hcnRpY2xlLmFydGljbGVGcm9tVGFsa1BhZ2UoKSB8fCBsLmFydGljbGU7XG5cdFx0Y29uc3QgdXJsID0gYGh0dHBzOi8veHRvb2xzLndtZmxhYnMub3JnL2FydGljbGVpbmZvLyR7ZW5jb2RlVVJJKFxuXHRcdFx0cGcud2lraS5ob3N0bmFtZVxuXHRcdCl9LyR7YXJ0aWNsZS51cmxTdHJpbmcoKX0/dXNlbGFuZz0ke213LmNvbmZpZy5nZXQoJ3dnVXNlckxhbmd1YWdlJyl9YDtcblx0XHRyZXR1cm4gZ2VuZXJhbE5hdkxpbmsoe1xuXHRcdFx0dXJsLFxuXHRcdFx0dGl0bGU6IHRwcmludGYoJ2VkaXRvckxpc3RIaW50JywgW2FydGljbGVdKSxcblx0XHRcdG5ld1dpbjogbC5uZXdXaW4sXG5cdFx0XHR0ZXh0OiBsLnRleHQsXG5cdFx0XHRub1BvcHVwOiAxLFxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBnZW5lcmFsTmF2TGluayA9IChsKSA9PiB7XG5cdFx0bC5jbGFzc05hbWUgPSBsLmNsYXNzTmFtZSA9PT0gbnVsbCA/ICdwb3B1cE5hdkxpbmsnIDogbC5jbGFzc05hbWU7XG5cdFx0cmV0dXJuIGdlbmVyYWxMaW5rKGwpO1xuXHR9O1xuXHQvLyBtYWdpYyBoaXN0b3J5IGxpbmtzXG5cdC8vXG5cdGNvbnN0IGdldEhpc3RvcnlJbmZvID0gKHdpa2lwYWdlLCB3aGF0TmV4dCkgPT4ge1xuXHRcdGxvZygnZ2V0SGlzdG9yeUluZm8nKTtcblx0XHRnZXRIaXN0b3J5KFxuXHRcdFx0d2lraXBhZ2UsXG5cdFx0XHR3aGF0TmV4dFxuXHRcdFx0XHQ/IChkKSA9PiB7XG5cdFx0XHRcdFx0XHR3aGF0TmV4dChwcm9jZXNzSGlzdG9yeShkKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQ6IHByb2Nlc3NIaXN0b3J5XG5cdFx0KTtcblx0fTtcblx0Ly8gRklYTUUgZWxpbWluYXRlIHBnLmlkTnVtYmVyIC4uLiBob3c/IDotKFxuXHRjb25zdCBnZXRIaXN0b3J5ID0gKHdpa2lwYWdlLCBvbkNvbXBsZXRlKSA9PiB7XG5cdFx0bG9nKCdnZXRIaXN0b3J5Jyk7XG5cdFx0Y29uc3QgdXJsID0gYCR7cGcud2lraS5hcGl3aWtpYmFzZX0/Zm9ybWF0PWpzb24mZm9ybWF0dmVyc2lvbj0yJmFjdGlvbj1xdWVyeSZwcm9wPXJldmlzaW9ucyZ0aXRsZXM9JHtuZXcgVGl0bGUoXG5cdFx0XHR3aWtpcGFnZVxuXHRcdCkudXJsU3RyaW5nKCl9JnJ2bGltaXQ9JHtnZXRWYWx1ZU9mKCdwb3B1cEhpc3RvcnlMaW1pdCcpfWA7XG5cdFx0bG9nKGBnZXRIaXN0b3J5OiB1cmw9JHt1cmx9YCk7XG5cdFx0cmV0dXJuIHN0YXJ0RG93bmxvYWQodXJsLCBgJHtwZy5pZE51bWJlcn1oaXN0b3J5YCwgb25Db21wbGV0ZSk7XG5cdH07XG5cdGNvbnN0IHByb2Nlc3NIaXN0b3J5ID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0Y29uc3QganNvYmogPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qge3JldmlzaW9uc30gPSBhbnlDaGlsZChqc29iai5xdWVyeS5wYWdlcyk7XG5cdFx0XHRjb25zdCBlZGl0cyA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCByZXZpc2lvbiBvZiByZXZpc2lvbnMpIHtcblx0XHRcdFx0ZWRpdHMucHVzaCh7XG5cdFx0XHRcdFx0b2xkaWQ6IHJldmlzaW9uLnJldmlkLFxuXHRcdFx0XHRcdGVkaXRvcjogcmV2aXNpb24udXNlcixcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRsb2coYHByb2Nlc3NlZCAke2VkaXRzLmxlbmd0aH0gZWRpdHNgKTtcblx0XHRcdHJldHVybiBmaW5pc2hQcm9jZXNzSGlzdG9yeShlZGl0cywgbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdGxvZygnU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBKU09OIGJ1c2luZXNzJyk7XG5cdFx0XHRyZXR1cm4gZmluaXNoUHJvY2Vzc0hpc3RvcnkoW10pO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZmluaXNoUHJvY2Vzc0hpc3RvcnkgPSAoZWRpdHMsIHVzZXJOYW1lKSA9PiB7XG5cdFx0Y29uc3QgaGlzdEluZm8gPSB7fTtcblx0XHRoaXN0SW5mby5lZGl0cyA9IGVkaXRzO1xuXHRcdGhpc3RJbmZvLnVzZXJOYW1lID0gdXNlck5hbWU7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlZGl0cy5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYgKGhpc3RJbmZvLm15TGFzdEVkaXQgPT09IHVuZGVmaW5lZCAmJiB1c2VyTmFtZSAmJiBlZGl0c1tpXS5lZGl0b3IgPT09IHVzZXJOYW1lKSB7XG5cdFx0XHRcdGhpc3RJbmZvLm15TGFzdEVkaXQgPSB7XG5cdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0b2xkaWQ6IGVkaXRzW2ldLm9sZGlkLFxuXHRcdFx0XHRcdHByZXZpZDogaSA9PT0gMCA/IG51bGwgOiBlZGl0c1tpIC0gMV0ub2xkaWQsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAoaGlzdEluZm8uZmlyc3ROZXdFZGl0b3IgPT09IHVuZGVmaW5lZCAmJiBlZGl0c1tpXS5lZGl0b3IgIT09IGVkaXRzWzBdLmVkaXRvcikge1xuXHRcdFx0XHRoaXN0SW5mby5maXJzdE5ld0VkaXRvciA9IHtcblx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRvbGRpZDogZWRpdHNbaV0ub2xkaWQsXG5cdFx0XHRcdFx0cHJldmlkOiBpID09PSAwID8gbnVsbCA6IGVkaXRzW2kgLSAxXS5vbGRpZCxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcGcubWlzYy5oaXN0b3J5SW5mbz1oaXN0SW5mbztcblx0XHRyZXR1cm4gaGlzdEluZm87XG5cdH07XG5cdC8vIEVOREZJTEU6IGxpbmtzLmpzXG5cdC8vIFNUQVJURklMRTogb3B0aW9ucy5qc1xuXHQvLyBvcHRpb25zXG5cdC8vIGNoZWNrIGZvciBleGlzdGluZyB2YWx1ZSwgZWxzZSB1c2UgZGVmYXVsdFxuXHRjb25zdCBkZWZhdWx0aXplID0gKHgpID0+IHtcblx0XHRpZiAocGcub3B0aW9uW3hdID09PSBudWxsIHx8IHBnLm9wdGlvblt4XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwZy5vcHRpb25beF0gPSB3aW5kb3dbeF0gPT09IHVuZGVmaW5lZCA/IHBnLm9wdGlvbkRlZmF1bHRbeF0gOiB3aW5kb3dbeF07XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBuZXdPcHRpb24gPSAoeCwgZGVmKSA9PiB7XG5cdFx0cGcub3B0aW9uRGVmYXVsdFt4XSA9IGRlZjtcblx0fTtcblx0Y29uc3Qgc2V0RGVmYXVsdCA9ICh4LCBkZWYpID0+IHtcblx0XHRyZXR1cm4gbmV3T3B0aW9uKHgsIGRlZik7XG5cdH07XG5cdGNvbnN0IGdldFZhbHVlT2YgPSAodmFyTmFtZSkgPT4ge1xuXHRcdGRlZmF1bHRpemUodmFyTmFtZSk7XG5cdFx0cmV0dXJuIHBnLm9wdGlvblt2YXJOYW1lXTtcblx0fTtcblx0Y29uc3Qgc2V0T3B0aW9ucyA9ICgpID0+IHtcblx0XHQvLyB1c2VyLXNldHRhYmxlIHBhcmFtZXRlcnMgYW5kIGRlZmF1bHRzXG5cdFx0bGV0IHVzZXJJc1N5c29wID0gZmFsc2U7XG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnVXNlckdyb3VwcycpKSB7XG5cdFx0XHRmb3IgKGxldCBnID0gMDsgZyA8IG13LmNvbmZpZy5nZXQoJ3dnVXNlckdyb3VwcycpLmxlbmd0aDsgKytnKSB7XG5cdFx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z1VzZXJHcm91cHMnKVtnXSA9PT0gJ3N5c29wJykge1xuXHRcdFx0XHRcdHVzZXJJc1N5c29wID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dVc2VyR3JvdXBzJylbZ10gPT09ICdzdGV3YXJkJykge1xuXHRcdFx0XHRcdHVzZXJJc1N5c29wID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBCYXNpYyBvcHRpb25zXG5cdFx0bmV3T3B0aW9uKCdwb3B1cERlbGF5JywgMC41KTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwSGlkZURlbGF5JywgMC41KTtcblx0XHRuZXdPcHRpb24oJ3NpbXBsZVBvcHVwcycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwU3RydWN0dXJlJywgJ3Nob3J0bWVudXMnKTsgLy8gc2VlIGxhdGVyIC0gZGVmYXVsdCBmb3IgcG9wdXBTdHJ1Y3R1cmUgaXMgJ29yaWdpbmFsJyBpZiBzaW1wbGVQb3B1cHMgaXMgdHJ1ZVxuXHRcdG5ld09wdGlvbigncG9wdXBBY3Rpb25zTWVudScsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBTZXR1cE1lbnUnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwQWRtaW5MaW5rcycsIHVzZXJJc1N5c29wKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwU2hvcnRjdXRLZXlzJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBIaXN0b3JpY2FsTGlua3MnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwT25seUFydGljbGVMaW5rcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncmVtb3ZlVGl0bGVzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1heFdpZHRoJywgMzUwKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwU2ltcGxpZnlNYWluTGluaycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBBcHBlbmRSZWRpck5hdkxpbmtzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFRvY0xpbmtzJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBTdWJwb3B1cHMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRHJhZ0hhbmRsZScsIGZhbHNlIC8qICdwb3B1cFRvcExpbmtzJyAqLyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cExhenlQcmV2aWV3cycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBMYXp5RG93bmxvYWRzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEFsbERhYnNTdHVicycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGVidWdnaW5nJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBBY3RpdmVOYXZsaW5rcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBNb2RpZmllcicsIGZhbHNlKTsgLy8gY3RybCwgc2hpZnQsIGFsdCBvciBtZXRhXG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1vZGlmaWVyQWN0aW9uJywgJ2VuYWJsZScpOyAvLyBvciAnZGlzYWJsZSdcblx0XHRuZXdPcHRpb24oJ3BvcHVwRHJhZ2dhYmxlJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmlldycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTG9jYWxlJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBEYXRlVGltZUZvcm1hdHRlck9wdGlvbnMnLCB7XG5cdFx0XHR5ZWFyOiAnbnVtZXJpYycsXG5cdFx0XHRtb250aDogJ2xvbmcnLFxuXHRcdFx0ZGF5OiAnbnVtZXJpYycsXG5cdFx0XHRob3VyMTI6IGZhbHNlLFxuXHRcdFx0aG91cjogJzItZGlnaXQnLFxuXHRcdFx0bWludXRlOiAnMi1kaWdpdCcsXG5cdFx0XHRzZWNvbmQ6ICcyLWRpZ2l0Jyxcblx0XHR9KTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGF0ZUZvcm1hdHRlck9wdGlvbnMnLCB7XG5cdFx0XHR5ZWFyOiAnbnVtZXJpYycsXG5cdFx0XHRtb250aDogJ2xvbmcnLFxuXHRcdFx0ZGF5OiAnbnVtZXJpYycsXG5cdFx0fSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFRpbWVGb3JtYXR0ZXJPcHRpb25zJywge1xuXHRcdFx0aG91cjEyOiBmYWxzZSxcblx0XHRcdGhvdXI6ICcyLWRpZ2l0Jyxcblx0XHRcdG1pbnV0ZTogJzItZGlnaXQnLFxuXHRcdFx0c2Vjb25kOiAnMi1kaWdpdCcsXG5cdFx0fSk7XG5cdFx0Ly8gaW1hZ2VzXG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbignaW1hZ2VQb3B1cHNGb3JJbWFnZXMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTmV2ZXJHZXRUaHVtYnMnLCBmYWxzZSk7XG5cdFx0Ly8gbmV3T3B0aW9uKCdwb3B1cEltYWdlc1RvZ2dsZVNpemUnLCAgICAgICB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwVGh1bWJBY3Rpb24nLCAnaW1hZ2VwYWdlJyk7IC8vICdzaXpldG9nZ2xlJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlU2l6ZScsIDYwKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwSW1hZ2VTaXplTGFyZ2UnLCAyMDApO1xuXHRcdC8vIHJlZGlycywgZGFicywgcmV2ZXJzaW9uXG5cdFx0bmV3T3B0aW9uKCdwb3B1cEZpeFJlZGlycycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUmVkaXJBdXRvQ2xpY2snLCAnd3BEaWZmJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEZpeERhYnMnLCBmYWxzZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cERhYnNBdXRvQ2xpY2snLCAnd3BEaWZmJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmVydFN1bW1hcnlQcm9tcHQnLCBmYWxzZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1pbm9yUmV2ZXJ0cycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUmVkbGlua1JlbW92YWwnLCBmYWxzZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJlZGxpbmtBdXRvQ2xpY2snLCAnd3BEaWZmJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFdhdGNoRGlzYW1iaWdnZWRQYWdlcycsIG51bGwpO1xuXHRcdG5ld09wdGlvbigncG9wdXBXYXRjaFJlZGlycmVkUGFnZXMnLCBudWxsKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGFiV2lrdGlvbmFyeScsICdsYXN0Jyk7XG5cdFx0Ly8gbmF2bGlua3Ncblx0XHRuZXdPcHRpb24oJ3BvcHVwTmF2TGlua3MnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTmF2TGlua1NlcGFyYXRvcicsICcgJnNkb3Q7ICcpO1xuXHRcdG5ld09wdGlvbigncG9wdXBMYXN0RWRpdExpbmsnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRWRpdENvdW50ZXJUb29sJywgJ3N1cGVyY291bnQnKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRWRpdENvdW50ZXJVcmwnLCAnJyk7XG5cdFx0Ly8gcHJldmlld3MgZXRjXG5cdFx0bmV3T3B0aW9uKCdwb3B1cFByZXZpZXdzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFN1bW1hcnlEYXRhJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1heFByZXZpZXdTZW50ZW5jZXMnLCA1KTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTWF4UHJldmlld0NoYXJhY3RlcnMnLCA2MDApO1xuXHRcdG5ld09wdGlvbigncG9wdXBMYXN0TW9kaWZpZWQnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUHJldmlld0tpbGxUZW1wbGF0ZXMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUHJldmlld1Jhd1RlbXBsYXRlcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3Rmlyc3RQYXJPbmx5JywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFByZXZpZXdDdXRIZWFkaW5ncycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3QnV0dG9uJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3QnV0dG9uRXZlbnQnLCAnY2xpY2snKTtcblx0XHQvLyBkaWZmc1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3RGlmZnMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGlmZk1heExpbmVzJywgMTAwKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGlmZkNvbnRleHRMaW5lcycsIDIpO1xuXHRcdG5ld09wdGlvbigncG9wdXBEaWZmQ29udGV4dENoYXJhY3RlcnMnLCA0MCk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cERpZmZEYXRlcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBEaWZmRGF0ZVByaW50ZXInLCAndG9Mb2NhbGVTdHJpbmcnKTsgLy8gbm8gbG9uZ2VyIGluIHVzZVxuXG5cdFx0Ly8gZWRpdCBzdW1tYXJpZXMuIEdvZCwgdGhlc2UgYXJlIHVnbHkuXG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmlld2VkU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBSZXZpZXdlZFN1bW1hcnknKSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEZpeERhYnNTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cEZpeERhYnNTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBFeHRlbmRlZFJldmVydFN1bW1hcnknLCBwb3B1cFN0cmluZygnZGVmYXVsdHBvcHVwRXh0ZW5kZWRSZXZlcnRTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBSZXZlcnRTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cFJldmVydFN1bW1hcnknKSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmVydFRvUHJldmlvdXNTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cFJldmVydFRvUHJldmlvdXNTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBRdWVyaWVkUmV2ZXJ0U3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBRdWVyaWVkUmV2ZXJ0U3VtbWFyeScpKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUXVlcmllZFJldmVydFRvUHJldmlvdXNTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeScpKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRml4UmVkaXJzU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBGaXhSZWRpcnNTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBSZWRsaW5rU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBSZWRsaW5rU3VtbWFyeScpKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUm1EYWJMaW5rU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBSbURhYkxpbmtTdW1tYXJ5JykpO1xuXHRcdC8vIG1pc2Ncblx0XHRuZXdPcHRpb24oJ3BvcHVwSGlzdG9yeUxpbWl0JywgNTApO1xuXHRcdG5ld09wdGlvbigncG9wdXBGaWx0ZXJzJywgW1xuXHRcdFx0cG9wdXBGaWx0ZXJTdHViRGV0ZWN0LFxuXHRcdFx0cG9wdXBGaWx0ZXJEaXNhbWJpZ0RldGVjdCxcblx0XHRcdHBvcHVwRmlsdGVyUGFnZVNpemUsXG5cdFx0XHRwb3B1cEZpbHRlckNvdW50TGlua3MsXG5cdFx0XHRwb3B1cEZpbHRlckNvdW50SW1hZ2VzLFxuXHRcdFx0cG9wdXBGaWx0ZXJDb3VudENhdGVnb3JpZXMsXG5cdFx0XHRwb3B1cEZpbHRlckxhc3RNb2RpZmllZCxcblx0XHRdKTtcblx0XHRuZXdPcHRpb24oJ2V4dHJhUG9wdXBGaWx0ZXJzJywgW10pO1xuXHRcdG5ld09wdGlvbigncG9wdXBPbkVkaXRTZWxlY3Rpb24nLCAnY3Vyc29yJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFByZXZpZXdIaXN0b3J5JywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlTGlua3MnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwQ2F0ZWdvcnlNZW1iZXJzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFVzZXJJbmZvJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEhpc3RvcnlQcmV2aWV3TGltaXQnLCAyNSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cENvbnRyaWJzUHJldmlld0xpbWl0JywgMjUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBSZXZEZWxVcmwnLCAnLy9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2lraXBlZGlhOlJldmlzaW9uX2RlbGV0aW9uJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFNob3dHZW5kZXInLCB0cnVlKTtcblx0XHQvLyBuZXcgd2luZG93c1xuXHRcdG5ld09wdGlvbigncG9wdXBOZXdXaW5kb3dzJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBMaW5rc05ld1dpbmRvdycsIHtsYXN0Q29udHJpYjogdHJ1ZSwgc2luY2VNZTogdHJ1ZX0pO1xuXHRcdC8vIHJlZ2V4cHNcblx0XHRuZXdPcHRpb24oXG5cdFx0XHQncG9wdXBEYWJSZWdleHAnLFxuXHRcdFx0J1xcXFx7XFxcXHtcXFxccyooZChhYnxpc2FtYihpZyh1YXRpb24pPyk/KXwoKChnZW98aG58cm9hZD98c2Nob29sfG51bWJlcilkaXMpfFsyMzRdW2xjXVthY3ddfChyb2FkfHNoaXApaW5kZXgpKVxcXFxzKihcXFxcfFtefV0qKT9cXFxcfVxcXFx9fGlzIGEgLipkaXNhbWJpZ3VhdGlvbi4qcGFnZSdcblx0XHQpO1xuXHRcdG5ld09wdGlvbigncG9wdXBBbmNob3JSZWdleHAnLCAnYW5jaG9ycz8nKTsgLy8gaG93IHRvIGlkZW50aWZ5IGFuIGFuY2hvcnMgdGVtcGxhdGVcblx0XHRuZXdPcHRpb24oJ3BvcHVwU3R1YlJlZ2V4cCcsICcoc2VjdCk/c3R1Ylt9XVt9XXxUaGlzIC4qLXJlbGF0ZWQgYXJ0aWNsZSBpcyBhIC4qc3R1YicpO1xuXHRcdG5ld09wdGlvbigncG9wdXBJbWFnZVZhcnNSZWdleHAnLCAnaW1hZ2V8aW1hZ2VfKD86ZmlsZXxza3lsaW5lfG5hbWV8ZmxhZ3xzZWFsKXxjb3ZlcnxiYWRnZXxsb2dvJyk7XG5cdH07XG5cdC8vIEVOREZJTEU6IG9wdGlvbnMuanNcblx0Ly8gU1RBUlRGSUxFOiBzdHJpbmdzLmpzXG5cdC8vIFRyYW5zbGF0YWJsZSBzdHJpbmdzXG5cdC8vXG5cdC8vIFNlZSBpbnN0cnVjdGlvbnMgYXRcblx0Ly8ge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwcy9UcmFuc2xhdGlvbn1cblx0cGcuc3RyaW5nID0ge1xuXHRcdC8vIHN1bW1hcnkgZGF0YSwgc2VhcmNoaW5nIGV0Yy5cblx0XHRhcnRpY2xlOiAnYXJ0aWNsZScsXG5cdFx0Y2F0ZWdvcnk6ICdjYXRlZ29yeScsXG5cdFx0Y2F0ZWdvcmllczogJ2NhdGVnb3JpZXMnLFxuXHRcdGltYWdlOiAnaW1hZ2UnLFxuXHRcdGltYWdlczogJ2ltYWdlcycsXG5cdFx0c3R1YjogJ3N0dWInLFxuXHRcdCdzZWN0aW9uIHN0dWInOiAnc2VjdGlvbiBzdHViJyxcblx0XHQnRW1wdHkgcGFnZSc6ICdFbXB0eSBwYWdlJyxcblx0XHRrQjogJ2tCJyxcblx0XHRieXRlczogJ2J5dGVzJyxcblx0XHRkYXk6ICdkYXknLFxuXHRcdGRheXM6ICdkYXlzJyxcblx0XHRob3VyOiAnaG91cicsXG5cdFx0aG91cnM6ICdob3VycycsXG5cdFx0bWludXRlOiAnbWludXRlJyxcblx0XHRtaW51dGVzOiAnbWludXRlcycsXG5cdFx0c2Vjb25kOiAnc2Vjb25kJyxcblx0XHRzZWNvbmRzOiAnc2Vjb25kcycsXG5cdFx0d2VlazogJ3dlZWsnLFxuXHRcdHdlZWtzOiAnd2Vla3MnLFxuXHRcdHNlYXJjaDogJ3NlYXJjaCcsXG5cdFx0U2VhcmNoSGludDogJ0ZpbmQgRW5nbGlzaCBXaWtpcGVkaWEgYXJ0aWNsZXMgY29udGFpbmluZyAlcycsXG5cdFx0d2ViOiAnd2ViJyxcblx0XHRnbG9iYWw6ICdnbG9iYWwnLFxuXHRcdC8vIGFydGljbGUtcmVsYXRlZCBhY3Rpb25zIGFuZCBpbmZvXG5cdFx0Ly8gKHNvbWUgYWN0aW9ucyBhbHNvIGFwcGx5IHRvIHVzZXIgcGFnZXMpXG5cdFx0YWN0aW9uczogJ2FjdGlvbnMnLFxuXHRcdHBvcHVwc01lbnU6ICdwb3B1cHMnLFxuXHRcdHRvZ2dsZVByZXZpZXdzSGludDogJ1RvZ2dsZSBwcmV2aWV3IGdlbmVyYXRpb24gaW4gcG9wdXBzIG9uIHRoaXMgcGFnZScsXG5cdFx0J2VuYWJsZSBwcmV2aWV3cyc6ICdlbmFibGUgcHJldmlld3MnLFxuXHRcdCdkaXNhYmxlIHByZXZpZXdzJzogJ2Rpc2FibGUgcHJldmlld3MnLFxuXHRcdCd0b2dnbGUgcHJldmlld3MnOiAndG9nZ2xlIHByZXZpZXdzJyxcblx0XHQnc2hvdyBwcmV2aWV3JzogJ3Nob3cgcHJldmlldycsXG5cdFx0cmVzZXQ6ICdyZXNldCcsXG5cdFx0J21vcmUuLi4nOiAnbW9yZS4uLicsXG5cdFx0ZGlzYWJsZTogJ2Rpc2FibGUgcG9wdXBzJyxcblx0XHRkaXNhYmxlUG9wdXBzSGludDogJ0Rpc2FibGUgcG9wdXBzIG9uIHRoaXMgcGFnZS4gUmVsb2FkIHBhZ2UgdG8gcmUtZW5hYmxlLicsXG5cdFx0aGlzdG9yeWZlZWRIaW50OiAnUlNTIGZlZWQgb2YgcmVjZW50IGNoYW5nZXMgdG8gdGhpcyBwYWdlJyxcblx0XHRwdXJnZVBvcHVwc0hpbnQ6ICdSZXNldCBwb3B1cHMsIGNsZWFyaW5nIGFsbCBjYWNoZWQgcG9wdXAgZGF0YS4nLFxuXHRcdFBvcHVwc0hpbnQ6ICdSZXNldCBwb3B1cHMsIGNsZWFyaW5nIGFsbCBjYWNoZWQgcG9wdXAgZGF0YS4nLFxuXHRcdHNwYWNlYmFyOiAnc3BhY2UnLFxuXHRcdHZpZXc6ICd2aWV3Jyxcblx0XHQndmlldyBhcnRpY2xlJzogJ3ZpZXcgYXJ0aWNsZScsXG5cdFx0dmlld0hpbnQ6ICdHbyB0byAlcycsXG5cdFx0dGFsazogJ3RhbGsnLFxuXHRcdCd0YWxrIHBhZ2UnOiAndGFsayBwYWdlJyxcblx0XHQndGhpcyZuYnNwO3JldmlzaW9uJzogJ3RoaXMmbmJzcDtyZXZpc2lvbicsXG5cdFx0J3JldmlzaW9uICVzIG9mICVzJzogJ3JldmlzaW9uICVzIG9mICVzJyxcblx0XHQnUmV2aXNpb24gJXMgb2YgJXMnOiAnUmV2aXNpb24gJXMgb2YgJXMnLFxuXHRcdCd0aGUgcmV2aXNpb24gcHJpb3IgdG8gcmV2aXNpb24gJXMgb2YgJXMnOiAndGhlIHJldmlzaW9uIHByaW9yIHRvIHJldmlzaW9uICVzIG9mICVzJyxcblx0XHQnVG9nZ2xlIGltYWdlIHNpemUnOiAnQ2xpY2sgdG8gdG9nZ2xlIGltYWdlIHNpemUnLFxuXHRcdGRlbDogJ2RlbCcsXG5cdFx0ZGVsZXRlOiAnZGVsZXRlJyxcblx0XHRkZWxldGVIaW50OiAnRGVsZXRlICVzJyxcblx0XHR1bmRlbGV0ZVNob3J0OiAndW4nLFxuXHRcdFVuZGVsZXRlSGludDogJ1Nob3cgdGhlIGRlbGV0aW9uIGhpc3RvcnkgZm9yICVzJyxcblx0XHRwcm90ZWN0OiAncHJvdGVjdCcsXG5cdFx0cHJvdGVjdEhpbnQ6ICdSZXN0cmljdCBlZGl0aW5nIHJpZ2h0cyB0byAlcycsXG5cdFx0dW5wcm90ZWN0U2hvcnQ6ICd1bicsXG5cdFx0dW5wcm90ZWN0SGludDogJ0FsbG93ICVzIHRvIGJlIGVkaXRlZCBieSBhbnlvbmUgYWdhaW4nLFxuXHRcdCdzZW5kIHRoYW5rcyc6ICdzZW5kIHRoYW5rcycsXG5cdFx0VGhhbmtzSGludDogJ1NlbmQgYSB0aGFuayB5b3Ugbm90aWZpY2F0aW9uIHRvIHRoaXMgdXNlcicsXG5cdFx0bW92ZTogJ21vdmUnLFxuXHRcdCdtb3ZlIHBhZ2UnOiAnbW92ZSBwYWdlJyxcblx0XHRNb3ZlcGFnZUhpbnQ6ICdDaGFuZ2UgdGhlIHRpdGxlIG9mICVzJyxcblx0XHRlZGl0OiAnZWRpdCcsXG5cdFx0J2VkaXQgYXJ0aWNsZSc6ICdlZGl0IGFydGljbGUnLFxuXHRcdGVkaXRIaW50OiAnQ2hhbmdlIHRoZSBjb250ZW50IG9mICVzJyxcblx0XHQnZWRpdCB0YWxrJzogJ2VkaXQgdGFsaycsXG5cdFx0bmV3OiAnbmV3Jyxcblx0XHQnbmV3IHRvcGljJzogJ25ldyB0b3BpYycsXG5cdFx0bmV3U2VjdGlvbkhpbnQ6ICdTdGFydCBhIG5ldyBzZWN0aW9uIG9uICVzJyxcblx0XHQnbnVsbCBlZGl0JzogJ251bGwgZWRpdCcsXG5cdFx0bnVsbEVkaXRIaW50OiAnU3VibWl0IGFuIGVkaXQgdG8gJXMsIG1ha2luZyBubyBjaGFuZ2VzICcsXG5cdFx0aGlzdDogJ2hpc3QnLFxuXHRcdGhpc3Rvcnk6ICdoaXN0b3J5Jyxcblx0XHRoaXN0b3J5SGludDogJ0xpc3QgdGhlIGNoYW5nZXMgbWFkZSB0byAlcycsXG5cdFx0bGFzdDogJ3ByZXYnLFxuXHRcdGxhc3RFZGl0OiAnbGFzdEVkaXQnLFxuXHRcdCdtYXJrIHBhdHJvbGxlZCc6ICdtYXJrIHBhdHJvbGxlZCcsXG5cdFx0bWFya3BhdHJvbGxlZEhpbnQ6ICdNYXJrIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnLFxuXHRcdCdDb3VsZCBub3QgbWFya2VkIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnOiAnQ291bGQgbm90IG1hcmtlZCB0aGlzIGVkaXQgYXMgcGF0cm9sbGVkJyxcblx0XHQnc2hvdyBsYXN0IGVkaXQnOiAnbW9zdCByZWNlbnQgZWRpdCcsXG5cdFx0J1Nob3cgdGhlIGxhc3QgZWRpdCc6ICdTaG93IHRoZSBlZmZlY3RzIG9mIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2UnLFxuXHRcdGxhc3RDb250cmliOiAnbGFzdENvbnRyaWInLFxuXHRcdCdsYXN0IHNldCBvZiBlZGl0cyc6ICdsYXRlc3QgZWRpdHMnLFxuXHRcdGxhc3RDb250cmliSGludDogJ1Nob3cgdGhlIG5ldCBlZmZlY3Qgb2YgY2hhbmdlcyBtYWRlIGJ5IHRoZSBsYXN0IGVkaXRvcicsXG5cdFx0Y3VyOiAnY3VyJyxcblx0XHRkaWZmQ3VyOiAnZGlmZkN1cicsXG5cdFx0J1Nob3cgY2hhbmdlcyBzaW5jZSByZXZpc2lvbiAlcyc6ICdTaG93IGNoYW5nZXMgc2luY2UgcmV2aXNpb24gJXMnLFxuXHRcdCclcyBvbGQnOiAnJXMgb2xkJyxcblx0XHRvbGRFZGl0OiAnb2xkRWRpdCcsXG5cdFx0cHVyZ2U6ICdwdXJnZScsXG5cdFx0cHVyZ2VIaW50OiAnRGVtYW5kIGEgZnJlc2ggY29weSBvZiAlcycsXG5cdFx0cmF3OiAnc291cmNlJyxcblx0XHRyYXdIaW50OiAnRG93bmxvYWQgdGhlIHNvdXJjZSBvZiAlcycsXG5cdFx0cmVuZGVyOiAnc2ltcGxlJyxcblx0XHRyZW5kZXJIaW50OiAnU2hvdyBhIHBsYWluIEhUTUwgdmVyc2lvbiBvZiAlcycsXG5cdFx0J1Nob3cgdGhlIGVkaXQgbWFkZSB0byBnZXQgcmV2aXNpb24nOiAnU2hvdyB0aGUgZWRpdCBtYWRlIHRvIGdldCByZXZpc2lvbicsXG5cdFx0c2luY2VNZTogJ3NpbmNlTWUnLFxuXHRcdCdjaGFuZ2VzIHNpbmNlIG1pbmUnOiAnZGlmZiBteSBlZGl0Jyxcblx0XHRzaW5jZU1lSGludDogJ1Nob3cgY2hhbmdlcyBzaW5jZSBteSBsYXN0IGVkaXQnLFxuXHRcdFwiQ291bGRuJ3QgZmluZCBhbiBlZGl0IGJ5ICVzXFxuaW4gdGhlIGxhc3QgJXMgZWRpdHMgdG9cXG4lc1wiOlxuXHRcdFx0XCJDb3VsZG4ndCBmaW5kIGFuIGVkaXQgYnkgJXNcXG5pbiB0aGUgbGFzdCAlcyBlZGl0cyB0b1xcbiVzXCIsXG5cdFx0ZWRzOiAnZWRzJyxcblx0XHRlZGl0b3JzOiAnZWRpdG9ycycsXG5cdFx0ZWRpdG9yTGlzdEhpbnQ6ICdMaXN0IHRoZSB1c2VycyB3aG8gaGF2ZSBlZGl0ZWQgJXMnLFxuXHRcdHJlbGF0ZWQ6ICdyZWxhdGVkJyxcblx0XHRyZWxhdGVkQ2hhbmdlczogJ3JlbGF0ZWRDaGFuZ2VzJyxcblx0XHQncmVsYXRlZCBjaGFuZ2VzJzogJ3JlbGF0ZWQgY2hhbmdlcycsXG5cdFx0UmVjZW50Y2hhbmdlc2xpbmtlZEhpbnQ6ICdTaG93IGNoYW5nZXMgaW4gYXJ0aWNsZXMgcmVsYXRlZCB0byAlcycsXG5cdFx0ZWRpdE9sZDogJ2VkaXRPbGQnLFxuXHRcdHJ2OiAncnYnLFxuXHRcdHJldmVydDogJ3JldmVydCcsXG5cdFx0cmV2ZXJ0SGludDogJ1JldmVydCB0byAlcycsXG5cdFx0ZGVmYXVsdHBvcHVwUmV2aWV3ZWRTdW1tYXJ5OlxuXHRcdFx0J0FjY2VwdGVkIGJ5IHJldmlld2luZyB0aGUgW1tTcGVjaWFsOmRpZmYvJXMvJXN8ZGlmZmVyZW5jZV1dIGJldHdlZW4gdGhpcyB2ZXJzaW9uIGFuZCBwcmV2aW91c2x5IGFjY2VwdGVkIHZlcnNpb24gdXNpbmcgW1s6ZW53aWtpOldpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwc3xwb3B1cHNdXScsXG5cdFx0ZGVmYXVsdHBvcHVwUmVkbGlua1N1bW1hcnk6XG5cdFx0XHQnUmVtb3ZpbmcgbGluayB0byBlbXB0eSBwYWdlIFtbJXNdXSB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBGaXhEYWJzU3VtbWFyeTpcblx0XHRcdCdEaXNhbWJpZ3VhdGUgW1slc11dIHRvIFtbJXNdXSB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBGaXhSZWRpcnNTdW1tYXJ5OlxuXHRcdFx0J1JlZGlyZWN0IGJ5cGFzcyBmcm9tIFtbJXNdXSB0byBbWyVzXV0gdXNpbmcgW1s6ZW53aWtpOldpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwc3xwb3B1cHNdXScsXG5cdFx0ZGVmYXVsdHBvcHVwRXh0ZW5kZWRSZXZlcnRTdW1tYXJ5OlxuXHRcdFx0J1JldmVydCB0byByZXZpc2lvbiBkYXRlZCAlcyBieSAlcywgb2xkaWQgJXMgdXNpbmcgW1s6ZW53aWtpOldpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwc3xwb3B1cHNdXScsXG5cdFx0ZGVmYXVsdHBvcHVwUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnk6XG5cdFx0XHQnUmV2ZXJ0IHRvIHRoZSByZXZpc2lvbiBwcmlvciB0byByZXZpc2lvbiAlcyB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBSZXZlcnRTdW1tYXJ5OiAnUmV2ZXJ0IHRvIHJldmlzaW9uICVzIHVzaW5nIFtbOmVud2lraTpXaWtpcGVkaWE6VG9vbHMvTmF2aWdhdGlvbl9wb3B1cHN8cG9wdXBzXV0nLFxuXHRcdGRlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeTpcblx0XHRcdCdSZXZlcnQgdG8gdGhlIHJldmlzaW9uIHByaW9yIHRvIHJldmlzaW9uICQxIGRhdGVkICQyIGJ5ICQzIHVzaW5nIFtbOmVud2lraTpXaWtpcGVkaWE6VG9vbHMvTmF2aWdhdGlvbl9wb3B1cHN8cG9wdXBzXV0nLFxuXHRcdGRlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRTdW1tYXJ5OlxuXHRcdFx0J1JldmVydCB0byByZXZpc2lvbiAkMSBkYXRlZCAkMiBieSAkMyB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBSbURhYkxpbmtTdW1tYXJ5OlxuXHRcdFx0J1JlbW92ZSBsaW5rIHRvIGRhYiBwYWdlIFtbJXNdXSB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRSZWRpcmVjdHM6ICdSZWRpcmVjdHMnLFxuXHRcdCcgdG8gJzogJyB0byAnLFxuXHRcdCdCeXBhc3MgcmVkaXJlY3QnOiAnQnlwYXNzIHJlZGlyZWN0Jyxcblx0XHQnRml4IHRoaXMgcmVkaXJlY3QnOiAnRml4IHRoaXMgcmVkaXJlY3QnLFxuXHRcdGRpc2FtYmlnOiAnZGlzYW1iaWcnLFxuXHRcdGRpc2FtYmlnSGludDogJ0Rpc2FtYmlndWF0ZSB0aGlzIGxpbmsgdG8gW1slc11dJyxcblx0XHQnQ2xpY2sgdG8gZGlzYW1iaWd1YXRlIHRoaXMgbGluayB0bzonOiAnQ2xpY2sgdG8gZGlzYW1iaWd1YXRlIHRoaXMgbGluayB0bzonLFxuXHRcdCdyZW1vdmUgdGhpcyBsaW5rJzogJ3JlbW92ZSB0aGlzIGxpbmsnLFxuXHRcdCdyZW1vdmUgYWxsIGxpbmtzIHRvIHRoaXMgcGFnZSBmcm9tIHRoaXMgYXJ0aWNsZSc6ICdyZW1vdmUgYWxsIGxpbmtzIHRvIHRoaXMgcGFnZSBmcm9tIHRoaXMgYXJ0aWNsZScsXG5cdFx0J3JlbW92ZSBhbGwgbGlua3MgdG8gdGhpcyBkaXNhbWJpZyBwYWdlIGZyb20gdGhpcyBhcnRpY2xlJzpcblx0XHRcdCdyZW1vdmUgYWxsIGxpbmtzIHRvIHRoaXMgZGlzYW1iaWcgcGFnZSBmcm9tIHRoaXMgYXJ0aWNsZScsXG5cdFx0bWFpbmxpbms6ICdtYWlubGluaycsXG5cdFx0d2lraUxpbms6ICd3aWtpTGluaycsXG5cdFx0d2lraUxpbmtzOiAnd2lraUxpbmtzJyxcblx0XHQnbGlua3MgaGVyZSc6ICdsaW5rcyBoZXJlJyxcblx0XHR3aGF0TGlua3NIZXJlOiAnd2hhdExpbmtzSGVyZScsXG5cdFx0J3doYXQgbGlua3MgaGVyZSc6ICd3aGF0IGxpbmtzIGhlcmUnLFxuXHRcdFdoYXRsaW5rc2hlcmVIaW50OiAnTGlzdCB0aGUgcGFnZXMgdGhhdCBhcmUgaHlwZXJsaW5rZWQgdG8gJXMnLFxuXHRcdHVud2F0Y2hTaG9ydDogJ3VuJyxcblx0XHR3YXRjaFRoaW5neTogJ3dhdGNoJyxcblx0XHR3YXRjaEhpbnQ6ICdBZGQgJXMgdG8gbXkgd2F0Y2hsaXN0Jyxcblx0XHR1bndhdGNoSGludDogJ1JlbW92ZSAlcyBmcm9tIG15IHdhdGNobGlzdCcsXG5cdFx0J09ubHkgZm91bmQgb25lIGVkaXRvcjogJXMgbWFkZSAlcyBlZGl0cyc6ICdPbmx5IGZvdW5kIG9uZSBlZGl0b3I6ICVzIG1hZGUgJXMgZWRpdHMnLFxuXHRcdCclcyBzZWVtcyB0byBiZSB0aGUgbGFzdCBlZGl0b3IgdG8gdGhlIHBhZ2UgJXMnOiAnJXMgc2VlbXMgdG8gYmUgdGhlIGxhc3QgZWRpdG9yIHRvIHRoZSBwYWdlICVzJyxcblx0XHRyc3M6ICdyc3MnLFxuXHRcdC8vIGRpZmYgcHJldmlld3Ncblx0XHQnRGlmZiB0cnVuY2F0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMnOiAnRGlmZiB0cnVuY2F0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMnLFxuXHRcdCdPbGQgcmV2aXNpb24nOiAnT2xkIHJldmlzaW9uJyxcblx0XHQnTmV3IHJldmlzaW9uJzogJ05ldyByZXZpc2lvbicsXG5cdFx0J1NvbWV0aGluZyB3ZW50IHdyb25nIDotKCc6ICdTb21ldGhpbmcgd2VudCB3cm9uZyA6LSgnLFxuXHRcdCdFbXB0eSByZXZpc2lvbiwgbWF5YmUgbm9uLWV4aXN0ZW50JzogJ0VtcHR5IHJldmlzaW9uLCBtYXliZSBub24tZXhpc3RlbnQnLFxuXHRcdCdVbmtub3duIGRhdGUnOiAnVW5rbm93biBkYXRlJyxcblx0XHQvLyBvdGhlciBzcGVjaWFsIHByZXZpZXdzXG5cdFx0J0VtcHR5IGNhdGVnb3J5JzogJ0VtcHR5IGNhdGVnb3J5Jyxcblx0XHQnQ2F0ZWdvcnkgbWVtYmVycyAoJXMgc2hvd24pJzogJ0NhdGVnb3J5IG1lbWJlcnMgKCVzIHNob3duKScsXG5cdFx0J05vIGltYWdlIGxpbmtzIGZvdW5kJzogJ05vIGltYWdlIGxpbmtzIGZvdW5kJyxcblx0XHQnRmlsZSBsaW5rcyc6ICdGaWxlIGxpbmtzJyxcblx0XHQnTm8gaW1hZ2UgZm91bmQnOiAnTm8gaW1hZ2UgZm91bmQnLFxuXHRcdCdJbWFnZSBmcm9tIENvbW1vbnMnOiAnSW1hZ2UgZnJvbSBDb21tb25zJyxcblx0XHQnRGVzY3JpcHRpb24gcGFnZSc6ICdEZXNjcmlwdGlvbiBwYWdlJyxcblx0XHQnQWx0IHRleHQ6JzogJ0FsdCB0ZXh0OicsXG5cdFx0cmV2ZGVsOiAnSGlkZGVuIHJldmlzaW9uJyxcblx0XHQvLyB1c2VyLXJlbGF0ZWQgYWN0aW9ucyBhbmQgaW5mb1xuXHRcdHVzZXI6ICd1c2VyJyxcblx0XHQndXNlciZuYnNwO3BhZ2UnOiAndXNlciZuYnNwO3BhZ2UnLFxuXHRcdCd1c2VyIHRhbGsnOiAndXNlciB0YWxrJyxcblx0XHQnZWRpdCB1c2VyIHRhbGsnOiAnZWRpdCB1c2VyIHRhbGsnLFxuXHRcdCdsZWF2ZSBjb21tZW50JzogJ2xlYXZlIGNvbW1lbnQnLFxuXHRcdGVtYWlsOiAnZW1haWwnLFxuXHRcdCdlbWFpbCB1c2VyJzogJ2VtYWlsIHVzZXInLFxuXHRcdEVtYWlsdXNlckhpbnQ6ICdTZW5kIGFuIGVtYWlsIHRvICVzJyxcblx0XHRzcGFjZTogJ3NwYWNlJyxcblx0XHRQcmVmaXhJbmRleEhpbnQ6ICdTaG93IHBhZ2VzIGluIHRoZSB1c2Vyc3BhY2Ugb2YgJXMnLFxuXHRcdGNvdW50OiAnY291bnQnLFxuXHRcdCdlZGl0IGNvdW50ZXInOiAnZWRpdCBjb3VudGVyJyxcblx0XHRlZGl0Q291bnRlckxpbmtIaW50OiAnQ291bnQgdGhlIGNvbnRyaWJ1dGlvbnMgbWFkZSBieSAlcycsXG5cdFx0Y29udHJpYnM6ICdjb250cmlicycsXG5cdFx0Y29udHJpYnV0aW9uczogJ2NvbnRyaWJ1dGlvbnMnLFxuXHRcdGRlbGV0ZWRDb250cmliczogJ2RlbGV0ZWQgY29udHJpYnV0aW9ucycsXG5cdFx0RGVsZXRlZGNvbnRyaWJ1dGlvbnNIaW50OiAnTGlzdCBkZWxldGVkIGVkaXRzIG1hZGUgYnkgJXMnLFxuXHRcdENvbnRyaWJ1dGlvbnNIaW50OiAnTGlzdCB0aGUgY29udHJpYnV0aW9ucyBtYWRlIGJ5ICVzJyxcblx0XHRsb2c6ICdsb2cnLFxuXHRcdCd1c2VyIGxvZyc6ICd1c2VyIGxvZycsXG5cdFx0dXNlckxvZ0hpbnQ6IFwiU2hvdyAlcydzIHVzZXIgbG9nXCIsXG5cdFx0YXJpbjogJ0FSSU4gbG9va3VwJyxcblx0XHQnTG9vayB1cCAlcyBpbiBBUklOIHdob2lzIGRhdGFiYXNlJzogJ0xvb2sgdXAgJXMgaW4gdGhlIEFSSU4gd2hvaXMgZGF0YWJhc2UnLFxuXHRcdHVuYmxvY2tTaG9ydDogJ3VuJyxcblx0XHRibG9jazogJ2Jsb2NrJyxcblx0XHQnYmxvY2sgdXNlcic6ICdibG9jayB1c2VyJyxcblx0XHRJcGJsb2NrbGlzdEhpbnQ6ICdVbmJsb2NrICVzJyxcblx0XHRCbG9ja2lwSGludDogJ1ByZXZlbnQgJXMgZnJvbSBlZGl0aW5nJyxcblx0XHQnYmxvY2sgbG9nJzogJ2Jsb2NrIGxvZycsXG5cdFx0YmxvY2tMb2dIaW50OiAnU2hvdyB0aGUgYmxvY2sgbG9nIGZvciAlcycsXG5cdFx0cHJvdGVjdExvZ0hpbnQ6ICdTaG93IHRoZSBwcm90ZWN0aW9uIGxvZyBmb3IgJXMnLFxuXHRcdHBhZ2VMb2dIaW50OiAnU2hvdyB0aGUgcGFnZSBsb2cgZm9yICVzJyxcblx0XHRkZWxldGVMb2dIaW50OiAnU2hvdyB0aGUgZGVsZXRpb24gbG9nIGZvciAlcycsXG5cdFx0J0ludmFsaWQgJXMgJXMnOiAnVGhlIG9wdGlvbiAlcyBpcyBpbnZhbGlkOiAlcycsXG5cdFx0J05vIGJhY2tsaW5rcyBmb3VuZCc6ICdObyBiYWNrbGlua3MgZm91bmQnLFxuXHRcdCcgYW5kIG1vcmUnOiAnIGFuZCBtb3JlJyxcblx0XHR1bmRvOiAndW5kbycsXG5cdFx0dW5kb0hpbnQ6ICd1bmRvIHRoaXMgZWRpdCcsXG5cdFx0J0Rvd25sb2FkIHByZXZpZXcgZGF0YSc6ICdEb3dubG9hZCBwcmV2aWV3IGRhdGEnLFxuXHRcdCdJbnZhbGlkIG9yIElQIHVzZXInOiAnSW52YWxpZCBvciBJUCB1c2VyJyxcblx0XHQnTm90IGEgcmVnaXN0ZXJlZCB1c2VybmFtZSc6ICdOb3QgYSByZWdpc3RlcmVkIHVzZXJuYW1lJyxcblx0XHRCTE9DS0VEOiAnQkxPQ0tFRCcsXG5cdFx0J0hhcyBibG9ja3MnOiAnSGFzIGJsb2NrcycsXG5cdFx0JyBlZGl0cyBzaW5jZTogJzogJyBlZGl0cyBzaW5jZTogJyxcblx0XHQnbGFzdCBlZGl0IG9uICc6ICdsYXN0IGVkaXQgb24gJyxcblx0XHQnaGUvaGltJzogJ2hlL2hpbScsXG5cdFx0J3NoZS9oZXInOiAnc2hlL2hlcicsXG5cdFx0Ly8gQXV0b2VkaXRpbmdcblx0XHQnRW50ZXIgYSBub24tZW1wdHkgZWRpdCBzdW1tYXJ5IG9yIHByZXNzIGNhbmNlbCB0byBhYm9ydCc6XG5cdFx0XHQnRW50ZXIgYSBub24tZW1wdHkgZWRpdCBzdW1tYXJ5IG9yIHByZXNzIGNhbmNlbCB0byBhYm9ydCcsXG5cdFx0J0ZhaWxlZCB0byBnZXQgcmV2aXNpb24gaW5mb3JtYXRpb24sIHBsZWFzZSBlZGl0IG1hbnVhbGx5Llxcblxcbic6XG5cdFx0XHQnRmFpbGVkIHRvIGdldCByZXZpc2lvbiBpbmZvcm1hdGlvbiwgcGxlYXNlIGVkaXQgbWFudWFsbHkuXFxuXFxuJyxcblx0XHQnVGhlICVzIGJ1dHRvbiBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGNsaWNrZWQuIFBsZWFzZSB3YWl0IGZvciB0aGUgbmV4dCBwYWdlIHRvIGxvYWQuJzpcblx0XHRcdCdUaGUgJXMgYnV0dG9uIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY2xpY2tlZC4gUGxlYXNlIHdhaXQgZm9yIHRoZSBuZXh0IHBhZ2UgdG8gbG9hZC4nLFxuXHRcdCdDb3VsZCBub3QgZmluZCBidXR0b24gJXMuIFBsZWFzZSBjaGVjayB0aGUgc2V0dGluZ3MgaW4geW91ciBqYXZhc2NyaXB0IGZpbGUuJzpcblx0XHRcdCdDb3VsZCBub3QgZmluZCBidXR0b24gJXMuIFBsZWFzZSBjaGVjayB0aGUgc2V0dGluZ3MgaW4geW91ciBqYXZhc2NyaXB0IGZpbGUuJyxcblx0XHQvLyBQb3B1cHMgc2V0dXBcblx0XHQnT3BlbiBmdWxsLXNpemUgaW1hZ2UnOiAnT3BlbiBmdWxsLXNpemUgaW1hZ2UnLFxuXHRcdGF1dG9lZGl0X3ZlcnNpb246ICducDIwMTQwNDE2Jyxcblx0fTtcblx0Y29uc3QgcG9wdXBTdHJpbmcgPSAoc3RyKSA9PiB7XG5cdFx0aWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCAmJiBtZXNzYWdlICYmIG1lc3NhZ2Vbc3RyXSkge1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2Vbc3RyXTtcblx0XHR9XG5cdFx0aWYgKHBnLnN0cmluZ1tzdHJdKSB7XG5cdFx0XHRyZXR1cm4gcGcuc3RyaW5nW3N0cl07XG5cdFx0fVxuXHRcdHJldHVybiBzdHI7XG5cdH07XG5cdGNvbnN0IHRwcmludGYgPSAoc3RyLCBzdWJzKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBzdWJzICE9PSB0eXBlb2YgW10pIHtcblx0XHRcdHN1YnMgPSBbc3Vic107XG5cdFx0fVxuXHRcdHJldHVybiBzaW1wbGVQcmludGYocG9wdXBTdHJpbmcoc3RyKSwgc3Vicyk7XG5cdH07XG5cdC8vIEVOREZJTEU6IHN0cmluZ3MuanNcblx0Ly8gU1RBUlRGSUxFOiBydW4uanNcblx0Ly8gUnVuIHRoaW5nc1xuXHQvLyBGb3Igc29tZSByZWFzb24gcG9wdXBzIHJlcXVpcmVzIGEgZnVsbHkgbG9hZGVkIHBhZ2UgalF1ZXJ5LnJlYWR5KC4uLikgY2F1c2VzIHByb2JsZW1zIGZvciBzb21lLlxuXHQvLyBUaGUgb2xkIGFkZE9ubG9hZEhvb2sgZGlkIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBiZWxvd1xuXHRpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuXHRcdGF1dG9FZGl0KCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gd2lsbCBzZXR1cCBwb3B1cHNcblx0XHQkKHdpbmRvdykub24oJ2xvYWQnLCBhdXRvRWRpdCk7XG5cdH1cblx0Ly8gU3VwcG9ydCBmb3IgTWVkaWFXaWtpJ3MgbGl2ZSBwcmV2aWV3LCBWaXN1YWxFZGl0b3IncyBzYXZlcyBhbmQgRWNobydzIGZseW91dC5cblx0KCgpID0+IHtcblx0XHRsZXQgb25jZSA9IHRydWU7XG5cdFx0Y29uc3QgZHluYW1pY0NvbnRlbnRIYW5kbGVyID0gKCRjb250ZW50KSA9PiB7XG5cdFx0XHQvLyBUcnkgdG8gZGV0ZWN0IHRoZSBob29rIGZpcmVkIG9uIGluaXRpYWwgcGFnZSBsb2FkIGFuZCBkaXNyZWdhcmRcblx0XHRcdC8vIGl0LCB3ZSBhbHJlYWR5IGhvb2sgdG8gb25sb2FkIChwb3NzaWJseSB0byBkaWZmZXJlbnQgcGFydHMgb2Zcblx0XHRcdC8vIHBhZ2UgLSBpdCdzIGNvbmZpZ3VyYWJsZSkgYW5kIHJ1bm5pbmcgdHdpY2UgbWlnaHQgYmUgYmFkLiBVZ2x5Li4uXG5cdFx0XHRpZiAoJGNvbnRlbnQuYXR0cignaWQnKSA9PT0gJ213LWNvbnRlbnQtdGV4dCcgJiYgb25jZSkge1xuXHRcdFx0XHRvbmNlID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlZ2lzdGVySG9va3NGb3JWaXNpYmxlTmF2cG9wcyA9ICgpID0+IHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IHBnLmN1cnJlbnQubGlua3MgJiYgaSA8IHBnLmN1cnJlbnQubGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCBuYXZwb3AgPSBwZy5jdXJyZW50LmxpbmtzW2ldLm5hdnBvcHVwO1xuXHRcdFx0XHRcdGlmICghbmF2cG9wIHx8ICFuYXZwb3AuaXNWaXNpYmxlKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHROYXZwb3B1cC50cmFja2VyLmFkZEhvb2socG9zQ2hlY2tlckhvb2sobmF2cG9wKSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBkb0l0ID0gKCkgPT4ge1xuXHRcdFx0XHRyZWdpc3Rlckhvb2tzRm9yVmlzaWJsZU5hdnBvcHMoKTtcblx0XHRcdFx0JGNvbnRlbnQuZWFjaCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0ZWxlbWVudC5yYW5TZXR1cFRvb2x0aXBzQWxyZWFkeSA9IGZhbHNlO1xuXHRcdFx0XHRcdHNldHVwVG9vbHRpcHMoZWxlbWVudCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHRcdHNldHVwUG9wdXBzKGRvSXQpO1xuXHRcdH07XG5cdFx0Ly8gVGhpcyBob29rIGlzIGFsc28gZmlyZWQgYWZ0ZXIgcGFnZSBsb2FkLlxuXHRcdG13Lmhvb2soJ3dpa2lwYWdlLmNvbnRlbnQnKS5hZGQoZHluYW1pY0NvbnRlbnRIYW5kbGVyKTtcblx0XHRtdy5ob29rKCdleHQuZWNoby5vdmVybGF5LmJlZm9yZVNob3dpbmdPdmVybGF5JykuYWRkKCgkb3ZlcmxheSkgPT4ge1xuXHRcdFx0ZHluYW1pY0NvbnRlbnRIYW5kbGVyKCRvdmVybGF5LmZpbmQoJy5tdy1lY2hvLXN0YXRlJykpO1xuXHRcdH0pO1xuXHR9KSgpO1xuXHQvLyBFTkRGSUxFOiBydW4uanNcbn07XG5cbmV4cG9ydCB7cG9wdXBzfTtcbiIsICJpbXBvcnQgJy4vTmF2aWdhdGlvbl9wb3B1cHMubGVzcyc7XG5pbXBvcnQge3BvcHVwc30gZnJvbSAnLi9tb2R1bGVzL2NvcmUnO1xuXG4kKHBvcHVwcyk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsd0ZBQUFBLFNBQUE7QUFBQTtBQUNBLFFBQUksUUFBUSxTQUFVLElBQUk7QUFDeEIsYUFBTyxNQUFNLEdBQUcsU0FBUyxRQUFRO0FBQUEsSUFDbkM7QUFHQSxJQUFBQSxRQUFPO0FBQUEsSUFFTCxNQUFNLE9BQU8sY0FBYyxZQUFZLFVBQVUsS0FDakQsTUFBTSxPQUFPLFVBQVUsWUFBWSxNQUFNO0FBQUEsSUFFekMsTUFBTSxPQUFPLFFBQVEsWUFBWSxJQUFJLEtBQ3JDLE1BQU0sT0FBTyxVQUFVLFlBQVksTUFBTSxLQUN6QyxNQUFNLE9BQU8sV0FBUSxZQUFZLE9BQUk7QUFBQSxJQUVwQywyQkFBWTtBQUFFLGFBQU87QUFBQSxJQUFNLEVBQUcsS0FBSyxTQUFTLGFBQWEsRUFBRTtBQUFBO0FBQUE7OztBQ2Y5RDtBQUFBLHVGQUFBQyxTQUFBO0FBQUE7QUFDQSxJQUFBQSxRQUFPLFVBQVUsU0FBVSxNQUFNO0FBQy9CLFVBQUk7QUFDRixlQUFPLENBQUMsQ0FBQyxLQUFLO0FBQUEsTUFDaEIsU0FBUyxPQUFPO0FBQ2QsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJ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TixRQUFJK2dDLE9BQU87QUFDWCxVQUFNQyx3QkFBeUJDLGNBQWE7QUFJM0MsVUFBSUEsU0FBUzMzQixLQUFLLElBQUksTUFBTSxxQkFBcUJ5M0IsTUFBTTtBQUN0REEsZUFBTztBQUNQO01BQ0Q7QUFDQSxZQUFNRyxpQ0FBaUNBLE1BQU07QUFDNUMsaUJBQVMxcEMsSUFBSSxHQUFHbE8sR0FBR2EsUUFBUWdILFNBQVNxRyxJQUFJbE8sR0FBR2EsUUFBUWdILE1BQU1oRixRQUFRcUwsS0FBSztBQUNyRSxnQkFBTXBILFNBQVM5RyxHQUFHYSxRQUFRZ0gsTUFBTXFHLENBQUMsRUFBRTNHO0FBQ25DLGNBQUksQ0FBQ1QsVUFBVSxDQUFDQSxPQUFPVSxVQUFVLEdBQUc7QUFDbkM7VUFDRDtBQUNBK0IsbUJBQVNvb0IsUUFBUTlzQixRQUFRK3NCLGVBQWU5cUIsTUFBTSxDQUFDO1FBQ2hEO01BQ0Q7QUFDQSxZQUFNK3dDLE9BQU9BLE1BQU07QUFDbEJELHVDQUErQjtBQUMvQkQsaUJBQVNHLEtBQUssQ0FBQ0MsUUFBUWhqQyxZQUFZO0FBQ2xDQSxrQkFBUWpULDBCQUEwQjtBQUNsQ2Isd0JBQWM4VCxPQUFPO1FBQ3RCLENBQUM7TUFDRjtBQUNBNkIsa0JBQVlpaEMsSUFBSTtJQUNqQjtBQUVBdmhDLE9BQUcwd0IsS0FBSyxrQkFBa0IsRUFBRWdSLElBQUlOLHFCQUFxQjtBQUNyRHBoQyxPQUFHMHdCLEtBQUssdUNBQXVDLEVBQUVnUixJQUFLQyxjQUFhO0FBQ2xFUCw0QkFBc0JPLFNBQVM5dEIsS0FBSyxnQkFBZ0IsQ0FBQztJQUN0RCxDQUFDO0VBQ0YsR0FBRztBQUVKOztBQ24rUEFELEVBQUVucUIsTUFBTTsiLAogICJuYW1lcyI6IFsibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdsb2JhbCIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJnbG9iYWxUaGlzIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIlN5bWJvbCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiZG9jdW1lbnQiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdsb2JhbCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiVHlwZUVycm9yIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIiQiLCAibW9kdWxlIiwgIiQiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiUmVnRXhwIiwgImtleSIsICJpbXBvcnRfZXh0X2dhZGdldCIsICJyZXF1aXJlIiwgImFwaSIsICJpbml0TXdBcGkiLCAibWVzc2FnZSIsICJhcnRpY2xlIiwgIndpbmRvdyIsICJ3Z1VMUyIsICJjYXRlZ29yeSIsICJjYXRlZ29yaWVzIiwgImltYWdlIiwgImltYWdlcyIsICJzdHViIiwgImtCIiwgImJ5dGVzIiwgImRheSIsICJkYXlzIiwgImhvdXIiLCAiaG91cnMiLCAibWludXRlIiwgIm1pbnV0ZXMiLCAic2Vjb25kIiwgInNlY29uZHMiLCAid2VlayIsICJ3ZWVrcyIsICJtb250aCIsICJtb250aHMiLCAieWVhciIsICJ5ZWFycyIsICJzZWFyY2giLCAiU2VhcmNoSGludCIsICJ3ZWIiLCAiZ2xvYmFsIiwgImFjdGlvbnMiLCAicG9wdXBzTWVudSIsICJ0b2dnbGVQcmV2aWV3c0hpbnQiLCAicmVzZXQiLCAiZGlzYWJsZSIsICJkaXNhYmxlUG9wdXBzSGludCIsICJwdXJnZVBvcHVwc0hpbnQiLCAiUG9wdXBzSGludCIsICJzcGFjZWJhciIsICJ2aWV3IiwgInZpZXdIaW50IiwgInRhbGsiLCAiZGVsIiwgImRlbGV0ZSIsICJkZWxldGVIaW50IiwgInVuZGVsZXRlU2hvcnQiLCAiVW5kZWxldGVIaW50IiwgInByb3RlY3QiLCAicHJvdGVjdEhpbnQiLCAidW5wcm90ZWN0U2hvcnQiLCAidW5wcm90ZWN0SGludCIsICJtb3ZlIiwgIk1vdmVwYWdlSGludCIsICJlZGl0IiwgImVkaXRIaW50IiwgIm5ldyIsICJuZXdTZWN0aW9uSGludCIsICJudWxsRWRpdEhpbnQiLCAiaGlzdCIsICJoaXN0b3J5IiwgImhpc3RvcnlIaW50IiwgImxhc3QiLCAibGFzdEVkaXQiLCAibGFzdENvbnRyaWIiLCAibGFzdENvbnRyaWJIaW50IiwgImN1ciIsICJkaWZmQ3VyIiwgIm9sZEVkaXQiLCAicHVyZ2UiLCAicHVyZ2VIaW50IiwgInJhdyIsICJyYXdIaW50IiwgInJlbmRlciIsICJyZW5kZXJIaW50IiwgInNpbmNlTWUiLCAic2luY2VNZUhpbnQiLCAiZWRzIiwgImVkaXRvcnMiLCAiZWRpdG9yTGlzdEhpbnQiLCAicmVsYXRlZCIsICJyZWxhdGVkQ2hhbmdlcyIsICJSZWNlbnRjaGFuZ2VzbGlua2VkSGludCIsICJlZGl0T2xkIiwgInJ2IiwgInJldmVydCIsICJyZXZlcnRIaW50IiwgInVuZG8iLCAidW5kb0hpbnQiLCAiZGVmYXVsdHBvcHVwUmVkbGlua1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwRml4RGFic1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwRml4UmVkaXJzU3VtbWFyeSIsICJkZWZhdWx0cG9wdXBFeHRlbmRlZFJldmVydFN1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUmV2ZXJ0U3VtbWFyeSIsICJkZWZhdWx0cG9wdXBRdWVyaWVkUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUXVlcmllZFJldmVydFN1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUm1EYWJMaW5rU3VtbWFyeSIsICJSZWRpcmVjdHMiLCAiZGlzYW1iaWciLCAiZGlzYW1iaWdIaW50IiwgIm1haW5saW5rIiwgIndpa2lMaW5rIiwgIndpa2lMaW5rcyIsICJ3aGF0TGlua3NIZXJlIiwgIldoYXRsaW5rc2hlcmVIaW50IiwgInVud2F0Y2hTaG9ydCIsICJ3YXRjaFRoaW5neSIsICJ3YXRjaEhpbnQiLCAidW53YXRjaEhpbnQiLCAicnNzIiwgInVzZXIiLCAiZW1haWwiLCAiRW1haWx1c2VySGludCIsICJzcGFjZSIsICJQcmVmaXhpbmRleEhpbnQiLCAiY291bnQiLCAia2F0ZWxpbmtIaW50IiwgImNvbnRyaWJzIiwgImNvbnRyaWJ1dGlvbnMiLCAiZGVsZXRlZENvbnRyaWJzIiwgIkNvbnRyaWJ1dGlvbnNIaW50IiwgInRyZWUiLCAiY29udHJpYnNUcmVlSGludCIsICJsb2ciLCAidXNlckxvZ0hpbnQiLCAidW5ibG9ja1Nob3J0IiwgImJsb2NrIiwgIklwYmxvY2tsaXN0SGludCIsICJCbG9ja2lwSGludCIsICJibG9ja0xvZ0hpbnQiLCAicHJvdGVjdExvZ0hpbnQiLCAicGFnZUxvZ0hpbnQiLCAiZGVsZXRlTG9nSGludCIsICJtIiwgImJpbmdTZWFyY2hIaW50IiwgImhpc3RvcnlmZWVkSGludCIsICJUaGFua3NIaW50IiwgIm1hcmtwYXRyb2xsZWRIaW50IiwgImRlZmF1bHRwb3B1cFJldmlld2VkU3VtbWFyeSIsICJyZXZkZWwiLCAiRGVsZXRlZGNvbnRyaWJ1dGlvbnNIaW50IiwgIkJMT0NLRUQiLCAiRW1haWxVc2VySGludCIsICJSQU5HRUJMT0NLRUQiLCAiSElEREVOIiwgIkxPQ0tFRCIsICJkaWZmIiwgImF1dG9lZGl0X3ZlcnNpb24iLCAiUHJlZml4SW5kZXhIaW50IiwgIm51bGxFZGl0U3VtbWFyeSIsICJzZXBhcmF0b3IiLCAiY29tbWEiLCAicG9wdXBzIiwgInBnIiwgInJlIiwgIm5zIiwgInN0cmluZyIsICJ3aWtpIiwgIm1pc2MiLCAib3B0aW9uIiwgIm9wdGlvbkRlZmF1bHQiLCAiZmxhZyIsICJjYWNoZSIsICJzdHJ1Y3R1cmVzIiwgInRpbWVyIiwgImNvdW50ZXIiLCAiY3VycmVudCIsICJmbiIsICJlbmRvZmxpc3QiLCAiSFRNTEVsZW1lbnQiLCAic2V0dXBUb29sdGlwcyIsICJjb250YWluZXIiLCAicmVtb3ZlIiwgImZvcmNlIiwgInBvcERhdGEiLCAiY29uY2F0IiwgImdldFZhbHVlT2YiLCAiZG9jdW1lbnQiLCAiZWRpdGZvcm0iLCAid3BUZXh0Ym94MSIsICJvbm1vdXNldXAiLCAiZG9TZWxlY3Rpb25Qb3B1cCIsICJkZWZhdWx0UG9wdXBzQ29udGFpbmVyIiwgInJhblNldHVwVG9vbHRpcHNBbHJlYWR5IiwgImFuY2hvcnMiLCAicXVlcnlTZWxlY3RvckFsbCIsICJzZXR1cFRvb2x0aXBzTG9vcCIsICJxdWVyeVNlbGVjdG9yIiwgInNldHVwVG9vbHRpcHNMb29wMiIsICJiZWdpbiIsICJob3dtYW55IiwgInNsZWVwIiwgImFyZ3MiLCAic2ltcGxlUHJpbnRmIiwgImZpbmlzaCIsICJsb29wZW5kIiwgIk1hdGgiLCAibWluIiwgImxlbmd0aCIsICJqIiwgImRvVG9vbHRpcCIsICJyZW1vdmVUb29sdGlwIiwgImFkZFRvb2x0aXAiLCAiYSIsICJocmVmIiwgInNldFRpbWVvdXQiLCAicm1Ub2NUb29sdGlwcyIsICJmaW5pc2hlZExvYWRpbmciLCAidG9jIiwgInRvY0xpbmtzIiwgInRvY0xlbiIsICJpc1BvcHVwTGluayIsICJvbm1vdXNlb3ZlciIsICJtb3VzZU92ZXJXaWtpTGluayIsICJvbm1vdXNlb3V0IiwgIm1vdXNlT3V0V2lraUxpbmsiLCAib25tb3VzZWRvd24iLCAia2lsbFBvcHVwIiwgImhhc1BvcHVwIiwgIm9yaWdpbmFsVGl0bGUiLCAidGl0bGUiLCAicmVtb3ZlVGl0bGUiLCAicmVzdG9yZVRpdGxlIiwgInJlZ2lzdGVySG9va3MiLCAibnAiLCAicG9wdXBNYXhXaWR0aCIsICJzZXRNYXhXaWR0aCIsICJtYWluRGl2IiwgInN0eWxlIiwgIm1heFdpZHRoIiwgImFkZEhvb2siLCAiYWRkUG9wdXBTaG9ydGN1dHMiLCAicm1Qb3B1cFNob3J0Y3V0cyIsICJyZW1vdmVNb2RpZmllcktleUxpc3RlbmVyIiwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCAibW9kaWZpZXJLZXlMaXN0ZW5lciIsICJtb3VzZU92ZXJXaWtpTGluazMiLCAiZXZ0IiwgImV2ZW50IiwgImFjdGlvbiIsICJrZXkiLCAic2VsZiIsICJldnQyIiwgIm1vdXNlT3Zlcldpa2lMaW5rMiIsICJhZGRFdmVudExpc3RlbmVyIiwgImZvb3Rub3RlVGFyZ2V0IiwgImFUaXRsZSIsICJUaXRsZSIsICJmcm9tQW5jaG9yIiwgImFuY2giLCAiYW5jaG9yIiwgInRlc3QiLCAibFRpdGxlIiwgImZyb21VUkwiLCAibG9jYXRpb24iLCAidG9TdHJpbmciLCAiZWwiLCAibm9kZU5hbWUiLCAibnQiLCAidG9Mb3dlckNhc2UiLCAicGFyZW50Tm9kZSIsICJmb290bm90ZVByZXZpZXciLCAieCIsICJuYXZwb3AiLCAic2V0UG9wdXBIVE1MIiwgImlubmVySFRNTCIsICJpZE51bWJlciIsICJtb2RpZmllclByZXNzZWQiLCAibW9kIiwgImlzQ29ycmVjdE1vZGlmaWVyIiwgIl9hIiwgImxpbmsiLCAibmF2cG9wdXAiLCAiaXNWaXNpYmxlIiwgInBvcHVwU3RydWN0dXJlIiwgInNldERlZmF1bHQiLCAibmV3TmF2cG9wdXAiLCAibGlua3NIYXNoIiwgImxpbmtzIiwgInB1c2giLCAicGVuZGluZyIsICJzaW1wbGVQb3B1cENvbnRlbnQiLCAic2hvd1Nvb25JZlN0YWJsZSIsICJkZWxheSIsICJjbGVhckludGVydmFsIiwgImNoZWNrUG9wdXBQb3NpdGlvbiIsICJzZXRJbnRlcnZhbCIsICJzaW1wbGVOb01vcmUiLCAiZCIsICJjcmVhdGVFbGVtZW50IiwgImNsYXNzTmFtZSIsICJzIiwgImFwcGVuZCIsICJkaXNwbGF5IiwgIm5vbnNpbXBsZVBvcHVwQ29udGVudCIsICJwb3B1cFN0cmluZyIsICJoYXNQb3B1cE1lbnUiLCAic2V0SW5uZXJIVE1MIiwgInBvcHVwSFRNTCIsICJmaWxsRW1wdHlTcGFucyIsICJkcmFnSGFuZGxlIiwgIm1ha2VEcmFnZ2FibGUiLCAicG9wdXBSZWRsaW5rSFRNTCIsICJkZWJ1Z0RhdGEiLCAiTmF2cG9wdXAiLCAiZnV6eiIsICJwYXJlbnRBbmNob3IiLCAicGFyZW50UG9wdXAiLCAib3duZXIiLCAic2hvdWxkU2hvd05vblNpbXBsZSIsICJzaG91bGRTaG93IiwgImRpZmYyIiwgInBhcmFtcyIsICJwYXJzZVBhcmFtcyIsICJvbGRpZCIsICJyZWZlcmVuY2VFbGVtZW50IiwgImxvYWREaWZmIiwgImxvYWRBUElQcmV2aWV3IiwgImJhY2tsaW5rcyIsICJuYW1lc3BhY2VJZCIsICJuc0ltYWdlSWQiLCAiYW5jaG9yQ29udGFpbnNJbWFnZSIsICJsb2FkSW1hZ2UiLCAibnNDYXRlZ29yeUlkIiwgIm5zVXNlcklkIiwgIm5zVXNlcnRhbGtJZCIsICJzdGFydEFydGljbGVQcmV2aWV3IiwgInBlbmRpbmdOYXZwb3BUYXNrIiwgImNvbXBsZXRlZE5hdnBvcFRhc2siLCAicmVkaXIiLCAibG9hZFByZXZpZXciLCAib3JpZ2luYWxBcnRpY2xlIiwgImxvYWRQcmV2aWV3RnJvbVJlZGlyIiwgInJlZGlyTWF0Y2giLCAidGFyZ2V0IiwgImZyb21XaWtpVGV4dCIsICJyZWRpclRhcmdldCIsICJ3YXJuUmVkaXIiLCAicmVkaXJMaW5rIiwgImluc2VydFByZXZpZXciLCAiZG93bmxvYWQiLCAicmVkaXJlY3QiLCAiZXhlYyIsICJkYXRhIiwgInZpc2libGUiLCAiaW5zZXJ0UHJldmlld05vdyIsICJpZCIsICJ3aWtpVGV4dCIsICJhcnQiLCAibWFrZUZpeERhYnMiLCAiZ2V0UGFnZUluZm8iLCAic2V0UG9wdXBUcmFpbGVyIiwgImltYWdlUGFnZSIsICJnZXRWYWxpZEltYWdlRnJvbVdpa2lUZXh0IiwgImluc2VydEFydGljbGVQcmV2aWV3IiwgIm5zVGVtcGxhdGVJZCIsICJoIiwgImVudGlmeSIsICJzcGxpdCIsICJqb2luIiwgInAiLCAicHJlcFByZXZpZXdtYWtlciIsICJzaG93UHJldmlldyIsICJhbmNob3JpemUiLCAiYW5jaG9yU3RyaW5nIiwgInVybEJhc2UiLCAiam9pblBhdGgiLCAiYXJ0aWNsZWJhc2UiLCAidXJsU3RyaW5nIiwgIlByZXZpZXdtYWtlciIsICJhbmNoUmUiLCAiUmVnRXhwIiwgImxpdGVyYWxpemVSZWdleCIsICJyZXBsYWNlIiwgIm1hdGNoIiwgInNsaWNlIiwgIm1heCIsICJpbmRleE9mIiwgImxpbmVzIiwgImkiLCAia2lsbFBvcHVwMiIsICJiYW5pc2giLCAiYWJvcnRBbGxEb3dubG9hZHMiLCAiRHJhZyIsICJjb25zdHJ1Y3RvciIsICJzdGFydENvbmRpdGlvbiIsICJlbmRIb29rIiwgImZpeEUiLCAiZSIsICJsYXllclgiLCAib2Zmc2V0WCIsICJsYXllclkiLCAib2Zmc2V0WSIsICJpbml0IiwgIm8iLCAib1Jvb3QiLCAib2JqIiwgInN0YXJ0IiwgImRyYWdnaW5nIiwgInBvcHVwc19kcmFnZ2FibGUiLCAiaG1vZGUiLCAidm1vZGUiLCAicm9vdCIsICJOdW1iZXIiLCAiaXNOYU4iLCAicGFyc2VJbnQiLCAibGVmdCIsICJ0b3AiLCAib250aGlzU3RhcnQiLCAib250aGlzRW5kIiwgIm9udGhpcyIsICJ5IiwgImJvdHRvbSIsICJyaWdodCIsICJsYXN0TW91c2VYIiwgImNsaWVudFgiLCAibGFzdE1vdXNlWSIsICJjbGllbnRZIiwgIm9ubW91c2Vtb3ZlRGVmYXVsdCIsICJvbm1vdXNlbW92ZSIsICJlMiIsICJkcmFnIiwgImVuZCIsICJleSIsICJleCIsICJueCIsICJueSIsICJvcmlnaW5hbCIsICJwb3B1cExheW91dCIsICJwb3B1cFJlZGlyU3BhbnMiLCAicG9wdXBUaXRsZSIsICJuYXZsaW5rU3RyaW5nVG9IVE1MIiwgInBvcHVwVG9wTGlua3MiLCAibmF2TGlua3NIVE1MIiwgImhpbnQiLCAicG9wdXBJbWFnZSIsICJpbWFnZUhUTUwiLCAicG9wdXBSZWRpclRpdGxlIiwgInBvcHVwUmVkaXJUb3BMaW5rcyIsICJjb3B5U3RydWN0dXJlIiwgIm9sZFN0cnVjdHVyZSIsICJuZXdTdHJ1Y3R1cmUiLCAicHJvcCIsICJPYmplY3QiLCAiaGFzT3duIiwgIm5vc3RhbGdpYSIsICJzdHIiLCAiZWRpdHN0ciIsICJlZGl0T2xkaWRTdHIiLCAiaGlzdG9yeXN0ciIsICJ3YXRjaHN0ciIsICJmYW5jeSIsICJ3YXRjaCIsICJwb3B1cE90aGVyTGlua3MiLCAiYWRtaW4iLCAibm9ybWFsIiwgInBvcHVwUmVkaXJPdGhlckxpbmtzIiwgImZhbmN5MiIsICJtZW51cyIsICJzaG9ydGVyIiwgImRyb3BkaXYiLCAiZW5kZGl2IiwgImxhc3RlZGl0IiwgInRoYW5rIiwgImpzSGlzdG9yeSIsICJsaW5rc2hlcmUiLCAibnVsbFB1cmdlIiwgInZpZXdPcHRpb25zIiwgImVkaXRSb3ciLCAibWFya1BhdHJvbGxlZCIsICJuZXdUb3BpYyIsICJwcm90ZWN0RGVsZXRlIiwgIm1lbnVUaXRsZSIsICJzaG9ydG1lbnVzIiwgImxpdGUiLCAic3Vic3RpdHV0ZSIsICJjbWRCb2R5IiwgImZyb21SZSIsICJmcm9tIiwgImZsYWdzIiwgInRvIiwgImV4ZWNDbWRzIiwgImNtZExpc3QiLCAiX2l0ZXJhdG9yIiwgIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwgIl9zdGVwIiwgIm4iLCAiZG9uZSIsICJlbGVtZW50IiwgInZhbHVlIiwgImVyciIsICJmIiwgInBhcnNlQ21kIiwgInBhcnNlQ21kMiIsICJjaGFyQXQiLCAicGFyc2VTdWJzdGl0dXRlIiwgInJlbWFpbmRlciIsICJ1bkVzY2FwZSIsICJzZXAiLCAidG1wIiwgInNraXBPdmVyIiwgInNlZ21lbnQiLCAic2tpcFRvRW5kIiwgImVuZFNlZ21lbnQiLCAiZmluZE5leHQiLCAiX3NlcCIsICJjaCIsICJzZXRDaGVja2JveCIsICJwYXJhbSIsICJib3giLCAidmFsIiwgIm13IiwgInV0aWwiLCAiZ2V0UGFyYW1WYWx1ZSIsICJjaGVja2VkIiwgImF1dG9FZGl0IiwgImF1dG9FZGl0NCIsICJzZXR1cFBvcHVwcyIsICJhdXRvQ2xpY2tUb2tlbiIsICJtb2RpZnlXYXRjaGxpc3QiLCAiYWxyZWFkeVJhbiIsICJjbWRTdHJpbmciLCAiZWRpdGJveCIsICJpbnB1dCIsICJvdXRwdXQiLCAid3BNaW5vcmVkaXQiLCAid3BXYXRjaHRoaXMiLCAicnZpZCIsICJ1cmwiLCAiYXBpd2lraWJhc2UiLCAic3RhcnREb3dubG9hZCIsICJhdXRvRWRpdDIiLCAic3VtbWFyeSIsICJzdW1tYXJ5cHJvbXB0IiwgInN1bW1hcnlub3RpY2UiLCAiZ2V0UnZTdW1tYXJ5IiwgInR4dCIsICJyZXNwb25zZSIsICJwcm9tcHQiLCAid3BTdW1tYXJ5IiwgImF1dG9FZGl0MyIsICJzZXNzaW9uSWQiLCAiYnRuIiwgImJ1dHRvbiIsICJtc2ciLCAidHByaW50ZiIsICJiYW5uZXJNZXNzYWdlIiwgImNsaWNrIiwgIm5vdGlmeSIsICJ0YWciLCAidHlwZSIsICJoZWFkaW5ncyIsICJkaXYiLCAiZXNjYXBlUXVvdGVzSFRNTCIsICJpbnNlcnRCZWZvcmUiLCAidGVtcGxhdGUiLCAianNvbiIsICJnZXRKc09iaiIsICJhbnlDaGlsZCIsICJxdWVyeSIsICJwYWdlcyIsICJyZXZpc2lvbnMiLCAidGltZXN0YW1wIiwgInJldmlkIiwgInVzZXJoaWRkZW4iLCAiRG93bmxvYWRlciIsICJYTUxIdHRwUmVxdWVzdCIsICJodHRwIiwgImxhc3RNb2RpZmllZCIsICJjYWxsYmFja0Z1bmN0aW9uIiwgIm9uRmFpbHVyZSIsICJhYm9ydGVkIiwgIm1ldGhvZCIsICJhc3luYyIsICJzZW5kIiwgImFib3J0IiwgImdldERhdGEiLCAicmVzcG9uc2VUZXh0IiwgInNldFRhcmdldCIsICJvcGVuIiwgInNldFJlcXVlc3RIZWFkZXIiLCAidXNlckFnZW50IiwgImdldFJlYWR5U3RhdGUiLCAicmVhZHlTdGF0ZSIsICJkb3dubG9hZHNJblByb2dyZXNzIiwgImdldExhc3RNb2RpZmllZERhdGUiLCAibGFzdG1vZCIsICJnZXRSZXNwb25zZUhlYWRlciIsICJEYXRlIiwgInNldENhbGxiYWNrIiwgIm9ucmVhZHlzdGF0ZWNoYW5nZSIsICJnZXRTdGF0dXMiLCAic3RhdHVzIiwgIm5ld0Rvd25sb2FkIiwgIm5ld0Rvd25sb2FkMiIsICJjYWxsYmFjayIsICJvbmZhaWx1cmUiLCAiZmFrZURvd25sb2FkIiwgIkluc3RhIiwgInNldHVwTGl2ZVByZXZpZXciLCAiX2IiLCAiY29uZiIsICJiYXNlVXJsIiwgImxhbmciLCAiaW50ZXJ3aWtpIiwgImRlZmF1bHRfdGh1bWJfd2lkdGgiLCAicGF0aHMiLCAiYXJ0aWNsZXMiLCAiYXJ0aWNsZVBhdGgiLCAibWF0aCIsICJpbWFnZXNfZmFsbGJhY2siLCAibG9jYWxlIiwgImNvbmZpZyIsICJnZXQiLCAibmFtZSIsICJzaWduYXR1cmUiLCAiQkxPQ0tfSU1BR0UiLCAiZHVtcCIsICJjb252ZXJ0IiwgImxsIiwgInIiLCAicmVtYWluIiwgInNoIiwgInNoaWZ0IiwgInBzIiwgImYyIiwgImYzIiwgIm8yIiwgImMiLCAicDIiLCAiaHRtbF9lbnRpdGllcyIsICJodG1sZXNjYXBlX3RleHQiLCAiaHRtbGVzY2FwZV9hdHRyIiwgInN0cl9pbWF0Y2giLCAiYiIsICJsIiwgImNvbXBhcmVMaW5lU3RyaW5nT3JSZWciLCAiY29tcGFyZUxpbmVTdHJpbmciLCAiY2hhckF0UG9pbnQiLCAiZW5kbCIsICJwYXJzZV9saXN0IiwgInByZXYiLCAibF9tYXRjaCIsICJpcG9zIiwgInByZXZQb3MiLCAicGkiLCAibWF0Y2hQb3MiLCAibGkiLCAiYXQiLCAicGFyc2VfaW5saW5lX25vd2lraSIsICJkdF9tYXRjaCIsICJ1bnNoaWZ0IiwgInBhcnNlX3RhYmxlIiwgInBhcnNlX3RhYmxlX2RhdGEiLCAidGRfbGluZSIsICJtYXRjaF9pIiwgInRkX21hdGNoIiwgInBvcCIsICJ0YyIsICJ0ZCIsICJwYXJzZV9wcmUiLCAicGFyc2VfYmxvY2tfaW1hZ2UiLCAicGFyc2VfaW1hZ2UiLCAic3Vic3RyaW5nIiwgIndpZHRoIiwgImF0dHIiLCAiZmlsZW5hbWUiLCAiY2FwdGlvbiIsICJ0aHVtYiIsICJmcmFtZSIsICJjZW50ZXIiLCAiYWxpZ24iLCAibmVzdGluZyIsICJsYXN0X2F0dHIiLCAid19tYXRjaCIsICJsYXN0ZW5kIiwgInN1YnN0YXJ0IiwgIm5lc3RsZXYiLCAiY2xvc2UiLCAic3VibG9vcCIsICJodG1sIiwgInBhcnNlX2lubGluZV93aWtpIiwgInBhcnNlX2lubGluZV9pbWFnZXMiLCAibG9vcCIsICJ3aWtpMiIsICJwYXJzZV9pbmxpbmVfZm9ybWF0dGluZyIsICJlbSIsICJzdCIsICJkYXRlIiwgImdldFVUQ01pbnV0ZXMiLCAiZ2V0VVRDSG91cnMiLCAiZ2V0VVRDRGF0ZSIsICJnZXRVVENNb250aCIsICJnZXRVVENGdWxsWWVhciIsICJfJDAiLCAiJDEiLCAiJDIiLCAiJDMiLCAiJDQiLCAid2lraTJodG1sIiwgImJhc2V1cmwiLCAicG9wdXBGaWx0ZXJQYWdlU2l6ZSIsICJmb3JtYXRCeXRlcyIsICJwb3B1cEZpbHRlckNvdW50TGlua3MiLCAibnVtIiwgImNvdW50TGlua3MiLCAiU3RyaW5nIiwgInBvcHVwRmlsdGVyQ291bnRJbWFnZXMiLCAiY291bnRJbWFnZXMiLCAicG9wdXBGaWx0ZXJDb3VudENhdGVnb3JpZXMiLCAiY291bnRDYXRlZ29yaWVzIiwgInBvcHVwRmlsdGVyTGFzdE1vZGlmaWVkIiwgIl9kYXRhIiwgIm5vdyIsICJhZ2UiLCAiZm9ybWF0QWdlIiwgImFhIiwgInNlY2xlbiIsICJtaW5sZW4iLCAiaG91cmxlbiIsICJkYXlsZW4iLCAid2Vla2xlbiIsICJudW13ZWVrcyIsICJzd2Vla3MiLCAiYWRkdW5pdCIsICJudW1kYXlzIiwgInNkYXlzIiwgIm51bWhvdXJzIiwgInNob3VycyIsICJudW1taW5zIiwgInNtaW5zIiwgIm51bXNlY3MiLCAic3NlY3MiLCAicnVuUG9wdXBGaWx0ZXJzIiwgImxpc3QiLCAicmV0IiwgIl9pdGVyYXRvcjIiLCAiX3N0ZXAyIiwgInBvcHVwRmlsdGVycyIsICJleHRyYVBvcHVwRmlsdGVycyIsICJwYWdlSW5mb0FycmF5IiwgInBhZ2VJbmZvIiwgInVwY2FzZUZpcnN0IiwgImltYWdlQnJhY2tldENvdW50IiwgImNhdGVnb3J5QnJhY2tldENvdW50IiwgInBvcHVwRmlsdGVyU3R1YkRldGVjdCIsICJfZG93bmxvYWQiLCAiY291bnRzIiwgInN0dWJDb3VudCIsICJyZWFsIiwgInNlY3QiLCAicG9wdXBGaWx0ZXJEaXNhbWJpZ0RldGVjdCIsICJuYW1lc3BhY2UiLCAiaXNEaXNhbWJpZyIsICJyb3VuZCIsICJTdHJpbmd3cmFwcGVyIiwgIlN0cmluZ3dyYXBwZXIyIiwgInNldFV0ZiIsICJvbWl0QW5jaG9yIiwgImxlbiIsICJkZWNvZGVVUklDb21wb25lbnQiLCAidXJsQW5jaG9yIiwgImFuY2hvckZyb21VdGYiLCAiZW5jb2RlVVJJQ29tcG9uZW50IiwgInNwbGl0dGVkIiwgInUiLCAiZGVjb2RlTmFzdGllcyIsICJzdHJpcE5hbWVzcGFjZSIsICJzcGVjaWFsZGlmZiIsICJuc1NwZWNpYWxJZCIsICJtYWluIiwgImZyb21Cb3RJbnRlcmZhY2UiLCAiZXh0cmFjdGVkIiwgImlzU2FmYXJpIiwgInVuZXNjYXBlIiwgImRlY29kZVVSSSIsICJkZWNvZGVFc2NhcGVzIiwgIm15RGVjb2RlVVJJIiwgImhpbnRWYWx1ZSIsICJzYWZlRGVjb2RlVVJJIiwgInRvVXNlck5hbWUiLCAid2l0aE5zIiwgInVzZXJOYW1lIiwgInQiLCAidG9UYWxrUGFnZSIsICJsb2NhbGl6ZWROYW1lc3BhY2UiLCAidGFsa1BhZ2UiLCAiaXNUYWxrUGFnZSIsICJ0b0FydGljbGVGcm9tVGFsa1BhZ2UiLCAiYXJ0aWNsZUZyb21UYWxrUGFnZSIsICJhcnRpY2xlRnJvbVRhbGtPckFydGljbGUiLCAiaXNJcFVzZXIiLCAiaXBVc2VyIiwgIm5zTWFpbnNwYWNlSWQiLCAic2V0VXJsIiwgInVybGZyYWciLCAidiIsICJrZWVwU3BhY2VzIiwgImVuY29kZVVSSSIsICJyZW1vdmVBbmNob3IiLCAidG9VcmwiLCAidGl0bGViYXNlIiwgInNwZWNpYWxEaWZmIiwgImluY2x1ZGVzIiwgIl9pdGVyYXRvcjMiLCAiX3N0ZXAzIiwgInoiLCAiaGVscGVyIiwgImRlY29kZUV4dHJhcyIsICJzZWN0U3R1YiIsICJyZWFsU3R1YiIsICJpc1ZhbGlkSW1hZ2VOYW1lIiwgImlzSW5TdHJpcHBhYmxlTmFtZXNwYWNlIiwgImlzSW5NYWluTmFtZXNwYWNlIiwgImtpZHMiLCAiY2hpbGROb2RlcyIsICJfaXRlcmF0b3I0IiwgIl9zdGVwNCIsICJraWQiLCAibWFya05vcG9wdXBTcGFuTGlua3MiLCAiaW5Ob3BvcHVwU3BhbiIsICJnZXRBdHRyaWJ1dGUiLCAiYmFzZW5hbWVzIiwgInVybE5vUG9wdXAiLCAibWFya05vcG9wdXBTcGFuTGlua3MyIiwgImZpeFZlY3Rvck1lbnVQb3B1cHMiLCAiJGJvZHkiLCAiJCIsICJmaW5kIiwgInRvQXJyYXkiLCAiX2l0ZXJhdG9yNSIsICJfc3RlcDUiLCAiYXMiLCAiX2l0ZXJhdG9yNiIsICJfc3RlcDYiLCAiZ2V0UGFnZVdpdGhDYWNoaW5nIiwgIm9uQ29tcGxldGUiLCAiZmluZEluUGFnZUNhY2hlIiwgImdldFBhZ2UiLCAiYWRkRG93bmxvYWQiLCAiYWRkUGFnZVRvQ2FjaGUiLCAicGFnZSIsICJqc29uX3JldCIsICJKU09OIiwgInBhcnNlIiwgIndhcm5pbmdzIiwgInciLCAiZXJyb3IiLCAiZXJybG9nIiwgImNvZGUiLCAiaW5mbyIsICJ0b1VwcGVyQ2FzZSIsICJmaW5kSW5BcnJheSIsICJhcnIiLCAiZm9vIiwgIm5leHRPbmUiLCAiYXJyYXkiLCAiZXNjYXBlUmVnRXhwIiwgInByb3RvdHlwZSIsICJyZW1vdmVOdWxscyIsICJmaWx0ZXIiLCAic3VicyIsICJjbWQiLCAiaXNTdHJpbmciLCAiaXNOdW1iZXIiLCAiaXNSZWdFeHAiLCAiaXNBcnJheSIsICJBcnJheSIsICJpc09iamVjdCIsICJpc0Z1bmN0aW9uIiwgIkZ1bmN0aW9uIiwgInJlcGVhdFN0cmluZyIsICJtdWx0IiwgInplcm9GaWxsIiwgIm1hcCIsICJtYXBfYXJyYXkiLCAibWFwX29iamVjdCIsICJfaXRlcmF0b3I3IiwgIl9zdGVwNyIsICJ0ZXh0IiwgInVuZXNjYXBlUXVvdGVzSFRNTCIsICJyZXRhcmdldERhYiIsICJuZXdUYXJnZXQiLCAib2xkVGFyZ2V0IiwgImZyaWVuZGx5Q3VycmVudEFydGljbGVOYW1lIiwgInRpdGxlVG9FZGl0IiwgImNoYW5nZUxpbmtUYXJnZXRMaW5rIiwgImNsaWNrQnV0dG9uIiwgIm1pbm9yIiwgImxpc3RMaW5rcyIsICJ3aWtpdGV4dCIsICJyZWciLCAib21pdFJlZ2V4IiwgIndpa1BvcyIsICJybUR1cGVzRnJvbVNvcnRlZExpc3QiLCAic29ydCIsICJ3aWtUYXJnZXQiLCAibWV0aCIsICJfaXRlcmF0b3I4IiwgIl9zdGVwOCIsICJtYWtlRml4RGFiIiwgInNldFBvcHVwSFRNTDIiLCAiZWxlbWVudElkIiwgInBvcHVwSWQiLCAib25TdWNjZXNzIiwgInBvcHVwRWxlbWVudCIsICJyY2lkIiwgInN0cnVjdHVyZSIsICJzcGFucyIsICJmbGF0dGVuIiwgImxheW91dCIsICJudW1zcGFucyIsICJyZWRpcnMiLCAicmVkaXJTcGFucyIsICJmb3VuZCIsICJzdHJ1Y3R1cmVmbiIsICJzZXRmbiIsICJzZXRQb3B1cFRpcHNBbmRIVE1MIiwgImZsYXR0ZW4yIiwgInBvcHVwSFRNTDIiLCAibWFrZUVtcHR5U3BhbnMiLCAibWFrZUVtcHR5U3BhbnMyIiwgIl9pdGVyYXRvcjkiLCAiX3N0ZXA5IiwgImVtcHR5U3BhbkhUTUwiLCAibm9kZVR5cGUiLCAiZW1wdHlTcGFuSFRNTDIiLCAiY2xhc3NuYW1lIiwgImNsYXNzQWxpYXNlcyIsICJwb3B1cFNlY29uZFByZXZpZXciLCAiX2FydGljbGUiLCAicG9wVGlwc1Nvb25GbiIsICJ3aGVuIiwgInBvcFRpcHMiLCAiZGl2bmFtZSIsICJpZG51bWJlciIsICJmdXp6eUN1cnNvck9mZk1lbnVzIiwgIl94IiwgIl95IiwgIl9mdXp6IiwgInBhcmVudCIsICJ1bHMiLCAiX2l0ZXJhdG9yMTAiLCAiX3N0ZXAxMCIsICJ1bCIsICJvZmZzZXRXaWR0aCIsICJsaW1pdEhvcml6b250YWxQb3NpdGlvbiIsICJtb3VzZU91dFdpa2lMaW5rMiIsICJ0cmFja2VyIiwgInBvc0NoZWNrZXJIb29rIiwgImRpcnR5IiwgIm1vdXNlT3Zlck5hdnBvcCIsICJpc1dpdGhpbiIsICJtb3VzZUxlYXZpbmdUaW1lIiwgInJ1blN0b3BQb3B1cFRpbWVyIiwgInN0b3BQb3B1cFRpbWVyIiwgIm9yaWdpbmFsRGF0YSIsICJtYXhDaGFyYWN0ZXJzIiwgIm1heFNlbnRlbmNlcyIsICJzZXREYXRhIiwgIm1heFNpemUiLCAia2lsbENvbW1lbnRzIiwgImtpbGxEaXZzIiwgImtpbGxHYWxsZXJpZXMiLCAia2lsbCIsICJvcGVuaW5nIiwgImNsb3NpbmciLCAic3Vib3BlbmluZyIsICJzdWJjbG9zaW5nIiwgInJlcGwiLCAib2xkayIsICJrIiwgImtpbGxTdHVmZiIsICJvcCIsICJtYWtlUmVnZXhwIiwgImNsIiwgInNiIiwgInNjIiwgIm9wUmVzdWx0IiwgImluZGV4IiwgImRlcHRoIiwgInJlbW92YWwiLCAicHJlZml4IiwgInN1ZmZpeCIsICJyZVN0ciIsICJzcCIsICJraWxsQm94VGVtcGxhdGVzIiwgImtpbGxUZW1wbGF0ZXMiLCAia2lsbFRhYmxlcyIsICJraWxsSW1hZ2VzIiwgImZvcmJpZGRlbk5hbWVzcGFjZUFsaWFzZXMiLCAiX2kiLCAiX09iamVjdCRlbnRyaWVzIiwgImVudHJpZXMiLCAibG9jYWxpemVkTmFtZXNwYWNlTGMiLCAia2lsbEhUTUwiLCAia2lsbENodW5rcyIsICJpdGFsaWNDaHVua1JlZ2V4IiwgIm1vcHVwIiwgImZpcnN0Qml0IiwgInN0dWZmIiwgIm5vdFNlbnRlbmNlRW5kcyIsICJmaXhTZW50ZW5jZUVuZHMiLCAiZnVsbExlbmd0aCIsICJkZCIsICJmaXJzdFNlbnRlbmNlcyIsICJzdHJzIiwgImtpbGxCYWRXaGl0ZXNwYWNlIiwgIm1ha2VQcmV2aWV3IiwgImtpbGxNdWx0aWxpbmVUZW1wbGF0ZXMiLCAiZml4SFRNTCIsICJzdHJpcExvbmdUZW1wbGF0ZXMiLCAiZXNXaWtpMkh0bWxQYXJ0IiwgInJlTGlua3MiLCAibGFzdEluZGV4IiwgInJlc3VsdCIsICJwb3N0Zml4SW5kZXgiLCAiX21hdGNoJCIsICJlZGl0U3VtbWFyeVByZXZpZXciLCAicmVBZXMiLCAic2VjdGlvbiIsICJwb3N0Zml4IiwgInNlY3Rpb25MaW5rIiwgIm1vcmUiLCAibW9yZUxpbmsiLCAib25jbGljayIsICJxdWVyeVR5cGUiLCAiaHRtbEdlbmVyYXRvciIsICJ1c2VybmFtZWFydCIsICJBUEloaXN0b3J5UHJldmlld0hUTUwiLCAiQVBJY2F0ZWdvcnlQcmV2aWV3SFRNTCIsICJ1c2VybmFtZSIsICJBUEl1c2VySW5mb1ByZXZpZXdIVE1MIiwgIkFQSWNvbnRyaWJzUHJldmlld0hUTUwiLCAidHJhaWwiLCAiQVBJaW1hZ2VwYWdlUHJldmlld0hUTUwiLCAiQVBJYmFja2xpbmtzUHJldmlld0hUTUwiLCAiQVBJcmV2aXNpb25QcmV2aWV3SFRNTCIsICJmZXRjaFVzZXJHcm91cE5hbWVzIiwgInRoZW4iLCAic2hvd0FQSVByZXZpZXciLCAiZ28iLCAibGlua0xpc3QiLCAiYnVmIiwgIl9pdGVyYXRvcjExIiwgIl9zdGVwMTEiLCAiZ2V0VGltZU9mZnNldCIsICJ0eiIsICJvcHRpb25zIiwgImdldFRpbWVab25lIiwgInRpbWVab25lIiwgInR6Q29tcG9uZW50cyIsICJ1c2VUaW1lT2Zmc2V0IiwgIkludGwiLCAiRGF0ZVRpbWVGb3JtYXQiLCAiZm9ybWF0VG9QYXJ0cyIsICJnZXRMb2NhbGVzIiwgImxvY2FsZXMiLCAidXNlckxhbmd1YWdlIiwgImdldE1XRGF0ZUZvcm1hdCIsICJzdXBwb3J0ZWRMb2NhbGVzT2YiLCAibmF2aWdhdG9yIiwgImxhbmd1YWdlIiwgImVkaXRQcmV2aWV3VGFibGUiLCAicmVhbGx5Q29udHJpYnMiLCAiY3VyYXJ0IiwgIm1ha2VGaXJzdENvbHVtbkxpbmtzIiwgImN1cnJlbnRSZXZpc2lvbiIsICJmaXJzdFJldmlkIiwgIl9pdGVyYXRvcjEyIiwgIl9zdGVwMTIiLCAiZWRpdERhdGUiLCAidGhpc0RheSIsICJmb3JtYXR0ZWREYXRlIiwgInRoaXNUaW1lIiwgImZvcm1hdHRlZFRpbWUiLCAiY29sM3VybCIsICJjb2wzdHh0IiwgImNvbW1lbnQiLCAiY29udGVudCIsICJjb21tZW50aGlkZGVuIiwgImFkanVzdERhdGUiLCAib2Zmc2V0IiwgImNvbnZlcnRUaW1lWm9uZSIsICJ0b0xvY2FsZVN0cmluZyIsICJmb3JtYXR0ZWREYXRlVGltZSIsICJkMiIsICJnZXRGdWxsWWVhciIsICJnZXRNb250aCIsICJnZXREYXRlIiwgImdldEhvdXJzIiwgImdldE1pbnV0ZXMiLCAiZ2V0U2Vjb25kcyIsICJ0b0xvY2FsZURhdGVTdHJpbmciLCAiZ2V0VVRDU2Vjb25kcyIsICJ0b0xvY2FsZVRpbWVTdHJpbmciLCAidXNlcmluZm9SZXNwb25zZSIsICJxdWVyeU9iaiIsICJ1c2VycyIsICJtZXNzYWdlcyIsICJncm91cHMiLCAiX2l0ZXJhdG9yMTMiLCAiX3N0ZXAxMyIsICJncm91cE5hbWUiLCAiZ2xvYmFsdXNlcmluZm8iLCAiX2l0ZXJhdG9yMTQiLCAiX3N0ZXAxNCIsICJnZXRNd0FwaSIsICJsb2FkTWVzc2FnZXNJZk1pc3NpbmciLCAianNPYmoiLCAibWlzc2luZyIsICJjb250ZW50bW9kZWwiLCAiX2l0ZXJhdG9yMTUiLCAiX3N0ZXAxNSIsICJjb250aW51ZSIsICJibGNvbnRpbnVlIiwgIkFQSXNoYXJlZEltYWdlUGFnZVByZXZpZXdIVE1MIiwgInBvcHVwaWQiLCAicmVxdWVzdGlkIiwgImFsdCIsICJpbWFnZXJlcG9zaXRvcnkiLCAiZW5jYXJ0IiwgInNoYXJlZF91cmwiLCAiYXBpY29tbW9uc2Jhc2UiLCAiY29tbW9uc2Jhc2UiLCAibG9hZGVyIiwgImxvYWQiLCAiQVBJaW1hZ2VsaW5rc1ByZXZpZXdIVE1MIiwgImpzb2JqIiwgImltYWdldXNhZ2UiLCAiX2l0ZXJhdG9yMTYiLCAiX3N0ZXAxNiIsICJjYXRlZ29yeW1lbWJlcnMiLCAiX2l0ZXJhdG9yMTciLCAiX3N0ZXAxNyIsICJjbWNvbnRpbnVlIiwgInF1ZXJ5b2JqIiwgImludmFsaWQiLCAiYmxvY2tlZGJ5IiwgImJsb2NrcGFydGlhbCIsICJsb2NrZWRTdWxBY2NvdW50SXNBdHRhY2hlZFRvVGhpcyIsICJ1bmF0dGFjaGVkIiwgImdlbmRlciIsICJfaXRlcmF0b3IxOCIsICJfc3RlcDE4IiwgIl9pdGVyYXRvcjE5IiwgIl9zdGVwMTkiLCAicmVnaXN0cmF0aW9uIiwgIl91c2VyJGVkaXRjb3VudCIsICJlZGl0Y291bnQiLCAidXNlcmNvbnRyaWJzIiwgImJsb2NrcyIsICJyYnN0ciIsICJyYW5nZXN0YXJ0IiwgInJhbmdlZW5kIiwgInJlc3RyaWN0aW9ucyIsICJzcGxpY2UiLCAiX25hdnBvcCIsICJlZGl0cyIsICJzZXR1cERlYnVnZ2luZyIsICJwb3B1cERlYnVnIiwgImNvbnNvbGUiLCAicG9wdXBzSW5zZXJ0SW1hZ2UiLCAiaW1hZ2VpbmZvIiwgImltYWdlcGFnZSIsICJ0aHVtYnVybCIsICJzcmMiLCAibWltZSIsICJkZXNjcmlwdGlvbnVybCIsICJ0b2dnbGVTaXplIiwgInRvZ2dsZVNpemUyIiwgImltZyIsICJmaXJzdENoaWxkIiwgIm1hdGNoZWQiLCAicmVtb3ZlTWF0Y2hlc1VubGVzcyIsICJyZTEiLCAicGFyZW5jb3VudCIsICJyZTIiLCAic2V0TmFtZXNwYWNlcyIsICJzZXRSZWRpcnMiLCAiUiIsICJyZWRpckxpc3RzIiwgImFyIiwgImJlIiwgImJnIiwgImJzIiwgImJuIiwgImNzIiwgImN5IiwgImRlIiwgImVvIiwgImVzIiwgImV0IiwgImdhIiwgImdsIiwgImhlIiwgImh1IiwgImlzIiwgIml0IiwgImphIiwgIm1rIiwgIm5kcyIsICJubCIsICJubiIsICJwbCIsICJwdCIsICJydSIsICJzayIsICJzciIsICJ0dCIsICJ1ayIsICJ2aSIsICJ5aSIsICJ6aCIsICJyZWRpckxpc3QiLCAic2V0SW50ZXJ3aWtpIiwgIndpa2ltZWRpYSIsICJuc1JlIiwgImltYWdlTmFtZXNwYWNlVmFyaWFudHMiLCAiX2kyIiwgIl9PYmplY3QkZW50cmllczIiLCAiX2xvY2FsaXplZE5hbWVzcGFjZUxjIiwgIl9uYW1lc3BhY2VJZCIsICJuc1JlSW1hZ2UiLCAiZ2V0RWRpdGJveFNlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiY3JlYXRlUmFuZ2UiLCAic2VsU3RhcnQiLCAic2VsZWN0aW9uU3RhcnQiLCAic2VsRW5kIiwgInNlbGVjdGlvbkVuZCIsICJzZWwiLCAicGlwZSIsICJkb1NlcGFyYXRlU2VsZWN0aW9uUG9wdXAiLCAiTW91c2V0cmFja2VyIiwgImxvb3BEZWxheSIsICJhY3RpdmUiLCAiaG9va3MiLCAicnVuSG9va3MiLCAicmVtb3ZlT2JqIiwgInJlbW92ZUhvb2tzIiwgIm5ld0hvb2tzIiwgInRyYWNrIiwgInBhZ2VYIiwgInBhZ2VZIiwgImRvY0VsdCIsICJkb2N1bWVudEVsZW1lbnQiLCAic2Nyb2xsTGVmdCIsICJzY3JvbGxUb3AiLCAic2V0UG9zaXRpb24iLCAibGFzdEhvb2tfeCIsICJsYXN0SG9va195IiwgImVuYWJsZSIsICJzYXZlZExpc3RlbmVyIiwgInVpZCIsICJub3Nob3ciLCAiY3JlYXRlIiwgInVuaGlkZSIsICJoaWRlIiwgImhvb2tJZHMiLCAiZG93bmxvYWRzIiwgImNvbnN0cmFpbmVkIiwgImhlaWdodCIsICJjcmVhdGVNYWluRGl2IiwgInJlcG9zaXRpb24iLCAibm9MaW1pdEhvciIsICJ0b29XaWRlIiwgInVwZGF0ZURpbWVuc2lvbnMiLCAiY1dpZHRoIiwgImNsaWVudFdpZHRoIiwgIm5hdHVyYWxXaWR0aCIsICJuZXdMZWZ0IiwgInJhaXNlIiwgInpJbmRleCIsICJoaWdoZXN0IiwgInNob3ciLCAidGltZSIsICJzdGFibGVfeCIsICJzdGFibGVfeSIsICJzdGFibGVTaG93IiwgIm5ld194IiwgIm5ld195IiwgImR4IiwgImR5IiwgImZ1enoyIiwgInNob3dTb29uU3RhYmxlVGltZXIiLCAia2V5SG9va3MiLCAiUmVmbGVjdCIsICJhcHBseSIsICJob29rIiwgImhvb2tJZCIsICJfdGhpcyRjbGFzc05hbWUiLCAib25jbGlja0xpc3RlbmVyIiwgInBvc2l0aW9uIiwgIm1pbldpZHRoIiwgImhhbmRsZU5hbWUiLCAic2hpZnRLZXkiLCAiYWJvcnREb3dubG9hZHMiLCAib2Zmc2V0SGVpZ2h0IiwgIl9pdGVyYXRvcjIwIiwgIl9zdGVwMjAiLCAiZGVsRm10IiwgImluc0ZtdCIsICJjb3VudENyb3NzaW5ncyIsICJlamVjdCIsICJyb3ciLCAiX2l0ZXJhdG9yMjEiLCAiX3N0ZXAyMSIsICJzaG9ydGVuRGlmZlN0cmluZyIsICJzaG9ydGVuRGlmZlN0cmluZzIiLCAiY29udGV4dCIsICJkaWZmU3RyaW5nIiwgIm9TcGxpdHRlZCIsICJuU3BsaXR0ZWQiLCAib3V0IiwgImFjYyIsICJtYXhPdXRwdXRQYWlyIiwgInBhaXJlZCIsICJqc1Jlc2VydmVkUHJvcGVydGllcyIsICJkaWZmQnVnQWxlcnQiLCAiZGlmZkJ1Z0FsZXJ0MiIsICJ3b3JkIiwgIm1ha2VEaWZmSGFzaHRhYmxlIiwgIm9zIiwgInNldFNpdGVJbmZvIiwgInBvcHVwTG9jYWxEZWJ1ZyIsICJob3N0bmFtZSIsICJ3aWtpYSIsICJpc0xvY2FsIiwgInN0YXJ0c1dpdGgiLCAiY29tbW9ucyIsICJwb3J0IiwgInNpdGViYXNlIiwgInNldFVzZXJJbmZvIiwgInVzdXNlcnMiLCAidXNwcm9wIiwgImNhblJldmlldyIsICJyaWdodHMiLCAiZmV0Y2hTcGVjaWFsUGFnZU5hbWVzIiwgImZvcm1hdCIsICJmb3JtYXR2ZXJzaW9uIiwgIm1heGFnZSIsICJtZXRhIiwgInNpcHJvcCIsICJ1c2VsYW5nIiwgInNwZWNpYWxwYWdlYWxpYXNlcyIsICJzZXRUaXRsZUJhc2UiLCAicHJvdG9jb2wiLCAiYm90SW50ZXJmYWNlUGF0aCIsICJBUElQYXRoIiwgInRpdGxldGFpbCIsICJ3aWtpYmFzZSIsICJzZXRNYWluUmVnZXgiLCAicmVTdGFydCIsICJwcmVUaXRsZXMiLCAicmVFbmQiLCAiYnVpbGRTcGVjaWFsUGFnZUdyb3VwIiwgInNwZWNpYWxQYWdlT2JqIiwgInZhcmlhbnRzIiwgInJlYWxuYW1lIiwgIl9pdGVyYXRvcjIyIiwgImFsaWFzZXMiLCAiX3N0ZXAyMiIsICJhbGlhcyIsICJzZXRSZWdleHBzIiwgIl9pdGVyYXRvcjIzIiwgIl9zdGVwMjMiLCAic3BlY2lhbHBhZ2UiLCAiaW0iLCAic2V0dXBDYWNoZSIsICJzZXRNaXNjIiwgImNsaWVudCIsICJzZXR1cFBvcHVwczIiLCAiY29tcGxldGVkIiwgInNldE9wdGlvbnMiLCAiZGVmYXVsdE5hdmxpbmtTcGVjIiwgIl9oaW50IiwgImV4cGFuZENvbmRpdGlvbmFsTmF2bGlua1N0cmluZyIsICJleHBhbmRDb25kaXRpb25hbE5hdmxpbmtTdHJpbmcyIiwgInJlY3Vyc2lvbkNvdW50IiwgImNvbmRpdGlvbmFsU3BsaXRSZWdleCIsICJudW1QYXJlbnMiLCAidGVzdFN0cmluZyIsICJ0cnVlU3RyaW5nIiwgImZhbHNlU3RyaW5nIiwgInRlc3RSZXN1bHQiLCAibmF2bGlua1N0cmluZ1RvQXJyYXkiLCAiX2l0ZXJhdG9yMjQiLCAiX3N0ZXAyNCIsICJuYXZsaW5rVGFnIiwgInNzIiwgInNzcyIsICJuYXZsaW5rU3Vic3RpdHV0ZUhUTUwiLCAibmF2bGlua0RlcHRoIiwgIm1hZ2ljIiwgIm1lbnVkZXB0aCIsICJtZW51cm93ZGVwdGgiLCAiX2l0ZXJhdG9yMjUiLCAiX3N0ZXAyNSIsICJnZXROZXdXaW4iLCAiZ2V0UHJpbnRGdW5jdGlvbiIsICJ0YWdUeXBlIiwgInByaW50IiwgInNob3J0Y3V0IiwgImFkZFBvcHVwU2hvcnRjdXQiLCAicG9wdXBMaW5rc05ld1dpbmRvdyIsICJuZXdXaW4iLCAibm9Qb3B1cCIsICJzcGVjaWFsTGluayIsICJtYWdpY1dhdGNoTGluayIsICJ0aXRsZWRXaWtpTGluayIsICJfcGckY3VycmVudCRsaW5rJG9yaWciLCAiYXJpbkxpbmsiLCAiZWRpdENvdW50ZXJMaW5rIiwgImVkaXRvckxpc3RMaW5rIiwgInRpdGxlZERpZmZMaW5rIiwgIm1hZ2ljSGlzdG9yeUxpbmsiLCAic2ltcGxlUG9wdXBzIiwgInBvcHVwTWVudUxpbmsiLCAicG9wdXBIYW5kbGVLZXlwcmVzcyIsICJwb3B1cEhhbmRsZUtleXByZXNzMiIsICJfZXZ0JGtleUNvZGUiLCAia2V5Q29kZSIsICJ3aGljaCIsICJsZXR0ZXIiLCAiZnJvbUNvZGVQb2ludCIsICJzdGFydExpbmsiLCAibGFzdFBvcHVwTGlua1NlbGVjdGVkIiwgInByZXZlbnREZWZhdWx0IiwgImZvY3VzIiwgIm9sZFBvcHVwT25rZXlwcmVzcyIsICJvbmtleXByZXNzIiwgImFkZExpbmtQcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJkaWZmRGF0YSIsICJvbGRSZXYiLCAibmV3UmV2IiwgImFwaTIiLCAiZnJvbXRpdGxlIiwgInRvcmVsYXRpdmUiLCAiZnJvbXJldiIsICJ0b3JldiIsICJjb21wYXJlIiwgImZyb21yZXZpZCIsICJ0b3JldmlkIiwgImFkZFJldmlld0xpbmsiLCAiZG9uZURpZmYiLCAicmV2aWRzIiwgInN0YWJsZV9yZXZpZCIsICJmbGFnZ2VkIiwgInBhcmFtczIiLCAicG9zdFdpdGhUb2tlbiIsICJmYWlsIiwgIl9pdGVyYXRvcjI2IiwgIl9zdGVwMjYiLCAiX2kzIiwgIl9yZXZpc2lvbnMiLCAicmV2aXNpb24iLCAiaW5zZXJ0RGlmZiIsICJybUJvcmluZ0xpbmVzIiwgImFhYSIsICJiYiIsICJiYmIiLCAic3RyaXBPdXRlckNvbW1vbkxpbmVzIiwgIm9sZGxpbmVzIiwgIm5ld2xpbmVzIiwgImlubmVyIiwgInRydW5jYXRlZCIsICJwb3B1cERpZmZNYXhMaW5lcyIsICJwb3B1cERpZmZDb250ZXh0TGluZXMiLCAibGluZURpZmYiLCAibGluZXMyIiwgIm9sZGxpbmVzMiIsICJuZXdsaW5lczIiLCAiZGlmZkRhdGVzVGFibGUiLCAiZGlmZkRhdGVzVGFibGVSb3ciLCAibGFiZWwiLCAibGFzdE1vZGlmaWVkRGF0ZSIsICJyZXZsaW5rIiwgImdlbmVyYWxMaW5rIiwgImFjdGlvbk5hbWUiLCAic2F2ZWRPbGRpZCIsICJvbGRpZERhdGEiLCAicmV2aXNpb25TdHJpbmciLCAicmV2ZXJ0U3VtbWFyeSIsICJiYXNlIiwgImNzc0NsYXNzIiwgImRlZmF1bHROYXZsaW5rQ2xhc3NuYW1lIiwgImdlbmVyYWxOYXZMaW5rIiwgImdldExhc3RDb250cmliIiwgIndpa2lwYWdlIiwgImdldEhpc3RvcnlJbmZvIiwgInByb2Nlc3NMYXN0Q29udHJpYkluZm8iLCAiZmlyc3ROZXdFZGl0b3IiLCAiZWRpdG9yIiwgIm5ld1VybCIsICJkaXNwbGF5VXJsIiwgImdldERpZmZTaW5jZU15RWRpdCIsICJwcm9jZXNzRGlmZlNpbmNlTXlFZGl0IiwgImZyaWVuZGx5TmFtZSIsICJteUxhc3RFZGl0IiwgInB1cmdlUG9wdXBzIiwgInByb2Nlc3NBbGxQb3B1cHMiLCAibnVsbGlmeSIsICJkaXNhYmxlUG9wdXBzIiwgInRvZ2dsZVByZXZpZXdzIiwgIm1hZ2ljV2F0Y2hMaW5rMiIsICJfcmVmIiwgIl9hc3luY1RvR2VuZXJhdG9yIiwgInJlcURhdGEiLCAidGl0bGVzIiwgInVud2F0Y2giLCAibXdUaXRsZSIsICJuZXdGcm9tVGV4dCIsICJtZXNzYWdlTmFtZSIsICJnZXROYW1lc3BhY2VJZCIsICJwYXJzZURvbSIsICJfeDIiLCAiX3gzIiwgImFyZ3VtZW50cyIsICJqc1VybCIsICJvbkNsaWNrIiwgImFwcGVuZFBhcmFtc1RvTGluayIsICJsaW5rc3RyIiwgImNBIiwgImNocyIsICJjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0IiwgImxrIiwgImFsc29DaGFuZ2VMYWJlbCIsICJzYW5lTGlua0NoZWNrIiwgInVOIiwgInRvb2xEYk5hbWUiLCAiY29va2llU3R5bGUiLCAidG9vbCIsICJkZWZhdWx0VG9vbFVybCIsICJ0aGVXaWtpIiwgIndoYXROZXh0IiwgImdldEhpc3RvcnkiLCAicHJvY2Vzc0hpc3RvcnkiLCAiX2l0ZXJhdG9yMjciLCAiX3N0ZXAyNyIsICJmaW5pc2hQcm9jZXNzSGlzdG9yeSIsICJoaXN0SW5mbyIsICJwcmV2aWQiLCAiZGVmYXVsdGl6ZSIsICJuZXdPcHRpb24iLCAiZGVmIiwgInZhck5hbWUiLCAidXNlcklzU3lzb3AiLCAiZyIsICJob3VyMTIiLCAiZWRpdENvdW50ZXJMaW5rSGludCIsICJhcmluIiwgIm9uIiwgIm9uY2UiLCAiZHluYW1pY0NvbnRlbnRIYW5kbGVyIiwgIiRjb250ZW50IiwgInJlZ2lzdGVySG9va3NGb3JWaXNpYmxlTmF2cG9wcyIsICJkb0l0IiwgImVhY2giLCAiX2luZGV4IiwgImFkZCIsICIkb3ZlcmxheSJdCn0K